![]() |
Re: Probleme mit Listbox Einträgen
Delphi-Quellcode:
if OpenDialog.Execute then
|
Re: Probleme mit Listbox Einträgen
Hallo,
da mich das auch interessiert, hab' ich mal DaddyH's Idee umgesetzt. Nach etwas googeln, kam' ich zu diesem ![]()
Delphi-Quellcode:
Hierbei wird ein Verzeichnis gescanned und die Dateinamen ohne den Pfad in die Listbox geschrieben, der volle Dateiname wird ebenfalls hinterlegt (AList.AddObject(SR.Name, TObject(Entry))). So wie ich das unter dem Link verstanden habe ist TObject nur der Zeiger auf den String, den wir anlegen und kann somit referenziert werden. Was mich noch interessieren würde, wäre wie ich einen string > 255 Zeichen hinbekomme. Wenn ich das im Record erhöhe bekomme ich folgende Fehlermeldung: "String-Literale können maximal 255 Elemente besitzen".
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; procedure Button1Click(Sender: TObject); procedure ListBox1DblClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type TListEntry = record FullFilename: string[255] end; // Pointer to data record PListEntry = ^TListEntry; var Form1: TForm1; implementation {$R *.dfm} procedure GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean); var Entry: PListEntry; SR: TSearchRec; begin if (ADirectory <> '') and (ADirectory[length(ADirectory)] <> '\') then ADirectory := ADirectory + '\'; if (FindFirst(ADirectory + AMask, faAnyFile and not faDirectory, SR) = 0) then begin repeat if (SR.Attr and faDirectory) = 0 then begin new(Entry); Entry^.FullFilename := ADirectory + SR.Name; AList.AddObject(SR.Name, TObject(Entry)) //AList.Add(ADirectory+SR.Name) end; until FindNext(SR) <> 0; FindClose(SR); end; if ARekursiv then if (FindFirst(ADirectory + '*.*', faDirectory, SR) = 0) then begin repeat if (SR.Name <> '.') and (SR.Name <> '..') then GetFilesInDirectory(ADirectory + SR.Name, AMask, AList, True); until FindNext(SR) <> 0; FindClose(SR); end; end; procedure ShowFullFilename(const ID: Integer); var Filename: string; begin Filename := PListEntry(Form1.ListBox1.Items.Objects[ID])^.FullFilename; ShowMessage(Filename); end; procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.BeginUpdate; GetFilesInDirectory('C:\...\Eigene Dateien', '*.*', ListBox1.Items, True); ListBox1.Items.EndUpdate; end; procedure TForm1.ListBox1DblClick(Sender: TObject); begin if ListBox1.ItemIndex <> -1 then ShowFullFilename(ListBox1.ItemIndex); end; end. Gruß -- €: Christian Seehase's Hinweise übernommen... |
Re: Probleme mit Listbox Einträgen
Moin Calculon,
dann nimm doch string statt string[255]. Was mir noch aufgefallen ist:
Delphi-Quellcode:
Auch wenn es hier keine Auswirkung hat:
faAnyFile - faDirectory
Niemals Bitfelder (Flags) mit + und - bearbeiten, immer nur mit OR (statt +) bzw. and not (statt -) (nähere Erklärungen warum das so ist findest Du hier in der DP häufiger)
Delphi-Quellcode:
Das hier
faAnyFile and not faDirectory
Delphi-Quellcode:
ist nicht so besonders sinnvoll, da Du mal davon ausgehen kannst, dass SR.Attr noch mehr enthalten kann als faDirectory
(SR.Attr <> faDirectory)
Delphi-Quellcode:
wäre hier sinnvoller.
(SR.Attr and faDirectory) = 0
Die Namen . und .. sind übrigens immer Verzeichnisse. Wenn also schon feststeht, dass es sich nicht um ein Verzeichnis handelt, kann man sich die Überprüfung auf . und .. sparen. |
Re: Probleme mit Listbox Einträgen
Hallo Christian,
Zitat:
Wegen den restlichen Hinweisen: ![]() Gruß -- |
Re: Probleme mit Listbox Einträgen
Moin Calculon,
ein, sogenannter, HugeString (string in Standardeinstellung) ist erst einmal ein Pointer (SizeOf(StringVariable) ist immer gleich 4), und hat vor dem Inhalt noch einen 32-Bit Längenfeld, und davor ein 32-Bit-Feld als Referenzzähler. Er endet auch immer auf 0, damit er mit einem einfachen Cast (PChar(...)) als C-String genutzt werden kann. Zitat:
|
Re: Probleme mit Listbox Einträgen
Zitat:
Zitat:
![]() Gruß^^ -- |
Re: Probleme mit Listbox Einträgen
Zitat:
Wenn ich jetzt einen Lisbox eintrag starten will, öffnet sich das OpenDialog Fenster, und unten bei Dateiname steht der komplette Pfad der Andwenung, die in die Listbox kopiert wurde. Wenn ich dann auf Öffnen gehe, gibts wieder eine Exception bei Adresse 0043EB92 "Lesen von Adresse 0000003C" Es wird nicht angezeigt wo der fehler auftritt. Wo liegt das Problem? |
Re: Probleme mit Listbox Einträgen
Jag das Programm mal durch den Debugger
|
Re: Probleme mit Listbox Einträgen
Und der aktuelle Quälcode wäre auch mal ganz interessant.
|
Re: Probleme mit Listbox Einträgen
So, hier der Code.
Mit dieser Prozedur wird das "Datei Öffnen" Fenster gestartet:
Delphi-Quellcode:
mit dieser Prozedur soll dann das ausgwählte Listbox Item gestartet werden:
procedure TForm2.Button3Click(Sender: TObject);
begin openDialog := TOpenDialog.Create(self); openDialog.InitialDir := GetCurrentDir; openDialog.Options := [ofFileMustExist]; openDialog.Filter := 'Anwendungen|*.exe'; openDialog.FilterIndex := 0; if openDialog.Execute then Form4.Show; OpenDialog.Free; // seitdem ich hier OpenDialog1 enfernt habe, bekomme ich keine Laufzeitfehler mehr. end;
Delphi-Quellcode:
leider funktioniert es nicht so richtig. Laufzeitfehler sind weg - allerdings wenn ich ein Item starten will, öffnet sich wieder das OpenDialog Fenster, mit dem Pfad der Hinzugefügten Datei unten im Fenster. Wenn ich dann auf öffnen klicke, öffnet sich wiederrum das 2te Formular, wo ich den Alternativen Dateinamen eingeben kann....und so weiter.
procedure TForm2.Button2Click(Sender: TObject);
function ShellExecuteErrMessage(int_Code: INTEGER): String; begin case int_code of 0: result := 'Zuwenig Speicher, ausführbare Datei war zerstört, Relokationswerte waren ungültig'; 2: result := 'Datei wurde nicht gefunden.'; 3: result := 'Verzeichnis wurde nicht gefunden.'; 5: result := 'Fehler beim gemeinsamen Zugriff auf eine Datei im Netz oder Fehler beim Zugriff auf eine gesperrte Datei im Netz.'; 6: result := 'Bibliothek forderte separate Datensegmente für jede Task an.'; 8: result := 'Zuwenig Speicher, um die Anwendung zu starten.'; 10: result := 'Falsche Windows-Version.'; 11: result := 'Ungültige ausführbare Datei. Entweder keine Windows-Anwendung oder Fehler in der EXE-Datei.'; 12: result := 'Anwendung für ein anderes Betriebssystem.'; 13: result := 'Anwendung für MS-DOS 4.0.'; 14: result := 'Typ der ausführbaren Datei unbekannt.'; 15: result := 'Versuch, eine Real-Mode-Anwendung (für eine frühere Windows-Version) zu laden.'; 16: result := 'Versuch, eine zweite Instanz einer ausführbaren Datei mit mehreren Datensegmenten die nicht als nur lesbar gekennzeichnet waren, zu laden.'; 19: result := 'Versuch, eine komprimierte ausführbare Datei zu laden.' + #13 + 'Die Datei muß dekomprimiert werden, bevor sie geladen werden kann.'; 20: result := 'Ungültige dynamische Linkbibliothek (DLL).' + #13 + 'Eine der DLLs, die benötigt wurde, um die Anwendung auszuführen, war beschädigt.'; else result := 'Ein Unbekannter Fehler ist aufgetreten. (' + IntToStr(int_code) + ')'; end; end; var Err: Integer; lIndex: Integer; begin if OpenDialog1.Execute() then // wenn ich hier die 1 entferne, und oben ebenfalls, gibts wieder einen Laufzeitfehler. begin lIndex := Length(MeinArray); SetLength(MeinArray, lIndex + 1); MeinArray[lIndex].RealFileName := OpenDialog1.FileName; MeinArray[lIndex].DisplayName := Form4.Edit1.Text; ListBox1.Items.Add(MeinArray[lIndex].DisplayName); end; if Err <= 32 then Showmessage(ShellExecuteErrMessage(Err)); if FileExists (OpenDialog2.FileName) then begin if CheckBox2.Checked then Application.Minimize; end; end; Irgendwo ist der Wurm drin, doch ich weiß nicht wo... :| EDIT: oh mann, hab gesehen das ich mit den 2 prozeduren ungewollt 2mal das andere Formular öffne :wall: Ok. der Fehler ist schonmal weg. Doch Es öffnet sich leider immernoch kein programm... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz