![]() |
Probleme mit Listbox Einträgen
Hi,
Per Button öffne ich einen OpenDialog, in dem man *.exe auswählen kann. Wenn man dann auf Ok klickt, öffnet sich ein 2tes Formular, in dem man einen Namen für die *.exe eingeben kann. Dieser Name wird dann in die ListBox eingefügt. Wenn ich dann das Item in der Listbox per ShellExecute starten will, gehts Logischerweise nicht, da Shellexecute versucht den Dateinamen aus dem OpenDialog als Pfad nimmt. Nun meine Frage: Wie kann ich unter der weiterverwendung von dem 2ten Formular, in dem man einen "Ersatznamen" für die *.exe eingibt das ausgewählte ListBox Item starten? Also, das der "Ersatznamen" in der Listbox dann angezeigt wird, aber dazugehörige Pfad unsichtbar gespeichert wird. Hinterher möchte ich die Kompletten ListBox Items und der jeweils dazugehörige Pfad in einer Datei speichern - das speichern der Items klappt bis jetzt. Ich hoffe ihr versteht wie ich das meine, und ich hoffe ihr könnt mir ein bißchen helfen. :wink: |
Re: Probleme mit Listbox Einträgen
Die ListItems verfügen auch über eine Eigenschaft Objects. Da könntest Du den Originalnamen ablegen.
|
Re: Probleme mit Listbox Einträgen
entweder packst du in die Listbox beide Namen hintereinander und sorgst selber für das Zeichnen der Listbox so das nur der eine Name dann auch gemalt wird oder:
Zitat:
Zudem ist es üblich die Daten komplett im nicht sichtbaren Bereich zu halten und diese nur für die Anzeige in das entsprechende Anzeigeelement zu übertragen. In deinem Fall also komplettenPfad und Ersatzname in einer Liste oder einem Array ablegen und dann den Ersatznamen in die Listbox einfügen. |
Re: Probleme mit Listbox Einträgen
Danke schonmal für die Antworten,
mit folgendem Code würde ich das Programm aus der ListBox laden:
Delphi-Quellcode:
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; begin if ListBox1.ItemIndex > -1 then Err:= ShellExecute(0, Nil, PChar(ListBox1.Items[ListBox1.ItemIndex]), Pchar(Edit1.Text), SW_NORMAL); if Err <= 32 then Showmessage(ShellExecuteErrMessage(Err)); end; nach dem eine Datei ausgewählt wurde, öffnet sich folgendes Formular:
Delphi-Quellcode:
Könntet ihr mir ein Beispiel mit den ListItem.Objects oder dem Array geben?
procedure TForm4.Button1Click(Sender: TObject);
var IconIndex : Integer; h : hIcon; S : String; Icon : TIcon; Bitmap : TBitmap; OpenDialog : TOpenDialog; begin Form2.ListBox1.MultiSelect :=False; Form2.ListBox1.Sorted :=True; Form2.Label2.Caption := OpenDialog.FileName; begin Icon := TIcon.Create; IconIndex := 0; S := OpenDialog.FileName; h := IconFromFile(OpenDialog.FileName,0); Form2.ImageList1.AddIcon (Icon); try Form2.ImageList1.GetIcon(0, Icon); Form2.Image1.Canvas.Draw(0, 0, Icon); with Form2.Image1.Canvas Do DrawIconEx(Handle, 0, 0,h, 32, 32, 0, Brush.Handle, di_Normal); begin Form2.ListBox1.Items.Add (Edit1.Text); // der inhalt aus edit1 wird in die listbox geladen, also der "Ersatzname" Form4.Close; Edit1.Clear; end; finally FreeAndNil(Icon); end; end; end; Hab gerade schwierigkeiten das umzusetzen und zu realisieren.... :gruebel: |
Re: Probleme mit Listbox Einträgen
Delphi-Quellcode:
type
TFilenameInfos = record RealFileName: String; DisplayName: String; end; [...] private MeinArray: Array of TFilenameInfos; [...] var lIndex: Integer; begin if OpenDialog1.Execute() then begin lIndex := Length(MeinArray); //Zeige Form für alternativen Dateinamen SetLength(MeinArray, lIndex + 1); MeinArray[lIndex].RealFileName := OpenDialog1.FileName; MeinArray[lIndex].DisplayName := NameAusForm2; ListBox1.Items.Add(MeinArray[lIndex].DisplayName); end; |
Re: Probleme mit Listbox Einträgen
Hi, hab deinen Code meinem entsprechend angepasst. Es wird zwar kompiliert, doch wenn ich das Programm starten will (das aus der Listbox) gibts eine Zugriffsverletzung...
Delphi-Quellcode:
was hab ich falsch gemacht?
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 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; |
Re: Probleme mit Listbox Einträgen
Könntest du bitte die vollständige Fehlermeldung posten und angeben bei welcher Anweisung diese kommt?
|
Re: Probleme mit Listbox Einträgen
natürlich.
Zitat:
Delphi-Quellcode:
auf.
if OpenDialog1.Execute() then
|
Re: Probleme mit Listbox Einträgen
Existiert den eine Instanz des Dialogs?
|
Re: Probleme mit Listbox Einträgen
habs so mal versucht:
Delphi-Quellcode:
da bekomme ich in der selben zeile den selben fehler bei adresse 0048BEE1.....
var
Err: Integer; lIndex: Integer; begin openDialog := TOpenDialog.Create(self); openDialog.InitialDir := GetCurrentDir; openDialog.Options := [ofFileMustExist]; openDialog.Filter := 'Anwendungen|*.exe'; openDialog.FilterIndex := 0; begin if OpenDialog1.Execute then 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; |
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... |
Re: Probleme mit Listbox Einträgen
Moment, die Items sind doch schon in der Listbox enthalten, oder? Dann ist die ganze Passage
Zitat:
Zitat:
|
Re: Probleme mit Listbox Einträgen
Hi,
hab die fehler beseitigt und den richtigen code hier: Irgendwie komm ich heute auf keinen grünen zweig. Lauter Fehler die man eigentlich sofort sehen sollte.. :roll: das ist der befehl, die Datei aus dem array zu starten - es passiert jedoch nichts, keine fehlermeldung, rein gar nichts.
Delphi-Quellcode:
begin
if Err = 0 then ShellExecute (Form2.Handle, 'open', Pchar('MeinArray[lIndex].RealFileName'), NIL, NIL, SW_SHOWNORMAL); das ist die prozedur die datei aus dem Opendialog in die Listbox zu laden:(überarbeitet)
Delphi-Quellcode:
wie gesagt,sobald ein eintrag in der Listbox drin ist, und gestartet werden soll, passiert nichts, aber auch rein gar nichts.
procedure TForm4.Button1Click(Sender: TObject);
var IconIndex : Integer; h : hIcon; S : String; Icon : TIcon; Bitmap : TBitmap; OpenDialog : TOpenDialog; lIndex: Integer; begin lIndex := Length(MeinArray); SetLength(MeinArray, lIndex + 1); MeinArray[lIndex].RealFileName := Form2.OpenDialog1.FileName; MeinArray[lIndex].DisplayName := Form4.Edit1.Text; Form2.ListBox1.Items.Add(MeinArray[lIndex].DisplayName); Form2.ListBox1.MultiSelect :=False; Form2.ListBox1.Sorted :=True; Form2.Label2.Caption := OpenDialog.FileName; Icon := TIcon.Create; IconIndex := 0; S := OpenDialog.FileName; h := IconFromFile(OpenDialog.FileName,0); Form2.ImageList1.AddIcon (Icon); try Form2.ImageList1.GetIcon(0, Icon); Form2.Image1.Canvas.Draw(0, 0, Icon); with Form2.Image1.Canvas Do DrawIconEx(Handle, 0, 0,h, 32, 32, 0, Brush.Handle, di_Normal); begin Form4.Close; Edit1.Clear; end; finally FreeAndNil(Icon); end; end; EDIT: Habs schon mit Application.Handle und SW_NORMAL versucht, ohne erfolg. |
Re: Probleme mit Listbox Einträgen
Schonmal den Rückgabewert von ShellExecute anzeigen lassen?
|
Re: Probleme mit Listbox Einträgen
Wie wäre es denn so?
Delphi-Quellcode:
[edit] :wall: Nimm mal die Hochkommata im 3. Parameter raus:
Err := ShellExecute(Form2.Handle,
'open', Pchar('MeinArray[lIndex].RealFileName'), NIL, NIL, SW_SHOWNORMAL); if Err < 33 then Showmessage(ShellExecuteErrMessage(Err));
Delphi-Quellcode:
[/edit]
Pchar('MeinArray[lIndex].RealFileName')
--> Pchar(MeinArray[lIndex].RealFileName) |
Re: Probleme mit Listbox Einträgen
Zitat:
Der fehler wird bei
Delphi-Quellcode:
angezeigt.
Err := ShellExecute(Form2.Handle,
|
Re: Probleme mit Listbox Einträgen
Siehe Deddys Edit. Hätte ich auch drauf kommen können :wall:
|
Re: Probleme mit Listbox Einträgen
Hab ich ganz vergessen zu erwähnen, das hab ich schon ausprobiert. Es passiert nichts. :|
EDIT: wenn ich shellexecute so umschreibe, bekomme ich wieder "Fehler bei der Bereichsprüfung":
Delphi-Quellcode:
mach ich es jedoch mit Hochkomma, wird der aktuelle Projektordner im Explorer geöffnet, schonmal etwas....aber wieso gerade der Projektordner?
begin
Err:= ShellExecute (0, NIL, NIL, 'open', PChar(MeinArray[lIndex].RealFileName), SW_SHOWNORMAL); ich verstehe nicht woran es liegen könnte..... |
Re: Probleme mit Listbox Einträgen
Dann lass Dir MeinArray[lIndex].RealFileName doch mal mit ShowMessage ausgeben, irgendwas in Richtung falscher Eintrag wird es ja vermutlich sein.
|
Re: Probleme mit Listbox Einträgen
also, wenn ich ShellExecute so aufrufe, mit einem Absoluten Pfad, funktionert es.
Delphi-Quellcode:
if Err = 0 then
ShellExecute (Form2.Handle, 'open', Pchar('C:\Windows\Notepad.exe'), //zB. Nil, Nil, SW_NORMAL); Hat das vielleicht damit zutun, das ich 2 Formulare nutze, und in beiden sind die variablen für das Array definiert? Weil ich muss ja die daten aus dem 2ten Formular (Edit) ins 1te Formular einfügen (Listbox) In beiden Formularen sind die Typen deklariert:
Delphi-Quellcode:
in Form2 siehts so aus, um den Namen aus dem Editfeld in die Listbox in Formular 1 einzufügen:
type
TFilenameInfos = record RealFileName: String; DisplayName: String; end;
Delphi-Quellcode:
das ist dann der ablauf von Shellexecute, um einen Eintrag der Listbox in Formular 1 zu starten:
procedure TForm4.Button1Click(Sender: TObject);
var IconIndex : Integer; h : hIcon; S : String; Icon : TIcon; Bitmap : TBitmap; OpenDialog : TOpenDialog; lIndex: Integer; begin if (Edit1.Text = '') then begin ShowMessage('Bitte geben sie einen Namen ein.'); exit; end else Form2.ImageList1.GetIcon(0, Icon); Form2.Image1.Canvas.Draw(0, 0, Icon); lIndex := Length(MeinArray); SetLength(MeinArray, lIndex + 1); MeinArray[lIndex].RealFileName := Form2.OpenDialog1.FileName; MeinArray[lIndex].DisplayName := Form4.Edit1.Text; Form2.ListBox1.Items.Add(MeinArray[lIndex].DisplayName); Form2.ListBox1.MultiSelect :=False; Form2.ListBox1.Sorted :=True; Form2.Label2.Caption := Form4.Edit1.Text; Icon := TIcon.Create; IconIndex := 0; S := OpenDialog.FileName; h := IconFromFile(OpenDialog.FileName,0); Form2.ImageList1.AddIcon (Icon); with Form2.Image1.Canvas Do DrawIconEx(Handle, 0, 0,h, 32, 32, 0, Brush.Handle, di_Normal); begin Form4.Close; Edit1.Clear; FreeAndNil(Icon); end; end;
Delphi-Quellcode:
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; begin if Err = 0 then ShellExecute (Form2.Handle, 'open', Pchar('MeinArray[lIndex].RealFileName'), // absoluter Pfad funktioniert, nur ein Eintrag aus dem Array nicht.... Nil, Nil, SW_NORMAL); if Err <= 32 then Showmessage(ShellExecuteErrMessage(Err)); end; Aber wieso wird nicht
Delphi-Quellcode:
geladen wenn ich das da einfüge?
MeinArray[lIndex].RealFileName
Ich weiß nicht wo ich nach dem fehler suchen soll.... :pale: |
Re: Probleme mit Listbox Einträgen
Hast Du denn mal gemacht, was ich Dir geraten habe?
Delphi-Quellcode:
ist Quatsch, die Hochkommata müssen da raus. Und lass Dir mal den Eintrag ausgeben (ShowMessage), dann siehst Du sofort, ob das passt. Außerdem würde ich für Typen, die ich in mehreren Formularen brauche, eine eigene Unit anlegen und in allen Formularunits einbinden, die diese Typen verwenden.
Pchar('MeinArray[lIndex].RealFileName')
|
Re: Probleme mit Listbox Einträgen
Nein, tut mir leid. Hab ich vergessen.
meinst du das wenn eigentlich Shellexecute ausgeführt werden soll, ein Showmessage kommt? also:
Delphi-Quellcode:
oder hab ich dich falsch verstanden?
if Err = 0 then
ShowMessage(MeinArray[lIndex].RealFileName); end; |
Re: Probleme mit Listbox Einträgen
Nochmal zum Mitschreiben: bevor Du versuchst, das Programm zu starten, schau doch mal in der Testphase mit ShowMessage nach, was eigentlich in dem String drinsteht, den Du an ShellExecute übergeben willst.
Delphi-Quellcode:
ShowMessage(MeinArray[lIndex].RealFileName); //nur zur Kontrolle
Err := ShellExecute(Form2.Handle, 'open', Pchar(MeinArray[lIndex].RealFileName), NIL, NIL, SW_SHOWNORMAL); if Err < 33 then Showmessage(ShellExecuteErrMessage(Err)); |
Re: Probleme mit Listbox Einträgen
Der Showmessage Dialog wird nicht angezeigt.
Es wird lediglich
Delphi-Quellcode:
angezeigt, also eine von den definierten Shellexecute Fehlermeldungen.
'Zuwenig Speicher, ausführbare Datei war zerstört, Relokationswerte waren ungültig'
|
Re: Probleme mit Listbox Einträgen
Hast Du meinen Code aus dem letzten Post genauso übernommen?
|
Re: Probleme mit Listbox Einträgen
jap, zu 100%.hab den gerade nochmal kopiert und eingefügt.
Ohne Hochkomma bekomme ich "Fehler bei der Bereichsprüfung" und mit Hochkomma die Shellexecute Errormessage 0. |
Re: Probleme mit Listbox Einträgen
Welcher Source ist den jetzt der aktuelle? :roteyes:
|
Re: Probleme mit Listbox Einträgen
Uns wird nichts anderes übrig bleiben als TForm2.Button2Click nochmal durchzugehen.
|
Re: Probleme mit Listbox Einträgen
hier der aktuelle code:
Delphi-Quellcode:
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; begin ShowMessage(MeinArray[lIndex].RealFileName); //nur zur Kontrolle Err := ShellExecute(Form2.Handle, 'open', Pchar(MeinArray[lIndex].RealFileName), NIL, NIL, SW_SHOWNORMAL); if Err < 33 then Showmessage(ShellExecuteErrMessage(Err)); end; |
Re: Probleme mit Listbox Einträgen
Welchen Wert hat lIndex?
|
Re: Probleme mit Listbox Einträgen
Und was zeigt das ShowMessage an?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:25 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