關於SetFocus |
答題得分者是:banson1716
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
有一主程式各去執行副程式,希望能將焦點放在指定之處,但會出現Can't Focus a disable or invisible windows'
但我只要將副程式中DBGRID1.SetFocus省略或放在FormActivate即可,但這不是我要的結果,能給我一些建議?
是不是因傳給副程式執行時Form2.QuickSearch_A(INPUT.TEXT);這時副程式根本還沒開啟Form2.SHOWMODAL;
thanks!!
Form1:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
IF Application.FindComponent('Form2')=nil then Application.CreateForm(TForm2, Form2 );
Form2.QuickSearch_A(INPUT.TEXT);
Form2.SHOWMODAL;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
IF Application.FindComponent('Form2')=nil then Application.CreateForm(TForm2, Form2 );
Form2.QuickSearch_B(INPUT.TEXT);
Form2.SHOWMODAL;
end; Form2:
procedure TForm2.QuickSearch_A(NO:STRING);
begin
//程式段省略
DBGRID1.SetFocus; //--->發生錯誤
end;
procedure TForm2.QuickSearch_B(NO:STRING);
begin
//程式段省略
DBGRID2.SetFocus; //--->發生錯誤
end;
|
FrederickPau
資深會員 發表:4 回覆:161 積分:268 註冊:2002-11-04 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 有一主程式各去執行副程式,希望能將焦點放在指定之處,但會出現Can't Focus a disable or invisible windows' 但我只要將副程式中DBGRID1.SetFocus省略或放在FormActivate即可,但這不是我要的結果,能給我一些建議? 是不是因傳給副程式執行時Form2.QuickSearch_A(INPUT.TEXT);這時副程式根本還沒開啟Form2.SHOWMODAL; thanks!! Form1: procedure TForm1.BitBtn1Click(Sender: TObject); begin IF Application.FindComponent('Form2')=nil then Application.CreateForm(TForm2, Form2 ); Form2.QuickSearch_A(INPUT.TEXT); Form2.SHOWMODAL; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin IF Application.FindComponent('Form2')=nil then Application.CreateForm(TForm2, Form2 ); Form2.QuickSearch_B(INPUT.TEXT); Form2.SHOWMODAL; end; Form2: procedure TForm2.QuickSearch_A(NO:STRING); begin //程式段省略 DBGRID1.SetFocus; //--->發生錯誤 end; procedure TForm2.QuickSearch_B(NO:STRING); begin //程式段省略 DBGRID2.SetFocus; //--->發生錯誤 end; 如果你只是想達成focus的目標, 如 hager兄所說的即可, 不過我提供一個方法, 可以讓你無法create執行時, 而又想如create一啟動後就可以去執行(順位在onactive, onshow之前) 1.在 private 中建立一個 procedure Start(Sender: Tobject; var Done: boolean); 2.在 implement 下實作 procedure TForm1.Start(Sender: Tobject; var Done: booean); var handle: longInt; begin handle:= FindWindow('TForm1',nil); // TForm1 視該unit FormName if handle = 0 then exit; Application.ProcessMessages; Application.OnIdle:= nil; Done:= True; ..... 要實作的程式碼如 dbgrid1.setfocus; end; 3.在 TForm1.FormCreate(Sender: TObject); begin ..... // 最後一列請加上 Application.OnIdle:= Start; end; 這樣就可以達成在create之後, onactive, onshow之前執行指定的程式碼, 而且不只一個動作 |
banson1716
高階會員 發表:55 回覆:182 積分:167 註冊:2002-04-14 發送簡訊給我 |
試試看把你的
Form2.DBGRID1.SetFocus 放在TForm2.FormShow 中
procedure TForm2.FormShow(Sender: TObject);
begin
Form2.DBGRID1.SetFocus;
end;
引言: Form2: procedure TForm2.QuickSearch_A(NO:STRING); begin //程式段省略 DBGRID1.SetFocus; //--->發生錯誤 end; procedure TForm2.QuickSearch_B(NO:STRING); begin //程式段省略 DBGRID2.SetFocus; //--->發生錯誤 end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |