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

被DataSource打敗的我!求救中! 我的物件開發歷程

尚未結案
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-10-22 22:46:48 IP:220.134.xxx.xxx 訂閱
各位前輩及版主大人:
我的問題是,我想寫一個物件(如發文附件程式Pas),這個物件主要功能是
它可以偵測FORM(表單)上特定DataSource的狀態,我希望能做到當指定的DataSource狀態一改變
就能引發,我自訂物件內ChangeDataSourceState程序,但我卻不知道如何作成兩者的連結,
雖然我知道兩者的連結,需透過TNotifyEvent,但我卻不知道如何以不影響其他物件為前提的方式
達到這個目的!
懇請各位前輩給予指引,我真的迷路了! 是否可以給予程式碼上的建議,因為我好似有概念,
但是卻不知道怎麼實作。 先向前輩您說聲感謝!



================================================================================================
一個看似簡單的問題,卻困擾我好久! 每當欣喜的以為往前一步,好似真的踏前一步,但是遇到了問題
又著實的被打了回來! 原來我還是不懂....................失望極了!
我以為我已經入門了,但是一看清楚,原來我只是跨過小門,連正門的邊都沒碰著!
================================================================================================

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-10-23 11:02:39 IP:211.76.xxx.xxx 未訂閱
這是我很久以前寫的, 可能和你要的類似, 重點部份我有用藍色註解說明, 你參考看看 ...
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-10-23 13:56:56 IP:220.134.xxx.xxx 訂閱
danny前輩感謝您一再的回應!我會更努力學習,以效法您熱情回應!謝謝您!
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
TWJack
一般會員


發表:3
回覆:13
積分:3
註冊:2006-11-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-10-26 22:23:58 IP:211.74.xxx.xxx 未訂閱
你可以了解一下 TDataLink
應該對你會有幫助的
系統時間:2024-05-07 22:47:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!