自訂物件時發生 Control '' has no parent window. 的錯誤 |
尚未結案
|
xBug
一般會員 ![]() ![]() 發表:27 回覆:17 積分:8 註冊:2003-06-10 發送簡訊給我 |
小弟為了下列這一段程式碼,足足奮鬥了十一個小時,始終無法突破,想請大大幫忙看看,下列標了紅字的部分,該如何寫?
unit UNAV_TOOLBAR; interface uses ComCtrls, Classes, SysUtils, Dialogs, StdCtrls; type TNavBtn = (nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh); TNavBtnSet = set of TNavBtn; TNavToolBar = class(TToolBar) private FVisibleButtons: TNavBtnSet; procedure SetVisible(Value: TNavBtnSet); procedure InitButtons; public Buttons: array[TNavBtn] of TToolButton; constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property VisibleButtons: TNavBtnSet read FVisibleButtons write SetVisible default [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh]; end; procedure Register; implementation procedure Register; begin RegisterComponents('APPFII', [TNavToolBar]); end; { TNavToolBar } constructor TNavToolBar.Create(AOwner: TComponent); begin inherited Create(AOwner); FVisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh]; InitButtons; end; destructor TNavToolBar.Destroy; begin inherited Destroy; end; procedure TNavToolBar.InitButtons; var i: TNavBtn; Btn: TToolButton; begin ShowMessage(Self.Name); //如下圖所示,一片空白 for i := Low(Buttons) to High(Buttons) do begin Btn := TToolButton.Create(Owner); Btn.Parent := Self; //=>ERROR: Control '' has no parent window. Buttons[i] := Btn; end; end; procedure TNavToolBar.SetVisible(Value: TNavBtnSet); var i: TNavBtn; begin FVisibleButtons := Value; for i := Low(Buttons) to High(Buttons) do begin Buttons[i].Visible := i in FVisibleButtons; Buttons[i].Enabled := Buttons[i].Visible; end; end; end. |
ccchen
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
constructor TNavToolBar.Create(AOwner: TComponent); begin inherited Create(AOwner); parent:=TWinControl(AOwner); //可暫時解決你無parent之問題 FVisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh]; InitButtons; end; procedure TNavToolBar.InitButtons; var i: TNavBtn; Btn: TToolButton; begin ShowMessage(Self.Name); //你未給name當然是空白 元件不會自動有Name, DesignTime所以有name是Delphi的FormDesigner經由Designer.UniqueName來取得的,一般來說你可以不管 for i := Low(Buttons) to High(Buttons) do begin Btn := TToolButton.Create(Owner); Btn.Parent := Self; //=>ERROR: Control '' has no parent window. //此時你的TNavToolBar本身尚無parent, 故無法做為parent Buttons[i] := Btn; end; end; |
l630521
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:349 積分:372 註冊:2003-02-17 發送簡訊給我 |
unit UNAV_TOOLBAR; interface uses ComCtrls, Classes, SysUtils, Dialogs, StdCtrls, Controls; type TNavBtn = (nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh); TNavBtnSet = set of TNavBtn; TNavToolBar = class(TToolBar) private FVisibleButtons: TNavBtnSet; procedure SetVisible(Value: TNavBtnSet); procedure InitButtons; public Buttons: array[TNavBtn] of TToolButton; constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property VisibleButtons: TNavBtnSet read FVisibleButtons write SetVisible default [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh]; end; procedure Register; implementation procedure Register; begin RegisterComponents('APPFII', [TNavToolBar]); end; { TNavToolBar } constructor TNavToolBar.Create(AOwner: TComponent); begin inherited Create(AOwner); FVisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh]; Parent := TWinControl(AOwner); InitButtons; end; destructor TNavToolBar.Destroy; begin inherited Destroy; end; procedure TNavToolBar.InitButtons; var i: TNavBtn; Btn: TToolButton; begin ShowMessage(Self.Name); //如下圖所示,一片空白 for i := Low(Buttons) to High(Buttons) do begin Btn := TToolButton.Create(Owner); Btn.Parent := Self; //=>ERROR: Control '' has no parent window. Buttons[i] := Btn; end; end; procedure TNavToolBar.SetVisible(Value: TNavBtnSet); var i: TNavBtn; begin FVisibleButtons := Value; for i := Low(Buttons) to High(Buttons) do begin Buttons[i].Visible := i in FVisibleButtons; Buttons[i].Enabled := Buttons[i].Visible; end; end; end.請加上uses Controls, 及在Create加上Parent := TWinControl(AOwner); 試試看! Ian |
xBug
一般會員 ![]() ![]() 發表:27 回覆:17 積分:8 註冊:2003-06-10 發送簡訊給我 |
procedure TNavToolBar.InitButtons; var i: TNavBtn; Btn: TToolButton; begin for i := Low(NavBtns) to High(NavBtns) do begin Btn := TToolButton.Create(Self); Btn.Parent := Self; NavBtns[i] := Btn; end; end;加上紅色那一行後,程式可以執行了,可是又發現了兩個新的問題ㄟ。 1. 執行時會出現錯誤。錯誤訊息為: Project Project1.exe raised exception class EClassNotFound with message 'Class TToolButton not found'. Process stopped. Use Step or Run to Continue. 2. 在 Design Time 時,我建立一個 Project,將 TNavToolBar 物件拉到 TForm 上,TNavToolBar 會自動建立 10 個 TToolButton 物件;可是當我把 Project 存檔後再開啟時,他就變成 20 個 TToolButton 物件?我再猜應該是第一次建立時,建立了 10 個 TToolButton,第二次開啟 Project 時,又自動建立 10 個,變成一個 20 個 TToolButton 物件。為什麼會這樣? -------------------------------- 給我一個支點,我可以撐起整個地球 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |