全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1905
推到 Plurk!
推到 Facebook!

如何將資料庫讀到的值在動態EDIT上顯示

答題得分者是:careychen
rany
一般會員


發表:15
回覆:26
積分:8
註冊:2007-05-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-21 17:34:40 IP:220.132.xxx.xxx 訂閱
請教各位大大,

我在FormShow產生動態的TEdit
而目前我經由user輸入條件後放到某個Table去撈到幾筆資料要塞到動態的TEdit,不知如何?

譬如有3個動態的TEdit分別為:MyEdit[i].Name:=edt101,edt102,edt103(宣告時用'edt1' 序號)

撈出的資料為:
序號 金額 --->執行動作
01 5 --->塞給edt101
02 10 --->塞給edt102
03 15 --->塞給edt103

那我要如何在while not.eof do的Loop中Check如果序號是01的就把值塞給Name=edt101的動態TEdit呢??
另外,因為這個問題後還有得將動態TEdit的值再讀到資料庫的話又該怎麻做呢?有爬文到用FindComponent,但不知道是否有較完整的Code可以參考呢?......麻煩大家!!QQQ~
編輯記錄
rany 重新編輯於 2008-07-21 17:36:59, 註解 TEdit.Name是宣告時用'edt1'+序號‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-21 21:24:55 IP:218.210.xxx.xxx 訂閱
參考看看囉,給你一半的程式碼,教你如何用 FindComponent,
另一半將動態TEdit的值寫到資料庫給你自己發揮,既然你有用陣列,用陣列發揮一下吧

[code delphi]
with ADODataset do
begin
Open;
while not eof do
begin
TEdit(FindComponent('edt1' FieldByName('序號').AsString)).Text := FieldByName('金額').AsString;
Next;
end;
Close;
end;
[/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-07-21 21:27:37, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-21 23:22:05 IP:220.229.xxx.xxx 未訂閱
為什麼不考慮直接使用TDBEdit 做動態呢? 兩者的設計上大同小異!
pceyes
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-22 06:16:26 IP:220.141.xxx.xxx 訂閱

Label1s[i].Font.Name := '新細明體';
Label1s[i].Font.Size := 14;
Label1s[i].caption := Data_ls[0];
Label1s[i].parent :=Panels[i];
Label2s[i]:= Tlabel.create(self);
Label2s[i].Top := Panels[i].Height div 2;
Label2s[i].Left :=Label1s[i].Left;
Label2s[i].font.Color := clblack;
Label2s[i].Font.Name := '新細明體';
Label2s[i].Font.Size := 10;
Label2s[i].caption := Data_ls[1];
Label2s[i].parent :=Panels[i];
Buttons[i].tag :=i;
procedure TForm1.(Sender as TButton).Tag;
Buttons[tag_int].enabled := false;
mydir := extractfilepath(application.ExeName);
wnd := shellexecute(0,'OPEN',pchar(cmd_ls[tag_int]),pchar(param_ls[tag_int]),pchar(mydir),1);
if wnd > 32 then begin
form1.close;
end
else begin
showmessage('找不到可執行的檔案' cmd_ls[tag_int]);
Buttons[tag_int].enabled := true;
end;
end;

------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-07-22 06:22:30, 註解 改螢光筆 顏色‧
rany
一般會員


發表:15
回覆:26
積分:8
註冊:2007-05-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-22 15:13:33 IP:220.132.xxx.xxx 訂閱
我最後試成功了careychen的方法,不過小妹陣列的用法真的不是很可以,是不是要用到IF..... DO呢?
如果可以的話可以再給個Code參考一下嗎!!?...

P.D.版主的方法,原本是想說可以嘗試Master-Detail的方法,但是我sql撈出的資料並不是按欄位排列,而是取每一筆序號相符的資料(筆數不一定)填值給TEdit...有可能是小妹愚知,不懂版主想傳達的意思?

pceyes的方法呢我也努力過了,有讀到tag,但是卡在:
--TEdit的事件:因為我是利用實體TDBEdit的OnChange的條件去撈出對應的所有資料(筆數不一定)
--陣列讀值的問題:我寫了一個procedure去執行while not.eof do的Loop,但是只讀的到Tag='1'就不會嚕

[code delphi]
{.......產生動態TEdit
MyEdit[i].Tag := i 1;
MyEdit[i].onclick:= ReadDTL; } //不知如何改成實體TDBEdit的OnChange

procedure TForm1.ReadDTL(Sender: TObject);
var itag,_itmp : integer;
begin
while not Query.Eof do
begin
//for _itmp := 0 to Query.RecordCount - 1 do //這裡也不知道怎麻讀到所有的Tag
itag := (Sender as TEdit).Tag;
MyEdit[itag].Text:= Query.FieldByName('金額').Value;
Query.Next;
end;
end;
[/code]
編輯記錄
rany 重新編輯於 2008-07-22 15:21:26, 註解 無‧
rany 重新編輯於 2008-07-22 15:31:38, 註解 無‧
rany 重新編輯於 2008-07-22 15:33:13, 註解 無‧
pceyes
尊榮會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-22 16:35:08 IP:220.141.xxx.xxx 訂閱
interface
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure editchange(sender:Tobject);
private
{ Private declarations }
public
{ Public declarations }
end;

MyEdit : array of TEdit;
implementation

procedure TForm1.Button1Click(Sender: TObject);
var
i, i2 ,myleft,mytop: Integer;
begin
SetLength(MyEdit,30);
myleft := 28;
myTop := 10;
FOR I :=Low(MyEdit) to High(MyEdit) do
begin
i2 := i 1;
MyEdit[i]:= TEdit.Create(self);
MyEdit[i].Parent :=self;
MyEdit[i].Hint := '編輯盒1' '0' inttostr(i 1); // 妳也可以把要用的資訊放在這
MyEdit[i].ShowHint := False; // 然後把它關掉
MyEdit[i].text := '';
MyEdit[i].procedure TForm1.editchange(sender:Tobject);
var
itag: integer;

begin
showmessage(MyEdit[(Sender as TEdit).Tag].hint ': ' MyEdit[(Sender as TEdit).Tag].Text );
{
while not Query.Eof do
begin
itag := (Sender as TEdit).Tag;
MyEdit[itag].Text:= Query.FieldByName('金額').Value;
Query.Next;
end;
}
end;


end.

------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-07-22 17:00:01, 註解 無‧
pceyes 重新編輯於 2008-07-22 17:09:33, 註解 無‧
rany
一般會員


發表:15
回覆:26
積分:8
註冊:2007-05-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-07-22 17:31:39 IP:220.132.xxx.xxx 訂閱
Dear pceyes,

1.有關: //動態陣列是由0開始的
RE:原本是想說要讓tag跟序號一樣所以 1....呵!結果是多此一舉

2.有關onchange:= ReadDTL;
RE:並不是動態TEdit自己的OnChange,而是另一個實體的TDBEdit,因為我的程式是利用某個員工的工號(TDBEdit)去帶出他的薪資明細(MyEdit)。因此,我原本是想說可以像下面這樣,但是Compile時卻出現"Invalid class typecase"的錯誤訊息:

[code delphi]
//MyEdit[i].Tag := i;
//MyEdit[i].OnChange:=DBDdit1.OnChange;

procedure TForm1.DBDdit1Change(Sender: TObject);
begin
if DBDdit1.Text <> '' then ReadDTL(Sender);
end;

procedure TForm1.ReadIDTL(Sender: TObject);
VAR itag,_itmp : integer;
begin
while not Query.Eof do
begin
itag := (Sender as TEdit).Tag; //Error
MyEdit[itag].Text:= Query.FieldByName('金額').Value;
Query.Next;
end;
[/code]
編輯記錄
rany 重新編輯於 2008-07-22 17:34:16, 註解 哈哈!!我很努力在敲,結果沒注意到pceyes大大有再回覆....sorry!!‧
pceyes
尊榮會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-07-22 18:37:42 IP:220.141.xxx.xxx 訂閱
如果只以妳現有程式run
因為sender 是dbedit 要不error要改成這樣
itag := (Sender as TDBEdit).Tag; //no Error

因此要從長計議了。
------
努力會更接近成功
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-07-22 22:35:31 IP:59.126.xxx.xxx 訂閱
HI, Rany  
先回答妳的問題,存資料時可以用下面這樣的方式來完成


[code delphi]
procedure SaveData;
var I: Integer;
sSerialID: String;
begin
for I := 0 to Self.ComponentCount - 1 do
// Tag 用到 PCEyes 版大的概念, Tag 為 1 表示是動態建立的元件
if (Self.Components[I] is TEdit) and (Self.Components[I].Tag = 1) then
begin
sSerialID := Copy(TEdit(Self.Components[I]).Name, 5, 2);
// SQL 語法 (請自行變更)
Update Table Set Field=TEdit(Self.Components[I]).Text
where 序號 = sSerialID;
end;
end;
[/code]

其實不大了解妳現在的專案是什麼? 但用 DBGrid 會不會比較好處理一點?
不然筆數過多時,妳不就還要寫個 ScorllBox 來那使用者捲動??
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-07-22 22:37:58, 註解 無‧
rany
一般會員


發表:15
回覆:26
積分:8
註冊:2007-05-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-07-23 09:22:19 IP:220.132.xxx.xxx 訂閱
Dear pceyes,
謝謝你喔,還特地把之前的發問的資料帶出來,這樣更可以讓後面的人更清楚呢~
原本想說多Try一種多學一種,所以我想我就用careychen的方法往下一步走囉

Dear careychen,

1.用 DBGrid 會不會比較好處理一點?
RE:因為需求者希望呈現一個卡號的資料且可以做維護的動作,所以可以對應資料庫欄位的我就用TDBEeit,反之TEdit顯示

2.筆數過多時,妳不就還要寫個 ScorllBox 來那使用者捲動??
RE:當初就怕細項會增減所以做動態,但是卻不完美的是目前版面只剩下可以增加8個TEdit為限,大大這個建議待程式較完善時再來做調整的方向。

謝謝囉!!~那我繼續加油去唄 .......

編輯記錄
rany 重新編輯於 2008-07-23 09:25:02, 註解 無‧
系統時間:2024-04-29 12:31:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!