TListView und Symbole, Darstellung fehlerhaft (Windows)

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von Mathias »

Wen man die ListView mit neuen Einträgen aktualisieren will, ist die Darstellung unter Windows fehlerhaft.

Klammert man diese Zeiles aus, welche die Symbole auf den Canvas schreibt, ist die Darstellung unter nativen Windows richtig, aber dies ist nur ein bebastel.

Code: Alles auswählen

  for i := 0 to ImageList1.Count - 1 do begin
    //ImageList1.Draw(Canvas, i * 16, 0, i);
  end;   

Startet man das Programm aber mit Wine, dann bliebt die Darstellung fehlerhaft.

Für weitere Detail bitte hier weiter lesen: viewtopic.php?f=11&t=10911&start=68

Ab hier gibt es ein kleines ListView-Demo: viewtopic.php?f=11&t=10911&start=79


Unter Linux funktioniert alles einwandfrei.
Dateianhänge
ListView.tar.gz
(128.63 KiB) 150-mal heruntergeladen
Zuletzt geändert von Mathias am Mo 31. Jul 2017, 17:04, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von compmgmt »

Zu erwähnen ist noch, dass es unter der Lazarus 1.6.0/FPC 3.0.0 noch funktioniert hat, erst unter Lazarus 1.6.4/FPC 3.0.2 tritt der Fehler auf.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von wp_xyz »

Nach dem Neubefüllen der ImageList braucht diese offenbar ein neues Handle. Dazu einfach "ImageList1.Handle;" aufrufen, z.B. nach ImageList1.EndUpdate

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von Mathias »

wp_xyz hat geschrieben:Nach dem Neubefüllen der ImageList braucht diese offenbar ein neues Handle. Dazu einfach "ImageList1.Handle;" aufrufen, z.B. nach ImageList1.EndUpdate

Unter Nativen Windows funktioniert dein Tip, aber unter Wine geht es immer noch nicht, anscheinend macht dies etwa das selbe wie Canvas-Draw.

Noch etwas geht unter Windows nicht, wen man die List View in der Breite verändert, wird die Symbol-Anordnung nicht automatisch der ListView angepasst.
Unter Linux funktioniert auch dies Fehlerfrei.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von wp_xyz »

Versuch mal, die ImageList vom Listview zu lösen (Listview1.LargeImages := nil) und gleich darauf dann wieder zu verbinden (Listview1.LargeImages := ImageList1).

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von Mathias »

wp_xyz hat geschrieben:Versuch mal, die ImageList vom Listview zu lösen (Listview1.LargeImages := nil) und gleich darauf dann wieder zu verbinden (Listview1.LargeImages := ImageList1).

Diese Idee hatte ich auch schon, aber leider ohne Erfolg. :cry:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von compmgmt »

wp_xyz hat geschrieben:Nach dem Neubefüllen der ImageList braucht diese offenbar ein neues Handle. Dazu einfach "ImageList1.Handle;" aufrufen, z.B. nach ImageList1.EndUpdate
wp_xyz hat geschrieben:Versuch mal, die ImageList vom Listview zu lösen (Listview1.LargeImages := nil) und gleich darauf dann wieder zu verbinden (Listview1.LargeImages := ImageList1).
Es geht ja nicht darum, jetzt eine Lösung für dieses Problem zu finden, sondern zu erwähnen, dass es ein Bug ist und behoben werden sollte. Denn unter Lazarus 1.6.0/FPC 3.0.0 hat noch alles wunderbar funktioniert

Mathias hat geschrieben:Unter Nativen Windows funktioniert dein Tip, aber unter Wine geht es immer noch nicht, anscheinend macht dies etwa das selbe wie Canvas-Draw.
Das wird wahrscheinlich an Wine liegen, da kannst du sehr wenig machen. Denn die Idee hinter Wine ist ja, Windows-Programme unter Linux lauffähig zu machen. Also muss Wine sich an die Programme und an Windows anpassen und nicht umgekehrt ;) (Außer unter 1.6.0 hat noch alles ohne Probleme funktioniert, dann liegt es natürlich an Lazarus)

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von wp_xyz »

compmgmt hat geschrieben:Es geht ja nicht darum, jetzt eine Lösung für dieses Problem zu finden, sondern zu erwähnen, dass es ein Bug ist und behoben werden sollte. Denn unter Lazarus 1.6.0/FPC 3.0.0 hat noch alles wunderbar funktioniert

Dann ist das hier die falsche Stelle. Die Entwickler der LCL lesen üblicherweise nicht das deutsche Forum. Schreibe einen Report in den Bug-Tracker und füge ein Demo-Projekt bei, dann ist alles sauber dokumentiert, und es wird sich jemand darum kümmern.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von Mathias »

Dann ist das hier die falsche Stelle. Die Entwickler der LCL lesen üblicherweise nicht das deutsche Forum. Schreibe einen Report in den Bug-Tracker und füge ein Demo-Projekt bei, dann ist alles sauber dokumentiert, und es wird sich jemand darum kümmern.

Ich habe es gerade hochgeladen.

https://bugs.freepascal.org/view.php?id=32229

Ich habe folgende Fehlerbeschreibung mit Google übersetzt:

Code: Alles auswählen

Wen man bei TListView die Darstellung vsIcon oder vsSmallIcon wählt und und die TListView mit einer ImageList  verknüpft wird am Anfang noch alles korrekt dargestellt. änder man aber die ImageList zur Laufzeit, dann gibt es eine fehlerhafte Darstellung. Mit der Vorgängerversion von Lazarus trat der Fehler nicht auf.
Siehe Demo im Anhang.
 
Unter Linux ist die Darstellung einwandfrei.
 
Mehr Information im deutschen Forum. viewtopic.php?f=19&t=10942&p=96968#p96968
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von wp_xyz »

Mathias, jetzt habe ich mich doch mit diesem Fehler befasst, obwohl ich es eigentlich gar nicht wollte. Die schuldige Revision habe ich gefunden. Entferne bitte vorübergehend in Datei imglist.inc, Prozedur TCustomImageList.Clear das mit einem {$IFDEF WINDOWS} umgebene "DestroyReference", prüfe dein Testprogramm unter Wine und schreibe das Ergebnis als Kommentar an deinen Bug-Report, insbesondere wenn der Fehler weiterhin besteht.

Code: Alles auswählen

procedure TCustomImageList.Clear;
begin
  if FCount = 0 then Exit;
  if HandleAllocated
  then TWSCustomImageListClass(WidgetSetClass).Clear(Self);
  {$ifdef windows}
//  DestroyReference; //Issue #0029905: images added after clear aren't shown if width or height changed   // <--- DIESE ZEILE ENTFERNEN
  {$endif}
  SetLength(FData, 0);
  FAllocCount := 0;
  ClearOverlays;
 
  FChanged := True;
  FCount := 0;
  Change;
end;

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von Mathias »

prüfe dein Testprogramm unter Wine und schreibe das Ergebnis als Kommentar an deinen Bug-Report, insbesondere wenn der Fehler weiterhin besteht.

Unter nativen Windows scheint es zu funktionieren, aber in Wine kommen zwar jetzt die Symbole, aber so wie es scheint, wird irgend ein Offset nicht auf Null gesetzt. (Siehe Anhang)
Ich habe noch die Beispiele mit TreeView und StringGrid ausprobiert, dort scheint es zu funktionieren. Das man bei Stringrid Iconen einfügen kann, war mir bis jetzt nicht bekannt.
Dateianhänge
Bildschirmfoto vom 2017-08-01 16-48-53.png
Bildschirmfoto vom 2017-08-01 16-49-01.png
Bildschirmfoto vom 2017-08-01 16-49-05.png
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von wp_xyz »

Das sieht so aus, als ob zwar die Bilder selbst gelöscht, aber der Zähler für die enthaltenen Bilder nicht auf Null zurückgesetzt wird.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von Mathias »

Was noch komisch ist, wieso geht es nur in Wine nicht ?

Ich habe den Code gerade noch mit Delphi 6 getestet, dort funktioniert es in Wine. Somit wäre Wine eigentlich unschuldig.

Zwischen Linux und Windows gibt es noch einen Unterschied.
Unter Windows wird der Text zentriert zwischen dem Icon geschrieben, bei Linux ist er linksbündig.
Siehe Anhang.
Dateianhänge
Bildschirmfoto vom 2017-08-01 22-39-05.png
Zuletzt geändert von Mathias am Di 1. Aug 2017, 23:30, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von wp_xyz »

Du hast 2x Windows geschrieben. Ich nehme an, Wine ist das linke Bild?

Also ich bezweifle, ob die Wine-Probleme gefixt werden, die möglicherweise auch noch von der Linux-Distribution abhängen... Aber das generelle Windows-Problem, dass die Icons plötzlich verschwinden, muss natürlich behoben werden.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TListView und Symbole, Darstellung fehlerhaft (Windows)

Beitrag von Mathias »

Das Bild links ist Linux nativ.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten