Form 與Form之間的指標切換 |
答題得分者是:aftcast
|
upen24931251
一般會員 發表:4 回覆:1 積分:1 註冊:2011-03-07 發送簡訊給我 |
最近寫BCB上遇到了個問題,想請大家幫忙參詳一下
因為在寫多國語言程式,我以INI方式來實現,在單一個Form的時候沒有任何問題, 但是當要在主視窗點選了所要的語言,然後副視窗雖然尚未開啟,但只要開始就會和主視窗的語言同步, 這樣的功能在實現的時候,我採用如下方法: A Form 點選某按鈕之後,會叫出B Form 我按照板上的INI語言範例來寫第三個程式(C Form), 然後讓A Form以及 B Form都include它, 透過變更C Form裡面的變數,讓所有include它的Form都知道現在是處於哪個語系, 用這種方式來完成多個Form之間的語系切換, 在我所做的第一個測試程式裡面, A Form點選了呼叫B Form的按鈕,按鈕裡面寫著: if (Form->ShowModal() == mrOk) { ImgDestroy(&m_ImgSrc); m_ImgSrc = Form->CloneImgOutput(); BmpLoadFromImgU8(ImageShow->Picture->Bitmap, m_ImgSrc); ImageShow->Refresh(); *(m_ImgSrc.type)=Bool8bit; } 然後BForm在啟動時(onActivate事件)判斷現在的語系為何,然後跟著讀取不一樣的語言檔. 第一個測試程式很順利地達成工作, //AForm裡面切換語系的Function void __fastcall TFormMain::N44Click(TObject *Sender) { //點選之後會使當前頁面變成所選擇的語言 Form1->UpdateInterface("ChineseBIG5",this); Form1->CHANG=0; } //BForm裡面判斷語系的Function void __fastcall TForm2Value::FormActivate(TObject *Sender) { if(Form1->CHANG==0) { Form1->UpdateInterface("ChineseBIG5",this); }else if(Form1->CHANG==1) { Form1->GBUpdateInterface("ChineseBIG5",this); }else if(Form1->CHANG==2) { Form1->UpdateInterface("English",this); } } 但在第二個測試程式裡面,和第一個程式唯一的差別在於,當我點選"中文"這個按鈕的時候, 除了語系被切換之外,同時也開啟了第二個Form,另一方面, 因為要傳入新的參數,所以我另外寫了一個函數,叫做ShowFormMain,將ShowModal()包在其中 這時候問題發生了, BForm沒辦法顯示正確的字,通通變成我預設的字串(我為了以防萬一,只要程式沒有搜索到match的元件名稱,就會顯示預設字串) 底下是該按鈕的程式碼: void __fastcall TFOpenStart::BtnChineseClick(TObject *Sender) { Form1->UpdateInterface("ChineseBIG5",this); Form1->CHANG=0; //DeadLine(this); DeadLineFinal(this); int Lng = 0; bool bChk; bChk = CheckBox1->Checked; if(bChk) // OpenFormTube(this, Lng, bChk); OpenFormMain(this, Lng, bChk,Mirror); else OpenFormMain(this, Lng, bChk,Mirror); Close(); } void __fastcall TFOpenStart::OpenFormMain(TObject *Sender, int Lng, bool TbChked,int Mirror) { cof = new int[3]; cof[0] = Lng; cof[1] = TbChked; cof[2] = (int)Mirror; TFormMain *Form = new TFormMain(this, cof); delete [] cof; if(Form->ShowModal()==mrNone) delete Form; } 因為只有A和B兩個Form, 我在想會不會是this指標,一值停留在AForm身上,而沒辦法切換到BForm呢嗎? 為什麼ShowModal()特別另外寫在一個函數裡面,會造成這樣的問題呢? 希望有人能解答我的疑惑 謝謝囉 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
你好,寫的好亂,看了二遍花了一點時間還是不太了解,因為:
A Form 是什麼類別 ( TFormMain ???, 但到了你所謂的測式二時變成TFOpenStart ??, TFormMain又變成你的所謂Form B? ) , B Form ( Form2Value ????,測式二中,你的B又變成TFormMain ?? )與 C Form (TForm1??我自猜)又是啥類別? 你說夠不夠亂的? 也許我猜的是對的…但真是太累人,還說重把這問題講清楚!!! 而 Form->ShowModal() 的Form 又是誰? (動態產生的Form A ? 上下的不一樣) Form1 是誰? (Form C 產生的物件?) 這 TFOpenStart 類別 又是指哪個 ? (沒說明過的額外的叫Form D ?? Form A ?) 還有一個重要的 : UpdateInterface("ChineseBIG5",this); 他的程式碼可以大概貼一下嗎? 用this來做ui的更新是吧?? 但還是要大概貼重點… 整體是可以猜到一些些,但不確定的情形下,該如何正確解答? 而且重要的是太亂容易讓人看不下去就想不理了…… 該講清楚第一次測式中,Form A B C 各是誰? 第二次的時候又是誰? (我發現是不同的)
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
多看了數次後…
若我上面猜的都是對的,那麼你的問題就是… void __fastcall TFOpenStart::BtnChineseClick(TObject *Sender) { Form1->UpdateInterface("ChineseBIG5",this); Form1->CHANG=0; Application->ProcessMessages(); // 這裡加一行 //------------------------------------------------------------------------------------------------------------ 試看看吧
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
upen24931251
一般會員 發表:4 回覆:1 積分:1 註冊:2011-03-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |