xufs
一般會員
發表:16 回覆:26 積分:8 註冊:2003-04-23
發送簡訊給我
|
我在將StringGrid組件和ComboBox組件複合成新VCL時,編譯安裝通過了。但點選應用于應用程序時,卻出現”Control ' 'has no parent window"的出錯信息。這是為何﹖如何解決﹖編碼在哪裡出錯﹖
我是按一書介紹的方法﹐想將上述二個組件複合的,其編碼如下﹕
//--------------------------------------------------------------------------- #ifndef XuStringGridComboBoxH
#define XuStringGridComboBoxH
//---------------------------------------------------------------------------
#include
#include
#include
#include <Forms.hpp>
#include //---------------------------------------------------------------------------
class PACKAGE TXuStringGridComboBox : public TWinControl
{
private:
TXuStringGrid *FXuStringGrid;
TComboBox *FComboBox;
protected:
void __fastcall ComboBoxClick(TObject* Sender);
void __fastcall ComboBoxExit(TObject* Sender);
void __fastcall XuStringGridClick(TObject* Sender);
void __fastcall CreateWnd(); public:
__fastcall TXuStringGridComboBox(TComponent* Owner); __published:
};
//---------------------------------------------------------------------------
#endif
******************************************************************** //---------------------------------------------------------------------------
#include
#pragma hdrstop #include "XuStringGridComboBox.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
// static inline void ValidCtrCheck(TXuStringGridComboBox *)
{
new TXuStringGridComboBox(NULL);
}
//---------------------------------------------------------------------------
__fastcall TXuStringGridComboBox::TXuStringGridComboBox(TComponent* Owner)
: TWinControl(Owner)
{
Width=250;
Height=120; FXuStringGrid=new TXuStringGrid(this);
FXuStringGrid->Parent=this;
FXuStringGrid->Left=0;
FXuStringGrid->Top=0;
FXuStringGrid->Width=250;
FXuStringGrid->Height=120;
FXuStringGrid->XuStringGridClick; TRect CellRect;
CellRect = FXuStringGrid->CellRect(1, 0); FComboBox=new TComboBox(FGroupBox);
FComboBox->Parent=FGroupBox;
FComboBox->Left=FXuStringGrid->Left;
FComboBox->Top=FXuStringGrid->Top;
FComboBox->Left=FComboBox->Left CellRect.Left FXuStringGrid->GridLineWidth 1;
FComboBox->Top=FComboBox->Top FXuStringGrid->GridLineWidth;
FComboBox->Width=(CellRect.Right - CellRect.Left) 0;
FComboBox->Height=(CellRect.Bottom - CellRect.Top) 1;
FComboBox->OnExit=ComboBoxExit;
// FComboBox->ComboBoxClick;
FComboBox->Clear();
FComboBox->Color=clYellow;
FComboBox->Visible=true;
// FComboBox->SetFocus(); }
//---------------------------------------------------------------------------
namespace Xustringgridcombobox
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TXuStringGridComboBox)};
RegisterComponents("myVCL", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TXuStringGridComboBox::ComboBoxExit(TObject* Sender)
{
FXuStringGrid->Cells[FXuStringGrid->Col][0]= FComboBox->Text;
FComboBox->Visible=false;
} //---------------------------------------------------------------------------
void __fastcall TXuStringGridComboBox::ComboBoxClick(TObject* Sender)
{
// FXuStringGrid->Cells[FXuStringGrid->Col][0] = FComboBox->Text;
}
//---------------------------------------------------------------------------
void __fastcall TXuStringGridComboBox::XuStringGridClick(TObject* Sender)
{
FComboBox->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TXuStringGridComboBox::CreateWnd()
{
TWinControl::CreateWnd();
//取得窗口柄(handle)
FComboBox->Items->Add("輸入變量");
FComboBox->Items->Add("目標變量");
FComboBox->ItemIndex=0;
// ComboBoxClick(0);
ComboBoxExit(this);
}
//---------------------------------------------------------------------------
|
pwipwi
版主
發表:68 回覆:629 積分:349 註冊:2004-04-08
發送簡訊給我
|
引言:
public:
__fastcall TXuStringGridComboBox(TComponent* Owner); new TXuStringGridComboBox(NULL);
TXuStringGridComboBox(NULL);<----Must have Owner Try
TXuStringGridComboBox(Form1);
|
xufs
一般會員
發表:16 回覆:26 積分:8 註冊:2003-04-23
發送簡訊給我
|
引言:
引言:
public:
__fastcall TXuStringGridComboBox(TComponent* Owner); new TXuStringGridComboBox(NULL);
TXuStringGridComboBox(NULL);<----Must have Owner Try
TXuStringGridComboBox(Form1);
----------------------------------------------
還是不能解決問題。
|
jcjroc
高階會員
發表:21 回覆:279 積分:115 註冊:2002-09-18
發送簡訊給我
|
Label=new TLabel(TForm1);<==指明Label是依附在TForm1底下,當TForm1被刪除時,會自動刪除Label
Label->Parent=Panel1;<==指明Label顯示在Panel1上
|
xufs
一般會員
發表:16 回覆:26 積分:8 註冊:2003-04-23
發送簡訊給我
|
引言:
Label=new TLabel(TForm1);<==指明Label是依附在TForm1底下,當TForm1被刪除時,會自動刪除Label
Label->Parent=Panel1;<==指明Label顯示在Panel1上
jcjroc先生﹕
我創建的新VCL繼承于TWinControl﹐非放置于Form上。因此﹐我認為其FXuStringGrid->Parent不是Form,而應是這個新VCL,未知我理解的對否﹖
現我代碼改為如下﹕
//--------------------------------------------------------------------------- #ifndef XuStringGridComboBoxH
#define XuStringGridComboBoxH
//---------------------------------------------------------------------------
#include
#include
#include
#include <Forms.hpp>
#include //---------------------------------------------------------------------------
class PACKAGE TXuStringGridComboBox : public TWinControl
{
private:
TXuStringGrid *FXuStringGrid;
TComboBox *FComboBox;
protected:
void __fastcall ComboBoxClick(TObject* Sender);
void __fastcall ComboBoxExit(TObject* Sender);
void __fastcall XuStringGridClick(TObject* Sender);
// void __fastcall CreateWnd();
void __fastcall CreateHandle(void);
void __fastcall SetXuStringGrid(TXuStringGrid* FSetXuStringGrid);
void __fastcall SetComboBox(TComboBox* FSetComboBox); public:
__fastcall TXuStringGridComboBox(TComponent* Owner);
__fastcall ~TXuStringGridComboBox(); __published:
__property TXuStringGrid* XuStringGrid={read=FXuStringGrid, write=SetXuStringGrid};
__property TComboBox* ComboBox={read=FComboBox, write=SetComboBox};
};
//---------------------------------------------------------------------------
#endif
//--------------------------------------------------------------------------- #include
#pragma hdrstop #include "XuStringGridComboBox.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
// static inline void ValidCtrCheck(TXuStringGridComboBox *)
{
new TXuStringGridComboBox(NULL);
}
//---------------------------------------------------------------------------
__fastcall TXuStringGridComboBox::TXuStringGridComboBox(TComponent* Owner)
: TWinControl(Owner)
{
// }
//---------------------------------------------------------------------------
namespace Xustringgridcombobox
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TXuStringGridComboBox)};
RegisterComponents("myVCL", classes, 0);
}
}
//---------------------------------------------------------------------------
__fastcall TXuStringGridComboBox::~TXuStringGridComboBox()
{
if(FXuStringGrid) delete FXuStringGrid;
if(FComboBox) delete FComboBox;
}
//---------------------------------------------------------------------------- void __fastcall TXuStringGridComboBox::ComboBoxExit(TObject* Sender)
{
FXuStringGrid->Cells[FXuStringGrid->Col][0]= FComboBox->Text;
FComboBox->Visible=false;
} //---------------------------------------------------------------------------
void __fastcall TXuStringGridComboBox::ComboBoxClick(TObject* Sender)
{
FXuStringGrid->Cells[FXuStringGrid->Col][0] = FComboBox->Text;
}
//---------------------------------------------------------------------------
void __fastcall TXuStringGridComboBox::XuStringGridClick(TObject* Sender)
{
FXuStringGrid->SetFocus();
FXuStringGrid->Width=this->Width;
FXuStringGrid->Height=this->Height;
FComboBox->Visible=true;
}
//--------------------------------------------------------------------------- void __fastcall TXuStringGridComboBox::CreateHandle(void)
{
TWinControl::CreateHandle(); //重載载CreateHandle,取得句柄 Width=250;
Height=120;
FXuStringGrid=new TXuStringGrid(this);
FXuStringGrid->Parent=this;
FXuStringGrid->Left=0;
FXuStringGrid->Top=0;
FXuStringGrid->Width=this->Width;
FXuStringGrid->Height=this->Height;
FXuStringGrid->&XuStringGridClick; TRect CellRect;
CellRect = FXuStringGrid->CellRect(1, 0); FComboBox=new TComboBox(FXuStringGrid);
FComboBox->Parent=FXuStringGrid;
FComboBox->Left=FXuStringGrid->Left;
FComboBox->Top=FXuStringGrid->Top;
FComboBox->Left=FComboBox->Left CellRect.Left FXuStringGrid->GridLineWidth 1;
FComboBox->Top=FComboBox->Top FXuStringGrid->GridLineWidth 2;
FComboBox->Width=(CellRect.Right - CellRect.Left) 0;
FComboBox->Height=(CellRect.Bottom - CellRect.Top) 1;
FComboBox->OnExit=&ComboBoxExit;
FComboBox->&ComboBoxClick;
FComboBox->Clear();
FComboBox->Color=clYellow;
FComboBox->Visible=true;
// FComboBox->SetFocus();
FComboBox->Items->Add(" 輸入變量");
FComboBox->Items->Add(" 目標變量");
FComboBox->ItemIndex=0;
// ComboBoxClick(0);
ComboBoxExit(this); }
//-----------------------------------------------------------------------------void __fastcall TXuStringGridComboBox::SetXuStringGrid(TXuStringGrid* FSetXuStringGrid)
{
FXuStringGrid->Assign(FSetXuStringGrid);
}
//-----------------------------------------------------------------------------
void __fastcall TXuStringGridComboBox::SetComboBox(TComboBox* FSetComboBox)
{
FComboBox->Assign(FSetComboBox);
}
//----------------------------------------------------------------------------
這樣解決了出現的問題。但這樣的VCL還有許多要解決的問題﹐如ComboBox和XuStringGrid的property不會出現在Object Inspector等. 發表人 - xufs 於 2004/04/30 19:07:25
|
jcjroc
高階會員
發表:21 回覆:279 積分:115 註冊:2002-09-18
發送簡訊給我
|
不然你以為我在說啥喔!那只是舉例告訴你問題在哪而已.相同名稱的的Property你必須自己在去包一次,例如許多VCL Component都有Font這個Property,然後你結合兩個Component,別妄想他會出現所以你要獨自各別再去包一次.
我不會幫你改程式,那就失去你取得經驗的機會,經驗是由自己一連串的失敗中得到的,而這種經驗將會讓你比別人更強,基於這理由,我只要是回答問題都不會給完整程式,只會給方法而已.
|
xufs
一般會員
發表:16 回覆:26 積分:8 註冊:2003-04-23
發送簡訊給我
|
引言:
不然你以為我在說啥喔!那只是舉例告訴你問題在哪而已.相同名稱的的Property你必須自己在去包一次,例如許多VCL Component都有Font這個Property,然後你結合兩個Component,別妄想他會出現所以你要獨自各別再去包一次.
我不會幫你改程式,那就失去你取得經驗的機會,經驗是由自己一連串的失敗中得到的,而這種經驗將會讓你比別人更強,基於這理由,我只要是回答問題都不會給完整程式,只會給方法而已. PS.我不知道你的元件顯示出來如何,但看你的程式時,ComboBox的Parent是
FXuStringGrid,這表示你的ComboBox顯示在FXuStringGrid上的,可是這樣我覺得你為何再繼承TWinControl然後去包這兩個元件?
為何不直接繼承TXuStringGrid?
該不會是嫌Compiler出來的程式太小,資源消耗太少吧?(說笑的...) 發表人 - >>< face="Verdana, Arial, Helvetica">
//-----------------------------------------------------------------
謝謝兩位的參與和指教!
這是按做的.我想試試其效果.
ComboBox的Parent為this﹐似乎亦可.
我也有做過直接繼承TXuStringGrid.只是想作比較.
|