Listview.smallimages funtioniert nicht immer

Rund um die LCL und andere Komponenten
Antworten
Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Listview.smallimages funtioniert nicht immer

Beitrag von Ralph59 »

Hallo,

ich stehe mal wieder auf dem Schlauch.
Zuerst meine Umgebung:
Lazarus 0.9.26.2 Beta
FPC 2.2.2

Ich benutze in meiner Anwendung verschiedene Fenster, ich nenne diese mal F0, F1, F2...
Ich habe ein Hauptfenster("F0"), welches ein anderes aufruft("F1"), hier sind verschiedene Buttons, mit denen man neue Fenster öffnet in diesem Fall ("F2").
Im Fenster F2 erstelle ich automatisch ein Mainmenue mit Einträgen aus einer Datenbank.
Mit der Auswahl aus diesem Menue wird immer ein neues Fenster aufgerufen ("F3"), es werden nur aus der Datenbank entsprechende Variablen übergeben, die für den Inhalt des Fensters (F4) verantwortlich sind.
Im Fenster F4 habe ich ein Listview, welches aus einer Imagelist entsprechende Bilder in den Items darstellt (ordner, Dateien...).
Das Listview wird beim betätigen von Radio buttons immer wieder mit anderen Werten gefüllt (Verschiedene Verzeichnisse auf einem Rechner oder einem FTP-Server). Die Inhalte und die Bilder stimmern beim Aufruf des Fensters auch immer.
:wink: Alle Funktionalitäten zum Aufbau des Listviews funktionieren beim ersten Aufruf des Fensters (F4) immer.
:cry: Wenn ich das Fenster schließe, und aus dem Menuepunkt vom Fenster (F3) einen neuen Menuepunkt wähle, dann funktioniert mein Listview nur noch teilweise.
:wink: Alle Einträge stimmen.
:wink: Alle Events wie onClick werden richtig ausgeführt.
:cry: Nur die Images werden nicht mehr angezeigt.
Vor dem Füllen des Listviews führe ich folgendes aus:

Code: Alles auswählen

Listview1.clear;
  Listview1.Columns.Clear;
  listview1.ViewStyle:= vsReport;
  Listview1.SmallImages:=ImageList1;
Gefüllt wird dann

Code: Alles auswählen

if length(aDir) > 0 then begin
    for I:=0 to High(aDir) do begin
      Listview_x.Items.Add.Caption:=aDir[I,0];
      Listview_x.Items[Listview_x.Items.Count-1].ImageIndex:=zBild('verzeichnis');// 0;
    end;
  end;
  if length(aVerz) > 0 then begin
    for I:=0 to High(aVerz) do begin
      Listview_x.Items.Add.Caption:=aVerz[I,0];
      Listview_x.Items[Listview_x.Items.Count-1].ImageIndex:=zBild(aVerz[I,0]);// 0;
    end;
  end;
zBild ist eine Funktion, die entsprechend der Datei Endungen (.doc, .prg...) einen Integer für das ImageIndex zurück gibt.

Ich habe gedacht, das das Imagelist in der ".lfm" abgelegt ist und mit Compiliert wird und dadurch auch immer zur Verfügung stehen sollte.

Code: Alles auswählen

