Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ListView - mit Dateien füllen und auf Inhalt prüfen (https://www.delphipraxis.net/98957-listview-mit-dateien-fuellen-und-auf-inhalt-pruefen.html)

atgis 4. Sep 2007 15:58


ListView - mit Dateien füllen und auf Inhalt prüfen
 
Hi,

Also ich hab hier ein Problem. Undzwar will ich im Programm einen Ordner (Pfad) angeben. Der Inhalt des Ordners sind TXT-Dateien...die sollen nun in das ListView geladen werden. Soweit so gut. Das funktioniert schonmal...

Delphi-Quellcode:
procedure TForm1.ReadDir(WorkingDir: String);
var SearchRec : TSearchRec;

  procedure DoSomeThing(SearchRec : TSearchRec);
  var ListItem: TListItem;
  begin
   if FileExists(WorkingDir +SearchRec.name) then //Hier soll geprüft werden ob die TXT Datei Leer ist oder nicht...
   //PC'S
   begin
    ListItem:= ListView1.Items.Add;
    ListItem.Caption:=ChangeFileExt(searchrec.name,'');
    ListItem.ImageIndex:= 1;
   end
   else
   //leere Dateien
   begin
    ListItem:= ListView1.Items.Add;
    ListItem.Caption:=searchrec.name;
    ListItem.ImageIndex:= 0;
   end;
  end;

begin
  if WorkingDir[length(WorkingDir)] <> '\' then
    WorkingDir := WorkingDir + '\';
  if findfirst(WorkingDir + '*.*', faanyfile, SearchRec) = 0 then
  repeat
    if searchrec.name[1] <> '.' then
    begin
      StatusBar1.Panels[3].text := WorkingDir + searchrec.Name;
      if ((searchrec.attr and fadirectory) <> fadirectory) then
      begin

        if fileexists(WorkingDir + searchrec.name) then
        begin
          DoSomeThing(SearchRec);
        end else
        begin
          showmessage('Datei ' + WorkingDir + SearchRec.Name + ' konnte nicht gelesen werden');
        end;
      end else
        if cbRekursiv.Checked then
         ReadDir(WorkingDir + searchrec.name);
    end;
  until (findnext(searchrec) <> 0) or Application.Terminated;
  findclose(searchrec);
end;

//Menü Form2 öffnen zum Pfad eingeben
procedure TForm1.Verzeichnis1Click(Sender: TObject);
var workingdir: string;
begin
 if form2.ShowModal = mrOk then
 begin
   Workingdir:=form2.edPfad.text;
   ReadDir(workingdir);
 end
 else
end;
Aber mein Problem ist nun: TXT's mit einem Inhalt sollen ein PC-Symbol erhalten, leere TXT's ein anderes Symbol...Aber wie finde ich heraus ob die Datei leer ist? Ich hab im Quelltext die Stelle markiert, wo die Abfrage stehen sollte...

jfheins 4. Sep 2007 15:59

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Versuch doch mal, die Dateigröße abzufragen und auf 0 zu prüfen ;)

atgis 4. Sep 2007 16:08

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Ja das hab ich mir auch schon überlegt...aber das Searchrec.name ist immer nur der letzte Datei Name :?

http://img266.imageshack.us/img266/5...nnt1bs2.th.jpg
Delphi-Quellcode:
 StatusBar1.Panels[2].Text:=ChangeFileExt(ExtractFileName(ParamStr(0)),'');
Unten rechts in der Statusbar wird das Searchrec ausgegeben...

Kann mir bitte jemand helfen?!

xZise 4. Sep 2007 16:33

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Und wo ist das Problem?

Du überprüfst dass doch in einer Schleife.
".size" sollte dir die Größe zurückgeben.

atgis 4. Sep 2007 16:57

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Ok Danke! Hat geklappt...ich wusste das mit "size" nicht...
Delphi-Quellcode:
if SearchRec.size = 0 then
//Add Items
So und nun soll bei Doppelklick auf die Datei, der Inhalt in einem StringGrid in einem neuen Formular dargestellt werden...

