一個 Stringgrid 事件觸發的問題!!! |
尚未結案
|
hello
初階會員 ![]() ![]() 發表:64 回覆:68 積分:31 註冊:2004-05-08 發送簡訊給我 |
各位先進大家好,這是一個困擾我很久的問題.我在 Tstringgrid 的onselectcells寫上 以下程式碼:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
while 1 = 1 do begin
application.ProcessMessages;
..... if ... then break;
end;
end;
如果在此stringgrid快速捲動時此事件會重覆執行,我知是因為application.processmessage所造成的.但如果在while 回圈裡必須有此行,但又不希望while 迴圈未離開前,stringgrid的onselectcell事件又被觸發,是否有解決的方法?謝謝
|
Fishman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi hello,
1.定義一個全域變數 RunSelectCell ... private RunSelectCell : Boolean; { Private declarations } public ... 2.FormCreate 設定初始值 procedure TForm1.FormCreate(Sender: TObject); begin RunSelectCell := True; end; 3.SelectCell事件更改如下 procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if RunSelectCell then begin RunSelectCell := False; while 1 = 1 do begin Application.ProcessMessages; ... if ... then begin RunSelectCell := True; Break; end; end; end; end;
------
Fishman |
hello
初階會員 ![]() ![]() 發表:64 回覆:68 積分:31 註冊:2004-05-08 發送簡訊給我 |
感謝fishman熱必的問答,不過我遭遇的問題是onselectcell事件不能觸發,fishman大大的方式還是觸發onselectcell,再利用runselectcell的全域變數控管onselectcell的某段程式不重覆執行,其實我是建構一個公用函數,裡有application.process而在onselectcell事件裡去呼叫此函數(當然也可在其他不同的程式碼區段呼叫),其程式架構如下:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
ans : string;
ans1 : string;
begin
...
ans := do_xxx;
..
...
ans1 := do_xxx;
end; function Tform1.do_xxx:string;
begin
while 1 = 1 do begin
application.processmessage;
...
if .... then begin
temp_str := ...;
break;
end;
end;
result := temp_str;
end;
end;
|
Fishman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi hello,
如果在一進入 StringGrid1 的 OnSelectCell 事件將該 StringGrid 的 OnSelectCell 指向 nil 完成後再回復原來狀態呢(缺點是會有一點點 Delay)? procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var ans : string; ans1 : string; begin StringGrid1.OnSelectCell := NIL; ... ans := do_xxx; ... ans1 := do_xxx; StringGrid1.OnSelectCell := StringGrid1SelectCell; end;
------
Fishman |
hello
初階會員 ![]() ![]() 發表:64 回覆:68 積分:31 註冊:2004-05-08 發送簡訊給我 |
fishman謝謝你的回答,這正是我目前的處理方式,其實do_xxx()這個處理函數會這樣寫其實是在等候sever的問應,是要花一點時間.所以有一點點delay並不是什麼大問題,只是每次call do_xxx皆要在事件裡寫上這二段程式碼:
StringGrid1.OnSelectCell := NIL;
StringGrid1.OnSelectCell := StringGrid1SelectCell;
而在不同事件裡也是這種處理方式,雖然可達到控管的目的,只是在使用do_xxx這個函數總覺的不方便,我在想是否有一勞永逸的方法把控管的程式碼寫入do_xxx裡面呢?
再次感謝fishman熱心的光幫忙
|
hello
初階會員 ![]() ![]() 發表:64 回覆:68 積分:31 註冊:2004-05-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |