Delphi-PRAXiS

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/)
-   -   In VirtualStringTree nach Neuladen zurück auf vorigen Node (https://www.delphipraxis.net/205910-virtualstringtree-nach-neuladen-zurueck-auf-vorigen-node.html)

norwegen60 29. Okt 2020 14:09

In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
Hallo,

ich habe ein Problem nach einem Neuladen des VST wieder auf den alten Node zu kommen.

Folgendes Vorgehen:
  • Die Daten werden aus einer DB geladen in VST geladen
  • Einen Eintrag editieren und Editierung z.B. mit Mausklick auf nächste Zeile beenden
  • In OnEdited werden Daten in DB geschrieben und Daten neu in VST geladen. U.U. liegt editierter Satz jetzt in anderer Reihenfolge
  • Beim Editieren merke ich mir die ID des Eintrags
  • Nach Neuladen springe ich wieder auf diese ID
  • Bis hier her funktioniert soweit auch alles
Jetzt aber arbeitet VST noch den Mausklick ab und da der Eintarg nach dem Neuladen nicht mehr unbedingt genau an dem Ort steht, an dem er vorher stand, wird Cursor jetzt u.U. in falsche Zeile gesetzt

Wie kann ich verhindern, dass VST nach Neuladen nur mein GotoID() ausführt und nicht danach auch noch den MausKlick

Da das VST in einem Frame liegt, wollte ich verhindern das Ereignis über GetMessages abzufangen. Vielleicht gibt es ja noch einen anderen Weg

Danke
Gerd

mytbo 29. Okt 2020 17:31

AW: In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
Zitat:

Zitat von norwegen60 (Beitrag 1476366)
[*]In OnEdited werden Daten in DB geschrieben und Daten neu in VST geladen. U.U. liegt editierter Satz jetzt in anderer Reihenfolge

Für mich stellt sich die Frage, warum du die Daten neu laden willst? Hier würde ein einfaches InvalidateNode(Node) zur Aktualisierung der Anzeigen eigentlich reichen.

Ich mache es allgemein so:
Delphi-Quellcode:
focusedItemOID := GetLVFocusedItemOID(vlvList);
vlvList.BeginUpdate;
try
  // Daten aktualisieren
finally
  vlvList.EndUpdate;
end;
SetLVFocusByItemOID(vlvList, focusedItemOID);
In der Prozedure SetLVFocusByItemOID() steht dann am Ende in etwa folgendes:
Delphi-Quellcode:
vlvList.ClearSelection;
vlvList.FocusedNode := Node;
vlvList.Selected[Node] := True;
Anmerkung: Ich setzte den VST schon sehr lange ein. Weil er in eigenen Frameworks eingebunden ist, auch nicht die aktuellste Version.

Bis bald...
Thomas

norwegen60 29. Okt 2020 18:43

AW: In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
Im Grunde genommen hast du natürlich recht.

Es gibt aber noch Bearbeitungsmöglichkeiten, wo dann im Hintergrund an Dateien Änderungen vorgenommen werden. Zur Absicherung, ob das alle korrekt gelaufen ist, werden zuerst die Dateikorrekturen in die DB geladen und dann in VST angezeigt.

Ich würde es heute nicht mehr so machen, aber ...

Aviator 29. Okt 2020 19:49

AW: In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
Du scheinst ja das neue Laden der Daten im OnEdited Event auszulösen. Das würde ich dann vielleicht nicht so machen. Vielleicht wäre es sinnvoller, auf das Post Event der Query oder eines anderen Events zu reagieren. Alternativ kannst du auch einen Timer starten, der kurz nach dem Abarbeiten von OnEdited ausgelöst wird. Ggf. noch mit einem
Delphi-Quellcode:
ReloadPending
Flag oder so.

Das Problem bei dir wird wohl sein, dass du den Tree bei der Abarbeitung seiner Routine blockierst und er danach erst weitermachen kann. Und somit dann das Click Event ausführt. Der VST ist ja recht gut programmiert, aber es kommt natürlich auch immer noch auf eure Event-Handler an. Da könnte es natürlich auch irgendwann mal knallen, wenn die Daten plötzlich unterm Hintern weggelöscht werden.

norwegen60 29. Okt 2020 20:50

AW: In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
Das mit dem Timer hatte ich mir auch schon überlegt.

Lieber wäre mir aber schon ich könnte die Message irgendwie abfangen oder bereinigen.

sh17 31. Okt 2020 09:50

AW: In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
evtl merkst Du dir die ID des Knotens und setzt den Knoten beim Neuinitialisieren mittels InitialStates und ivsSelected, wenn er vorbei kommt
allerdings könnte er dann immer noch außerhalb des sichtbaren Bereiches liegen.

Ansonsten würde ich den Knoten direkt im Vst verschieben, anstatt alles neu zu laden

jaenicke 31. Okt 2020 09:56

AW: In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
Ein Timer ist gar nicht nötig. Es sollte reichen dir selbst mit PostMessage eine Nachricht zu schicken. Die wird dann hinter den vorhandenen Nachrichten in die Warteschlange eingereiht, also auch hinter den noch anstehenden Mausereignissen (bei Drag & Drop, sprich wenn man mit der Maus noch nicht fertig ist, geht das natürlich z.B. nicht).

norwegen60 1. Nov 2020 12:30

AW: In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
Zitat:

Zitat von jaenicke (Beitrag 1476476)
Ein Timer ist gar nicht nötig. Es sollte reichen dir selbst mit PostMessage eine Nachricht zu schicken. Die wird dann hinter den vorhandenen Nachrichten in die Warteschlange eingereiht, also auch hinter den noch anstehenden Mausereignissen (bei Drag & Drop, sprich wenn man mit der Maus noch nicht fertig ist, geht das natürlich z.B. nicht).

Ich habe bisher nie mit Postmessage gearbeitet und mal versucht mich schlau zu machen. Dabei finde ich recht viele Threads mit Problemen und was da alles zu beachten ist. Wie könnte so ein Postmessage aussehen?

jaenicke 2. Nov 2020 22:32

AW: In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
Empfang der Nachricht:
Delphi-Quellcode:
const
  MyMessage = WM_APP + 100;

type
  TBlubForm = class(TForm)
  protected
    procedure WmMyMessage(var Msg: TMessage); message MyMessage;
  end;

implementation

procedure TBlubForm.WmMyMessage(var Msg: TMessage);
begin
  Reload...
end;
Senden der Nachricht:
Delphi-Quellcode:
PostMessage(Handle, MyMessage, 0, 0);
// PostMessage wartet nicht auf Abarbeitung der Nachricht
Mehr dazu hier:
http://docwiki.embarcadero.com/RADSt...andling_Method

norwegen60 4. Nov 2020 08:36

AW: In VirtualStringTree nach Neuladen zurück auf vorigen Node
 
Super, das funktioniert einwandfrei. Danke für deine Hilfe.
Und wenn man es so sieht eigentlich auch ganz einfach


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr.

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