Sorry, habe ich nicht erwähnt, aber alles andere ist geschehen, also:
Delphi-Quellcode:
Procedure THF.LvFilesData (Sender: TObject; Item: TListItem);
Var
FileObj: TFileObj;
Begin
FileObj := FileObjLst[Item.Index];
Item.Data := FileObj;
Item.Caption := FileObj.FileName; // NUR Dateiname (wird angezeigt)
Item.ImageIndex := FileObj.FileIcon; // Bildindex in Windows Hauptliste small images
Item.SubItems.Add (FileObj.FileLenS); // SubItem 0 - Dateigröße
Item.SubItems.Add (FileObj.FileType); // SubItem 1 - Dateitype
Item.SubItems.Add (FileObj.FileDatS); // Subitem 2 - Änderungsdatum
Item.SubItems.Add (FileObj.FileAttr); // SubItem 3 - Dateattribute
End;
und
Delphi-Quellcode:
Procedure THF.ReadFiles (Node: TTreeNode);
Var
FldrPath : String;
FileName : String;
FldrObj : TFldrObj;
FileArray: TStringDynArray;
ArrayIdx : Integer;
ArraySize: Integer;
FileCount: Integer;
FileObj : TFileObj;
FIdCnt : Integer;
sFileAttr: String;
lFileAttr: TFileAttributes;
// FileInfo : TSHFileInfo;
Begin
LogEnterMethod ('THF.ReadFiles');
// Vorbereitung ==============================
FileCount := 0; // Zählt die wirklich angezeigten Dateien
FldrObj := Node.Data; // Ordnerobjekt aus dem aktuellen Baumknoten extrahieren
FldrPath := FldrObj.AbsPathEx; // Absoluten Pfad des aktuellen Ordners bereitstellen (ohne \)
FileArray := TDirectory.GetFiles (FldrPath); // Unterordner ermitteln und in Array bereitstellen
ArraySize := Length (FileArray); // Anzahl der Unterordner
// alte Dateiliste durchlaufen und die enthaltnen Folder-Objekte vernichten
LvFiles.Items.BeginUpdate;
For FIdCnt := 0 To FileObjLst.Count - 1 Do // Dateiobjektliste durchgehen
Begin // alle Elemente
TFileObj (FileObjLst.Items[FIdCnt]).Destroy; // einzeln vernichten (jetzt Destroy, füher Free 2018-10-11)
End; // bis Ende
// Listelemente löschen
FileObjLst.Clear; // alle auf einmal
// Alle Dateien im Array durchgehen ...
For ArrayIdx := 0 To ArraySize - 1 Do // alle Dateien durchgehen
Begin // (die Arrayelemente enthalten den vollstämdigen Dateinamen = Pfad+Dateiname
FileName := FileArray[ArrayIdx]; // ein Dateiname
If Opt.ShowThisFile (FileName) Then // wenn nichts gegen die Anzeige spricht (z.B. datei.bak) sh. OdbOpt
Begin // Objekt für die Dateiliste aufbauen:
inc (FileCount); // Dateizähler erhöhen
FileObj := TFileObj.Create; // Dateiobjekt erstellen (sh. ObjObj->TFileObj)
FileObj.FileName := ExtractFilename (FileName); // Dateinamen (ohne Pfad) ablegen
LogLog ('Collecting Data for: »' + FileObj.FileName + '«');
FileObj.FileLn64 := GetFileSize (FileName); // Dateigröße in Bytes ablegen
FileObj.NodeFldrObj := FldrObj; // Datenobjekt des Ordners referenzieren
//
lFileAttr := TFile.GetAttributes (FileName); // Attribute zusammenstellen (bisher nur unbedeutend)
sFileAttr := ''; // leer
...
FileObj.FileAttr := sFileAttr; // Attribute ablegen
//
FileObj.FileIcon := IconList.FindIcon (FileName);
FileObj.FileType := IconList.FindType (FileName);
FileObj.FileDatE := TFile.GetCreationTime (FileName); // Datei-Estellungszeit ablegen
FileObj.FileDesk := DeskriptFile (FldrObj, FileObj);
FileObjLst.Add (FileObj); // Objekt in Datei-Liste aufnehmen (wird für OwnerData benötigt)
End Else Begin
LogLog ('Hiding File: ' + FileName, clLtBlue);
End;
End;
LvFiles.Items.Count := FileCount; // Count muß bei OwnerData manuell gesetzt werden <-----------------
LogLog (IntToStr(FileCount) + ' out of ' + IntToStr(ArraySize) + ' Files collected');
LvFiles.Items.EndUpdate; // Update der Dateiliste beenden
SetLength (FileArray, 0); // Dateinamen-Array löschen
Finalize (FileArray); // und endgülig entfernen
AcOrdDsk.Enabled := FileCount > 0; // Action/Menüpunkt Ordner verschlagworten erlauben
LvFiles.Refresh;
LogExitMethod ('THF.ReadFiles');
End;
Da Ganze hatte schon ohne
OnDataHint funktioniert.
In der Zwischenzeit habe ich
OnDataHint aufgebaut. Dort wird
StartIndex und EndIndex übergeben, für die Zeilen, die sich ändern.
Offensichtlich kann man das zum Aufbau eines
Caches nutzen, in dem die Zeilen bereitgestellt werden, die dann von
OnData aufgerufen werden.
Ich glaube, das war alles dazu.
Danke, Manfred.