Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Probleme mit Listbox Einträgen (https://www.delphipraxis.net/115832-probleme-mit-listbox-eintraegen.html)

Johnny Bravo 18. Jun 2008 16:49


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:

DeddyH 18. Jun 2008 16:55

Re: Probleme mit Listbox Einträgen
 
Die ListItems verfügen auch über eine Eigenschaft Objects. Da könntest Du den Originalnamen ablegen.

SirThornberry 18. Jun 2008 16:56

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:

Also, das der "Ersatznamen" in der Listbox dann angezeigt wird, aber dazugehörige Pfad unsichtbar gespeichert wird.
Also den dazugehörigen Pfad in einem Array, einer Liste etc. speichern.
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.

Johnny Bravo 18. Jun 2008 17:41

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:
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;
Könntet ihr mir ein Beispiel mit den ListItem.Objects oder dem Array geben?
Hab gerade schwierigkeiten das umzusetzen und zu realisieren.... :gruebel:

SirThornberry 18. Jun 2008 18:23

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;

Johnny Bravo 18. Jun 2008 20:45

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:
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;
was hab ich falsch gemacht?

SirThornberry 18. Jun 2008 21:16

Re: Probleme mit Listbox Einträgen
 
Könntest du bitte die vollständige Fehlermeldung posten und angeben bei welcher Anweisung diese kommt?

Johnny Bravo 18. Jun 2008 21:30

Re: Probleme mit Listbox Einträgen
 
natürlich.

Zitat:

Im Project Test1.exe ist eine Exception der Klasse EAccessViolation mit der Meldung "Zugriffsverletzung bei Adresse 0048BE8E in Modul Test1.Exe". Lesen von Adresse 00000000 aufgetreten.
der fehler tritt bei
Delphi-Quellcode:
if OpenDialog1.Execute() then
auf.

mkinzler 18. Jun 2008 21:39

Re: Probleme mit Listbox Einträgen
 
Existiert den eine Instanz des Dialogs?

Johnny Bravo 18. Jun 2008 22:15

Re: Probleme mit Listbox Einträgen
 
habs so mal versucht:
Delphi-Quellcode:
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;
da bekomme ich in der selben zeile den selben fehler bei adresse 0048BEE1.....

mkinzler 18. Jun 2008 22:16

Re: Probleme mit Listbox Einträgen
 
Delphi-Quellcode:
if OpenDialog.Execute then

calculon 18. Jun 2008 22:39

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 Link und das hab' ich mal auf dein Problem übertragen:

Delphi-Quellcode:
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.
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".

Gruß
--

€: Christian Seehase's Hinweise übernommen...

Christian Seehase 18. Jun 2008 22:59

Re: Probleme mit Listbox Einträgen
 
Moin Calculon,

dann nimm doch string statt string[255].

Was mir noch aufgefallen ist:

Delphi-Quellcode:
faAnyFile - faDirectory
Auch wenn es hier keine Auswirkung hat:
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:
faAnyFile and not faDirectory
Das hier
Delphi-Quellcode:
(SR.Attr <> faDirectory)
ist nicht so besonders sinnvoll, da Du mal davon ausgehen kannst, dass SR.Attr noch mehr enthalten kann als faDirectory

Delphi-Quellcode:
(SR.Attr and faDirectory) = 0
wäre hier sinnvoller.

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.

calculon 18. Jun 2008 23:19

Re: Probleme mit Listbox Einträgen
 
Hallo Christian,

Zitat:

Zitat von Christian Seehase
Moin Calculon,

dann nimm doch string statt string[255].

Ja, das hatte ich probiert, aber ich war mir nicht sicher, ob das korrekt ist, da doch dann die Information beim Casten über die Länge fehlt :gruebel: , oder wird da ganz C-isch auf "\0" gekuckt?

Wegen den restlichen Hinweisen: *DieSchuldWeiterSchieb* Hatte nur schnell nach einer Scan-Funktion gegoogelt :coder: . Ich benutze sonst ganz andere Routinen, die aber viel zu lang wären, um sie für das kleine Beispiel zu benutzen...

Gruß
--

Christian Seehase 18. Jun 2008 23:39

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:

Zitat von calculon
Wegen den restlichen Hinweisen: *DieSchuldWeiterSchieb*

Soviel zu Copy&Paste. Es kann nie schaden auch zu verstehen, was man da nutzt ;-)

