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

新增form

答題得分者是:aftcast
Brady_Chen
一般會員


發表:6
回覆:14
積分:9
註冊:2013-02-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-02-18 09:18:08 IP:218.210.xxx.xxx 訂閱
 小弟是BCB新手, 以前也都沒有寫程式的經驗

最近由於工作需求才開始接觸,

有個問題想請教各位前輩:

我想在form1上製作一個按鈕

此按鈕的功能為新增另一個form2

並在form2上使用CheckBox去選擇我需要的項目

再將選擇到的項目傳到form1的StringGrid裡


目前遇到主要的問題是:

1. 我不知道如何新增form2,並在form2上新增我所需要的CheckBox,
關於新增form的方法, 有看到使用File->NEW->Form
也有看到有人用動態新增
不知道哪個方法適用於我的想法

2. 在新增form之後, 我又要如何使按鈕與form2進行連結??

3. 最後, form1與form2之間資料的傳遞, 是如何使之連結的??

以上, 也許是很新手的問題, 希望各位前輩能夠指導, 感激不盡!!!

謝謝!!!

GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-02-18 17:06:56 IP:59.120.xxx.xxx 未訂閱
請參閱:
http://www.programmer-club.com.tw/ShowSameTitleN/cb/5068.html
Brady_Chen
一般會員


發表:6
回覆:14
積分:9
註冊:2013-02-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-02-18 17:35:37 IP:218.210.xxx.xxx 訂閱
 謝謝樓上前輩所提供的資訊

不過我目前所使用的方法不太一樣

寫出來提供參考 也遇到一些問題想繼續請教各位


1. 我使用 [File->New->Form] 新增一個Form2
並在Form1的按鈕增加以下程式碼

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form2->Visible=!Form2->Visible;
}


2. Form2內使用動態新增元件的方式產生CheckBox

__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
TCheckBox **cbox; //宣告一個指標是屬於CheckBox
cbox = new TCheckBox*[data1c]; //一次要建立 (data1c) 個CheckBox,做記憶體配置
for(int a=0;a<=data1c;a ) //使用回圈來指定每一個CheckBox的屬性
{
cbox[a] = new TCheckBox(Form2); //記憶體配置
cbox[a]->Caption = AnsiString("CheckBox") IntToStr(a); //指定CheckBox的Caption
cbox[a]->Parent=Form2; //指定CheckBox的Parent
cbox[a]->Name = AnsiString("CheckBox") IntToStr(a); //指定CheckBox的Name
cbox[a]->Width = 115; //指定CheckBox的寬度
cbox[a]->Height = 15; //指定CheckBox的高度
cbox[a]->Left = 50 a*10; //指定CheckBox的位置
cbox[a]->Top = 100 a*10; //指定CheckBox的位置
cbox[a]->Checked = true; //設定CheckBox的Checked參數
}
}


其中data1c是從Form1載入資料得到的數目

目前遇到一個不知道怎麼解決的問題

我希望data1c的值是在我按下按鈕後才傳到Form2

這樣才能夠得到正確的數目

但是我發現我一執行, 他就用data1c=0(初始值)產生好CheckBox了

要如何才能讓我在Form1載入檔案之後, 確定好data1c的值

在Form1按下按鈕之後 再將data1c傳到Form2執行呢??


如能撥空指教, 感激不盡!!
謝謝!!
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-02-19 07:59:28 IP:210.61.xxx.xxx 未訂閱
data1c的宣告可以在Form1就先宣告好
然後在按下Form1的按鈕時賦予值

我猜data1c為從0開始是因為Form2被啟動時
data1c是被重新宣告的
所以會是從0開始

猜的
純粹是從Code猜的...我看不太懂C ....拍謝
以上僅供參考@@
編輯記錄
老大仔 重新編輯於 2013-02-18 17:00:07, 註解 無‧
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-02-19 09:44:29 IP:59.120.xxx.xxx 未訂閱
老大仔說的沒錯,程式一啟動就跑去執行動態新增元件的那個函式了
至於為什麼?
請參閱:http://bbs.nsysu.edu.tw/txtVersion/treasure/delphi/M.855652590.A/M.855652590.A/M.855652589.A/M.837175309.A.html

簡單地擷取一些內容說明:
『利甪 Options | Project , 將子視窗從 Auto-Create forms 移到 Available forms』

一、也就是你要利用「人工」的方式去建立你的Form2
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//Form2->Visible=!Form2->Visible;
Form2 = new TForm2(this);
Form2->Show();
}

二、Form2必須先include Form1才可能讀到Form1的變數 / 全域變數
unit2.h
include

三、人工建立的物件請記得釋放

以上
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-02-19 10:50:33 IP:114.32.xxx.xxx 訂閱
看你自己有試著寫,有點誠意,所以就快速的把我寫的給你參考一下:

from1的cpp


[code cpp]
void __fastcall TForm1::_btn1Click(TObject *Sender)
{
TForm2 *foo = new TForm2(0);
foo->_data1c = 5; // 這裡的5可以改成你要的變數
foo->ShowModal(); // 如果你用show,問題變多,form2的物件delete要放在form close等…
bool test = foo->_cbox[0]->Checked;
if (test)
ShowMessage("box 0 was checked");
else
ShowMessage("box 0 was NOT checked");
delete foo;
}
[/code]

form2 的 hpp

[code cpp]
class TForm2 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormShow(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm2(TComponent* Owner);
int _data1c; //自加
TCheckBox **_cbox; //自加
};

[/code]

form2的cpp

[code cpp]
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
_cbox = 0;
}
//---------------------------------------------------------------------------

