Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   VirtualTreeview NodeText geht verloren (https://www.delphipraxis.net/216265-virtualtreeview-nodetext-geht-verloren.html)

TurboMagic 30. Nov 2024 20:28

VirtualTreeview NodeText geht verloren
 
Hallo,

habe ein Problem mit Virtual Tree View:
In OnFocusChanging will ich mittels modalem Dialog, je nach Knoten,
ein Passwort abfragen, da manche Knoten nicht für alle Anwender zugänglich sein sollen.

Nur: sobald dieses modale Fenster aufgerufen wird, wird für den bisher dargestellten
Knoten der Text nicht mehr angezeigt. Ich weiß aber nicht warum :-(

Versuche mit vst.Invalidate(vst.FocussedNode) und anschließendem vst.Refresh
haben nichts gebracht.

Der Knoten bleibt auch nach Schließen des modalen Dialogs ohne Text. Klicke ich ihn an
oder was anderes im baum wird alles richtig neu gezeichnet.

Woran liegt das alles und wie kann ich das beheben?

jaenicke 30. Nov 2024 22:50

AW: VirtualTreeview NodeText geht verloren
 
Was heißt denn "nicht zugänglich"? Der Knoten ist ja offensichtlich sichtbar, sonst könnte man ihn ja nicht anklicken. Geht es rein um das Fokussieren oder um das, was durch das Fokussieren ausgelöst wird, wenn du darauf reagierst?

Grundsätzlich ist es keine gute Idee in dem Event mehr zu machen, als den Wechsel zu erlauben oder nicht. Einen Wechsel des Eingabefokus in dem Event würde ich vermeiden.

TurboMagic 1. Dez 2024 10:14

AW: VirtualTreeview NodeText geht verloren
 
Hallo,

es geht darum, dass der Text des Knotens weg ist und das Auswahlrechteck,
welches dann angezeigt wird, ist auch wesentlich kürzer als der Text der vorher
dort stand.

Ich versuche jetzt mal was mit einem Timer und Status merken zu basteln,
mal schauen was rauskommt...

TurboMagic 1. Dez 2024 10:37

AW: VirtualTreeview NodeText geht verloren
 
Hallo,

habe jetzt im OnFocusChanging das Allowed auf false gesetzt,
wenn es noch keinen gemerkten Wert von NewNode gibt.
Dann hab' ich mir NewNode gemerkt und einen Timer gestartet.

In den hab' ich diese Passwortabfrage verlagert und wenn das
richtige eingegeben wurde hab' ich das ausgeführt:

Delphi-Quellcode:
if CheckPassword(FNewFocussedNode) then
begin
  vst_Menu.FocusedNode := FNewFocussedNode;

  if Assigned(vst_Menu.FocusedNode) then
    vst_Menu.Selected[vst_Menu.FocusedNode] := true;
     
  FNewFocussedNode := nil;
end;
Das funktioniert allerdings wie bisher auch. Egal wie lange das
Timer Interval ist. Drehe ich es auf 1 Sek. hoch sehe ich auch deutlich,
dass das Verschwinden des Knoten Texts schon auftritt, noch bevor der
Passwort Dialog angezeigt wird!

Noch was ist mir aufgefallen: wird ein falsches Passwort eingegeben,
bleibt der Knoten Text auch nach Wegklicken aller Fehermeldungsdialoge
verschwunden, bis ich einen anderen Knoten anklicke.

Es hilft auch nicht den Knoten zu invalidieren und dann ein Refresh aufzurufen...

Die Grundsätzliche Frage für mich wäre hier, warum der Knotentext überhaupt verschwindet.
Hat da einer schon die "Fokussierter Knoten" Darstellung auf dem Bildschirm gelöscht,
aber noch nicht als normalen Knoten darstellen Funktion aufgerufen?

Ist das evtl. ein Bug im VST?
Bzw. wie bekomme ich den entsprechenden Knoten geziehlt neugezeichnet?

Gausi 1. Dez 2024 11:09

AW: VirtualTreeview NodeText geht verloren
 
Ich würde da nicht auf einen Bug im VST tippen, sondern dass dieses Event nicht dafür gedacht ist, was du da vor hast. Denn du möchtest während des Fokuswechsels den Fokus auf ein komplett anderes Control legen - das kann dann natürlich Nebeneffekte haben.

Kannst du das ggf. so umbauen, dass du die Passwort-Abfrage im
Delphi-Quellcode:
OnFocusChanged
durchführst? Also so, dass der "unerlaubte Knoten" zwar ausgewählt werden kann, aber nur dann sinnvolles Zeug anzeigt (inkl. ggf. Subknoten etc.), nachdem das korrekte Passwort eingegeben wurde?

jaenicke 1. Dez 2024 11:13

AW: VirtualTreeview NodeText geht verloren
 
Darauf zielte meine (unbeantwortete) Frage ab. Eine Möglichkeit wäre ja z.B. auch, einfach wieder den Fokus zurück zu wechseln, wenn das Passwort falsch eingegeben wurde.

Zitat:

Zitat von TurboMagic (Beitrag 1543728)
Ist das evtl. ein Bug im VST?

Kannst du das in einem Testprogramm nachvollziehen? Ich nämlich nicht.

Statt eines Timers könntest du dir auch einfach mit PostMessage eine Nachricht schicken.

himitsu 1. Dez 2024 11:37

AW: VirtualTreeview NodeText geht verloren
 
Und es könnte z.B. auch mitten in einem PaintLock/BeginUpdate hängen, während man das Event dort mit ShowMessage blockiert.

PostMessage, TThread.ForceQueue oder ähnliches, anstatt einem Timer, für ein einmaliges Event.

TurboMagic 1. Dez 2024 15:49

AW: VirtualTreeview NodeText geht verloren
 
Hallo,

Bug im VST scheidet für mich inzwischen auch eher aus.
Ich habe ein einfaches Testprogramm erstellt und versucht das nachzustellen.
In dem einfachen Testprogramm funktioniert es wie es soll, selbst wenn der VST
(was aber eigentlich keinen Unterschied machen sollte) auf einem modalen 2. Fenster
sitzt.

Einzige Unterschiede zwischen Testprogramm und meinem eigentlichen Programm:
  • Testprogramm nutzt noch keine Icons für den VST
  • Testprogramm hat nur eine Knotenebene, in meinem eigentlichen Programm ist der zum Testen benutzte Knoten einer der 2. Ebene

Was mache ich in dem anderen Programm falsch?
Ich habe dort auch mal den CellText des OnGetText Events geloggt und festgestellt,
dass mein modaler Aufruf im OnFocusCHanging das triggert, die geloggten Werte sind aber
alle richtig, auch der von dem bisher fokussierten Knoten der dann nicht mehr angezeigt wird.

TurboMagic 1. Dez 2024 15:53

AW: VirtualTreeview NodeText geht verloren
 
Interessante neue Erkenntnis:
Das Zeichenproblem tritt nicht auf, wenn ich einen anderen Stil als "Windows" (der ja quasi ein nicht Stil ist) benutze!

jaenicke 1. Dez 2024 16:16

AW: VirtualTreeview NodeText geht verloren
 
1. Liefere in OnGetText einen festen Wert zurück --> ausschließen, dass es an den Daten liegt
2. Wenn es auch dann noch passiert, solltest du ja alle anderen Events der Reihe nach entfernen können.

Und entweder findest du dabei das Problem oder es bleibt ein so weit entkernter Rumpf übrig, dass du ihn hier posten kannst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz