全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1410
推到 Plurk!
推到 Facebook!

多個視窗相互連動

尚未結案
corey
一般會員


發表:34
回覆:44
積分:14
註冊:2003-04-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-02 00:09:27 IP:61.230.xxx.xxx 未訂閱
我的問題如下: 我在桌面上放了三個form(a,b,c) a,b,c三個form 各放一個stringgrid 我如果點選其中一個a form的某一筆主資料(也有可能點選b或c),其它兩個b,c form會連動對應到相對子資料,請問有相關範例參考嗎?(我已找過本站資料)或著告訴我方向如何去做.....請指教.
artist1002
高階會員


發表:2
回覆:155
積分:151
註冊:2002-09-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-02 02:23:07 IP:211.76.xxx.xxx 未訂閱
引言: 我的問題如下: 我在桌面上放了三個form(a,b,c) a,b,c三個form 各放一個stringgrid 我如果點選其中一個a form的某一筆主資料(也有可能點選b或c),其它兩個b,c form會連動對應到相對子資料,請問有相關範例參考嗎?(我已找過本站資料)或著告訴我方向如何去做.....請指教.
你三個Form的StringGrid的資料關係是怎麼樣的呢? 你有提到母資料和子資料 所以可以說明一下連動對應關係為何?
corey
一般會員


發表:34
回覆:44
積分:14
註冊:2003-04-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-02 08:46:51 IP:211.78.xxx.xxx 未訂閱
引言: 你三個Form的StringGrid的資料關係是怎麼樣的呢? 你有提到母資料和子資料 所以可以說明一下連動對應關係為何?
我在說更清楚一點 a form 為客戶基本資料檔 b form 為此客戶交易之明細 c form 為客戶之庫存量 當我點選其中任何一個form之資料,三個form會顯示出各自資料,彼此之間都由帳號做關聯
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-02 09:44:00 IP:203.66.xxx.xxx 未訂閱
大膽猜測 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-02 16:08:01 IP:211.78.xxx.xxx 未訂閱
引言: 大膽猜測 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-03 00:26:24 IP:211.76.xxx.xxx 未訂閱
嗯...原來是資料庫的部份 那就是典型的Master-Detail設計了... 要在多個Form中使用的話 建立一個DataModule來放DataSource Form的部份放Data-aware的元件像是TDBGrid 然後設計DataSource的關係 設計的方法很多,幾乎每一本教學的書籍都會寫 範例在Delphi的Expamles也很多... 總之,如果是Master-Detail的說明實在是太多了 可能的話還是自己先看看書和範例 再把設計過程中遇到的問題提出來比較好
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-03 09:59:53 IP:203.66.xxx.xxx 未訂閱
可能我程度不好,我覺得這個問題並不是 "易如反掌",著時花了幾天作了很沒有效率的"測試",功能強大的元件往往隱藏了許多重量級的動作 ... 廢話不多說,請看以下簡單的範例: ------------------------------------------------------------------- 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·Q­n°õ¦æªº 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·Q­n°õ¦æªº 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-07 21:31:21 IP:61.230.xxx.xxx 未訂閱
這是個人寫的測試程式 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-08 09:01:54 IP:203.66.xxx.xxx 未訂閱
還好有看懂我要表達的意思.... :P 另外我好奇問一下,既然用 DataBase 為何堅持用 StringGrid ,而不用 Data-Award 的 DBGrid?? 如果是因為控制畫面or Cell 間移動的問題, 可以在站內 Search 'TDBGrid' 的問題,有幾個有 Source Code 的討論, 有關顏色,置入其他的控制項的做法討論,很實用,也可以省去很多判斷資料 的程式碼
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-09 16:06:44 IP:211.96.xxx.xxx 未訂閱
可能都是犯了不信任的毛病吧,總覺得給系統去自動感知,觸發,就是有那麼一點沒安全感,想要全部自己handle control所有的異動及事件觸發~~~~~ 我不懂,不懂,不懂....所以我才來ktop學工夫
系統時間:2024-04-28 23:09:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!