Einzelnen Beitrag anzeigen

FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#7

AW: Listview ein Image aus ImageList zuweisen

  Alt 5. Aug 2011, 08:14
Um es noch sauberer zu machen:
Einen Class Helper verwenden, der das ListItem befüllt. Bei der Gelegenheit kann man dann auch gleich konsequent refaktorisieren.
Damit sollten dann die Grundregeln ordentlichen OOP einigermaßen erfüllt sein.

Delphi-Quellcode:
Type
// Es ist die Aufgabe eines TFileInfo, in meiner Applikation das richtige Icon zu liefern
  TIconIndexHelper = Class Helper For TFileInfo
    Function IsDirectory : Boolean;
    Function GetImageIndexFromFileName : Integer;
  End;

// Es ist Aufgabe eines TListItem, in meiner App sich selbst anhand eines TFileInfo zu befüllen
  TListViewItemFillFromFileInfoHelper = Class Helper For TListItem
    Procedure FillSubItemsWithNameInfo (aFileInfo : TFileInfo);
    Procedure FillContentsFromFileInfo (aFileInfo : TFileInfo);
  End;

Const
  iiNoIcon = -1;
  iiMP3Icon = 0;

Function TIconIndexHelper.GetImageIndexFromFileName : Integer;
Begin
  if AnsiUpperCase(ExtractFileExt(Name)) = AnsiUpperCase('.mp3') then
    Result := iiMP3Icon
  else
    Result := iiNoIcon;
End;

Function TIconIndexHelper.IsDirectory : Boolean;
Begin
  Result := LongBool(Attributes and FILE_ATTRIBUTE_DIRECTORY)
End;
    
Procedure TListViewItemFillFromFileInfoHelper.FillSubItemsWithNameInfo (aFileInfo : TFileInfo);
Begin
  SubItems.Add(aFileInfo.Location);
  SubItems.Add(aFileInfo.Name);
  if aFileInfo.IsDirectory then
    SubItems.Add('Folder')
  else begin
    SubItems.Add(FormatFileSize(aFileInfo.Size));
    SubItems.Add(DateTimeToStr(aFileInfo.ModifiedTime));
  end;
End;
      
Procedure TListViewItemFillFromFileInfoHelper.FillContentsFromFileInfo (aFileInfo : TFileInfo);
Begin
  Caption := IntToStr(Self.ListView.Items.Count);
  FillSubItemsWithNameInfo(aFileInfo);
  ImageIndex := aFileInfo.GetImageIndexFromFilename;
end;

...
  ListView1.Items.BeginUpdate;
  Try
    ListView1.Items.Add.FillContentsFromFileInfo (FileInfo);
  Finally
    ListView1.Items.EndUpdate;
  End;
  if not FindFile.Threaded then
    Application.ProcessMessages;
end;
Es ist natürlich 3x soviel Schreibarbeit, aber dafür übersichtlich, verständlich und leichter erweiterbar. Meine Meinung.
Das Bild hängt schief.
  Mit Zitat antworten Zitat