Delphi-PRAXiS
Seite 2 von 12     12 34     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)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 Uhr.
Seite 2 von 12     12 34     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