![]() |
Wie bekomm ich eine Grafik in den Spaltenkopf?
Hi,
schön langsam und Dank Eurer Hilfe funktioniert das Einlesen eines Verzeichnisses in eine ListView. Dabei verwende ich folgenden Code ![]() Nun hab ich auch schon eine Sortier-Routine eingebaut. Funktioniert super. Allerdings würde ich gerne im Spaltenkopf je nach Sortierung eine kleine Grafik (kleines Dreieck) anzeigen. Dies sollte so funktionieren:
Code:
Dabei muss aber die Eigenschaft SmallImages von ListView mit einer ImageList verbunden sein.
ListView.Columns.Items[0].ImageIndex:=1;
Und genau da liegt nun das Problem, weil CreateImage (siehe ![]() Was kann ich nun machen, um sowohl die Grafiken zu den einzelnen Dateien im ListView, als auch mein kleines Dreieck im Spaltenkopf angezeigt zu bekommen? Gruß Thomas :coder: |
Moin Thomas,
es hindert Dich niemand daran die ImageList entsprechend zu erweitern. Für das jeweils angezeigte Bild ist dann ja nur der entsprechende Index aus der Liste zu verwenden. |
Und da man die System-ImageList nicht selbst verändern soll, kann man diese in eine eigene kopieren.
Delphi-Quellcode:
Bei diesem Code gehe ich davon aus, das zwei TImageList Komponenten SmallImages und LargeImages auf dem Formular liegen und mit der ListView verknüpft sind.
procedure Createimages;
var SysIL : uint; SFI : TSHFileInfo; SysSmallImages, SysLargeImages: TImageList; i: Integer; begin SysLargeImages := TImageList.Create(MainForm); SysSmallImages := TImageList.Create(MainForm); try SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_LARGEICON); if SysIL <> 0 then begin SysLargeImages.Handle := SysIL; SysLargeImages.ShareImages := TRUE; end; SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); if SysIL <> 0 then begin SysSmallImages.Handle := SysIL; SysSmallImages.ShareImages := TRUE; end; for i := MainForm.SmallImages.Count - 1 downto 2 {Anzahl der verbleibenden Images} do MainForm.SmallImages.Delete(i); MainForm.SmallImages.AddImages(SysSmallImages); for i := MainForm.LargeImages.Count - 1 downto 2 {Anzahl der verbleibenden Images} do MainForm.LargeImages.Delete(i); MainForm.LargeImages.AddImages(SysLargeImages); finally SysLargeImages.Free; // wird nicht mehr benötigt SysSmallImages.Free; // wird nicht mehr benötigt end; end; Und beim Hinzufügen der ListItems müssen die festen Images natürlich berücksichtigt werden:
Delphi-Quellcode:
NewItem.ImageIndex := Info.IIcon + 2 {Anzahl der festen Images};
|
Danke für Deine Antwort und den Source-Code.
Funktioniert unter W98 einwandfrei. Unter W2000 wird allerdings vor den Dateinamen kein Icon oder nur ein nicht dazupassendes angezeigt. So lese ich die einzelnen Dateien ein:
Code:
Was mach ich falsch???? :firejump:
procedure VerzeichnisEinlesen(VerzName, filter:string);
var NewItem : TListItem; Info : TSHFileInfo; SR : TSearchRec; dgroesse: String; // Dateigröße-Text dsize : Integer; // Dateigröße begin if VerzName[length(VerzName)]<>'\' then VerzName:=VerzName+'\'; if filter='' then filter:='*.*'; with FormShredExplor do begin ListView.Items.Clear; if FindFirst(VerzName+filter,faAnyFile-faDirectory ,SR)=0 then begin repeat if (length(SR.Name)>0) and (SR.Name[1]<>'.') then begin NewItem:=ListView.Items.Add; NewItem.Caption:=SR.Name; SHGetFileInfo(PChar(VerzName+SR.Name),0,Info,SizeOf(TSHFileInfo),SHGFI_SYSIconIndex or SHGFI_TYPENAME); NewItem.ImageIndex:=Info.IIcon+2; dSize:=Round((SR.Size/1024)+0.5); dGroesse:=IntToStr(dSize); if Length(dgroesse)>3 then Insert('.',dGroesse,Length(dgroesse)-2); if Length(dgroesse)>7 then Insert('.',dGroesse,Length(dgroesse)-6); NewItem.SubItems.Add(dGroesse+ ' KB'); NewItem.SubItems.Add(Info.szTypeName); end; until FindNext(SR)<>0; FindClose(SR); end; end; end; Gruß Thomas |
Moin Thomas,
also wenn Du schon so fragst :mrgreen: Im Ernst, zu Deinem eigentlichen Problem kann ich Dir leider jetzt nicht helfen, mir ist allerdings trotzdem noch ein Fehler aufgefallen: Die Abfrage (SR.Name[1]<>'.') ist falsch, auch wenn sie meist so funktioniert wie gedacht. Es muss explizit auf (SR.Name <> '.') and (SR.Name <> '..') abgefragt werden, denn ein Punkt zu Beginn eines Datei- oder Verzeichnisnamens ist erlaubt, und kann erzeugt werden. |
Spät aber doch: Ein Nachtrag. 8)
Das mit der Grafik im Spaltenkopf führt auch unter W98 zu einer fehlerhaften Anzeige. Allerdings viel seltener. Dadurch ist es mir auch nicht gleich aufgefallen. :cry: Offensichtlich führt das Hinzufügen von anderen Icons in die Imagliste zu einem Fehlverhalten (sowohl unter W98 als auch unter W2000). Hab daher jetzt einfach die Grafik in den Spaltenköpfen weggelassen. Nun funktioniert es wirklich fehlerfrei. Oder habt ihr noch eine Idee, wie es doch funktionieren könnt??? Gruß Thomas :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz