Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie bekomm ich eine Grafik in den Spaltenkopf? (https://www.delphipraxis.net/1783-wie-bekomm-ich-eine-grafik-den-spaltenkopf.html)

schitho 23. Dez 2002 14:31


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 http://www.delphi-fundgrube.de/files/listview.txt

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:
 ListView.Columns.Items[0].ImageIndex:=1;
Dabei muss aber die Eigenschaft SmallImages von ListView mit einer ImageList verbunden sein.

Und genau da liegt nun das Problem, weil CreateImage (siehe http://www.delphi-fundgrube.de/files/listview.txt) ebenfalls SmallImages verwendet.

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:

Christian Seehase 23. Dez 2002 14:56

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.

jbg 23. Dez 2002 15:08

Und da man die System-ImageList nicht selbst verändern soll, kann man diese in eine eigene kopieren.
Delphi-Quellcode:
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;
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.

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};

schitho 23. Dez 2002 19:38

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:
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;
Was mach ich falsch???? :firejump:

Gruß

Thomas

Christian Seehase 24. Dez 2002 00:12

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.

schitho 9. Jan 2003 21:47

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 01:02 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