Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - ListBox Problem


Ralle23 - Mo 09.06.03 00:04
Titel: ListBox Problem
Hi leute,

Ich möchte in einer ListBox Datein (*.dat ) aus einem Ordner anzeigen lassen ohne Endung, wenn ich dann auf diese klicke sollen in den edit Fenster die entsprechenden Daten aus der Datei angezeigt werden. Ich benutze ein Typisierten Datein System.

Wie kann ich das am besten machen da ich mich mit den ListBoxen noch nicht so beschäftigt haben und nicht das richtige bisher finden konnte.

Beste Grüße


Hansi@OMG - Mo 09.06.03 09:19

Zum zeigen der Dateien, mit bestimmter Extension ohne Pfad und Extension in einer Listbox gibt es folgende Möglichkeit, musst du dir nur modifizieren.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
{
  Alle Dateien mit bestimmter Erweiterung
  ohne Pfad und Extension in ListBox laden
}


unit loadfiles;

interface

uses
  classes, sysutils, Windows, ShellAPI;


function ListFilesRecursive(Path, Mask: String; ShowPath: Boolean): TStringList;
function ExtractPureFilename(Name: String): String;
function StringCountInStr(SubStr, Str: String): Integer;
function SubPositionByIndex(Str, SubStr: String; Index: Integer): Integer;
function StrLeft(Str: String; Count: Integer): String;


implementation



function ListFilesRecursive(Path, Mask: String; ShowPath: Boolean): TStringList;
var SR: TSearchRec;
    Erg, I: Integer;
    RelDir, TempStr : String;
    TempList: TStringList;
begin
   IncludeTrailingPathDelimiter(Path);
   RelDir := ExtractFilePath(Mask);
   Mask := ExtractFileName(Mask);
   result:= TStringList.Create;
   TempList:= TStringList.Create;
   Erg := FindFirst(Path+RelDir+'*.*', faDirectory, SR);
   while Erg = 0 do
   begin
      if (SR.attr and faDirectory) <> 0 then
         if SR.Name[1] <> '.' then begin
            TempList.Assign(ListFilesRecursive(Path, RelDir+SR.Name+'\'+Mask, ShowPath));
            for I:= 0 to TempList.Count - 1 do begin
               TempStr:= TempList[I];
               if ShowPath and not (TempStr[2] = ':') then TempStr:= Path + TempStr;
               result.Add(TempList[I]);
            end;
         end;
      Erg := FindNext(SR);
   end;
   Erg := FindFirst(Path+RelDir+Mask, $27, SR);
   {Das Attribut $27 bedeutet
   alle echten Dateien}

   while Erg = 0 do
   begin
      if not ShowPath then
         result.Add(RelDir+SR.Name)
      else
      result.Add(Path+RelDir+SR.Name);
      Erg := FindNext(SR);
   end;
  // FindClose(SR);
   TempList.Free;
end;



//Extension abschneiden
function ExtractPureFilename(Name: String): String;
var
   Dots, DotPos: Integer;
begin
   Dots:= StringCountInStr('.', Name);
   DotPos:= SubPositionByIndex(Name, '.', Dots);
   result:= StrLeft(Name, DotPos - 1);
end;


function StringCountInStr(SubStr, Str: String): Integer;
var
   StrLn, SubLn, I: Integer;
   TempStr: String;
begin
   StrLn:= StrLen(PChar(Str));
   SubLn:= StrLen(PChar(SubStr));
   TempStr:= Str;
   result:= 0;
   for I:= 0 to StrLn - 1 do begin
      TempStr:= Copy(Str, I + 1, SubLn);
      if TempStr = SubStr then Inc(result);
   end;
end;


function SubPositionByIndex(Str, SubStr: String; Index: Integer): Integer;
var
   StrLn, SubLn, Lock, I: Integer;
   TempStr: String;
begin
   StrLn:= StrLen(PChar(Str));
   SubLn:= StrLen(PChar(SubStr));
   result:= 0;
   Lock:= 0;
   for I:= 0 to StrLn - 1 do begin
      TempStr:= Copy(Str, I + 1, SubLn);
      if TempStr = SubStr then Inc(Lock);
      if Lock = Index then begin
         result:= I + 1;
         break;
      end;
   end;
end;


function StrLeft(Str: String; Count: Integer): String;
begin
   result:= Copy(Str, 1, Count);
end;

end.
//------------------------U N I T ------- E N D E-------------------------------

//Aufruf mit

uses
  loadfiles;
  

procedure TForm1.ladetipps(Sender: TObject);
var
  path : string;
  stl  : TSTringList;
  i    : integer;
begin
  ListBox1.Clear;
  path := extractfilepath(paramstr(0))+'themen\'+combobox1.text+'\';
  stl := TStringList.Create;
  TRY
    STL.Assign(ListFilesRecursive(Path, '*.thm', false));

    for i := 0 to stl.Count - 1 do
    begin
      listbox1.Items.Add(ExtractPureFilename(stl.Strings[i]));
      listbox1.itemindex := listbox1.itemindex+1;
    end;
  FINALLY
   stl.free;
  end;
end;


Mit dem auslesen der Datei, das hab ich dir unten geschrieben, da würd ich dir empfehlen ein Memofeld zu nehmen, denn ein Editfeld hat nicht die Funktion .loadfromfile() . Du musst außerdem, den Pfad, zu den *.dat Dateien in einer globalen Variablen speichern, damit du diesen später wieder verwenden kannst.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.ListBox1Click(Sender: TObject);
var i : integer;
begin
i:=listbox1.ItemIndex; \\ Nummer des angeklickten Items
memo1.Lines.LoadFromFile(Pfadvariable+listbox1.Items[i]); \\Datei in Memofeld auslesen
end;


Ich hoffe, das löst dein Problem. :!:


Ralle23 - Mo 09.06.03 09:34

HI,

leider muß ich edit Felder benutzen. Ich erkläremal wo für ich das brauche.

Ich schreibe im moment eine Verwaltungssoftware für Züchter, wenn man auf den Button neu klickt wird ein Fenster geönffnet in dem man den Tiernamen angibt, nach dem ok wird eine leere name.dat erstellt.
Da die Angaben zu jedem Tiert nicht ganz so viel sind ( ca. 15 Felder ) habe ich mich für Typisierten Datei entschieden.

Ok, der Name wird dann in der Liste angezeigt und wenn ich auf diesen klicke möchte ich rechts wo die Editfelder dann die zugehörigen Daten eintragen.

Kann ich nicht von der ListBox den Dateinamen nicht nach hier übergeben lassen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormCreate(Sender: TObject);
begin
  AssignFile(datei,'liste.dat');
  if FileExists('liste.dat') then ReSet(datei)
  else ReWrite(datei);

end;


So das er hier z.b. immer die aktuell angeklickte Datei einfügt, dann sollten auch die EditFelder kein Problem sein.

Grüße Ralle


Moderiert von user profile icontommie-lie: Code- durch Delphi-Tags ersetzt


Hansi@OMG - Mo 09.06.03 12:03

Sorry, da kann ich dir nicht weiterhelfen, da musst du selbst ausprobieren.


Ralle23 - Mo 09.06.03 12:47

Jepp,

nur leider meckert er mir schon den Part mit clear an :-(

Grüße


Tino - Di 10.06.03 09:24

Ralle23 hat folgendes geschrieben:
nur leider meckert er mir schon den Part mit clear an :-(

Dann versuch es mal so:

Delphi-Quelltext
1:
Listbox1.Items.Clear;                    

Außerdem würde ich dir empfehlen die Hilfeseite von der ListBox Komponente mal anzuschauen. :wink:

Gruß
Tino


Ralle23 - Mi 11.06.03 14:57

Hallo.

ein weiteres Problem, wenn ich in der Liste noch nicht geklickt habe , wird keine Datei übergeben, wie kann ich es machen das direkt bei start die erste Datei aus der Liste gewählt wird.

Grüße

P.S. Sorry wenn ich nerve, aber es kann nur besser werden ;-)


Tino - Mi 11.06.03 15:05

Hallo!

Ralle23 hat folgendes geschrieben:
ein weiteres Problem

Ist das vorherige Problem gelöst?

Ralle23 hat folgendes geschrieben:
wie kann ich es machen das direkt bei start die erste Datei aus der Liste gewählt wird.

so:

Delphi-Quelltext
1:
ListBox1.ItemIndex := 0;                    


Ralle23 hat folgendes geschrieben:
P.S. Sorry wenn ich nerve, aber es kann nur besser werden ;-)

Du nervst nicht. Aber schau dir mal die Hilfe zu der Komponente Listbox an. Auch die möglichen Eigenschaften und Methoden... erst dann kann es nur besser werden :-D

Gruß
Tino


Ralle23 - Mi 11.06.03 15:55

Hi Tino,

jepp hab das Problem von vorher gelöscht, habe schon oft in die Hilfe geschaut. Nur leider bin ich wohl Blind, oder suche nach den Falschen Begriffen.

Grüße

P.S. Habe das ListBox1.ItemIndex := 0; versucht einzubauen beim aktivate Part nur leider geht es nicht, keine Ahnung mehr was ich sollen mach


Ralle23 - Do 12.06.03 18:17

Hi,

kann mir bitte nicht einer Helfen, ich bekomme das nicht hin das er direkt die erste wählt so das er direkt einen Übergabe an den Record macht.

Grüße Ralle


Tino - Fr 13.06.03 08:00

Ralle23 hat folgendes geschrieben:
ich bekomme das nicht hin das er direkt die erste wählt

Das geht wie oben schon geschrieben mit der Eigenschaft ItemIndex. Was genau funktioniert denn dabei nicht. Wo setzt du die Eigenschaft?
Ralle23 hat folgendes geschrieben:
so das er direkt einen Übergabe an den Record macht.

Das verstehe ich jetzt nicht!

Gruß
Tino


Ralle23 - Fr 13.06.03 08:07

Hi ich habe es im FormCreat nach dem die Listbox geschrieben worden ist.
Es passiert leider gar nichts.

Er soll wenn das Programm gestart wird direkt die erste Datei auswählen, so das der Nutzer nicht erst eine anklicken muß wenn das Programm gestartet hat.

Nur wie schon geschrieben es passiert nichts.

Grüße Ralle


Tino - Fr 13.06.03 10:08

Also ich habe ein Form erstellt und eine ListBox drauf gepackt. Die ListBox enthält mehrere Items. Im FormCreate-Event habe ich folgendes eingefügt:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.ItemIndex := 0;
end;

Bei mir ist beim anzeigen der Form das erste Item der ListBox markiert. Also das funktioniert auf jedenfall.

Hinweis: Das OnClick-Event der ListBox wird natürlich nicht beim manuellen setzen von ItemIndex ausgeführt.

Gruß
Tino


Ralle23 - Fr 13.06.03 10:19

Hi,

ja die erste Datei ist bei mir auch makiert, nur es wird in die edit Fenster nicht die Daten übernommen, dafür muß ich erst drauf klicken und das wollte ich nicht. Es sollen direkt die Daten angezeigt werden

Grüße


Tweafis - Fr 13.06.03 10:23

DAnn mahc in FormCreate


Delphi-Quelltext
1:
2:
Listbox1.ItemIndex := 0;
Listbox1.Click(Sender); // oder Listbox1OnClick(Sender);


Ralle23 - Fr 13.06.03 10:38

Hi,

leider bekommee ich da die Meldung undefenierter Bezeichner :-(

Grüße


Ralle23 - Fr 13.06.03 10:42

Ok, Fehler gefunden.
Dank euch allen erstmal

Grüße


Tino - Fr 13.06.03 10:47

Hallo!

Ralle23 hat folgendes geschrieben:
ja die erste Datei ist bei mir auch makiert,

Jetzt plötzlich doch? Wie komme ich darauf das Du geschrieben hast das das nicht so war ?!?!?!?
Ralle23 hat folgendes geschrieben:
[...]wie kann ich es machen das direkt bei start die erste Datei aus der Liste gewählt wird.[...]

[...]Habe das ListBox1.ItemIndex := 0; versucht einzubauen beim aktivate Part nur leider geht es nicht, keine Ahnung mehr was ich sollen mach

[...]ich bekomme das nicht hin das er direkt die erste wählt

Na ja, auch egal. :?

Ralle23 hat folgendes geschrieben:
dafür muß ich erst drauf klicken und das wollte ich nicht

Ich hab doch oben geschrieben das beim manuellen setzten von ItemIndex das OnClick-Event nicht ausgelöst wird. Du musst die On-Click Procedure nach dem setzen selbst aufrufen:

Delphi-Quelltext
1:
2:
ListBox1.ItemIndex := 0;
ListBox1Click (Self);

Gruß
Tino


Ralle23 - Fr 13.06.03 10:55

Na markiert war Sie schon, hab mich da wohl etwas schlecht ausgedrückt.
Hat halt nur die Datei nicht geladen, das meinte ich die ganze Zeit.

Grüße Ralle

P.S. Und nun weiter im meinem Chaos coden