Sychrone Listboxen
Hallo,
zwei LB sollen synchron gescrollt werden. Im Tool http://www.screensoft.de/txtc.zip ist zu sehen wenn in der Vorschau (Mitte) gescrollt wird und beide LB nachgezogen werden sollen hängt die 2. LB etwas hinterher. Warum?
Code:
Danke und beste Grüße
procedure TMainForm.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin TopLine:=... // SendMessage(ListBox1.Handle, WM_VSCROLL, MakeLong(LOWORD(SB_THUMBPOSITION), TopLine), 0); Application.ProcessMessages; SendMessage(ListBox2.Handle, WM_VSCROLL, MakeLong(LOWORD(SB_THUMBPOSITION), TopLine), 0); end; |
AW: Sychrone Listboxen
Na ja, das ist doch offensichtlich. Zwischen den beiden SendMessage-Aufrufen für ListBox1 und ListBox2 sorgt das Application.ProcessMessages für ein Refresh der ListBox1 bevor ListBox2 überhaupt den Befehl zum Scrollen bekommen hat.
|
AW: Sychrone Listboxen
Wenn ich Application.ProcessMessages rausmache dann hängt LB1.
|
AW: Sychrone Listboxen
Ohne konkretes Beispiel-Projekt kann ich auch nur spekulieren: Ändere mal die beiden SendMessage-Aufrufe in PostMessage.
|
AW: Sychrone Listboxen
Bei mir kann ich keinerlei Verzögerung bei der Synchronisation in Deinem Programm feststellen.
|
AW: Sychrone Listboxen
Hallo,
ich würde das Application.ProcessMessages; einfach als letzten Befehl aufrufen und nicht zwischen den beiden ListBox-Befehlen. |
AW: Sychrone Listboxen
Zitat:
|
AW: Sychrone Listboxen
Application.ProcessMessages; zuletzt: In dem Fall hängt LB1 etwas hinterher. Ich glaube ich muss damit erstmal leben:?.
|
AW: Sychrone Listboxen
Bevor ich ein Send-/Post-/Message anwenden würde, probiere ich zuerst ob das Control ein Perform beherrscht.
Bevor ich ein Application.ProcessMessages aufrufe, probiere ich ob es ein Begin-/End-/Update beherrscht. Ungetestet meine Theorie: Zitat:
|
AW: Sychrone Listboxen
Keine Änderung...
|
AW: Sychrone Listboxen
Für RichEdits habe ich es folgendermaßen umgesetzt:
(https://youtu.be/qH-kT2I5q6g) Das kannst Du so natürlich nicht 1:1 übernehmen (da ich von einem anderen Datenbestand ausgehe und Listboxen vielleicht nicht genau so funktionieren) aber evtl. hilft es als Ideenpool... (Die Panels sind ausgestanzt und bilden die Rahmen um die aktuellen Zeilen links und rechts.)
Delphi-Quellcode:
case (ControlledSite) of
csLeft: begin TLO := RichEdit1O.Perform(EM_GETFIRSTVISIBLELINE, 0, 0); ALO := RichEdit1O.ActiveLineNo; PanelLeftFrame.Top := (((ALO - TLO) * 14) + 4); lTag := (TLO); if Assigned(BlocksCtrl) then begin D := MaxInt; for I := 0 to BlocksCtrl.LineNumberListRight.Count - 1 do begin D_ := Abs(ALO - (BlocksCtrl.LineNumberListRight[I].LineNumber)); if (D_ < D) then begin ALR := I; D := D_; if (D = 0) then begin TLR := RichEdit1R.Perform(EM_GETFIRSTVISIBLELINE, 0, 0); TLC := (I - (ALO - TLO)); if (TLC < 0) then begin TLC := 0; end; RichEdit1R.Perform(EM_LINESCROLL, 0, TLC - TLR); TLR := RichEdit1R.Perform(EM_GETFIRSTVISIBLELINE, 0, 0); rTag := TLR; PanelRightFrame.Top := (((ALR - TLR) * 14) + 4); PanelRightFrame.Visible := True; if (RichEdit1R.CaretPos.Y <> ALR) then RichEdit1R.CaretPos := TPoint.Create(0, ALR); Break; end; end; end; if (D <> 0) then begin PanelRightFrame.Visible := False; rTag := -1; end; if (ALO <= BlocksCtrl.LineNumberListLeft.Count - 1) then BlocksCtrl.currentBlockNumber := BlocksCtrl.LineNumberListLeft[ALO].BlockNumber; end; end; ... |
AW: Sychrone Listboxen
Lösung:
Code:
:thumb:
TopLine:=...
Application.ProcessMessages; SendMessage(ListBox1.Handle, WM_VSCROLL, MakeLong(LOWORD(SB_THUMBPOSITION), TopLine), 0); SendMessage(ListBox2.Handle, WM_VSCROLL, MakeLong(LOWORD(SB_THUMBPOSITION), TopLine), 0); Application.ProcessMessages; |
AW: Sychrone Listboxen
Jetzt auch im Tool sichtbar: http://www.screensoft.de/txtc.zip
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz