私は2TTreeviewsを持っています。どちらも同じ数のアイテムを持っています。 私は同期させることができるように彼らのスクロールバーが欲しい...私はそれらのいずれかを移動すると、他の移動をも...2Treeviewsのスクロールを同期させる方法は?
を水平ために、私は期待どおりに動作... 垂直の場合、私はスクロールバーの矢印を使用している場合、それは動作しますが、私は親指をドラッグか、私はマウスホイールを使用している場合...ここ
は私がきたサンプルであれば、それはしていません私の問題を説明するために書かれた:
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
私もTTreeViewのからサブクラスを作成しようとしたが、成功(同じ動作)することなく、... は、私はTMemoオブジェクトを試みたが、期待どおりに動作しますが...
私は何を欠席しましたか?
乾杯、
W.
は私のテストの間に、私は、VCLのテーマを削除すると思ったが、私はなしで試していませんランタイムテーマ...私は正常にあなたのコードをテストし、答えがはっきりと私が探していたものと同じように明確に受け入れられている... – Whiler
@ sertac-akyuz:実際には、WM_MOUSEWHEELはまだ期待どおりに動作しません...他のTrreviewが集中していないので、TMessageが本当に欲しいものを行うには十分であるとは思いません... ? – Whiler
私はこれでマウスホイールを管理します: 'procedure TForm1.FormMouseWheelDown(Sender:TObject; Shift:TShiftState; MousePos:TPoint; var Handled:Boolean); begin tv1.Perform(WM_VSCROLL、1,0); 処理済み:=真; end; TForm1.FormMouseWheelUp(送信者:TObject; Shift:TShiftState; MousePos:TPoint; var処理済み:ブール); begin tv1.Perform(WM_VSCROLL、0、0); 処理済み:=真; end; ' – Whiler