Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-80186
syte_ser78
2004-01-31 10:23
2004.02.25
Сохранение страници


1-79703
Karlson
2004-02-10 21:00
2004.02.25
Запрет нажатия *


14-80115
Polevi
2004-01-29 14:37
2004.02.25
Сафин - Агасси


14-80299
MBo
2004-01-30 08:37
2004.02.25
Пятница... Задачка ;)


4-80351
nejest
2003-12-17 18:00
2004.02.25
SetWindowText(GetActiveWindow(), тест ); почему-то не работет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский