Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизКак синхронизировать прокрутку 3-х StringGrid ов Найти похожие ветки
← →
siriusP (2004-02-13 14:36) [0]Подскажите, как синхронизировать прокрутку 3-х StringGrid"ов.
А именно: один является ведущим, у других выключены ScrollBars (ssNone); когда у ведущего нажимается гор-ый скролл также скроллится в этом направлении и один ведомый, а когда нажимается верт.скролл - скроллиться другой ведомый. Если, что не так сформулировал, то не пинайте.
← →
Тимохов (2004-02-13 14:37) [1]Сделай потомка от грида.
Перекрой метод TopLeftChanged - там делай то, что тебе нужно.
← →
Семен Сорокин (2004-02-13 14:39) [2]штатных нет, придется добавить:
procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
← →
Тимохов (2004-02-13 14:40) [3]
> Семен Сорокин © (13.02.04 14:39) [2]
Можно, конечно и так. Но имхо автору нужно было синхронизировать именно grid"ы. Думаю, что 1 - ему будет достаточно.
← →
Семен Сорокин (2004-02-13 14:44) [4]Тимохов © (13.02.04 14:40) [3]
Думаю, что 1 - ему будет достаточно.
Может быть, пусть сам выбирает.
← →
Тимохов (2004-02-13 14:44) [5]
> Может быть, пусть сам выбирает.
Точно!
← →
siriusP (2004-02-13 14:46) [6]TopLeftChange вызывается когда изменяется TopRow или LeftCol, а при скроллировании они могут и не изменятся
← →
Alexey_85 (2004-02-13 14:48) [7]А зачем? нельзя ли всю инфу поместить в один грид?
Напиши код
← →
olookin (2004-02-13 14:55) [8][6] siriusP (13.02.04 14:46)
TopLeftChange вызывается когда изменяется TopRow или LeftCol, а при скроллировании они могут и не изменятся
Если включить в опцию goThumbTracking, то меняется как только сместилась первая строка/столбец...
← →
olookin (2004-02-13 14:56) [9]А собственно решение проблемы такое:
procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
begin
stringgrid2.TopRow:=stringgrid1.toprow;
end;
← →
Alexey_85 (2004-02-13 15:14) [10]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids;
type
TForm1 = class(TForm)
StringGrid3: TStringGrid;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
procedure StringGrid3Enter(Sender: TObject);
procedure StringGrid3KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure StringGrid3MouseWheelDown(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
procedure StringGrid3MouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
procedure Rol(Arow:integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Rol(ARow:integer);
begin
StringGrid1.Row:=Arow;
StringGrid2.Row:=Arow;
end;
procedure TForm1.StringGrid3KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=40 then Rol(StringGrid3.Row+1)
else
if key=38 then Rol(StringGrid3.Row-1)
end;
procedure TForm1.StringGrid3MouseWheelDown(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
Rol(StringGrid3.Row+1);
end;
procedure TForm1.StringGrid3MouseWheelUp(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
Rol(StringGrid3.Row-1);
end;
end.
--------------
← →
siriusP (2004-02-13 15:21) [11]А процедура перехватывания сообщения относится только к StringGrid или ко всей форме. Я понимаю, что можно создать свой StringGrid на базе старого и перехватывать прокрутку. А как из него изменять другие StringGrid. Скорее я не допонимаю. Просветите.
← →
Alexey_85 (2004-02-13 15:26) [12]Зачем?
Нет ты просто обрабатываешь события (см. выше) возможные при прокрутке.
Это клавиатура: KeyDown и Мышь:MouseWheelUp, MouseWheelDown
возможно что-то еще....................
-------------
Обожди , У тебя В приложении 3 СтрингГрида, ты на одном изменяешь что-либо, и на других это отбражается? так?
← →
Семен Сорокин (2004-02-13 15:26) [13]siriusP (13.02.04 15:21) [11]
А процедура перехватывания сообщения относится только к StringGrid или ко всей форме. Я понимаю, что можно создать свой StringGrid на базе старого и перехватывать прокрутку. А как из него изменять другие StringGrid. Скорее я не допонимаю. Просветите.
Если этот вопрос касательно моего поста, то вот понадобилось как-то ScrollBox расширить, может поможет:
unit ScrBox;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms;
type
TScrollDirect = (sdVert, sdHorz);
TScrollEvent = procedure (Sender: TScrollBox; Direct: TScrollDirect; Position: integer) of object;
TScrBox = class(TScrollBox)
private
FOnScroll: TScrollEvent;
procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
procedure WMNCHitTest(var Message: TMessage); message WM_NCHITTEST;
published
property OnScroll: TScrollEvent read FOnScroll write FOnScroll;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("Samples", [TScrBox]);
end;
{ ------------------------------- TScrBox ------------------------------------ }
procedure TScrBox.WMHScroll(var Message: TWMHScroll);
begin
inherited;
if Assigned(FOnScroll) then
FOnScroll(TScrollBox(Self), sdHorz, HorzScrollBar.Position)
end;
procedure TScrBox.WMNCHitTest(var Message: TMessage);
begin
DefaultHandler(Message)
end;
procedure TScrBox.WMVScroll(var Message: TWMVScroll);
begin
inherited;
if Assigned(FOnScroll) then
FOnScroll(TScrollBox(Self), sdVert, VertScrollBar.Position)
end;
end.
← →
siriusP (2004-02-13 15:26) [14]Ок. на OnTopLeftChanged можно все обрабатывать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c