多個視窗相互連動 |
尚未結案
|
corey
一般會員 發表:34 回覆:44 積分:14 註冊:2003-04-19 發送簡訊給我 |
|
artist1002
高階會員 發表:2 回覆:155 積分:151 註冊:2002-09-26 發送簡訊給我 |
|
corey
一般會員 發表:34 回覆:44 積分:14 註冊:2003-04-19 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
大膽猜測 corey 想要問的是,資料來源是什麼??怎麼送到 StringGrid 的??
若是有用到 DataSource 就有比較方便的方法,否則,如果是單純從檔案內讀出資料,一個一個塞到 Cell 內,做法就不同 有用到 TDataSource 的方法 :
利用 A Form 內的 TDataSource 的 AfterScroll 方法觸發 Event...
在 AfterScroll 內寫入觸發 B,C Form 內資料更新的 code B 觸發 A,C , C 觸發 A,B 的方法同理 沒有用到 TDataSource 的方法 :
利用 TStringGrid 內的 OnSelectCell 觸發 Event, 然後在此方法內
寫入利用 ARow or ACol 判斷目前位於哪個 Data Row ..
根據 Data Row 內的 Key,去更新顯示 B, C Form 的 StringGrid 如果你有用到 DB 的元件(ADO,BDE),利用 TDBGrid 會比較簡單... 其他的同理
|
corey
一般會員 發表:34 回覆:44 積分:14 註冊:2003-04-19 發送簡訊給我 |
引言: 大膽猜測 corey 想要問的是,資料來源是什麼??怎麼送到 StringGrid 的?? 若是有用到 DataSource 就有比較方便的方法,否則,如果是單純從檔案內讀出資料,一個一個塞到 Cell 內,做法就不同 有用到 TDataSource 的方法 : 利用 A Form 內的 TDataSource 的 AfterScroll 方法觸發 Event... 在 AfterScroll 內寫入觸發 B,C Form 內資料更新的 code B 觸發 A,C , C 觸發 A,B 的方法同理 沒有用到 TDataSource 的方法 : 利用 TStringGrid 內的 OnSelectCell 觸發 Event, 然後在此方法內 寫入利用 ARow or ACol 判斷目前位於哪個 Data Row .. 根據 Data Row 內的 Key,去更新顯示 B, C Form 的 StringGrid 如果你有用到 DB 的元件(ADO,BDE),利用 TDBGrid 會比較簡單... 其他的同理首先謝謝seaturn99回應,但可否POS一下簡單的範例 小弟還有一些不懂 資料來源是用DATABASE....謝謝 |
artist1002
高階會員 發表:2 回覆:155 積分:151 註冊:2002-09-26 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
可能我程度不好,我覺得這個問題並不是 "易如反掌",著時花了幾天作了很沒有效率的"測試",功能強大的元件往往隱藏了許多重量級的動作 ... 廢話不多說,請看以下簡單的範例:
-------------------------------------------------------------------
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids; type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Query1: TQuery;
procedure Query1AfterScroll(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation uses Unit2,Unit3; {$R *.dfm} procedure TForm1.Query1AfterScroll(DataSet: TDataSet);
var
StrSQL : String;
begin
try
Form2.Query1.Close;
Form2.Query1.SQL.Clear;
// ¶ñ¤J·Qn°õ¦æªº SQL Command
StrSQL := 'SELECT * FROM «È¤á¥æ©ö¤§©ú²Ó WHERE custom_id=' DataSet.FieldByName('custom_id').AsString ;
Form2.Query1.SQL.Add(StrSQL);
Form2.Query1.Open; Form3.Query1.Close;
Form3.Query1.SQL.Clear;
// ¶ñ¤J·Qn°õ¦æªº SQL Command
StrSQL := 'SELECT * FROM «È¤á¤§®w¦s¶q WHERE custom_id=' DataSet.FieldByName('custom_id').AsString ;
Form3.Query1.SQL.Add(StrSQL);
Form3.Query1.Open; except
ON E : EDatabaseError do ShowMessage(E.Message);
ON E : EUpdateError do ShowMessage(E.Message);
end;
end; end. unit Unit2; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids; type
TForm2 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Query1: TQuery;
private
{ Private declarations }
public
{ Public declarations }
end; var
Form2: TForm2; implementation {$R *.dfm} end. unit Unit3; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids; type
TForm3 = class(TForm)
DBGrid1: TDBGrid;
Query1: TQuery;
DataSource1: TDataSource;
private
{ Private declarations }
public
{ Public declarations }
end; var
Form3: TForm3; implementation {$R *.dfm} end.
-----------------------------------------------------------------
注意事項 :
1.TQuery 跟 TDataSource 的對應我就不列出來了 ..
2.使用 BDE/ADO/dbExpress/InerBase 請自行變化對應的Query or Table元件
3.只示範 FormA 變化時,改變 FormB,C 的 DBGrid,其餘同理
4.偷懶,所以沒有把 DB 元件歸類到 DataModule Container 內 程度不好,希望野人獻曝,能稍微解決您的問題
|
corey
一般會員 發表:34 回覆:44 積分:14 註冊:2003-04-19 發送簡訊給我 |
這是個人寫的測試程式
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, ComCtrls, StdCtrls; type
TForm1 = class(TForm)
Panel1: TPanel;
Splitter2: TSplitter;
Panel4: TPanel;
StringGrid1: TStringGrid;
Splitter1: TSplitter;
StringGrid2: TStringGrid;
StringGrid3: TStringGrid;
StaticText1: TStaticText;
procedure FormShow(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid3SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid2SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1;
t: Integer; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject);
var i: Integer;
begin
for i := 1 to 4 do begin
StringGrid1.Cells[i,1] := '123';
StringGrid1.Cells[i,2] := '456';
StringGrid1.Cells[i,3] := '789';
StringGrid1.Cells[i,4] := '000'; StringGrid2.Cells[i,1] := '123';
StringGrid2.Cells[i,2] := '456';
StringGrid2.Cells[i,3] := '789';
StringGrid2.Cells[i,4] := '000'; StringGrid3.Cells[i,1] := '123';
StringGrid3.Cells[i,2] := '456';
StringGrid3.Cells[i,3] := '789';
StringGrid3.Cells[i,4] := '000';
end;
t := 0;
end; procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ActiveControl = StringGrid1 then begin
StaticText1.Caption := StringGrid1.Cells[ACol,ARow];
StringGrid2.Row := ARow;
StringGrid3.Row := ARow;
end;
end; procedure TForm1.StringGrid3SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ActiveControl = StringGrid3 then begin
StaticText1.Caption := StringGrid3.Cells[ACol,ARow];
StringGrid1.Row := ARow;
StringGrid2.Row := ARow;
end;
end; procedure TForm1.StringGrid2SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ActiveControl = StringGrid2 then begin
StaticText1.Caption := StringGrid2.Cells[ACol,ARow];
StringGrid1.Row := ARow;
StringGrid3.Row := ARow;
end;
end; end.
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |