AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls In VirtualStringTree nach Neuladen zurück auf vorigen Node

In VirtualStringTree nach Neuladen zurück auf vorigen Node

Ein Thema von norwegen60 · begonnen am 29. Okt 2020 · letzter Beitrag vom 4. Nov 2020
Antwort Antwort
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
428 Beiträge
 
Delphi 10.3 Rio
 
#1

In VirtualStringTree nach Neuladen zurück auf vorigen Node

  Alt 29. Okt 2020, 14:09
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

Geändert von norwegen60 (29. Okt 2020 um 14:12 Uhr)
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
135 Beiträge
 
#2

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

  Alt 29. Okt 2020, 17:31
[*]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
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
428 Beiträge
 
Delphi 10.3 Rio
 
#3

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

  Alt 29. Okt 2020, 18:43
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 ...
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.588 Beiträge
 
Delphi 10.3 Rio
 
#4

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

  Alt 29. Okt 2020, 19:49
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 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.
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
428 Beiträge
 
Delphi 10.3 Rio
 
#5

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

  Alt 29. Okt 2020, 20:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.558 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 31. Okt 2020, 09:50
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
Sven
--
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.135 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 31. Okt 2020, 09:56
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).
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
428 Beiträge
 
Delphi 10.3 Rio
 
#8

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

  Alt 1. Nov 2020, 12:30
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?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.135 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 2. Nov 2020, 22:32
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
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
428 Beiträge
 
Delphi 10.3 Rio
 
#10

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

  Alt 4. Nov 2020, 08:36
Super, das funktioniert einwandfrei. Danke für deine Hilfe.
Und wenn man es so sieht eigentlich auch ganz einfach
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 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