我正在開發一個組件,但我無法讓它考慮在設計時設置的屬性。Delphi XE2在運行時不考慮組件屬性
以下是組分的摘錄:
TRVEditFrame = class(TFrame)
...
private
{ Private declarations }
FRVEditor:TCustomRichView;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
protected
function GetRVEditor:TCustomRichView;
procedure SetRVEditor(Editor:TCustomRichView);
published
property RVEditor:TCustomRichView read GetRVEditor write SetRVEditor;
end;
...
constructor TRVEditFrame.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
SetRVEditor(FRVEditor);
...
end;
function TRVEditFrame.GetRVEditor:TCustomRichView;
begin
Result:=FRVEditor;
end;
procedure TRVEditFrame.SetRVEditor(Editor:TCustomRichView);
begin
if Assigned(Editor) then begin
FRVEditor:=Editor;
end;
end;
我可以註冊該組件,將其置於療法形式,以及取決於設計時設定FRVEditor。
問題是當我運行應用程序時SetRVEditor()中的代碼沒有執行,因爲Editor = nil。
如果我能夠在設計時設置FRVEditor,那麼它是如何在運行時間=零?我怎樣才能解決這個問題 ?
我在這裏添加我進一步的評論,因爲對此的解釋是太長
@Kenneth,感謝您的回覆
- TCustomRichView是管理 超文本的第三部分組件集的一部分文件,並有4個更專業的後代,你是 是正確的,TCustomRichView不應該在真正的應用程序中使用。
- TRVEditFrame是我正在開發的組件。
我的組件背後的想法是用菜單,快捷方式,彈出菜單等來創建一個單一框架(因此組件TFrame的選擇)來管理每個TCustomRichView後代。
這正是我使用TCustomRichView的原因:我可以將4個後代中的任何一個「插入」我的組件框架。這與TDatasource的原理相同,可以與TTAble和TQuery連接(它們具有相同的祖先)。
我想爲什麼VCL沒有將RVEditor鏈接到我在設計時設置的TCustomRichView後代,原因是TFrame沒有OnCreate事件,例如TForm。
到目前爲止,我設法通過在主持TRVEditFrame的TForm.OnCreate中手動調用TRVEditFrame.SetRVEditor來解決問題,但我想知道是否有更好的方法來做到這一點,這就是爲什麼我在這裏提出建議的原因。
我知道你也可以爲TFrames創建一個OnCreate事件,也許我可以將TRVEditFrame.SetRVEditor放在那裏,但是,我想知道是否有更好的方法。
關於您評論的最後部分,我瞭解註冊程序,但考慮到組件正在開發中。當我開發組件時,我從來不會將它們安裝在IDE中,因爲我寧願將測試內容保留在「官方」之外。 我使用這種方法,只要組件準備就緒,我就會將其註冊到您提到的程序中。如果我想對同一個組件實現其他功能,我可以在測試環境中工作,並繼續使用IDE中的「官方」功能。
什麼是TCustomRichView?它看起來像一個班。所以 屬性是一個參考。實際的對象在哪裏?它存在於表單上嗎?對象甚至在被用作屬性賦值的來源之前被實例化了嗎? 另外,構造函數中的SetRVEditor(FRVEditor)是 毫無意義的。擺脫它。 –
@David TcustomerRichView是一個類,該屬性是對另一個要鏈接的類的引用 是的,該對象在設計時與TRVEditFrame以相同的形式丟棄。 「該對象是否在作爲屬性賦值的來源之前被實例化?」 我不確定你在這裏的意思。 TRVEditFrame.RVEditor在設計時指定。我回答了您的問題 –
@pio pio:當您查看DFM(alt + F12)時,您是否看到屬性設置爲您分配的值? – AlexSC