calculon 18. Jun 2008 23:52

Re: Probleme mit Listbox Einträgen
 
Zitat:

Zitat von Christian Seehase
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.

Wow, vielen Dank für die Erklärung. Hab' ich nicht gewusst!

Zitat:

Zitat von Christian Seehase
Soviel zu Copy&amp;Paste. Es kann nie schaden auch zu verstehen, was man da nutzt ;-)

Äh http://www.cosgan.de/images/smilie/konfus/d025.gif

Gruß^^
--

Johnny Bravo 19. Jun 2008 17:13

Re: Probleme mit Listbox Einträgen
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
if OpenDialog.Execute then

danke, hab das total übersehen. Leider funktioniert es trotzdem nicht.
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?

mkinzler 19. Jun 2008 17:21

Re: Probleme mit Listbox Einträgen
 
Jag das Programm mal durch den Debugger

DeddyH 19. Jun 2008 17:22

Re: Probleme mit Listbox Einträgen
 
Und der aktuelle Quälcode wäre auch mal ganz interessant.

Johnny Bravo 20. Jun 2008 19:09

Re: Probleme mit Listbox Einträgen
 
So, hier der Code.

Mit dieser Prozedur wird das "Datei Öffnen" Fenster gestartet:

Delphi-Quellcode:
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;
mit dieser Prozedur soll dann das ausgwählte Listbox Item gestartet werden:

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;
  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;
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.

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...

DeddyH 20. Jun 2008 19:15

Re: Probleme mit Listbox Einträgen
 
Moment, die Items sind doch schon in der Listbox enthalten, oder? Dann ist die ganze Passage
Zitat:

Delphi-Quellcode:
  if OpenDialog1.Execute() then // wenn ich hier die 1 entferne, und oben ebenfalls, gibts wieder einen Laufzeitfehler.
  begin
    lIndex := Length(MeinArray);
    Form4.Show; // Das ist das 2te Formular, in der man den ALternativnamen eingibt.
    SetLength(MeinArray, lIndex + 1);
    MeinArray[lIndex].RealFileName := OpenDialog1.FileName;
    MeinArray[lIndex].DisplayName := Form4.Edit1.Text;
    ListBox1.Items.Add(MeinArray[lIndex].DisplayName);
  end;

doch Grütze, da Du hier wieder den OpenDialog aufrufst und das Item hinzufügst. Außerdem fehlt hiervor irgendwie ein Aufruf von ShellExecute.
Zitat:

Delphi-Quellcode:
  if Err <= 32 then
      Showmessage(ShellExecuteErrMessage(Err));

Err ist gar nicht initialisiert, was soll denn da kommen? Das soll doch den Rückgabewert von ShellExecute aufnehmen, oder täusche ich mich?

Johnny Bravo 20. Jun 2008 20:31

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:
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;
wie gesagt,sobald ein eintrag in der Listbox drin ist, und gestartet werden soll, passiert nichts, aber auch rein gar nichts.

EDIT: Habs schon mit Application.Handle und SW_NORMAL versucht, ohne erfolg.

Fussball-Robby 20. Jun 2008 20:35

Re: Probleme mit Listbox Einträgen
 
Schonmal den Rückgabewert von ShellExecute anzeigen lassen?

DeddyH 20. Jun 2008 20:39

Re: Probleme mit Listbox Einträgen
 
Wie wäre es denn so?
Delphi-Quellcode:
Err := ShellExecute(Form2.Handle,
      'open',
      Pchar('MeinArray[lIndex].RealFileName'),
      NIL,
      NIL,
      SW_SHOWNORMAL);
  if Err < 33 then
    Showmessage(ShellExecuteErrMessage(Err));
