DirOutln

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
SpaceJamm
Beiträge: 6
Registriert: Fr 27. Apr 2012, 17:23
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

DirOutln

Beitrag von SpaceJamm »

Hallo,
ich brauche Hilfe beim Umstieg von Delphi nach Lazarus.

nachdem ich Delphi project und Units in Lazarus umgewandelt habe, muss ich unit {DirOutln,} ausklammern. Sonst führt es zu dem Fehler "sterbof.pas(9,36) Fatal: Can't find unit DirOutln used by sterbof".

Leider bringt es nichts, wenn ich DirOutln.pas von Delphi6/Source/samples einfach kopiere, und dann durch Tools>convert Delphi Unit to Lazarus umwandele und zum Project durch Project>Project Inspector einfüge. Weil es dann sehr viele Fehlermeldungen wegen DirOutln.pas gibt.

Wie kann man diese Fehlermeldung beseitigen "sterbof.pas(9,36) Fatal: Can't find unit DirOutln used by sterbof". Unter Delphi 6 funktioniert das Programm fehlerloss.

Danke :)

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: DirOutln

Beitrag von Heinrich Wolf »

SpaceJamm hat geschrieben:Fehler "sterbof.pas(9,36) Fatal: Can't find unit DirOutln used by sterbof".
Es reicht nicht, die unit aus dem Project Inspector zu löschen. In sterbof.pas unter "uses" muss DirOutIn auch noch entfernt werden und für die Aufrufe, die aus sterbof.pas nach DirOutIn.pas gehen, muss Ersatz geschaffen werden.
SpaceJamm hat geschrieben:Leider bringt es nichts, wenn ich DirOutln.pas von Delphi6/Source/samples einfach kopiere, und dann durch Tools>convert Delphi Unit to Lazarus umwandele und zum Project durch Project>Project Inspector einfüge. Weil es dann sehr viele Fehlermeldungen wegen DirOutln.pas gibt.
Das scheint aber der einzig sinnvolle Weg zu sein. Wenn Du Fragen zu den Fehlermeldungen, die hier auftreten, hast, kannst Du ja hier weiter fragen.

Heiner

SpaceJamm
Beiträge: 6
Registriert: Fr 27. Apr 2012, 17:23
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: DirOutln

Beitrag von SpaceJamm »

Heinrich Wolf hat geschrieben:
SpaceJamm hat geschrieben:Fehler "sterbof.pas(9,36) Fatal: Can't find unit DirOutln used by sterbof".
Es reicht nicht, die unit aus dem Project Inspector zu löschen. In sterbof.pas unter "uses" muss DirOutIn auch noch entfernt werden und für die Aufrufe, die aus sterbof.pas nach DirOutIn.pas gehen, muss Ersatz geschaffen werden.
SpaceJamm hat geschrieben:Leider bringt es nichts, wenn ich DirOutln.pas von Delphi6/Source/samples einfach kopiere, und dann durch Tools>convert Delphi Unit to Lazarus umwandele und zum Project durch Project>Project Inspector einfüge. Weil es dann sehr viele Fehlermeldungen wegen DirOutln.pas gibt.
Das scheint aber der einzig sinnvolle Weg zu sein. Wenn Du Fragen zu den Fehlermeldungen, die hier auftreten, hast, kannst Du ja hier weiter fragen.

Heiner
Danke!

In folgenden Quelltext:

Code: Alles auswählen

function BrowseDialog(const Title: string; const Flag: integer): string;
//BG: Startet die SHBrowseForFolder-API-Funktion und gibt das
//ausgewählte Verzeichnis wieder.
var
  lpItemID: PItemIDList;
  BrowseInfo: TBrowseInfo;
  DisplayName: array[0..MAX_PATH] of char;
  TempPath: array[0..MAX_PATH] of char;
begin
  Result := '';
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  with BrowseInfo do
  begin
    hwndOwner := Application.Handle;
    pszDisplayName := @DisplayName;
    lpszTitle := PChar(Title);
    ulFlags := Flag;
  end;
  lpItemID := SHBrowseForFolder (BrowseInfo);
  if lpItemId <> nil then
  begin
    SHGetPathFromIDList(lpItemID, TempPath);
    Result := TempPath;
    GlobalFreePtr(lpItemID);
  end;
