Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 01:53

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Aug 16, 2010 15:05 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Tach auch,

mein GUI-Editor macht große Fortschritte (größere als die GUI selbst :D), aber gerade hackts wieder nen bissel.
Ich benutze als "Projektinspektor" ein TTreeview, in dem mein Projekt auch korrekt als Baumstruktur dargestellt wird. In diesem will ich momentan selektierte Objekte fett darstellen. Mein Code dazu sieht wie folgt aus:

Code:
procedure Tfrm_Output.tvObjectsCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
tv_Objects.Canvas.Font.Style := [];
if Assigned(Node.Data) then
  if TEditorItem(Node.Data).Selected then
    tv_Objects.Canvas.Font.Style := [fsBold];
end;


Das klappt soweit auch ganz gut, aaaber...TTreeview zeichnet einen Knoten nur dann neu, wenn sich an den Eigenschaften des Knotens etwas ändert (oder das gesamte TTreeview neu gezeichnet werden muss), was dazu führt, dass ich ein Objekt zwar selektieren kann, das aber erst sehe, wenn ich das Fenster mit dem Treeview einmal minimiere und dann wieder maximiere (oder ähnliches).
Ich hatte das kurz so gelöst, dass ich in dem Moment, wo ein Element im Editor selektiert wird, auch dessen Knoten im Treeview selektiert habe (mit TreeNode.Selected := True) und beim Abwählen des Elements auch dessen Knoten deselektiert wurde. Nun gibts da aber (dank Mehrfachselektion) ein Szenario, bei dem die Methode an ihre Grenzen stößt:
Ich selektiere Objekt1 im Editor, TreeNode(Objekt1).Selected wird True, der Knoten wird neu gezeichnet, in der Prozedur merkt das TV, dass Objekt1 selektiert ist und schreibt fett. Danach selektiere ich zusätzlich Objekt2, TreeNode(Objekt2).Selected wird True, er zeichnet den Knoten neu, das TV merkt: Objekt2 ist selektiert, und schreibt fett. Gleichzeitig (trotz aktiverter MultiSelection im TV) setzt das TV scheinbar selbstständig TreeNode(Objekt1).Selected auf False, der Knoten wird neu gezeichnet, das TV merkt: Objekt1 ist selektiert (ich frage ja nach dem Objekt selbst und nicht nach dem Knoten in meiner Prozedur), und schreibt fett.
Soweit so gut.
Jetzt wähle ich beide Elemente gleichzeitg ab.
Objekt2: TreeNode(Objekt2).Selected := False, was für das TV bedeutet, es zeichnet den Knoten neu, fragt nach, ob Objekt2 angehält ist, dass ist es nicht, die Schrift bleibt normal. (Immernoch: So weit, so gut)
Objekt1: TreeNode(Objekt1).Selected := False - was für das TV nichts ändert, weil das ja selbstständig irgendwann einmal den Knoten abgewählt hatte. Das zieht nach sich, dass der Knoten NICHT neu gezeichnet wird und die Schrift fett bleibt. Doof.

Im Moment hab ich das so "gelöst", dass ich, wenn ein Objekt deselektiert wird, dessen Knoten, bevor dieser deselektiert wird mit TreeNode.Selected := True anwähle:

Code:
procedure TEditorItem.DeSelect;
begin
Selected := False;
Node.Selected := True;
Node.Selected := False;
end


Eine Lösung, die bei mir Augenkrebs hervorruft, weil sie mir zutiefst unelegant erscheint - leider hab ich keine elegantere gefunden. Hat hier vielleicht jemand eine Idee? (Am liebsten wäre es mir, wenn ich die TreeNode.Selected - Eigenschaft gar nicht bräuchte - immerhin benutze ich sie im Code eigentlich nirgendwo, sie ist nur bisher der einzige mir bekannte Weg (neben einer Änderung der Knotenbeschriftung), ein Neuzeichnen des Knotens zu forcieren.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 16, 2010 18:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Die TTreeview ist generell recht beschränkt. Wenn es nicht sowas wie TreeNode.Invalidate oder TreeView.invalidateNode gibt, solltest du einen Blick auf die Virtual Tree View werfen. Die Möglichkeiten sind schier überwältigend. Man muss sich erst etwas reinarbeiten, aber dann geht es ziemlich gut. Du hast ja deine Daten sowieso größtenteils in den Editorelementen und hast sicher einige mühe, die mit den Nodes im Tree zu synchronisieren. Bei der VTV halten die Nodes keine Daten, sondern nur einen Pointer (oder beliebige andere Daten) und ihren Zustand (selektiert, fokussiert, expandiert etc.). Der Rest wird über Callbacks gelöst. Gibt einige gute Beispiele da draußen und im VTV-Paket. Ich mache inzwischen das meiste mit der VTV, weil das meiste damit machbar ist ;).

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.034s | 15 Queries | GZIP : On ]