如何將資料庫讀到的值在動態EDIT上顯示 |
答題得分者是:careychen
|
rany
一般會員 發表:15 回覆:26 積分:8 註冊:2007-05-05 發送簡訊給我 |
請教各位大大,
我在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 發送簡訊給我 |
參考看看囉,給你一半的程式碼,教你如何用 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 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
Label1s[i].Font.Name := '新細明體'; |
rany
一般會員 發表:15 回覆:26 積分:8 註冊:2007-05-05 發送簡訊給我 |
我最後試成功了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] |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
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.
------
努力會更接近成功 |
rany
一般會員 發表:15 回覆:26 積分:8 註冊:2007-05-05 發送簡訊給我 |
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 發送簡訊給我 |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
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 發送簡訊給我 |
Dear pceyes,
謝謝你喔,還特地把之前的發問的資料帶出來,這樣更可以讓後面的人更清楚呢~ 原本想說多Try一種多學一種,所以我想我就用careychen的方法往下一步走囉 Dear careychen, 1.用 DBGrid 會不會比較好處理一點? RE:因為需求者希望呈現一個卡號的資料且可以做維護的動作,所以可以對應資料庫欄位的我就用TDBEeit,反之TEdit顯示 2.筆數過多時,妳不就還要寫個 ScorllBox 來那使用者捲動?? RE:當初就怕細項會增減所以做動態,但是卻不完美的是目前版面只剩下可以增加8個TEdit為限,大大這個建議待程式較完善時再來做調整的方向。 謝謝囉!!~那我繼續加油去唄 .......
編輯記錄
rany 重新編輯於 2008-07-23 09:25:02, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |