被DataSource打敗的我!求救中! 我的物件開發歷程 |
尚未結案
|
g9221712
高階會員 發表:145 回覆:344 積分:162 註冊:2006-07-06 發送簡訊給我 |
各位前輩及版主大人:
我的問題是,我想寫一個物件(如發文附件程式Pas),這個物件主要功能是 它可以偵測FORM(表單)上特定DataSource的狀態,我希望能做到當指定的DataSource狀態一改變 就能引發,我自訂物件內ChangeDataSourceState程序,但我卻不知道如何作成兩者的連結, 雖然我知道兩者的連結,需透過TNotifyEvent,但我卻不知道如何以不影響其他物件為前提的方式 達到這個目的! 懇請各位前輩給予指引,我真的迷路了! 是否可以給予程式碼上的建議,因為我好似有概念, 但是卻不知道怎麼實作。 先向前輩您說聲感謝! ================================================================================================ 一個看似簡單的問題,卻困擾我好久! 每當欣喜的以為往前一步,好似真的踏前一步,但是遇到了問題 又著實的被打了回來! 原來我還是不懂....................失望極了! 我以為我已經入門了,但是一看清楚,原來我只是跨過小門,連正門的邊都沒碰著! ================================================================================================
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」 程式寫的越久,卻發現自己越來越不會寫程式! |
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
這是我很久以前寫的, 可能和你要的類似, 重點部份我有用藍色註解說明, 你參考看看 ...
unit ahDBStatus; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Db; type TahDBStatus = class(TCustomLabel) private { Private declarations } FDataSource: TDataSource; FOnStateChange: TNotifyEvent; procedure SetDataSource(const Value: TDataSource); procedure NewStateChange(Sender: TObject); procedure SetCaption(ShowCaption: String; ShowColor: TColor); protected { Protected declarations } procedure Paint; override; public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published declarations } property DataSource: TDataSource read FDataSource write SetDataSource; property OnStateChange: TNotifyEvent read FOnStateChange write FOnStateChange; property Font; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TahDBStatus]); end; { TahDBStatus } constructor TahDBStatus.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TahDBStatus.Destroy; begin FDataSource := nil; inherited Destroy; end; procedure TahDBStatus.NewStateChange(Sender: TObject); begin if (FDataSource <> nil) then begin case FDataSource.State of dsBrowse: SetCaption('流覽', clBlack); dsEdit: SetCaption('編輯', clRed); dsInsert: SetCaption('新增', clRed); else SetCaption('', clBlack); end; { Designer 在 Datasource.OnStateChange 有寫程式則執行他 } if Assigned(FOnStateChange) then FOnStateChange(Sender); end; end; procedure TahDBStatus.Paint; begin inherited; { Design time 時顯示是那一個DataSet } if (csDesigning in ComponentState) then if (FDataSource <> nil) then Caption := FDataSource.DataSet.Name ':' Name else Caption := Name; end; procedure TahDBStatus.SetCaption(ShowCaption: String; ShowColor: TColor); begin Font.Color := ShowColor; Caption := ShowCaption; end; procedure TahDBStatus.SetDataSource(const Value: TDataSource); begin FDataSource := Value; { Run time 時才指定 DataSource.OnStateChange } if not (csDesigning in ComponentState) then if (FDataSource = nil) then FDataSource.OnStateChange := nil else FDataSource.OnStateChange := NewStateChange; end; end.
------
將問題盡快結案也是一種禮貌! |
g9221712
高階會員 發表:145 回覆:344 積分:162 註冊:2006-07-06 發送簡訊給我 |
|
TWJack
一般會員 發表:3 回覆:13 積分:3 註冊:2006-11-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |