Thema: Delphi TListView - OnDataHint

Einzelnen Beitrag anzeigen

ManfredG

Registriert seit: 12. Feb 2007
Ort: Berlin
34 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: TListView - OnDataHint

  Alt 16. Okt 2018, 08:05
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.
Manfred Götze
  Mit Zitat antworten Zitat