void __fastcall TForm2::FormShow(TObject *Sender)
{
//TCheckBox **cbox;
_cbox = new TCheckBox*[_data1c];
for(int a=0;a< _data1c;a ) //你這裡寫成<=,會死的不明不白!!
{
_cbox[a] = new TCheckBox((TComponent*)0); //自己處理物件的銷滅
_cbox[a]->Caption = AnsiString("CheckBox") IntToStr(a);
_cbox[a]->Parent=this;
_cbox[a]->Name = AnsiString("CheckBox") IntToStr(a);
_cbox[a]->Width = 115;
_cbox[a]->Height = 15;
_cbox[a]->Left = 50;// a*10;
_cbox[a]->Top = 10 a*_cbox[a]->Height; //這樣比較好看吧
_cbox[a]->Checked = true;
}
}
//---------------------------------------------------------------------------

void __fastcall TForm2::FormDestroy(TObject *Sender)
{
if (_cbox)
{
for (int i=0;i <_data1c ;i )
{
delete _cbox[i];
}
delete [] _cbox;
}


}
//---------------------------------------------------------------------------

[/code]

以上的form2處理onshow的事件與ondestory的事件上,這些事件可在form的蜀性上的event上按二下產生,然後再貼程式


------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-02-19 11:47:27 IP:218.173.xxx.xxx 訂閱
蕭大果真值得崇拜,看來要像蕭大這般功力,小弟肯定要等下輩子了
Brady_Chen
一般會員


發表:6
回覆:14
積分:9
註冊:2013-02-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2013-02-20 09:05:15 IP:218.210.xxx.xxx 訂閱
 非常感謝各位前輩的指導

小弟已經成功寫出來了

雖然不完全是照著前輩們的指導寫的

但您們所給予的許多觀念讓我受益良多

在此小弟也將寫好的程式分享出來

也許還有許多不足的地方 僅供參考


<<<Form1.cpp>>><br />
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int chkcol=0;
TCheckBox **cbox; //宣告一個指標是屬於CheckBox
cbox = new TCheckBox*[data1c]; //一次要建立 (data1c) 個CheckBox,做記憶體配置
for(int j=0; j
{
cbox[j] = new TCheckBox(Form2); //記憶體配置
cbox[j]->Caption = (*(*(data) j) " , " *(*(data 2) j)); //指定CheckBox的Caption
cbox[j]->Parent=Form2; //指定CheckBox的Parent
cbox[j]->Name = AnsiString("CheckBox") IntToStr(j); //指定CheckBox的Name
cbox[j]->Width = 115; //指定CheckBox的寬度
cbox[j]->Height = 15; //指定CheckBox的高度
cbox[j]->Checked = false; //設定CheckBox的Checked參
if(j >= 10 10*chkcol)
{chkcol ;}
cbox[j]->Left = 50 150*chkcol; //指定CheckBox的位置
cbox[j]->Top = 50 2*j*(cbox[j]->Height)-300*chkcol; //指定CheckBox的位置
}
Form2->Show();
Form1->Hide();
}


<<<Form2.cpp>>><br />
extern int data1c, data2c; //在Form1.cpp前面有先宣告
extern String **data; //這邊利用extern引用外部變數, 不用在.hpp宣告
extern String **checked;
int c=0, k=0; //暫存計數
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//******************** cancel **************************************************
void __fastcall TForm2::Button2Click(TObject *Sender)
{
Form1->Show();
Form2->Hide();
}
//******************** OK **************************************************
void __fastcall TForm2::Button1Click(TObject *Sender)
{
for(int j=0; j
{
TCheckBox *CheckBox = dynamic_cast(FindComponent("CheckBox" IntToStr(j)));
//建立一個TCheckBox用FindComponent來取得CheckBox的控制權,需轉型為相關的型態,在此就將他轉型成TCheckBox
if(CheckBox->Checked)
{c ;}
}
checked = new String*[2]; // //
for(int i=0; i<2 ; i ) //創造動態陣列記憶體空間//
{checked[i] = new String[c];} // //
for(int j=0; j
{
TCheckBox *CheckBox = dynamic_cast(FindComponent("CheckBox" IntToStr(j)));
if(CheckBox->Checked)
{
*(*(checked) j-k) = *(*(data) j);
*(*(checked 1) j-k) = *(*(data 2) j);
}
else
{k ;}
}
for(int j=0; j
{
//ShowMessage( IntToStr(j) " = " *(*(checked) j) " , " *(*(checked 1) j));
Form1->StringGrid1->RowCount = j 2;
Form1->StringGrid1->Cells[0] [j 1] = *(*(checked) j);
Form1->StringGrid1->Cells[1] [j 1] = *(*(checked 1) j);
}
Form1->Show();
Form2->Hide();
}
//*******************************************************************************


變數的部分我是用extern的方式引用外部宣告

跟在.hpp宣告不知道哪邊不一樣

不過我有試著用宣告在.hpp 他都會出現警告

用現在這個方法眉目前沒發現問題

有很多東西還不懂, 還要多多學習

謝謝各位前輩!!!!
編輯記錄
Brady_Chen 重新編輯於 2013-02-19 18:06:46, 註解 無‧
Brady_Chen 重新編輯於 2013-02-19 18:07:31, 註解 無‧
Brady_Chen 重新編輯於 2013-02-19 18:09:04, 註解 無‧
Brady_Chen 重新編輯於 2013-02-19 18:11:43, 註解 無‧
Brady_Chen 重新編輯於 2013-02-19 18:12:26, 註解 無‧
系統時間:2017-12-14 23:13:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!