end;
Während der Compelierung kommt 2 Fehler:
sterbof.pas(154,22) Hint: Local variable "BrowseInfo" does not seem to be initialized
sterbof.pas(158,30) Error: identifier idents no member "Handle"
sterbof.pas(164,44) Error: Incompatible type for arg no. 1: Got "BROWSEINFO", expected "LPBROWSEINFO"
Hint: Found declaration: SHBrowseForFolder(LPBROWSEINFO):^ITEMIDLIST;
sterbof.pas(220) Fatal: There were 2 errors compiling module, stopping

Wenn ich folgende 2 Sätze (// hwndOwner := Application.Handle; //lpItemID := SHBrowseForFolder (BrowseInfo);) von Programm wegnehme, dann funktioniert das Programm wieder, aber ohne " Browse for Foldner " und " The File open Dialog " funktionen.

Ich vermute, dass ich wegen Umstieg von Delphi zu Lazarus muss folgendes machen:
Entwieder 1. Die Analoge von DirOutln.pas finden oder 2. Die funktion SHBrowseForFolder (BrowseInfo) tauschen für die andere, die auch für Lazarus passt.

Weisst jemand ws. darüber, wie es geht ?
8)
Zuletzt geändert von Lori am Mi 2. Mai 2012, 22:01, insgesamt 1-mal geändert.
Grund: Bitte den Highlighter verwenden

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: DirOutln

Beitrag von theo »

Die Frage ist erstmal, ob du das nur für Windows oder auch für andere Plattformen brauchst.
Das SHBrowseForFolder ist reines Windows Zeug. Lazarus versucht normalerweise so etwas zu vermeiden.
Es gibt z.B. im Dialogs Tab einen TSelectDirectoryDialog. Der ist vllt. nicht ganz gleich, aber dafür läuft er überall.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: DirOutln

Beitrag von Heinrich Wolf »

SpaceJamm hat geschrieben:Danke!

In folgenden Quelltext:

Code: Alles auswählen

function BrowseDialog(const Title: string; const Flag: integer): string;
//BG: Startet die SHBrowseForFolder-API-Funktion und gibt das
//ausgewählte Verzeichnis wieder.
var
  lpItemID: PItemIDList;
  BrowseInfo: TBrowseInfo;
  DisplayName: array[0..MAX_PATH] of char;
  TempPath: array[0..MAX_PATH] of char;
begin
  Result := '';
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  with BrowseInfo do
  begin
    hwndOwner := Application.Handle; // Hier hilft evtl. (ungetestet) hwndOwner := WidgetSet.AppHandle
    pszDisplayName := @DisplayName;
    lpszTitle := PChar(Title);
    ulFlags := Flag;
  end;
  lpItemID := SHBrowseForFolder (BrowseInfo); // Hier hilft wahrscheinlich   lpItemID := SHBrowseForFolder (@BrowseInfo)
  if lpItemId <> nil then
  begin
    SHGetPathFromIDList(lpItemID, TempPath);
    Result := TempPath;
    GlobalFreePtr(lpItemID);
  end;
end;
Während der Compelierung kommt 2 Fehler:
Siehe die Kommentare, die ich eingefügt habe.
SpaceJamm hat geschrieben: sterbof.pas(154,22) Hint: Local variable "BrowseInfo" does not seem to be initialized
Diesen Hint kannst Du ignorieren. Lazarus erkennt nicht, dass FillChar die BrowseInfo initialisiert.
SpaceJamm hat geschrieben: sterbof.pas(158,30) Error: identifier idents no member "Handle"
Nachträglich: Ich hab mal kurz gegurgelt mit dem Suchbegriff "lazarus application.handle". Dabei hab ich http://lists.lazarus.freepascal.org/pip ... 62215.html gefunden.
SpaceJamm hat geschrieben: sterbof.pas(164,44) Error: Incompatible type for arg no. 1: Got "BROWSEINFO", expected "LPBROWSEINFO"
@BROWSEINFO gibt Dir einen Pointer LPBROWSEINFO, der auf BROWSEINFO zeigt.

Heiner

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: DirOutln

Beitrag von Heinrich Wolf »

Ich hab meinen letzten Beitrag editiert und WidgetSet.AppHandle, das ich gefunden habe, eingefügt. Kurze Info hier, da Ändern eines Beitrages keine neue Benachrichtigung sendet.

SpaceJamm
Beiträge: 6
Registriert: Fr 27. Apr 2012, 17:23
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: DirOutln

Beitrag von SpaceJamm »

Heinrich Wolf hat geschrieben:Ich hab meinen letzten Beitrag editiert und WidgetSet.AppHandle, das ich gefunden habe, eingefügt. Kurze Info hier, da Ändern eines Beitrages keine neue Benachrichtigung sendet.
Vielen Dank. Es funktioniert jetz mit hwndOwner := 0;
:D

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: DirOutln

Beitrag von Heinrich Wolf »

SpaceJamm hat geschrieben:Vielen Dank. Es funktioniert jetz mit hwndOwner := 0;
:D
Hallo,

funktioniert es mit

Code: Alles auswählen

hwndOwner := WidgetSet.AppHandle
nicht? Bei

Code: Alles auswählen

hwndOwner := 0
hat der SHBrowseForFolder Dialog keinen Eigentümer. Das kann evtl. dazu führen, dass er nicht wie gewünscht modal ist und vielleicht mal hinter Deiner Anwendung verborgen wird.

Heiner

SpaceJamm
Beiträge: 6
Registriert: Fr 27. Apr 2012, 17:23
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: DirOutln

Beitrag von SpaceJamm »

Heinrich Wolf hat geschrieben:
SpaceJamm hat geschrieben:Vielen Dank. Es funktioniert jetz mit hwndOwner := 0;
:D
Hallo,

funktioniert es mit

Code: Alles auswählen

hwndOwner := WidgetSet.AppHandle
nicht? Bei

Code: Alles auswählen

hwndOwner := 0
hat der SHBrowseForFolder Dialog keinen Eigentümer. Das kann evtl. dazu führen, dass er nicht wie gewünscht modal ist und vielleicht mal hinter Deiner Anwendung verborgen wird.

Heiner
Hallo. Danke.

Leider funktioniert es nicht mit hwndOwner := WidgetSet.AppHandle;

Kommt die Fehler:
sterbof.pas(161,29) Error: Identifier not found "WidgetSet"

:(

Aber mit hwndOwner := 0; funktioniert es von ersten augenblick einwandfrei :lol:

Vielen Dank!

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: DirOutln

Beitrag von Heinrich Wolf »

SpaceJamm hat geschrieben:Leider funktioniert es nicht mit hwndOwner := WidgetSet.AppHandle;

Kommt die Fehler:
sterbof.pas(161,29) Error: Identifier not found "WidgetSet"

Code: Alles auswählen

uses
  ...
  InterfacesBase,
  ...
macht WidgetSet verfügbar.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: DirOutln

Beitrag von Heinrich Wolf »

Heinrich Wolf hat geschrieben:Bei

Code: Alles auswählen

hwndOwner := 0
hat der SHBrowseForFolder Dialog keinen Eigentümer. Das kann evtl. dazu führen, dass er nicht wie gewünscht modal ist und vielleicht mal hinter Deiner Anwendung verborgen wird.
Heiner
Ich hab's grad mal ausprobiert. Genau das, was ich geschrieben habe, passiert bei hwndOwner = 0, und noch mehr: Ich hab einen Button auf meine Testanwendung, welcher BrowseDialog aufruft. Mit hwndOwner = 0 kann ich mehrere SHBrowseForFolder Dialoge gleichzeitig öffnen.

SpaceJamm
Beiträge: 6
Registriert: Fr 27. Apr 2012, 17:23
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: DirOutln

Beitrag von SpaceJamm »

Heinrich Wolf hat geschrieben:
Heinrich Wolf hat geschrieben:Bei

Code: Alles auswählen

hwndOwner := 0
hat der SHBrowseForFolder Dialog keinen Eigentümer. Das kann evtl. dazu führen, dass er nicht wie gewünscht modal ist und vielleicht mal hinter Deiner Anwendung verborgen wird.
Heiner
Ich hab's grad mal ausprobiert. Genau das, was ich geschrieben habe, passiert bei hwndOwner = 0, und noch mehr: Ich hab einen Button auf meine Testanwendung, welcher BrowseDialog aufruft. Mit hwndOwner = 0 kann ich mehrere SHBrowseForFolder Dialoge gleichzeitig öffnen.
Danke. :D

Ich habe gerade in
uses
...
interfacebase,
......

eingefügt. Jetzt funktioniert hwndOwner := WidgetSet.AppHandle; einwandsfrei!!!!!!!!!! Danke.

Antworten