DBGRid欄位驗證,使用Validate,整列的資料都會變? |
答題得分者是:leveon
|
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
使用xe2,ClientDataSet,資料庫firebrid
原畫面如下: sno prod_no prodname 001 p0001 aaa 002 p0002 bbb 003 p0003 ccc 固意將p0002 改為資料庫找不到的貨品編號「xxxxx」執行了下面程式 fdm.D_cds.FieldByName('prod_no').OnValidate:=prodcheck; procedure Tfstock_purchase_edit.prodcheck(Sender: TField); begin if trim(Sender.AsString)<>'' then begin if Select_Data('prod_name',trim(Sender.AsString))='' then begin MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); abort; end; end; end;
驗證後畫面如下: sno prod_no prodname 001 xxxxx aaa 002 xxxxx bbb 003 xxxxx ccc 正確因該為 sno prod_no prodname 001 p0001 aaa 002 xxxxx bbb 003 p0003 ccc 請問為何都變xxxxx 感謝~~~~~~~~~~~~~~~~~~ 發現原來是我加skin所造成的,有變法解決嗎~~~~~~~~ 編輯記錄
chris681016 重新編輯於 2012-11-06 02:51:15, 註解 無‧
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
可能是你 abort 掉後 Grid沒有在畫過
看看 DBGrid1.Repaint; DBGrid1.Refresh; 會不會恢復 正確資料===================引 用 chris681016 文 章=================== 使用xe2,ClientDataSet,資料庫firebrid 原畫面如下: sno prod_no prodname 001 p0001 aaa 002 p0002 bbb 003 p0003 ccc 固意將p0002 改為資料庫找不到的貨品編號「xxxxx」執行了下面程式 fdm.D_cds.FieldByName('prod_no').OnValidate:=prodcheck; procedure Tfstock_purchase_edit.prodcheck(Sender: TField); begin if trim(Sender.AsString)<>'' then begin if Select_Data('prod_name',trim(Sender.AsString))='' then begin MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); abort; end; end; end;
驗證後畫面如下: sno prod_no prodname 001 xxxxx aaa 002 xxxxx bbb 003 xxxxx ccc 正確因該為 sno prod_no prodname 001 p0001 aaa 002 xxxxx bbb 003 p0003 ccc 請問為何都變xxxxx 感謝~~~~~~~~~~~~~~~~~~ 發現原來是我加skin所造成的,有變法解決嗎~~~~~~~~ |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
不知道這樣行不行 DBGrid1.DataSource.DataSet.DisableControls; DBGrid1.DataSource.DataSet.EnableControls; ===================引 用 chris681016 文 章===================試了大大說的 DBGrid1.Repaint; DBGrid1.Refresh; abort;
還加了 fstock_purchase_edit.Repaint; fstock_purchase_edit.Refresh; 還是沒作用,如果固意把畫面跳到桌面,在進來就正常了@@ 如果把abort換成exit它又不會一直停在錯誤的地方,如果不show message 就也不會。 真的不行就~~~~不要用skin了..... |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
不知道這樣有沒有用阿 LockWindowUpdate(DBGrid1.Handle); LockWindowUpdate(0); ===================引 用 chris681016 文 章=================== 或是 DBGrid1.Perform(WM_SETREDRAW, 1, 0); 或是 SendMessage(DBGrid1.Handle, WM_SETREDRAW, 1, 0); 或是Application.ProcessMessages; 感覺是找個時機讓他重畫一下 就行了 是可以但變成鎖不住~~~ 如果DBGRid欄位驗證 不用onValidate, 使用DBGrid1ColExit,又會有用滑鼠上下移,或用鍵盤上下移不會處發到的問題,雖然在AfterScroll加上DBGrid1ColEnter能解決,但總覺的以後會有重覆觸發的問題,最後容易導致程式混亂~~~。 請問大大都採用何種方式呢? |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
|
cat200188
中階會員 發表:37 回覆:78 積分:68 註冊:2005-01-18 發送簡訊給我 |
|
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
其實我的MESSAGE就是自製的用FORM~~~~但還是ShowModal,是用呼叫DLL的如果改成,SHOW會閃一下看不到MESSAGE
編輯記錄
chris681016 重新編輯於 2012-11-07 18:54:04, 註解 無‧
|
cat200188
中階會員 發表:37 回覆:78 積分:68 註冊:2005-01-18 發送簡訊給我 |
|
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
如果送WM_SETREDRAW 還是沒用
那可能要靠自己重畫 在DBGrid的 onDrawColumnCell procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin (Sender as TDBGrid).Canvas.Brush.Color:=CLRed; (Sender as TDBGrid).Canvas.FillRect(Rect); (Sender as TDBGrid).Canvas.TextRect(Rect, Rect.Left 2, Rect.Top 2,(Sender as TDBGrid).DataSource.DataSet.FieldByName(Column.FieldName).AsString); end;
之後呼叫 DBGrid1.Repaint; 應該可以 |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
這個怪SKIN..............結論還是「不行」
procedure Tfstock_purchase_edit.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin (Sender as TDBGrid).Canvas.Brush.Color:=CLRed; (Sender as TDBGrid).Canvas.FillRect(Rect); (Sender as TDBGrid).Canvas.TextRect(Rect, Rect.Left 2, Rect.Top 2,(Sender as TDBGrid).DataSource.DataSet.FieldByName(Column.FieldName).AsString); end; procedure Tfstock_purchase_edit.Prod_Check(Sender: TField); begin if trim(Sender.AsString)<>'' then begin if Select_Data('prod_name',trim(Sender.AsString))='' then begin MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); { 還是只有這個可以但就是慢,畫面也閃一下 sSkinManager1.Active:=false; sSkinManager1.Active:=true; } //使用這個................沒用 { DBGrid1.Repaint; DBGrid1.Refresh; } //這個.....................也是沒用 //DBGrid1.Repaint; //原本的SKIN有一個,畫面會閃一下,但還是一樣.......................... sSkinManager1.RepaintForms; abort; end; end; end;
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
|
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
有變紅色 表示繪製Grid的程式 沒被Skin物件取代掉 try if trim(Sender.AsString)<>'' then begin if Select_Data('prod_name',trim(Sender.AsString))='' then begin MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); abort; end; end; end; //再補一槍 abort後依然會執行 DBGrid1.Repaint; showmessage('結束'); end; 試試看囉 ===================引 用 chris681016 文 章=================== 有的 ===================引 用 leveon 文 章=================== 疑 你加了onDrawColumnCell 後 Grid 有變成紅色嗎??
|
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
只要用就可以了,讓畫面正常了,但,確鎖不了在那位置,而且也不會在跳訊息了即時貨品錯了~~~
TRY if Select_Data('prod_name',trim(Sender.AsString))='' then begin MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); abort; end; EXCEPTEND; 看來因該沒救~~~~~感謝謝辛苦回覆^_____________^ repaint的時機應該放在abort後 procedure Tfstock_purchase_edit.Prod_Check(Sender: TField); begin except DBGrid1.Repaint; //或是之前貼的其他方法 end; 試試看囉 ===================引 用 chris681016 文 章=================== 有的 ===================引 用 leveon 文 章=================== 疑 你加了onDrawColumnCell 後 Grid 有變成紅色嗎??
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
從一開始接觸 Borland 產品,便發現 ShowMessage() 與 MessageBox() 關閉時會傳回 Char(13) 或 Char(27),
使原 Active 的元件因該傳回值而受到影響;故自製一個元件取代之,於該 ShowModal() 的 Message Form 的 FormCloseQuery 時, 呼叫另一個 ShowModal() 的無 Caption 無 Button 小 Size 的 Form,以其 FormKeyUp() 承接該 Key 並設定 ModalResult 而 Close。 於是 Message Form 關閉後就不會傳 Key 給原 Active 的元件,解決許多怪異的問題。 |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
很深奧的感覺,在試試,感謝大大
===================引 用 herbert2 文 章=================== 從一開始接觸 Borland 產品,便發現 ShowMessage() 與 MessageBox() 關閉時會傳回 Char(13) 或 Char(27), 使原 Active 的元件因該傳回值而受到影響;故自製一個元件取代之,於該 ShowModal() 的 Message Form 的 FormCloseQuery 時, 呼叫另一個 ShowModal() 的無 Caption 無 Button 小 Size 的 Form,以其 FormKeyUp() 承接該 Key 並設定 ModalResult 而 Close。 於是 Message Form 關閉後就不會傳 Key 給原 Active 的元件,解決許多怪異的問題。 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
如果 是ShowModal 的問題 那自己寫一個ShowModal 測試看看囉
TForm2 = class(TForm) private { Private declarations } public { Public declarations } function myShowModal: Integer; end; function TForm2.myShowModal: Integer; begin Application.ModalStarted; Show; try SendMessage(Handle, CM_ACTIVATE, 0, 0); ModalResult := 0; repeat Application.HandleMessage; if Application.Terminated then ModalResult := mrCancel else if ModalResult <> 0 then CloseModal; until ModalResult <> 0; Result := ModalResult; SendMessage(Handle, CM_DEACTIVATE, 0, 0); finally Hide; end; Application.ModalFinished; end; ===================引 用 herbert2 文 章=================== 從一開始接觸 Borland 產品,便發現 ShowMessage() 與 MessageBox() 關閉時會傳回 Char(13) 或 Char(27), 使原 Active 的元件因該傳回值而受到影響;故自製一個元件取代之,於該 ShowModal() 的 Message Form 的 FormCloseQuery 時, 呼叫另一個 ShowModal() 的無 Caption 無 Button 小 Size 的 Form,以其 FormKeyUp() 承接該 Key 並設定 ModalResult 而 Close。 於是 Message Form 關閉後就不會傳 Key 給原 Active 的元件,解決許多怪異的問題。 |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
請問這是啥意思~~~~~(功力很弱,不懂這個myShowModal的用途跟時機............)
呼叫myShowModal這個後然後怎麼show message。 ===================引 用 leveon 文 章=================== 如果 是ShowModal 的問題 那自己寫一個ShowModal 測試看看囉 TForm2 = class(TForm) private { Private declarations } public { Public declarations } function myShowModal: Integer; end; function TForm2.myShowModal: Integer; begin Application.ModalStarted; Show; try SendMessage(Handle, CM_ACTIVATE, 0, 0); ModalResult := 0; repeat Application.HandleMessage; if Application.Terminated then ModalResult := mrCancel else if ModalResult <> 0 then CloseModal; until ModalResult <> 0; Result := ModalResult; SendMessage(Handle, CM_DEACTIVATE, 0, 0); finally Hide; end; Application.ModalFinished; end; ===================引 用 herbert2 文 章=================== 從一開始接觸 Borland 產品,便發現 ShowMessage() 與 MessageBox() 關閉時會傳回 Char(13) 或 Char(27), 使原 Active 的元件因該傳回值而受到影響;故自製一個元件取代之,於該 ShowModal() 的 Message Form 的 FormCloseQuery 時, 呼叫另一個 ShowModal() 的無 Caption 無 Button 小 Size 的 Form,以其 FormKeyUp() 承接該 Key 並設定 ModalResult 而 Close。 於是 Message Form 關閉後就不會傳 Key 給原 Active 的元件,解決許多怪異的問題。
編輯記錄
chris681016 重新編輯於 2012-11-13 20:18:22, 註解 無‧
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
Form2.myShowModal; Form2 是一個新Form 就是你程式 MSG_RTN 這裡邊產生出的那個Form MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); ===================引 用 chris681016 文 章=================== 請問這是啥意思~~~~~(功力很弱,不懂這個myShowModal的用途跟時機............) 呼叫myShowModal這個後然後怎麼show message。 ===================引 用 leveon 文 章=================== 如果 是ShowModal 的問題 那自己寫一個ShowModal 測試看看囉 TForm2 = class(TForm) private { Private declarations } public { Public declarations } function myShowModal: Integer; end; function TForm2.myShowModal: Integer; begin Application.ModalStarted; Show; try SendMessage(Handle, CM_ACTIVATE, 0, 0); ModalResult := 0; repeat Application.HandleMessage; if Application.Terminated then ModalResult := mrCancel else if ModalResult <> 0 then CloseModal; until ModalResult <> 0; Result := ModalResult; SendMessage(Handle, CM_DEACTIVATE, 0, 0); finally Hide; end; Application.ModalFinished; end; ===================引 用 herbert2 文 章=================== 從一開始接觸 Borland 產品,便發現 ShowMessage() 與 MessageBox() 關閉時會傳回 Char(13) 或 Char(27), 使原 Active 的元件因該傳回值而受到影響;故自製一個元件取代之,於該 ShowModal() 的 Message Form 的 FormCloseQuery 時, 呼叫另一個 ShowModal() 的無 Caption 無 Button 小 Size 的 Form,以其 FormKeyUp() 承接該 Key 並設定 ModalResult 而 Close。 於是 Message Form 關閉後就不會傳 Key 給原 Active 的元件,解決許多怪異的問題。
編輯記錄
leveon 重新編輯於 2012-11-13 22:52:25, 註解 無‧
|
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
一樣不行..................再次感謝大大努力幫找解決方式,放棄這個問題好了~~~~~
===================引 用 leveon 文 章=================== Form2.myShowModal; Form2 是一個新Form 就是你程式 MSG_RTN 這裡邊產生出的那個Form MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); ===================引 用 chris681016 文 章=================== 請問這是啥意思~~~~~(功力很弱,不懂這個myShowModal的用途跟時機............) 呼叫myShowModal這個後然後怎麼show message。 ===================引 用 leveon 文 章=================== 如果 是ShowModal 的問題 那自己寫一個ShowModal 測試看看囉 TForm2 = class(TForm) private { Private declarations } public { Public declarations } function myShowModal: Integer; end; function TForm2.myShowModal: Integer; begin Application.ModalStarted; Show; try SendMessage(Handle, CM_ACTIVATE, 0, 0); ModalResult := 0; repeat Application.HandleMessage; if Application.Terminated then ModalResult := mrCancel else if ModalResult <> 0 then CloseModal; until ModalResult <> 0; Result := ModalResult; SendMessage(Handle, CM_DEACTIVATE, 0, 0); finally Hide; end; Application.ModalFinished; end; ===================引 用 herbert2 文 章=================== 從一開始接觸 Borland 產品,便發現 ShowMessage() 與 MessageBox() 關閉時會傳回 Char(13) 或 Char(27), 使原 Active 的元件因該傳回值而受到影響;故自製一個元件取代之,於該 ShowModal() 的 Message Form 的 FormCloseQuery 時, 呼叫另一個 ShowModal() 的無 Caption 無 Button 小 Size 的 Form,以其 FormKeyUp() 承接該 Key 並設定 ModalResult 而 Close。 於是 Message Form 關閉後就不會傳 Key 給原 Active 的元件,解決許多怪異的問題。 |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
對呀 真是太困難了 報歉沒幫上忙~ ===================引 用 chris681016 文 章=================== 一樣不行..................再次感謝大大努力幫找解決方式,放棄這個問題好了~~~~~ ===================引 用 leveon 文 章=================== Form2.myShowModal; Form2 是一個新Form 就是你程式 MSG_RTN 這裡邊產生出的那個Form MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); ===================引 用 chris681016 文 章=================== 請問這是啥意思~~~~~(功力很弱,不懂這個myShowModal的用途跟時機............) 呼叫myShowModal這個後然後怎麼show message。 ===================引 用 leveon 文 章=================== 如果 是ShowModal 的問題 那自己寫一個ShowModal 測試看看囉 TForm2 = class(TForm) private { Private declarations } public { Public declarations } function myShowModal: Integer; end; function TForm2.myShowModal: Integer; begin Application.ModalStarted; Show; try SendMessage(Handle, CM_ACTIVATE, 0, 0); ModalResult := 0; repeat Application.HandleMessage; if Application.Terminated then ModalResult := mrCancel else if ModalResult <> 0 then CloseModal; until ModalResult <> 0; Result := ModalResult; SendMessage(Handle, CM_DEACTIVATE, 0, 0); finally Hide; end; Application.ModalFinished; end; ===================引 用 herbert2 文 章=================== 從一開始接觸 Borland 產品,便發現 ShowMessage() 與 MessageBox() 關閉時會傳回 Char(13) 或 Char(27), 使原 Active 的元件因該傳回值而受到影響;故自製一個元件取代之,於該 ShowModal() 的 Message Form 的 FormCloseQuery 時, 呼叫另一個 ShowModal() 的無 Caption 無 Button 小 Size 的 Form,以其 FormKeyUp() 承接該 Key 並設定 ModalResult 而 Close。 於是 Message Form 關閉後就不會傳 Key 給原 Active 的元件,解決許多怪異的問題。 |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我個人大膽的假設與推論,這可能是和multithread裡使用form資源有關。所以,可以試著把流程改成如下,但原諒我delphi已生疏,看是否有人可以幫忙把psudo code與描述改成delphi code:
procedure Tfstock_purchase_edit.prodcheck(Sender: TField); begin if trim(Sender.AsString)<>'' then begin if Select_Data('prod_name',trim(Sender.AsString))='' then begin //MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); //也許可以使用sendmessage,但建議先測postmessage,先測寬的方法,若行再測緊的。 PostMessage(Tfstock_purchase_edit.Handle,.....USER_DEFINE...); abort; end; end; end;
然後在Tfstock_purchase_edit裡加入user_define message的handler: 在該handler裡: MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); 個人覺得成功率極高才是…
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
找了一下
const Define handler for message TMyForm = class(TForm) procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE; PostMessage(self.Handle,WM_MY_MESSAGE,0,0) 但不懂怎麼寫@@ ===================引 用 aftcast 文 章=================== 我個人大膽的假設與推論,這可能是和multithread裡使用form資源有關。所以,可以試著把流程改成如下,但原諒我delphi已生疏,看是否有人可以幫忙把psudo code與描述改成delphi code: procedure Tfstock_purchase_edit.prodcheck(Sender: TField); begin if trim(Sender.AsString)<>'' then begin if Select_Data('prod_name',trim(Sender.AsString))='' then begin //MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); //也許可以使用sendmessage,但建議先測postmessage,先測寬的方法,若行再測緊的。 PostMessage(Tfstock_purchase_edit.Handle,.....USER_DEFINE...); abort; end; end; end;
然後在Tfstock_purchase_edit裡加入user_define message的handler: 在該handler裡: MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); 個人覺得成功率極高才是… |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
我剛亂湊了程式
const WM_MY_MESSAGE = WM_USER 0; type Tfstock_purchase_edit = class(TForm) private { Private declarations }
procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE ; public { Public declarations } end; procedure Tfstock_purchase_edit.OnMyMessage(var Msg: TMessage); begin MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); end; procedure Tfstock_purchase_edit.Prod_Check(Sender: TField); var hwndwindow:hwnd; begin if trim(Sender.AsString)<>'' then begin if Select_Data('prod_name',trim(Sender.AsString))='' then begin PostMessage(fstock_purchase_edit.Handle,WM_MY_MESSAGE,0,0); abort; end; end; end; 是不會亂碼了但~~~~如果由DBGrid1ColEnter跳離了GRID 會跳出 MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); 然後跳出 Cannot make a visible window modal 跳離GRID會跳2次MSG_RTN可能這個關西...... 如果把PostMessage(fstock_purchase_edit.Handle,WM_MY_MESSAGE,0,0); 換成SendMessage(fstock_purchase_edit.Handle,WM_MY_MESSAGE,0,0);就跟以前一樣不行 如果將自訂的MSG_RTN 換成SHOWMESSAGE 或是 Application.MessageBox 都不會發生 「 Cannot make a visible window modal」
編輯記錄
chris681016 重新編輯於 2012-11-19 01:09:57, 註解 無‧
chris681016 重新編輯於 2012-11-19 01:19:12, 註解 無‧ chris681016 重新編輯於 2012-11-19 01:40:23, 註解 無‧ |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
嗯,處理的不錯。但看了你的程式碼後,覺得 PostMessage(self.Handle,WM_MY_MESSAGE,0,0); 比較優,因為就是這個form。
而你發生的問題應該是 MSG_RTN 這個函式造成的。因為沒看到它的實作,不能確定要怎麼改,但唯一可以確定的是modal form後面要free。在c 裡是new 一個form,用完去delete form。要依這樣的原理。 procedure Tfstock_purchase_edit.OnMyMessage(var Msg: TMessage); begin MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']); //這裡應該要free modal form end; procedure Tfstock_purchase_edit.Prod_Check(Sender: TField);此外,要注意另一個問題,但問題的原因我不是很確定,但我提供方法去找…即,在 這行下中斷點,然後去了解 trim(Sender.AsString)<>'' 或 Select_Data('prod_name',trim(Sender.AsString))='' 這二行是否在不該成立時而成立? 以上,先解決free的問題,看結果如何,若ok,那就別中斷了。若free後還是出現不如預期的,那就中斷去找問題。 ps 至於sendmessage不行的情形,是有點可預料,所以我才建議先測postmessage。它扯到執行緒是否立即切換…有機會再去了解。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
我的MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']);
是呼叫一個dll,大致如下: implementation uses get_dll; {$R *.dfm}
//--------------------------get_dll------------------------ unit get_dll; interface uses Data.Win.ADODB; function MSG_RTN(AA1,BB1 : ARRAY OF STRING):INTEGER ; implementation function MSG_RTN(AA1,BB1 : ARRAY OF STRING):INTEGER ; external 'ctl_func_dll.dll'; end. //--------------------------------ctl_func_dll.dll------------------------ function MSG_RTN(AA1,BB1 : ARRAY OF STRING):INTEGER ; BEGIN Application.CreateForm(TF_CTL_MESSAGE, F_CTL_MESSAGE); F_CTL_MESSAGE.ShowModal; F_CTL_MESSAGE.FREE; RESULT:=MSG_AA; END; //-----------------------CTL_MESSAGE------------------------------ procedure TF_CTL_MESSAGE.FormClose(Sender: TObject; var Action: TCloseAction); begin ACTION := CAFREE ; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |