Mam 2 TTreeviews. Oba mają taką samą liczbę przedmiotów. Chciałbym móc synchronizować ich przewijania ... Gdybym przenieść jeden z nich, inne ruchy również ...Jak zsynchronizować przewijanie 2 widoków TTreeviews?
dla poziomego, to działa jak oczekuję ... do pionu, to działa, jeśli mogę użyć strzałek na pasku przewijania, ale nie jeśli przeciągnij kciuk lub jeśli mogę użyć kółka myszy...
Oto przykład mam napisane w celu zilustrowania mojego problemu:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StrUtils;
type
TForm1 = class(TForm)
tv1: TTreeView;
tv2: TTreeView;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
originalTv1WindowProc : TWndMethod;
originalTv2WindowProc : TWndMethod;
procedure Tv1WindowProc (var Msg : TMessage);
procedure Tv2WindowProc (var Msg : TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 10 do
begin
tv1.Items.AddChild(nil, DupeString('A', 20) + IntToStr(i));
tv2.Items.AddChild(nil, DupeString('B', 20) + IntToStr(i));
end;
originalTv1WindowProc := tv1.WindowProc;
tv1.WindowProc := Tv1WindowProc;
originalTv2WindowProc := tv2.WindowProc;
tv2.WindowProc := Tv2WindowProc;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
tv1.WindowProc := originalTv1WindowProc;
tv2.WindowProc := originalTv2WindowProc;
originalTv1WindowProc := nil;
originalTv2WindowProc := nil;
end;
procedure TForm1.Tv1WindowProc(var Msg: TMessage);
begin
originalTv1WindowProc(Msg);
if ((Msg.Msg = WM_VSCROLL)
or (Msg.Msg = WM_HSCROLL)
or (Msg.msg = WM_Mousewheel)) then
begin
// tv2.Perform(Msg.Msg, Msg.wparam, Msg.lparam);
originalTv2WindowProc(Msg);
end;
end;
procedure TForm1.Tv2WindowProc(var Msg: TMessage);
begin
originalTv2WindowProc(Msg);
if ((Msg.Msg = WM_VSCROLL)
or (Msg.Msg = WM_HSCROLL)
or (Msg.msg = WM_Mousewheel)) then
begin
// tv1.Perform(Msg.Msg, Msg.wparam, Msg.lparam);
originalTv1WindowProc(Msg);
end;
end;
end.
DFM:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 113
ClientWidth = 274
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object tv1: TTreeView
Left = 8
Top = 8
Width = 121
Height = 97
Indent = 19
TabOrder = 0
end
object tv2: TTreeView
Left = 144
Top = 8
Width = 121
Height = 97
Indent = 19
TabOrder = 1
end
end
Próbowałem też utworzenie podklasy z TTreeview, ale bez powodzenia (samo zachowanie) ... Próbowałem z TMemo i działa zgodnie z oczekiwaniami ...
Czego mi brakowało?
Cheers,
W.
podczas moich testów, myślałem, aby usunąć motyw VCL, ale nie próbowałem bez Tematy uruchomieniowe ... BTW, pomyślnie przetestowałem twój kod, a odpowiedź jest wyraźnie zaakceptowana, ponieważ robi dokładnie to, czego szukałem ... – Whiler
@ sertac-akyuz: W rzeczywistości WM_MOUSEWHEEL nadal nie działa zgodnie z oczekiwaniami ... tak jak inne Trreview nie są skoncentrowane, nie jestem pewien, czy przekazanie TMessage wystarczy, aby zrobić to, co naprawdę chcę ... każdy pomysł ? – Whiler
Ok, zarządzam kółkiem myszy: "procedura TForm1.FormMouseWheelDown (Sender: TObject, Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); Rozpocznij tv1.Perform (WM_VSCROLL, 1, 0); Obsługiwane: = Prawda; koniec; Procedura TForm1.FormMouseWheelUp (Nadawca: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); rozpocząć tv1.Perform (WM_VSCROLL, 0, 0); Obsługiwane: = Prawda; koniec; ' – Whiler