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

無法設定自訂元件的PasswordChar屬性?

缺席
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-10-12 00:35:27 IP:220.134.xxx.xxx 訂閱
無法設定自訂元件的PasswordChar屬性?
各位前輩及版主大大:
我使用TntDBEdit為我輸入的自訂元件,我在自訂元件中多了PasswordChar屬性
我將PasswordChar設定成*,可以變成密碼的*顯示,但是我發現,屬性是有改變,
但是實際執行時,卻無法顯示我想的*,卻是資料庫實際的值,但是如果我單純
使用TntDBEdit元件,設定PasswordChar為*,卻是可以達成我想要的*顯示,不知道
我到底哪裡出錯了!
懇請各為前輩提示!

function Get_PasswordChar: WideChar;
procedure Set_PasswordChar(Value: WideChar);
//---------------------------------------------------------
property DataField_PasswordChar: WideChar read Get_PasswordChar write Set_PasswordChar;
procedure YaoEdit.Set_PasswordChar(Value: WideChar);
begin
UTEdit.PasswordChar := widechar(Value);
end;
function YaoEdit.Get_PasswordChar: WideChar; // 傳回值
begin
Result := UTEdit.PasswordChar;
end;
//==============================================================================
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-10-12 01:35:31 IP:220.134.xxx.xxx 訂閱
我查了一下原始定義:
function GetPasswordChar: WideChar;
procedure SetPasswordChar(const Value: WideChar);
不知道我哪邊出了問題!
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-10-13 16:57:49 IP:211.76.xxx.xxx 訂閱

你是繼承自 TDBEdit 吧!
property PasswordChar: Char read FPasswordChar write SetPasswordChar default #0;



所以你的 TntDBEdit 應該只要如此TDBEdit 已經 property PasswordChar;


如果還要另外加工, 則如此處理
published

...

function TntDBEdit .GetPasswordCharbegin inherited ;
end;
TntDBEdit SetPasswordChar(Value);


------
將問題盡快結案也是一種禮貌!
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-10-14 00:31:04 IP:220.134.xxx.xxx 訂閱
danny前輩:
感謝您花這麼多時間並且詳細的解說和撰寫範例,對物件繼承的概念,我想我清楚了一些了!不過我仍然有一些問題,
因為我的自訂vcl物件是複合物件,也就是說除了tntdbedit外還有lablel和button,也就是這樣,導致danny前輩您的程式碼,
我卻不知道要如何套用,本想說,我繼承原tntdbedit的 procedure SetPasswordChar(const Value: WideChar);但是
因為原來tntdbedit物件宣告的區段在 private區段,所以實際上我在使用時,並無法參考到SetPasswordChar的成員函數,
會出現Undeclated identifier警告,不知道要如何解決? 懇請各位在給予指正! 萬分感謝!
procedure YaoEdit.Set_PasswordChar(const Value: WideChar);
begin
inherited SetPasswordChar;
UTEdit.PasswordChar := Value;
end;
function YaoEdit.Get_PasswordChar: WideChar; // 傳回值
begin
inherited UTEdit.PasswordChar;
// inherited GetPasswordChar(Value);
Result := UTEdit.PasswordChar;
end;
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-10-17 14:05:40 IP:211.76.xxx.xxx 訂閱
可否post你的 source code上來, 否則無法從片段的 code 中找出問題.
Delphi 6 以上版本有一個 TLabelEdit 元件, 也許你可以繼承他改寫比較簡單.
------
將問題盡快結案也是一種禮貌!
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-01-22 02:56:37 IP:220.134.xxx.xxx 訂閱
Danny 前輩可以否請教一下:
我查了vcl元件原始碼:
TCustomEdit
C:\Program Files\Borland\Delphi7\Source\Vcl\ExtCtrls.pas\StdCtrls.pas
procedure TCustomEdit.SetPasswordChar(Value: Char);

TLabelEdit
C:\Program Files\Borland\Delphi7\Source\Vcl\ExtCtrls.pas

我看到關於Passwordchar設定的程式碼,不知道裡面的部份代碼,我實在看不懂,可否煩請前輩解說!
感謝您!

procedure TCustomEdit.SetPasswordChar(Value: Char);

begin
if FPasswordChar <> Value then
begin
FPasswordChar := Value;
if HandleAllocated then // 看不懂這一行!
begin
SendMessage(Handle, EM_SETPASSWORDCHAR, Ord(FPasswordChar), 0); // 看不懂這一行!

SetTextBuf(PChar(Text)); // 看不懂這一行!
end;
end;
end;
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-01-22 15:24:27 IP:220.134.xxx.xxx 訂閱
我目前在表單上,加了一段指定的程式竟然就可以顯示******密碼字元了!真是奇怪啊!
我在自訂物件上有一個 FPasswordChar: WideChar;的欄位用以儲存密碼字元,但是我發現
於表單建立時,指定星號字元當密碼顯示,就會正常,若無加上則只會顯示原來資料庫的內容
但是我明明有在表單上得自訂物件,去設定DB_Field_PasswordChar 為'*',但是用屬性編輯器
變更DB_Field_PasswordChar,在沒有設計時期,自訂物件的TntDBedit物件會顯示******,
但是只要一執行程式開啟表單,若無加上 self.YaoEdit1.DB_Field_PasswordChar := '*'; 這個程式碼
則又會回到原資料庫的內容!不知道我到底哪邊出了問題!真是想不透啊!

=================================================
// 表單上加上這個程式碼,則密碼顯示*效果會出現,若註解掉,則又會顯示原資料庫內容
procedure TFRM_USER.FormCreate(Sender: TObject);
begin
inherited;
self.YaoEdit1.DB_Field_PasswordChar := '*'; // 於表單建立時,指定星號字元當密碼顯示,就會正常,若無加上則只會顯示原來資料庫的內容
end;
=================================================

物件的密碼屬性設定
=================================================
property DB_Field_PasswordChar: WideChar read Get_PasswordChar write Set_PasswordChar;

屬性設定的程式碼部份
=================================================
function TYaoEdit.Get_PasswordChar: WideChar;
begin
Result := FPasswordChar;
end;

procedure TYaoEdit.Set_PasswordChar(const Value: WideChar);
begin
if FPasswordChar <> Value then
begin
FPasswordChar := Value;
UTEdit.PasswordChar := FPasswordChar;
end;
end;
=================================================



------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-01-23 10:17:21 IP:211.76.xxx.xxx 訂閱
看來你的元件並沒有繼承自 TDBEdit 請參考以下code modified.
另外, 下次請post出完整的source code 不然沒有人可以用猜的解決你的問題.
function TYaoEdit.Get_PasswordChar: WideChar;
begin
Result := UTEdit.PasswordChar;
end;

procedure TYaoEdit.Set_PasswordChar(const Value: WideChar);
begin
if UTEdit.PasswordChar <> Value then
begin
UTEdit.PasswordChar := Value;
end;
end;

------
將問題盡快結案也是一種禮貌!
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-01-27 02:50:14 IP:220.134.xxx.xxx 訂閱
danny前輩:
感謝您的回應,後來我發現不是我程式撰寫的問題,而是TntWare Delphi 的TntDBEdit這個物件,有些問題
我改回用DBEDIT就沒有問題了!您撰寫的程式碼跟我最之前測試的一樣,我還在尋求原來TntWare 撰寫者
協助,若有解決方案,我在po到版上!
問題問的不好,請danny前輩息怒! 再次感謝您!
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
系統時間:2024-05-14 4:40:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!