[edit] :wall: Nimm mal die Hochkommata im 3. Parameter raus:
Delphi-Quellcode:
Pchar('MeinArray[lIndex].RealFileName')
--> Pchar(MeinArray[lIndex].RealFileName)
[/edit]

Johnny Bravo 20. Jun 2008 21:16

Re: Probleme mit Listbox Einträgen
 
Zitat:

Zitat von DeddyH
Wie wäre es denn so?
Delphi-Quellcode:
Err := ShellExecute(Form2.Handle,
      'open',
      Pchar('MeinArray[lIndex].RealFileName'),
      NIL,
      NIL,
      SW_SHOWNORMAL);
  if Err < 33 then
    Showmessage(ShellExecuteErrMessage(Err));

damit bekomme ich ERangeError "Fehler bei der Bereichsprüfung".
Der fehler wird bei
Delphi-Quellcode:
Err := ShellExecute(Form2.Handle,
angezeigt.

Fussball-Robby 20. Jun 2008 21:19

Re: Probleme mit Listbox Einträgen
 
Siehe Deddys Edit. Hätte ich auch drauf kommen können :wall:

Johnny Bravo 21. Jun 2008 11:10

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:
begin
 Err:= ShellExecute (0,
               NIL,
               NIL,
               'open',
               PChar(MeinArray[lIndex].RealFileName),
               SW_SHOWNORMAL);
mach ich es jedoch mit Hochkomma, wird der aktuelle Projektordner im Explorer geöffnet, schonmal etwas....aber wieso gerade der Projektordner?

ich verstehe nicht woran es liegen könnte.....

DeddyH 21. Jun 2008 11:38

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.

Johnny Bravo 21. Jun 2008 18:39

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:
type
    TFilenameInfos = record
    RealFileName: String;
    DisplayName: String;
    end;
in Form2 siehts so aus, um den Namen aus dem Editfeld in die Listbox in Formular 1 einzufügen:

Delphi-Quellcode:
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;
das ist dann der ablauf von Shellexecute, um einen Eintrag der Listbox in Formular 1 zu starten:
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:
MeinArray[lIndex].RealFileName
geladen wenn ich das da einfüge?
Ich weiß nicht wo ich nach dem fehler suchen soll.... :pale:

DeddyH 21. Jun 2008 18:42

Re: Probleme mit Listbox Einträgen
 
Hast Du denn mal gemacht, was ich Dir geraten habe?
Delphi-Quellcode:
Pchar('MeinArray[lIndex].RealFileName')
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.

Johnny Bravo 21. Jun 2008 19:05

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:
 if Err = 0 then
ShowMessage(MeinArray[lIndex].RealFileName);
end;
oder hab ich dich falsch verstanden?

DeddyH 21. Jun 2008 19:09

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));

Johnny Bravo 21. Jun 2008 19:34

Re: Probleme mit Listbox Einträgen
 
Der Showmessage Dialog wird nicht angezeigt.
Es wird lediglich
Delphi-Quellcode:
'Zuwenig Speicher, ausführbare Datei war zerstört, Relokationswerte waren ungültig'
angezeigt, also eine von den definierten Shellexecute Fehlermeldungen.

DeddyH 21. Jun 2008 19:35

Re: Probleme mit Listbox Einträgen
 
Hast Du meinen Code aus dem letzten Post genauso übernommen?

Johnny Bravo 21. Jun 2008 19:58

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.

Die Muhkuh 21. Jun 2008 20:01

Re: Probleme mit Listbox Einträgen
 
Welcher Source ist den jetzt der aktuelle? :roteyes:

DeddyH 21. Jun 2008 20:01

Re: Probleme mit Listbox Einträgen
 
Uns wird nichts anderes übrig bleiben als TForm2.Button2Click nochmal durchzugehen.

Johnny Bravo 21. Jun 2008 20:16

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;

DeddyH 21. Jun 2008 20:18

Re: Probleme mit Listbox Einträgen
 
Welchen Wert hat lIndex?

Die Muhkuh 21. Jun 2008 20:21

Re: Probleme mit Listbox Einträgen
 
Und was zeigt das ShowMessage an?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz