線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1820
推到 Plurk!
推到 Facebook!

自訂物件時發生 Control '' has no parent window. 的錯誤

尚未結案
xBug
一般會員


發表:27
回覆:17
積分:8
註冊:2003-06-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-10 23:33:50 IP:218.162.xxx.xxx 未訂閱
小弟為了下列這一段程式碼,足足奮鬥了十一個小時,始終無法突破,想請大大幫忙看看,下列標了紅字的部分,該如何寫?    
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-11 08:55:55 IP:218.163.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-11 08:56:32 IP:210.66.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-11 11:59:31 IP:218.162.xxx.xxx 未訂閱
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 物件。為什麼會這樣? -------------------------------- 給我一個支點,我可以撐起整個地球
系統時間:2024-06-27 2:58:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!