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

DeBug使用Add Watch At Cursor疑問

答題得分者是:P.D.
ahentseng
一般會員


發表:6
回覆:9
積分:13
註冊:2008-03-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-19 16:19:58 IP:59.120.xxx.xxx 訂閱
各位先進大家好:
第一次發問..若有不足之處..請多包涵(接觸Delphi只有短短的四個月..正在努力學習中)
小弟做了一個簡單的程式碼如下...基本上應可執行(只是缺少了DB...請見諒)
功能為來源 => 目的 複製動作(Test1=>Test2)

問題:當我在程式執行時期跑DeBug
開啟 Watch List 看目的端欄位値(test001,test002,test003)時
除了只能一個一個打之外來查看它目前的值之外..如下
tqGoal.ParamByName('test001').AsString
tqGoal.ParamByName('test002').AsString
tqGoal.ParamByName('test003').AsString

可以有其他的語法或其他方法可以一次得知所有欄位的值嗎
不知到這樣的問法是否夠明確呢?
因為有問過公司的前輩...他說只能這樣一個一個打
我也知道大部分只會集中看其中幾個重要的欄位的值
不過還是想知道是否有此可能性
所以才來請問各位先進是否有碰過這樣的問題呢?

在此先謝謝各位先進...其實我在此論壇獲益不少(跟我學Delphi 的時間差不了多少)...
謝謝各位...各位辛苦了..各位是最棒
PS.我這樣應該不會太狗腿吧!!
[code delphi]
Procedure SourceDataToGoalData;
Var tqSourceData,tqGoalData: TQuery;
Begin
tqSourceData := TQuery.Create(nil);
tqGoalData := TQuery.Create(nil);
tqSourceData.DatabaseName := 'TestDB';
tqGoalData.DatabaseName := 'TestDB';
try
With tqSourceData do
Begin
Close;
SQL.Clear;
SQL.Text := 'Select test001,test002,test003 from Test1';
open;
End;
while not tqSourceData.Eof do
begin
With tqGoalData do
Begin
Close;
SQL.Clear;
SQL.Text := 'Insert into test2(test001,test002,test003) '
'values(:test001,:test002,:test003)';
ParamByName('test001').asString := tqSourceData.FieldByName('Test001').asString;
ParamByName('test002').asString := tqSourceData.FieldByName('Test002').asString;
ParamByName('test003').asString := tqSourceData.FieldByName('Test003').asString;
ExecSQL;
End;
end;
finally
tqSourceData.Free;
tqGoalData.Free;
tqSourceData := nil;
tqGoalData := nil;
end;
End;

[/code]
cobraliu
中階會員


發表:15
回覆:75
積分:83
註冊:2007-11-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-19 17:05:28 IP:59.127.xxx.xxx 訂閱
如果是很單純的將Test1 複製至Test2,那下列方法會不會比較簡單...

不過...不知你用的Database是什麼,下列是Oracle可以9i的版本...也許你是別的Database那可能不適用..XD

Sql.Clear;
SQL.Text := 'Insert into test2(test001,test002,test003)(select test001,test002,test003 From Test1 ';
exceSQL;

如果Test001,Test002,Test003是Key那你就要多判定有沒有Key重復的問題...
------
初學、初學、學了很久...還是在初學階段..Orz
編輯記錄
cobraliu 重新編輯於 2008-03-19 17:06:25, 註解 無‧
cobraliu 重新編輯於 2008-03-19 17:07:45, 註解 無‧
cobraliu 重新編輯於 2008-03-19 17:08:26, 註解 無‧
ahentseng
一般會員


發表:6
回覆:9
積分:13
註冊:2008-03-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-19 17:14:05 IP:61.222.xxx.xxx 訂閱
不好意思喔..我想你並未了解我的問題
我的問題是該如何使用DeBug的Watch List 來查看同一筆資料(只要一個語法就可看到所有欄位的值)
而不是欄位要一個一個打來看他的值
===================引 用 cobraliu 文 章===================
如果是很單純的將Test1 複製至Test2,那下列方法會不會比較簡單...

不過...不知你用的Database是什麼,下列是Oracle可以9i的版本...也許你是別的Database那可能不適用..XD

Sql.Clear;
SQL.Text := 'Insert into test2(test001,test002,test003)(select test001,test002,test003 From Test1 ';
exceSQL;

如果Test001,Test002,Test003是Key那你就要多判定有沒有Key重複的問題...
P.D.
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-19 23:55:09 IP:61.67.xxx.xxx 未訂閱
可以的

宣告一個陣列
private
DGfd : array[0..2] of string;

在你的程式中加入以下重點,
....
Begin
DGfd[0]:= 'test01';
DGfd[1]:= 'test02';
DGfd[2]:= 'test03';

for i:= low(DGfd) to high(DGfd) do begin
....
ParamByName(DGfd[i]).asString := tqSourceData.FieldByName(DGfd[i]).asString;
next;
...

然後再watch list 去看迴圈的值, 雖然我不知道你的目的是什麼?
編輯記錄
P.D. 重新編輯於 2008-03-19 23:57:35, 註解 無‧
ahentseng
一般會員


發表:6
回覆:9
積分:13
註冊:2008-03-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-03-20 09:08:28 IP:61.222.xxx.xxx 訂閱
  1. 謝謝P.D.版大的回應
    我還真沒想過這樣的作法..不過有個小缺點...因為若型態不一樣的話..
    就還要另外做型態判斷(雖然程式碼不到幾行)..抱歉喔...那容許我再問一個問題
  2. 假如我在Watch List 加入一個tqGoalData.Text 得到的值會是
'Insert into test2(test001,test002,test003) values(?,?,?)'
除了使用版大所說的迴圈使用之外...是否Watch List 有其他的語法可以得知欄位的值
也就是說我想要看到的結果是
(欄位名稱1,欄位名稱2)..(欄位值1,欄位值2) ==>可以在同一行看到 名稱及結果
不知道這樣的想法是否可實現呢?

===================引 用 P.D. 文 章===================
可以的

宣告一個陣列
private
DGfd : array[0..2] of string;

在你的程式中加入以下重點,
....
Begin
DGfd[0]:= 'test01';
DGfd[1]:= 'test02';
DGfd[2]:= 'test03';

for i:= low(DGfd) to high(DGfd) do begin
....
ParamByName(DGfd[i]).asString := tqSourceData.FieldByName(DGfd[i]).asString;
next;
...

然後再watch list 去看迴圈的值、雖然我不知道你的目的是什麼?
編輯記錄
ahentseng 重新編輯於 2008-03-20 09:09:27, 註解 無‧
P.D.
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-03-20 15:34:57 IP:61.67.xxx.xxx 未訂閱
1.ParamByName(DGfd[i]).asString := tqSourceData.FieldByName(DGfd[i]).asString;
型態不一致, 可以嘗試用, 不過我沒有使用過
ParamByName(DGfd[i]).asValiant := tqSourceData.FieldByName(DGfd[i]).asValiant
然而在 Delphi中, 左邊使用 asString , 即使原值為 Interger 也是可以被承認的, 唯一的問題是如果右邊的 asString轉換有問題,
會發生當出的現象
2.假如我在Watch List 加入一個tqGoalData.Text 得到的值會是
由於我不知道你整個程式前因後果, 這個問題無法解答, 基本上我們也不可能有那麼多時間可以幫你測出所有的問題
所以, 天助不如人助, 人助不如自助, 自己多run個數百次, 應該可以找出一些端倪的

就像我在寫程式, 遇到一個問題找不到原因, 我可能簡化程式來查, 可能在任何有疑問的點設中斷點或showmessage()來看數據或用Tracer方式來查, 很多方法, 不單只是利用 Watch List , 因為有時候你的程式一連串的執行, 或許你看到的Watch List 是上一個的, 或者你要的數值老早都跑掉, 所以我幾乎不用Watch List 來看數據, 而是自己用ShowMessage來顯示

===================引 用 ahentseng 文 章===================
  1. 謝謝P.D.版大的回應
    我還真沒想過這樣的作法..不過有個小缺點...因為若型態不一樣的話..
    就還要另外做型態判斷(雖然程式碼不到幾行)..抱歉喔...那容許我再問一個問題
  2. 假如我在Watch List 加入一個tqGoalData.Text 得到的值會是
'Insert into test2(test001,test002,test003) values(?,?,?)'
除了使用版大所說的迴圈使用之外...是否Watch List 有其他的語法可以得知欄位的值
也就是說我想要看到的結果是
(欄位名稱1,欄位名稱2)..(欄位值1,欄位值2) ==>可以在同一行看到 名稱及結果
不知道這樣的想法是否可實現呢?
ahentseng
一般會員


發表:6
回覆:9
積分:13
註冊:2008-03-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-03-20 16:42:17 IP:61.222.xxx.xxx 訂閱
謝謝版大提醒...我會努力學習的!!
===================引 用 P.D. 文 章===================
1.ParamByName(DGfd[i]).asString := tqSourceData.FieldByName(DGfd[i]).asString;
型態不一致、可以嘗試用、不過我沒有使用過
ParamByName(DGfd[i]).asValiant := tqSourceData.FieldByName(DGfd[i]).asValiant
然而在 Delphi中、左邊使用 asString 、即使原值為 Interger 也是可以被承認的、唯一的問題是如果右邊的 asString轉換有問題,
會發生當出的現象
2.假如我在Watch List 加入一個tqGoalData.Text 得到的值會是
由於我不知道你整個程式前因後果、這個問題無法解答、基本上我們也不可能有那麼多時間可以幫你測出所有的問題
所以、天助不如人助、人助不如自助、自己多run個數百次、應該可以找出一些端倪的

就像我在寫程式、遇到一個問題找不到原因、我可能簡化程式來查、可能在任何有疑問的點設中斷點或showmessage()來看資料或用Tracer方式來查、很多方法、不單只是利用 Watch List 、因為有時候你的程式一連串的執行、或許你看到的Watch List 是上一個的、或者你要的數值老早都跑掉、所以我幾乎不用Watch List 來看資料、而是自己用ShowMessage來顯示

===================引 用 ahentseng 文 章===================
  1. 謝謝P.D.版大的回應
    我還真沒想過這樣的作法..不過有個小缺點...因為若型態不一樣的話..
    就還要另外做型態判斷(雖然程式碼不到幾行)..抱歉喔...那容許我再問一個問題
  2. 假如我在Watch List 加入一個tqGoalData.Text 得到的值會是
'Insert into test2(test001,test002,test003) values(?,?,?)'
除了使用版大所說的迴圈使用之外...是否Watch List 有其他的語法可以得知欄位的值
也就是說我想要看到的結果是
(欄位名稱1,欄位名稱2)..(欄位值1,欄位值2) ==>可以在同一行看到 名稱及結果
不知道這樣的想法是否可實現呢?
系統時間:2024-05-04 1:54:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!