Meine Überlegung wäre, dass man im Hauptprogramm erstmal die Form nur aufruft. Dann wird der Pfad der Datei aus dem Hauptprog geholt und der Inhalt im StringGrid geladen...

Christian Seehase 4. Sep 2007 17:05

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Moin atgis,

ich habe da noch einen kleinen Fehler in Deiner Routine gefunden:

Delphi-Quellcode:
if searchrec.name[1] <> '.' then
sollte besser

Delphi-Quellcode:
if (searchrec.name <> '.') and (searchrec.name <> '..') then
lauten.

. und .. sind spezielle Verzeichnisnamen, aber das Dateisystem erlaubt es, dass Dateien und Verzeichnisse mit einem Punkt anfangen, so dass mit Deiner Abfrage nicht nur die beiden Verzeichnisse ausgefiltert werden.

atgis 4. Sep 2007 18:55

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Danke!

Also nun zu der 2. Sache. Den Inhalt der TXT's ins StringGrid bekommen!

So rufe ich vom Hauptformular das neue Formular mit den StringGrid auf:
Delphi-Quellcode:
//Inhalt in StringGrid laden
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
try form3.show;
 except ShowMessage('Keine Datei gewählt');
end;
end;
So öffne ich die TXT's im StringGrid:
Delphi-Quellcode:
//TxT Datei öffnen
procedure TForm3.FormCreate(Sender: TObject);
var Datei: Textfile;
    ZeileIndex, SpalteIndex: integer;
    Zeile: string;
begin
  //Datei Lesen
  ShowMessage(ExtractFilePath(ParamStr(0))+'DATEN\');
  assignfile(Datei, ExtractFilePath(ParamStr(0))+'DATEN\'+Form1.ListView1.Selected.Caption+'.txt');
  reset(Datei);
  ZeileIndex:=0;
  while not EoF(Datei) do
   begin
    readln(Datei, Zeile);
    SpalteIndex:=0;
    while pos(chr(9), Zeile) <> 0 do
    begin
     sgInhalt.Cells[SpalteIndex, ZeileIndex]:=copy(Zeile ,1 ,pos(chr(9), Zeile)-1);
     delete(Zeile, 1, pos(chr(9), Zeile));
     inc(SpalteIndex);
    end;
  sgInhalt.Cells[SpalteIndex, ZeileIndex]:=Zeile;
  inc(ZeileIndex);
  //Tabelle automatisch um 1 Zeile erhöhen
  sgInhalt.RowCount:=sgInhalt.RowCount+1;
  end;
  CloseFile(Datei);

//letzte Zeile ist zuviel -> überstehende Zeile Löschen
sgInhalt.RowCount:=sgInhalt.RowCount-1;
end;
Doch leider funzt es nicht so wie es soll. Ich will ja wenn ich auf ein Symbol z.b. mit den Namen LT-13-7-1 klicke...die TXT LT-13-7-1.txt im StringGrid angezeigt bekommen!

Ich dachte es funktioniert mit den gerade ausgewählten "Symbolnamen":
Delphi-Quellcode:
Form1.ListView1.Selected.Caption
aber geht auch nicht!

Wie kann ich den jeweiligen Namen herausfinden?

mkinzler 4. Sep 2007 19:15

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Delphi-Quellcode:
Form1.ListView1.Items[Form1.ListView1.Selected].Caption;

atgis 4. Sep 2007 19:29

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Geht leider nicht: Inkompatible Typen Integer und TListItem! :(

Delphi-Quellcode:
//TxT Datei öffnen
procedure TForm3.FormCreate(Sender: TObject);
var Datei: Textfile;
    ZeileIndex, SpalteIndex: integer;
    Zeile: string;
begin
  //ShowMessage(ExtractFilePath(ParamStr(0))+'DATEN\');
  assignfile(Datei, ExtractFilePath(ParamStr(0))+'DATEN\'+Form1.ListView1.Items[Form1.ListView1.Selected].Caption);
  reset(Datei);
  ZeileIndex:=0;
  while not EoF(Datei) do
   begin
    readln(Datei, Zeile);
    SpalteIndex:=0;
    while pos(chr(9), Zeile) <> 0 do
    begin
     sgInhalt.Cells[SpalteIndex, ZeileIndex]:=copy(Zeile ,1 ,pos(chr(9), Zeile)-1);
     delete(Zeile, 1, pos(chr(9), Zeile));
     inc(SpalteIndex);
    end;
  sgInhalt.Cells[SpalteIndex, ZeileIndex]:=Zeile;
  inc(ZeileIndex);
  //Tabelle automatisch um 1 Zeile erhöhen
  sgInhalt.RowCount:=sgInhalt.RowCount+1;
  end;
  CloseFile(Datei);

//letzte Zeile ist zuviel -> überstehende Zeile Löschen
sgInhalt.RowCount:=sgInhalt.RowCount-1;
end;

mkinzler 4. Sep 2007 19:37

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
.Selected ist ja schon ein TListItem.

atgis 4. Sep 2007 20:39

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Also wie bekomm ich den Namen des "Symbols" in die andere Form, dass ich die TXT im StringGrid öffnen kann?

Mit dem Selektierten Item klappt irgendwie nicht...

Hat den keiner eine Idee :?

atgis 5. Sep 2007 11:13

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Es soll also auf Doppelklick eines Symbols der Inhalt der jeweiligen TXT im StringGrid angezeigt werden.
http://img510.imageshack.us/img510/5...nnt1oj4.th.jpg

Doch wie bekomme ich den Selektierten Dateinamen in das StringGrid?
Delphi-Quellcode:
//TxT Datei öffnen
procedure TForm3.FormCreate(Sender: TObject);
var Datei: Textfile;
    ZeileIndex, SpalteIndex: integer;
    Zeile: string;
begin
  //ShowMessage(ExtractFilePath(ParamStr(0))+'DATEN\');
  assignfile(Datei, ExtractFilePath(ParamStr(0))+'DATEN\'+****HIER DATEINAME DES LISTVIEW ITEM****);
  reset(Datei);
  ZeileIndex:=0;
  while not EoF(Datei) do
   begin
    readln(Datei, Zeile);
    SpalteIndex:=0;
    while pos(chr(9), Zeile) <> 0 do
    begin
     sgInhalt.Cells[SpalteIndex, ZeileIndex]:=copy(Zeile ,1 ,pos(chr(9), Zeile)-1);
     delete(Zeile, 1, pos(chr(9), Zeile));
     inc(SpalteIndex);
    end;
  sgInhalt.Cells[SpalteIndex, ZeileIndex]:=Zeile;
  inc(ZeileIndex);
  //Tabelle automatisch um 1 Zeile erhöhen
  sgInhalt.RowCount:=sgInhalt.RowCount+1;
  end;
  CloseFile(Datei);

//letzte Zeile ist zuviel -> überstehende Zeile Löschen
sgInhalt.RowCount:=sgInhalt.RowCount-1;
end;

atgis 6. Sep 2007 15:22

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Kann mir den keiner helfen?

Christian Seehase 6. Sep 2007 16:19

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Moin atgis,

ersetze mal

****HIER DATEINAME DES LISTVIEW ITEM****

durch

Form1.ListView1.Selected.Caption

Dann lege mal einen Breakpoint auf die Zeile, und schau Dir an, was da drin steht.
Wenn OK (wovon auszugehen ist) kannst Du dann mal im Einzelschritt (F7) durchgehen, wo's hakt.

BTW:

Delphi-Quellcode:
//Inhalt in StringGrid laden
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
try form3.show;
except ShowMessage('Keine Datei gewählt');
end;
end;
finde ich nicht so schön.
try/except sollte man nur sehr sparsam einsetzen, und nur dann, wenn es wirklich nicht anders geht.

Wenn Du es, z.B., so machst, wird der Code sauberer.

Delphi-Quellcode:
//Inhalt in StringGrid laden
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
  if not Assigned(Form1.ListView1.Selected) then exit;
  form3.show; // evtl. auch ShowModal
end;

atgis 6. Sep 2007 16:31

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Zitat:

Zitat von Christian Seehase
Moin atgis,

ersetze mal

****HIER DATEINAME DES LISTVIEW ITEM****

durch

Form1.ListView1.Selected.Caption

Genau das hab ich ja schonmal versucht! Man denkt, dass sollte klappen...aber ich bekomm beim Compilieren immer eine Exception!
http://img253.imageshack.us/img253/7...tmapis9.th.jpg
Wenn ich den Dateinamen Fest eingeb, also Pfad\blablalb\LT-13-7-1.txt funktioniert es natürlich...aber es öffnet halt immer die selbe Datei...das will ich ja nicht :zwinker:


EDIT: Die Exception wird wohl dadurch kommen, weil ja noch gar kein Symbol Selektiert werden konnte. Geht ja auch schlecht, wenn das Programm nicht starten kann...

Man müsste quasi unterbinden, dass diese Form (Form3) mit den StringGrid beim Programmstart mit geladen wird...oder so ähnlich.


EDIT2: Ja es liegt daran, dass noch kein Symbol augewählt werden konnte...mh wie löse ich das Problem?

Christian Seehase 6. Sep 2007 16:42

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Moin atgis,

das ist aber äusserst seltsam. :gruebel:
Wenn Du einen Doppelclick auf einen ListView machst, enthält Selected entweder nil oder die Adresse des ListItems, auf das der DoppelClick gemacht wurde.
Vielleicht solltest Du mal Dein ganzes Projekt hier anhängen (am Besten in einem Archiv, ohne DCU, EXE), denn so kann ich mir den Fehler nicht erklären.

Zitat:

Zitat von atgis
Man müsste quasi unterbinden, dass diese Form (Form3) mit den StringGrid beim Programmstart mit geladen wird...oder so ähnlich.

hast Du denn auch mal die DoppelClick-Routine angepasst?

DeddyH 6. Sep 2007 16:56

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Zitat:

Zitat von Christian Seehase
Vielleicht solltest Du mal Dein ganzes Projekt hier anhängen

Dasselbe wollte ich auch gerade vorschlagen ;)

Christian Seehase 6. Sep 2007 17:01

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Moin atgis,

Zitat:

Zitat von Christian Seehase
hast Du denn auch mal die DoppelClick-Routine angepasst?

Zitat:

Zitat von atgis
EDIT2: Ja es liegt daran, dass noch kein Symbol augewählt werden konnte...mh wie löse ich das Problem?

Womit die Anwort auf meine Frage wohl "Nein" lauten dürfte ;-)

atgis 6. Sep 2007 19:40

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Doch ich hab es so angepasst wie du es Vorgeschlagen hast! Also ich weiß nicht ob ichs richtig beschrieben hab...Der Name der Datei, die im StringGrid geöffnet werden soll - soll sich aus dem Selektierten Item (Symbol) ergeben...

Aber der Compiler spuckt mich an, weil er sozusagen den Namen beim Programmstart nicht findet! Ist ja auch klar, weil noch keine Dateien ins ListView geladen wurden...

Ich hab mal zum testen ein festes Item in das ListView eingetragen und es test genannt. Mit SelectAll; das Item beim Programmstart Selektiert. Dann eine Datei in test.txt angelegt...Compiliert - funktioniert! Aber nun öffnet es eben immer tes.txt - egal auf welches Item ich Doppelklick...

Ich hoffe jetzt ist es Deutlich...

Programm siehe Anhang :stupid:

Christian Seehase 6. Sep 2007 23:31

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Moin atgis,

jetzt hab' ich's gefunden. Warum hab' ich das nicht eher gesehen :wall: (stand ja schon die ganze Zeit so im Thread)

Da Du im OnCreate des Form3 versuchst die Datei zu laden, passiert dies auch beim Programmstart, da das Formular ja schon zu diesem Zeitpunkt erzeugt wird.
Da fallen mir so spontan zwei Lösungsansätze ein:
Du verlegst das Ganze vom OnCreate in das OnShow des Form3

Du erzeugst das Form3 dynamisch (wobei spätestens dann die Verwendung von ShowModal sinnvoll wäre).

Mackhack 6. Sep 2007 23:33

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Kannst auch eine ueberladene Version von ShowModal schreiben und darin dann das Selected Item uebergeben!

atgis 7. Sep 2007 08:50

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Zitat:

Zitat von Christian Seehase
Du verlegst das Ganze vom OnCreate in das OnShow des Form3

Jo, Danke das hat geklappt! Aber ein Fehler ist noch drin. Die txt Dateien die Leer sind (die auch ein anderes Symbol haben) werden nicht "leer" in dem StrinGrid geöffnet...

Also wenn ich das Prog starte und auf irgendeine TXT (mit PC Symbol) Doppelklicke - wird diese geöffnet! Soweit so gut...

Jetzt klicke ich auf eine Leere Datei (mit Leer Symbol) - es wird eine andere TXT geöffnet :?
http://img513.imageshack.us/img513/7...nnt1ob6.th.jpg
(geklickt auf Leer Datei -> angezeigt wird aber eine Datei die zuvor schonmal geöffnet wurde)

Starte ich das Prog und klicke nur auf eine Leer Datei (zuvor auf keine andere) funktioniert es...

EDIT: Noch was anderes. Man kann die Form3 doch auch so
Delphi-Quellcode:
  if form1.listview1.SelCount=1 then
  form3.ShowModal;
aufrufen? Oder?

DeddyH 7. Sep 2007 09:27

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Tritt der Effekt auch dann auf, wenn Du erst eine "große" und dann eine "kleine" (weniger Zeilen) Datei lädst?

atgis 7. Sep 2007 11:30

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Zitat:

Zitat von DeddyH
Tritt der Effekt auch dann auf, wenn Du erst eine "große" und dann eine "kleine" (weniger Zeilen) Datei lädst?

Ich verstehe die frage nicht so recht...ob es nun wenig oder viele Zeilen in der Datei gibt, ist egal.

Ich habe eine Datei LEER.txt...da sind nur einpaar Absätze enthalten...starte ich das Prog und öffne irgendeine Datei mit Inhalt - danach die LEER.txt...sieht es so aus:
http://img249.imageshack.us/img249/3...nnt2lj9.th.jpg

Es übernimmt die Absätze der LEER.txt und danach Inhalt, aus der zuvor ausgewählten TXT :roll: :?

DeddyH 7. Sep 2007 12:13

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Ich hatte deshalb gefragt, weil ich den Verdacht habe, dass Du die StringGrid vor dem Laden der Datei nicht leerst.

atgis 7. Sep 2007 12:45

Re: ListView - mit Dateien füllen und auf Inhalt prüfen
 
Uff! Danke :shock:...genau daran lags

Ich hab bevor die Datein geladen werden, folgende Zeilen gepackt:
Delphi-Quellcode:
 //StringGrid entleeren
 for ZeileIndex := 0 to sgInhalt.RowCount - 1 do
  sgInhalt.Rows[ZeileIndex].Clear();
Jetzt funktioniert es! Danke an alle, ihr habt mir echt geholfen...

Ich hab aber noch eine frage: Gibt es eine Möglichkeit die Items in der Reportansicht zu "gruppieren"? Nach "leere" txt's und welche mit "Inhalt"? So ähnlich wie man bei Windows nach Typ gruppieren kann...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 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