| 
							ymhuk
							
						 | 
						
							
								  | 
								
									
									 «  : 21-07-2007 15:32 »   | 
								
								 | 
							  
							 
							Возможна ли синхронизация DBGrid и StringGrid по скролу. Т.е. при перемещении скрола у DBGrid нужно чтобы на столько же перемещался скрол у StringGrid. Пока мне эта задача не дается так как у них нет обработчика OnScroll, другого способа я не знаю 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Знаешь мало - поучись, знаешь много - поделись. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 21-07-2007 17:01 »   | 
								
								 | 
							  
							 
							Перехватывай сообщение WM_VSCROLL и будет тебе счастье. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							ymhuk
							
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 22-07-2007 00:46 »   | 
								
								 | 
							  
							 
							Попробовал перехватывать его, но никак не выходит. По тому принципу как отлавливаются сообщения формы написал для DBGrid, но у меня ноль реакции. В чем ошибка не знаю. Вот фрагменты кода: type   TYGrid = class(TDBGrid)   procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL; procedure WMVScroll(var Msg: TWMVScroll); message WM_VSCROLL; end;
  ...
  var   Form1: TForm1;   DBGrids: TYGrid;
  ...
  procedure TYGrid.WMHScroll(var Msg: TWMHScroll); begin   ShowMessage('Горизонтальная'); end;
  procedure TYGrid.WMVScroll(var Msg: TWMVScroll); begin   ShowMessage('Вертикальная'); end;
  где ошибка???  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Знаешь мало - поучись, знаешь много - поделись. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									«  Ответ #3 : 22-07-2007 05:27 »    | 
								
								 | 
							  
							 
							Не знаю, все должно работать. Вот мой код, все работает: unit Unit1;
  interface
  uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, DBGrids, DB, DBTables;
  type   TForm1 = class(TForm)     Table1: TTable;     DataSource1: TDataSource;     procedure FormCreate(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end;
    TDBGrid1 = class(TDBGrid)   private    procedure WMVScroll(var msg:TWMVScroll);message WM_VSCROLL;   end;
  var   Form1: TForm1;
  implementation
  {$R *.dfm}
  var   str:TDBGrid1;
  procedure TDBGrid1.WMVScroll(var msg:TWMVScroll); begin  inherited;  MessageBox(0, 'Ok', '', MB_OK); end;
  procedure TForm1.FormCreate(Sender: TObject); begin  str:=TDBGrid1.Create(Form1);  str.Parent:=Form1;  str.DataSource:=DataSource1; end;
  end. Естественно, Table1 подключена к БД и активна, а DataSource1 подключен к Table1.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							ymhuk
							
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 22-07-2007 19:54 »   | 
								
								 | 
							  
							 
							str.Parent:=Form1;  str.DataSource:=DataSource1;
  вот где ошибка моя  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Знаешь мало - поучись, знаешь много - поделись. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							ymhuk
							
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 23-07-2007 13:30 »   | 
								
								 | 
							  
							 
							Теперь у меня не выходит передать StringGrid'у на сколько у меня переместился скролл в DBGrid. вот что я написал unit r_;
  interface
  uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, Buttons, DB, Grids, DBGrids, ExtCtrls, ADODB, Menus,   ComCtrls, ShellAPI, WinProcs;
  type   TForm1 = class(TForm)     Button2: TButton;     Memo1: TMemo;     OpenDialog1: TOpenDialog;     Memo2: TMemo;     TU: TADOTable;     Button4: TButton;     Timer1: TTimer;     DSU: TDataSource;     Button5: TButton;     Save: TButton;     Load: TButton;     Panel1: TPanel;     Grid2: TStringGrid;     grid1: TStringGrid;     procedure Button2Click(Sender: TObject);     procedure FormResize(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end;   TYDBGrid = class(TDBGrid)   procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;   end; TYGrid = class (TStringGrid) end;
 
  var   Form1: TForm1;   HPos: Integer;
  implementation
  {$R *.dfm} var   DBGridU: TYDBGrid;   Grid3: TYGrid;
  procedure TYDBGrid.WMHScroll(var Msg: TWMHScroll); Var   ScrollMessage:TWMHScroll; begin  inherited;   HPos := GetScrollPos(DBGridU.Handle,       SB_HORZ);  {1 способ} //SendMessage(grid3.handle, WM_HSCROLL, HPos, 0); //  {2 способ} //SetScrollPos(Grid3.handle, WM_HSCROLL, HPos, true); end;
  procedure TForm1.FormCreate(Sender: TObject); begin DBGridU:=TYDBGrid.Create(Form1); DBGridU.Parent:=Form1; DBGridU.Top:=200; DBGridU.Left:=0; DBGridU.DataSource:=DSU; Grid3:=TYGrid.Create(Form1); Grid3.Parent:=Form1; Grid3.Top:=140; Grid3.Left:=14; Grid3.RowCount:=1; Grid3.DefaultRowHeight:=24; Grid3.Height:=20; Grid3.ScrollBars:= ssHorizontal; Grid3.FixedCols:=0; Grid3.FixedRows:=0; Grid3.BorderStyle:=bsNone; end;
  Я пробовал и первый и второй способ ничего не помогает. я не разобрался что означают третьи и четвертые параметры в них. Что они означают? Где можно прочитать про них? Может где еще есть ошибка или я вообще не так передаю сообщение для СтрингГрида  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 23-07-2007 13:36 от ymhuk »
								 | 
								
									 
									Записан
								 | 
							  
							 
							Знаешь мало - поучись, знаешь много - поделись. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 23-07-2007 20:46 »   | 
								
								 | 
							  
							 
							1-й способ у тебя неправильно сделан, там вместо HPos, должно быть 2-ное слово, где в качестве старшего слова SB_THUMBPOSITION (смотри описание WM_HSCROLL в MSDN), а в качестве младшего слова - HPos. 2-й способ должен работать: pos:=GetScrollPos(DBGridU.Handle, SB_HORZ); SetScrollPos(Grid3.handle, SB_HORZ, pos, True);(обрати внимание, что не WM_HSCROLL, а SB_HORZ). 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							ymhuk
							
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 24-07-2007 18:54 »   | 
								
								 | 
							  
							 
							zubr, сэнкс. второй способ вроде как заработал, но почему вместе с ползунком скрола не передвигается текст содержащийся в СтрингГриде? как вообще такое возможно, мож еще какой параметр надо передать 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Знаешь мало - поучись, знаешь много - поделись. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 25-07-2007 08:15 »   | 
								
								 | 
							  
							 
							Сделай так: pos:=GetScrollPos(DBGrid1.Handle, SB_HORZ);  pos:=pos shl 16;  pos:=pos+SB_THUMBPOSITION;  StringGrid1.Perform(WM_HSCROLL, pos, 0);  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							ymhuk
							
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 26-07-2007 23:39 »   | 
								
								 | 
							  
							 
							zubr, спасибо заработало. И еще одна просьба, если не сложно можно коментарии к этим строчкам, не охото тупо копировать код, так ничему не научишься.
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Знаешь мало - поучись, знаешь много - поделись. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 27-07-2007 07:43 »   | 
								
								 | 
							  
							 
							pos:=GetScrollPos(DBGrid1.Handle, SB_HORZ);//получаем позицию скролла DBGrid pos:=pos shl 16;//помещаем значение позиции скролла в старшее слово переменной pos pos:=pos+SB_THUMBPOSITION;//помещаем в младшее слово переменной pos SB_THUMBPOSITION (см. MSDN WM_HSCROLL) StringGrid1.Perform(WM_HSCROLL, pos, 0);//посылаем в StringGrid1 сообщение WM_HSCROLL (аналог SendMessage)
   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							ymhuk
							
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 07-08-2007 08:31 »   | 
								
								 | 
							  
							 
							zubr, спасиб за помощь 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Знаешь мало - поучись, знаешь много - поделись. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Sla
							
						 | 
						
							
								  | 
								
									
									 « Ответ #12 : 07-08-2007 09:01 »   | 
								
								 | 
							  
							 
							pos:=GetScrollPos(DBGrid1.Handle, SB_HORZ);//получаем позицию скролла DBGrid pos:=pos shl 16;//помещаем значение позиции скролла в старшее слово переменной pos pos:=pos+SB_THUMBPOSITION;//помещаем в младшее слово переменной pos SB_THUMBPOSITION (см. MSDN WM_HSCROLL) StringGrid1.Perform(WM_HSCROLL, pos, 0);//посылаем в StringGrid1 сообщение WM_HSCROLL (аналог SendMessage)
  с точки зрения читабельности нормально, чесслово я бы сделал, после отладки, бы так: StringGrid1.Perform(WM_HSCROLL, GetScrollPos(DBGrid1.Handle, SB_HORZ) shl 16 +SB_THUMBPOSITION, 0);
   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Мы все учились понемногу... Чему-нибудь и как-нибудь. 
						 | 
					 
				 
			 |  
		 
	 | 
	 |