Discussion:
[Delphi 10.2 Starter] TTreeView zeigt nichts mehr an
(zu alt für eine Antwort)
Michael Landenberger
2018-05-01 21:55:44 UTC
Permalink
Hallo,

nachdem mein installiertes Delphi 10.2.1 Starter gelegentlich den Rechner
einfrieren ließ, habe ich es deinstalliert und stattdessen 10.2.3 Starter
installiert. Die Installation hat reibungslos geklappt.

Allerdings habe ich jetzt ein Problem mit einem unter 10.2.1 erstellten
Projekt. Auf dem Hauptformular dieses Projekts befindet sich u. a. ein
TTreeView. Startet man eine mit 10.2.1 compilierte .exe, ist alles ok. Das
TreeView zeigt alle Inhalte ordnungsgemäß an. In einer mit 10.2.3 compilierten
.exe (gleicher, unveränderter Quellcode) ist das TreeView dagegen leer, obwohl
es Nodes enthält (Items.Count ist größer als 0). Testweise habe ich ein
weiteres TreeView auf das Formular gesetzt und mit dem Objektinspektor einen
Knoten hinzugefügt. Auch dieser Knoten wird nicht angezeigt, das TreeView ist
leer.

Daraufhin habe ich testweise mit 10.2.3 ein neues Projekt angelegt, ein
TreeView auf dem Hauptformular platziert und diesem einen Knoten hinzugefügt.
Ergebnis: hier wird der Knoten ordnungsgemäß angezeigt.

Das Problem liegt also bei meiner Anwendung. Offenbar gibt es irgend eine
Eigenschaft in meiner Anwendung bzw. deren Hauptformular, die bewirkt, dass
auf dem Formular platzierte TreeViews keine Inhalte anzeigen. Aber welche
Eigenschaft ist das? Und warum wirkt sie sich nur unter 10.2.3 aus, nicht
jedoch unter 10.2.1? Ich bin ratlos und wäre sehr dankbar, wenn mich jemand
auf die richtige Spur lotsen würde.

Gruß

Michael
Michael Landenberger
2018-05-02 07:47:56 UTC
Permalink
"Michael Landenberger" schrieb am 01.05.2018 um 23:55:44:

[Anzeigeprobleme mit TTreeView]

Neue Erkenntnisse: auf dem Formular befindet sich außer dem TreeView noch eine
zur Laufzeit (d. h. im OnCreate-Handler des Hauptformulars) erzeugte
Komponente, die von TListView abgeleitet ist. Nach der Erstellung dieser
Komponente wird ihrer Parent-Eigenschaft das Hauptformular zugewiesen.
Kommentiere ich diese Zuweisung aus, hagelt es zwar Exceptions, aber
irgendwann wird das Hauptfenster sichtbar und - o Wunder - das TreeView zeigt
seinen Inhalt wieder an.

Es könnte also sein, dass meine ListView-Komponente das Problem verursacht. Es
handelt sich dabei um ein virtuelles ListView, d. h. OwnerData ist True. Weil
es mit virtuellen ListViews Anzeigeprobleme gab, habe ich (entsprechend
einigen Hinweisen im Netz) außerdem DoubleBuffered auf True gesetzt.

Mein TreeView wird auch dann richtig angezeigt, wenn man OwnerData bzw.
DoubleBuffered der ListView-Komponente auf False setzt. Nur funktioniert diese
Komponente dann nicht mehr richtig, das ist also kein gangbarer Weg.
Seltsamerweise beseitigt das das Anzeigeproblem meines TreeViews auch nur
sporadisch. Manchmal funktioniert es, manchmal nicht. Das oben beschriebene
Auskommentieren der Parent-Zuweisung hat dagegen immer zur Folge, dass das
TreeView wieder funktioniert. Allerdings ist auch das keine Lösung, weil dann
das Listview ebenfalls nicht mehr funktioniert und außerdem am laufenden Band
Exceptions geworfen werden.

Hat Embarcadero in Delphi 10.2.3 die TListView-Komponente verschlimmbessert?
Schon in früheren Delphi-Versionen bereitete diese Komponente Probleme, z. B.
mit dem Handling von Mausereignissen oder beim Zeichnen von virtuellen
ListViews. In älteren Delphi-Versionen konnte ich diese Probleme mit diversen
Workarounds beheben. Seit Delphi 10.2.3 scheint die ListView-Komponente nun
nicht mehr nur Probleme mit sich selbst zu haben, sondern auch mit anderen
Komponenten :-(

Compiliere ich meine Anwendung mit Delphi 10.1 oder 10.2.1, läuft sie
wunderbar. Ich bin ratlos.

Gruß

Michael
Michael Landenberger
2018-05-02 10:54:41 UTC
Permalink
Post by Michael Landenberger
[Anzeigeprobleme mit TTreeView]
Neue Erkenntnisse #2: Ich habe jetzt eine von TListview abgeleitete
Dummy-Komponente auf mein Formular gesetzt. Damit ich das Programm compilieren
kann, habe ich der Komponente alle Eigenschaften und Methoden der
Original-Komponente verpasst, auf die das Formular zugreift. Die Eigenschaften
und Methoden sind aber ebenfalls nur Dummys ohne Funktion. Auch OwnerData und
DoubleBuffered sind False. Die Funktionalität der Komponente beschränkt sich
also rein auf die von TListView geerbten Funktionen. Die ListView-Komponente
wird nach wie vor zur Laufzeit im OnCreate-Handler des Hauptformulars erzeugt.

Ergebnis: Beide Komponenten (TreeView und ListView) werden angezeigt, aber der
TreeView ist nach wie vor leer :-( Offenbar spinnt das Hauptformular, sobald
man ein TreeView und ein ListView gemeinsam draufpackt. Aber warum? Und warum
nur in Delphi 10.2.3? (in älteren Versionen funktionioniert alles)

Gruß

Michael

Loading...