線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:11022
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

DBGRid欄位驗證,使用Validate,整列的資料都會變?

答題得分者是:leveon
chris681016
中階會員


發表:69
回覆:122
積分:98
註冊:2006-10-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-11-06 17:39:26 IP:211.75.xxx.xxx 訂閱
 使用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-11-06 18:07:14 IP:118.165.xxx.xxx 訂閱
可能是你 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-11-06 19:48:06 IP:219.85.xxx.xxx 訂閱
 試了大大說的
DBGrid1.Repaint;
DBGrid1.Refresh;
abort;
還加了
fstock_purchase_edit.Repaint;
fstock_purchase_edit.Refresh;

還是沒作用,如果固意把畫面跳到桌面,在進來就正常了@@
如果把abort換成exit它又不會一直停在錯誤的地方,如果不show message 就也不會。
真的不行就~~~~不要用skin了.....
leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-11-06 21:05:14 IP:111.240.xxx.xxx 訂閱
不知道這樣行不行

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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-11-06 22:04:11 IP:219.85.xxx.xxx 訂閱
 是可以但變成鎖不住~~~
如果DBGRid欄位驗證 不用onValidate,
使用DBGrid1ColExit,又會有用滑鼠上下移,或用鍵盤上下移不會處發到的問題,雖然在AfterScroll加上DBGrid1ColEnter能解決,但總覺的以後會有重覆觸發的問題,最後容易導致程式混亂~~~。
請問大大都採用何種方式呢?

leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-11-07 15:39:34 IP:118.165.xxx.xxx 訂閱
不知道這樣有沒有用阿
LockWindowUpdate(DBGrid1.Handle);
LockWindowUpdate(0);

或是
DBGrid1.Perform(WM_SETREDRAW, 1, 0);
或是
SendMessage(DBGrid1.Handle, WM_SETREDRAW, 1, 0);
或是
Application.ProcessMessages;

感覺是找個時機讓他重畫一下 就行了

===================引 用 chris681016 文 章===================
是可以但變成鎖不住~~~
如果DBGRid欄位驗證 不用onValidate,
使用DBGrid1ColExit,又會有用滑鼠上下移,或用鍵盤上下移不會處發到的問題,雖然在AfterScroll加上DBGrid1ColEnter能解決,但總覺的以後會有重覆觸發的問題,最後容易導致程式混亂~~~。
請問大大都採用何種方式呢?

chris681016
中階會員


發表:69
回覆:122
積分:98
註冊:2006-10-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-11-07 15:50:00 IP:211.75.xxx.xxx 訂閱
 不行~~~~~~~~~~~~~~~
暫時用爛方法
sSkinManager1.Active:=false;
sSkinManager1.Active:=true;
只是慢又閃一下~~~~~
真的太慢因該就不用了

感謝大大回應^____________________________^
cat200188
中階會員


發表:37
回覆:78
積分:68
註冊:2005-01-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-11-08 00:51:06 IP:114.37.xxx.xxx 訂閱
個人有個笨笨的方法  因為我發現原因出在showmessage 是採用showmodal  如果用另一個form 用show 就不會出現這問題
這方法想必各位高手都想過 不知為何不採用 還是我的測試有誤呢
謝謝
------
.......
chris681016
中階會員


發表:69
回覆:122
積分:98
註冊:2006-10-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-11-08 09:15:11 IP:211.75.xxx.xxx 訂閱
其實我的MESSAGE就是自製的用FORM~~~~但還是ShowModal,是用呼叫DLL的如果改成,SHOW會閃一下看不到MESSAGE
編輯記錄
chris681016 重新編輯於 2012-11-07 18:54:04, 註解 無‧
cat200188
中階會員


發表:37
回覆:78
積分:68
註冊:2005-01-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-11-08 10:24:59 IP:111.248.xxx.xxx 訂閱
恕我冒昧一問   如果form 用show  然後form 的defaultmonitor 設為 dmDesktop  這樣能否解決你的問題呢
------
.......
chris681016
中階會員


發表:69
回覆:122
積分:98
註冊:2006-10-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2012-11-08 10:41:24 IP:211.75.xxx.xxx 訂閱
 大大也有遇過使用SKIN 然後SHOWMESSAGE呼叫abort導至畫面亂掉嗎?
試過大大說的方式一樣閃一下

呼叫的MESSAGE

F_MESSAGE.ShowModal;
//F_MESSAGE.Show;
F_MESSAGE.FREE;
RESULT:=MSG_AA;

可能我用完就FREE所以閃一下,如果改為
F_MESSAGE.Show;
//F_MESSAGE.FREE;
RESULT:=MSG_AA;
會當掉

我的SKIN使用AlphaControls 2010



leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2012-11-08 10:43:50 IP:118.165.xxx.xxx 訂閱
 如果送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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2012-11-08 11:02:44 IP:211.75.xxx.xxx 訂閱
這個怪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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2012-11-08 11:15:19 IP:118.165.xxx.xxx 訂閱
 疑 你加了onDrawColumnCell 後
Grid 有變成紅色嗎??
chris681016
中階會員


發表:69
回覆:122
積分:98
註冊:2006-10-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2012-11-08 11:16:26 IP:211.75.xxx.xxx 訂閱
有的
===================引 用 leveon 文 章===================
疑 你加了onDrawColumnCell 後
Grid 有變成紅色嗎??
leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#16 引用回覆 回覆 發表時間:2012-11-09 07:24:49 IP:111.240.xxx.xxx 訂閱
有變紅色 表示繪製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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2012-11-09 11:01:56 IP:211.75.xxx.xxx 訂閱
只要用就可以了,讓畫面正常了,但,確鎖不了在那位置,而且也不會在跳訊息了即時貨品錯了~~~
TRY
if Select_Data('prod_name',trim(Sender.AsString))='' then
begin
MSG_RTN(['抱歉!!無此貨品編號,請重輸!!'],['[&O]瞭解']);
abort;
end;
EXCEPT

END;

看來因該沒救~~~~~感謝謝辛苦回覆^_____________^
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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2012-11-09 12:54:10 IP:202.39.xxx.xxx 訂閱
從一開始接觸 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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2012-11-12 12:32:32 IP:211.75.xxx.xxx 訂閱
很深奧的感覺,在試試,感謝大大
===================引 用 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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2012-11-13 22:26:22 IP:36.228.xxx.xxx 訂閱
 個人認為問題出在 AlphaControls 2010 沒有刷新。

看一下

leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#21 引用回覆 回覆 發表時間:2012-11-14 10:06:53 IP:118.165.xxx.xxx 訂閱
如果 是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

發送簡訊給我
#22 引用回覆 回覆 發表時間:2012-11-14 11:17:35 IP:211.75.xxx.xxx 訂閱
請問這是啥意思~~~~~(功力很弱,不懂這個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

發送簡訊給我
#23 引用回覆 回覆 發表時間:2012-11-14 11:34:35 IP:118.165.xxx.xxx 訂閱

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

發送簡訊給我
#24 引用回覆 回覆 發表時間:2012-11-15 09:51:42 IP:211.75.xxx.xxx 訂閱
一樣不行..................再次感謝大大努力幫找解決方式,放棄這個問題好了~~~~~
===================引 用 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

發送簡訊給我
#25 引用回覆 回覆 發表時間:2012-11-15 10:10:37 IP:118.165.xxx.xxx 訂閱

對呀 真是太困難了 報歉沒幫上忙~
===================引 用 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

發送簡訊給我
#26 引用回覆 回覆 發表時間:2012-11-16 17:13:37 IP:202.39.xxx.xxx 訂閱
Sorry! 遠古 Borland 時代, 尚無
Application.ModalStarted 等東東,
所以只好土法煉鋼!

等 XE3 測試 OK 後,
再改用您的建議看看,
或許效率會好一些!
謝謝!
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#27 引用回覆 回覆 發表時間:2012-11-19 02:13:29 IP:114.42.xxx.xxx 訂閱
我個人大膽的假設與推論,這可能是和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
編輯記錄
aftcast 重新編輯於 2012-11-18 11:19:48, 註解 無‧
aftcast 重新編輯於 2012-11-18 11:21:47, 註解 無‧
aftcast 重新編輯於 2012-11-18 11:26:06, 註解 無‧
chris681016
中階會員


發表:69
回覆:122
積分:98
註冊:2006-10-12

發送簡訊給我
#28 引用回覆 回覆 發表時間:2012-11-19 15:11:46 IP:211.75.xxx.xxx 訂閱
找了一下
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

發送簡訊給我
#29 引用回覆 回覆 發表時間:2012-11-19 16:02:16 IP:211.75.xxx.xxx 訂閱
我剛亂湊了程式

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可能這個關西......

SFDSF

如果把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

發送簡訊給我
#30 引用回覆 回覆 發表時間:2012-11-19 16:46:58 IP:114.32.xxx.xxx 訂閱
嗯,處理的不錯。但看了你的程式碼後,覺得 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

發送簡訊給我
#31 引用回覆 回覆 發表時間:2012-11-19 17:26:30 IP:211.75.xxx.xxx 訂閱
 我的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] [>>]
系統時間:2024-11-21 20:19:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!