Delphi-PRAXiS
Seite 1 von 12  1 2311     Letzte »    

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr.
Seite 1 von 12  1 2311     Letzte »    

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