新增form |
答題得分者是:aftcast
|
Brady_Chen
一般會員 ![]() ![]() 發表:6 回覆:14 積分:9 註冊:2013-02-07 發送簡訊給我 |
小弟是BCB新手, 以前也都沒有寫程式的經驗
最近由於工作需求才開始接觸, 有個問題想請教各位前輩: 我想在form1上製作一個按鈕 此按鈕的功能為新增另一個form2 並在form2上使用CheckBox去選擇我需要的項目 再將選擇到的項目傳到form1的StringGrid裡 目前遇到主要的問題是: 1. 我不知道如何新增form2,並在form2上新增我所需要的CheckBox, 關於新增form的方法, 有看到使用File->NEW->Form 也有看到有人用動態新增 不知道哪個方法適用於我的想法 2. 在新增form之後, 我又要如何使按鈕與form2進行連結?? 3. 最後, form1與form2之間資料的傳遞, 是如何使之連結的?? 以上, 也許是很新手的問題, 希望各位前輩能夠指導, 感激不盡!!! 謝謝!!! |
GrandRURU
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
Brady_Chen
一般會員 ![]() ![]() 發表:6 回覆:14 積分:9 註冊:2013-02-07 發送簡訊給我 |
謝謝樓上前輩所提供的資訊
不過我目前所使用的方法不太一樣 寫出來提供參考 也遇到一些問題想繼續請教各位 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執行呢?? 如能撥空指教, 感激不盡!! 謝謝!! |
老大仔
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
|
GrandRURU
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
老大仔說的沒錯,程式一啟動就跑去執行動態新增元件的那個函式了
至於為什麼? 請參閱: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 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
看你自己有試著寫,有點誠意,所以就快速的把我寫的給你參考一下:
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 發送簡訊給我 |
|
Brady_Chen
一般會員 ![]() ![]() 發表:6 回覆:14 積分:9 註冊:2013-02-07 發送簡訊給我 |
非常感謝各位前輩的指導 小弟已經成功寫出來了 雖然不完全是照著前輩們的指導寫的 但您們所給予的許多觀念讓我受益良多 在此小弟也將寫好的程式分享出來 也許還有許多不足的地方 僅供參考 <<<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 //建立一個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 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, 註解 無‧ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |