AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Listbox Einträgen

Ein Thema von Johnny Bravo · begonnen am 18. Jun 2008 · letzter Beitrag vom 2. Jul 2008
Antwort Antwort
Seite 2 von 12     12 34     Letzte »    
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Probleme mit Listbox Einträgen

  Alt 18. Jun 2008, 22:16
if OpenDialog.Execute then
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#12

Re: Probleme mit Listbox Einträgen

  Alt 18. Jun 2008, 22:39
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...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: Probleme mit Listbox Einträgen

  Alt 18. Jun 2008, 22:59
Moin Calculon,

dann nimm doch string statt string[255].

Was mir noch aufgefallen ist:

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)

faAnyFile and not faDirectory Das hier
(SR.Attr <> faDirectory) ist nicht so besonders sinnvoll, da Du mal davon ausgehen kannst, dass SR.Attr noch mehr enthalten kann als faDirectory

(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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#14

Re: Probleme mit Listbox Einträgen

  Alt 18. Jun 2008, 23:19
Hallo Christian,

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 , oder wird da ganz C-isch auf "\0" gekuckt?

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

Gruß
--
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Probleme mit Listbox Einträgen

  Alt 18. Jun 2008, 23:39
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 von calculon:
Wegen den restlichen Hinweisen: *DieSchuldWeiterSchieb*
Soviel zu Copy&Paste. Es kann nie schaden auch zu verstehen, was man da nutzt
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#16

Re: Probleme mit Listbox Einträgen

  Alt 18. Jun 2008, 23:52
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 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ß^^
--
  Mit Zitat antworten Zitat
Johnny Bravo

Registriert seit: 7. Jun 2008
75 Beiträge
 
#17

Re: Probleme mit Listbox Einträgen

  Alt 19. Jun 2008, 17:13
Zitat von mkinzler:
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Probleme mit Listbox Einträgen

  Alt 19. Jun 2008, 17:21
Jag das Programm mal durch den Debugger
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Probleme mit Listbox Einträgen

  Alt 19. Jun 2008, 17:22
Und der aktuelle Quälcode wäre auch mal ganz interessant.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Johnny Bravo

Registriert seit: 7. Jun 2008
75 Beiträge
 
#20

Re: Probleme mit Listbox Einträgen

  Alt 20. Jun 2008, 19:09
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

Ok. der Fehler ist schonmal weg. Doch Es öffnet sich leider immernoch kein programm...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 12     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 Uhr.
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