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

Form 與Form之間的指標切換

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


發表:4
回覆:1
積分:1
註冊:2011-03-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-03-28 09:28:38 IP:140.96.xxx.xxx 訂閱
最近寫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在啟動時(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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-03-28 13:52:54 IP:210.64.xxx.xxx 訂閱
你好,寫的好亂,看了二遍花了一點時間還是不太了解,因為:

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 重新編輯於 2011-03-27 23:58:08, 註解 無‧
aftcast 重新編輯於 2011-03-27 23:59:51, 註解 無‧
aftcast 重新編輯於 2011-03-28 00:23:28, 註解 無‧
aftcast 重新編輯於 2011-03-28 00:29:45, 註解 無‧
aftcast
站務副站長


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-03-28 14:55:54 IP:210.64.xxx.xxx 訂閱
多看了數次後…

若我上面猜的都是對的,那麼你的問題就是…

void __fastcall TFOpenStart::BtnChineseClick(TObject *Sender)
{
Form1->UpdateInterface("ChineseBIG5",this);
Form1->CHANG=0;
Application->ProcessMessages(); // 這裡插入一行
//DeadLine(this);
DeadLineFinal(this);
//----------------------------------------------------------------------------------------------

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);
}
Application->ProcessMessages(); // 這裡加一行


//------------------------------------------------------------------------------------------------------------

試看看吧
------



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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
upen24931251
一般會員


發表:4
回覆:1
積分:1
註冊:2011-03-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-03-31 16:24:27 IP:140.96.xxx.xxx 訂閱
很抱歉寫得有點亂,目前問題已經解決了!

但是和指標沒有任何關係,

而是BCB自動把我的Form->Name改掉了,原先如果是Form2Value,在執行期間變成了Form2Value_1

雖然不知道是什麼原因讓它變成這樣,

但是在INI語言檔裡面也做了修正之後,

問題就解決囉!


很抱歉那麼久才回覆,這幾天自己繼續和程式亂搞中,

sorry
系統時間:2017-10-21 7:30:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!