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

DBGrid如何邊打邊算輸入長度

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-13 14:48:02 IP:211.75.xxx.xxx 訂閱
Grid
編號 內容

如果我要新增「內容」,現在游標在內容上,如何在KeyDown事件上計算所輸入的長度,邊輸入邊計算內容大小,或是在別的事件上。
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-13 16:04:35 IP:220.141.xxx.xxx 訂閱
放一個dbedit連上與Dbgrid同一個DataSource,如果不想誏人看見設Visible=false
procedure TForm1.DBEdit1Change(Sender: TObject);
begin
form1.StaticText1.Caption := inttostr(dbedit1.GetTextLen);
end;
------
努力會更接近成功
chris681016
中階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-13 16:21:18 IP:211.75.xxx.xxx 訂閱
感謝大大快速的回覆^^
但是我在輸入「內容」並不會馬上將資料寫回資料庫,必需要移動後才會寫入,請問大大還有別的方法嗎?
目地只是為了提示客戶在輸入超過幾個字後,會讓報表折行。
編輯記錄
chris681016 重新編輯於 2008-11-13 16:25:33, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-13 16:48:40 IP:211.72.xxx.xxx 訂閱
DBEdit 與 DBGrid 暨然是同一個 DataSource, 他們就會同時反應 User 的 Key-In 並同時顯示結果,
不是等到寫回資料庫才有結果.

===================引 用 chris681016 文 章===================
感謝大大快速的回覆^^
但是我在輸入「內容」並不會馬上將資料寫回資料庫,必需要移動後才會寫入,請問大大還有別的方法嗎?
目地只是為了提示客戶在輸入超過幾個字後,會讓報表折行。
chris681016
中階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-13 17:28:29 IP:211.75.xxx.xxx 訂閱
例如
載入時DBGRID 編輯時
編號 內容 編號 內容
001 0001 ----> 001 0000000001(此時所輸入的資料在DBEdit1還是0001)
002 0002 002 0002
DBEdit1=0001 DBEdit1=0001

移動後
編號 內容
001 0000000001
002 0002
DBEdit1=0000000001

能在「編輯時」就知道「內容」的長度大小嗎?
感謝回覆,表達不好請見諒^^
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-13 21:32:13 IP:211.72.xxx.xxx 訂閱
因 TDataSource 之 OnDataChange() 要等換欄或換錄才被觸發,
故無法即時顯示 TDBGrid Key-In 內容至 TDBEdit.

請試一下於 TDBGrid->OnKeyUp() Event 做處理: (用 CBC 語法)

[code cpp]
void __fastcall Form1::DBGrid1KeyUp(......)
{
TField *oxFd = DBGrid1->SelectedField;
String sxName = oxFd->FieldName;
if (sxName == "您指定的欄名") {
Variant FdVal = oxFd->Value;
String sxVal = FdVal;
int ixLen = sxVal.Length(); // 您要的 Length
// .... 做您要的處理
}
}
[/code]
編輯記錄
herbert2 重新編輯於 2008-11-13 21:33:16, 註解 無‧
herbert2 重新編輯於 2008-11-13 21:34:21, 註解 無‧
chris681016
中階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-14 09:52:21 IP:211.75.xxx.xxx 訂閱
大大一樣不會變化耶@@
我是delphi寫成這樣結果還是一樣。
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var tf:TField;
val:Variant;
s_val:string;
begin
tf:=DBGrid1.SelectedField;
if DBGrid1.SelectedField.FieldName='c_name' then
begin
val:=tf.Value;
s_val:=val;
ShowMessage(s_val);
end;
end;
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-14 10:04:07 IP:211.72.xxx.xxx 訂閱
請用 KeyUp 再試一下, KeyDown 應尚未填入 Value.
chris681016
中階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-14 10:07:53 IP:211.75.xxx.xxx 訂閱
試了一下DBGrid1KeyUp,一樣^^!!
感謝大大快速回覆
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-11-14 12:15:56 IP:211.72.xxx.xxx 訂閱
沒辦法了! TDBGrid 有很多內部 Private 的作業, 不完全瞭解, 幫不上了!
您看要不要再找一下 Help, 看能不能有方法擷取到正在 Edit 的 Cell 的現值.
另外, 您的 DataSource->AutoEdit = true 嗎?
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-11-14 12:44:53 IP:122.116.xxx.xxx 未訂閱
您好,

很有趣的問題, 我想我也可能用得到, 所以努力找, 終於被我找到了

假設拉一個 tlabel 叫 label3 來放目前打了多少字
以下程式段放在 dbgrid 的 keyup 事件

if DBGrid1.ControlCount>0 then label3.caption := inttostr(TInplaceEdit(DBGrid1.Controls[0]).GetTextLen);

tinplaceedit 是用來放 dbgrid 編輯時的暫存資料的.

參考一下

補充 : 剛剛試了一下, D6 環境下一個中文字計2

再補充 : 剛剛試了一下, DBGRID 內 每一按键事件發生順序 KEYDOWN, KEYPRESS, KEYUP
本程式段要放在 KEYUP, 放在 KEYDOWN, KEYPRESS 的話會落後一碼 ( 因為該按鍵尚未完成動作 )
但感覺放在 KEYUP 好像比較慢, 可能 KEYUP 事件 DELPHI 本身要處理比較多事情吧.

------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-11-14 12:46:48, 註解 無‧
st33chen 重新編輯於 2008-11-14 12:48:25, 註解 無‧
st33chen 重新編輯於 2008-11-14 12:54:09, 註解 無‧
st33chen 重新編輯於 2008-11-14 12:56:50, 註解 無‧
st33chen 重新編輯於 2008-11-14 13:02:47, 註解 無‧
chris681016
中階會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-11-14 13:03:42 IP:211.75.xxx.xxx 訂閱
感謝各位大大的回覆,最後在st33chen的回應就可以了^^謝啦
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-11-14 14:56:32 IP:211.72.xxx.xxx 訂閱
因小弟從不使用 DBGrid 讓 User 做 Key-In,
且從 TDBGrid 的 Help 也很難聯想到 TInPlaceEdit 而未用過它,
害您多繞了許多路, 抱歉啦!

雖然問題已解決, 但想多瞭解一下 TInPlaceEdit, 故搜尋了一下 KTop,
找到這篇精彩文章, 您若要用 TDBGrid 作為 Edit 介面, 可前往參考一下.

http://delphi.ktop.com.tw/board.php?cid=30&fid=71&tid=90281


chris681016
中階會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-11-14 17:58:13 IP:211.75.xxx.xxx 訂閱
herbert2大大您怎麼熱心的回覆我就超感動了,別怎麼說,以後還請多多指教嘿^^。
我剛也有找一下TInPlaceEdit這的相關說^^
編輯記錄
chris681016 重新編輯於 2008-11-14 18:01:09, 註解 無‧
系統時間:2024-05-03 1:59:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!