object ImageList1: TImageList
    left = 710
    top = 340
    Bitmap = {
      4C690C0000....
Wie gesagt, ich stehe auf dem Schlauch, vieleicht kann mir einer auf die Sprünge helfen?

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Listview.smallimages funtioniert nicht immer

Beitrag von theo »

Mach doch mal eine Anwendung, wo sich das Problem auf's Minimum reduziert zeigt. Ohne DB, FTP etc. pp.
Vielleicht findest du dann die Ursache selber. Sonst kannst du uns den Source-Code zeigen.
Falls es sich dann als Bug herausstellt -> Bugtracker.

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Listview.smallimages funtioniert nicht immer

Beitrag von Ralph59 »

Hallo Theo,

das habe ich doch schon mehrfach gemacht, und es funktioniert auch immer, solange ich immer in einem Fenster bleibe.
Ich denke, dass mir irgendwie der Verweis auf das entsprechende Objekt einfach fehlt, wenn ich das Fenster mit dem Listview verlasse und dann wieder über mein generiertes Menue betrete.
Wenn ich z. B. die ImageList erst generieren könnte wenn ich das Listview aufbaue (dynamisch) dann könnte es auch klappen (hab aber keine Ahnung, wie ich das angehen könnte).
Wie auch immer, ich schreibe eine kleine Anwendung mit einem Menue und rufe von dort ein Fenster mit einem Listview auf, ich denke jedoch, dass dieses funktinieren wird.

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Listview.smallimages funtioniert nicht immer

Beitrag von Scotty »

Werden SmallImages nicht nur bei ViewStyle=vsSmallIcon angezeigt? Ansonsten: irgendein CustomDraw?

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Listview.smallimages funtioniert nicht immer

Beitrag von Ralph59 »

Hallo Scotty,

Smallimages werden auch im Viewstyle vsReport angezeigt habe ich schon häufig verwendet.
Aber, ich werde gleich mal probieren wie das in einem anderen Viewstyle aussieh, wird mir zwar nicht wirklich weiter, da ich so Dinge wie Dateigröße und Datum in der Regel mit anzeigen wollte.

Habe gerade den Viewstyle auf vsSmallIcon, funktioniert auch nicht.

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Listview.smallimages funtioniert nicht immer

Beitrag von Scotty »

Ich hab es im Designer ausprobiert und da werden die Icons nur angezeigt, wenn der entsprechende Stil gesetzt ist (Linux). Vielleicht hilft ja ein Update von FPC.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Listview.smallimages funtioniert nicht immer

Beitrag von theo »

Oder virtualtreeview-new, das funktioniert recht gut.

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Listview.smallimages funtioniert nicht immer

Beitrag von Ralph59 »

Hallo,

ich glaube eher, dass das Problem darin besteht, dass das Listview in einem Kindfenster liegt, dass von einem anderen Kindfenster aufgerufen wird. Dabei verliere ich irgendwie den Verweis auf das Objekt Imagelist.

Ich ewrde jetzt gleich einmal versuchen die ImageList automatisch zur Laufzeit zu genereiren, was den Vorteil hätte, dass der Benutzer seine eigenen Icons einbinden kann, leider muss ich mich dann auch noch um die Größen der Icons kümmern.

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Listview.smallimages funtioniert nicht immer

Beitrag von Ralph59 »

Hallo,

ich habe es jetzt folgenddermaßen gelöst, ist zwar sicherlich nicht der schönste Weg, aber es funktioniert. Ich werde mir in Zukunft noch etwas anderes Überlegen.
Ich erstelle einfach eine neue Imagelist und weise diese jedesmal zu. Es war nur komisch, wenn ich z.B. den Count der Imagelist abgefragt habe, zeigte der mir den richtigen wert, aber es wurden keine Bilder angezeigt :|

Code: Alles auswählen

var
Bmp: TBitmap;
ImageList2: TImageList;
begin                   
  imagelist2 := Timagelist.Create(nil);    //erstelle Liste
  Bmp := TBitmap.Create;                       // erstelle Bitmap
  Bmp.LoadFromFile('.\bmp\Dir1.bmp');    // lade Bitmap
  Bmp.Transparent := True;
  Bmp.TransparentMode := tmAuto;
  ImageList2.AddMasked(Bmp , Bmp.TransParentColor);    //schreibe Bitmap in Imagelist ...
  Bmp.LoadFromFile('.\bmp\zurueck.bmp');
  Bmp.Transparent := True;
  Bmp.TransparentMode := tmAuto;
  ImageList2.AddMasked(Bmp , Bmp.TransParentColor);
  Bmp.LoadFromFile('.\bmp\ultraedit.bmp');
  Bmp.Transparent := True;
  Bmp.TransparentMode := tmAuto;
  ImageList2.AddMasked(Bmp , Bmp.TransParentColor);
  Bmp.LoadFromFile('.\bmp\Datei1.bmp');
  Bmp.Transparent := True;
  Bmp.TransparentMode := tmAuto;
  ImageList2.AddMasked(Bmp , Bmp.TransParentColor);
 
  Listview1.clear;
  Listview1.Columns.Clear;
  listview1.ViewStyle:= vsReport;
  Listview1.SmallImages:=ImageList2;
 
end;
:wink: Aber so geht es ja auch.

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Antworten