請問兩個Unit間變數傳值的問題 |
尚未結案
|
chateau_frank
一般會員 發表:20 回覆:32 積分:10 註冊:2005-07-07 發送簡訊給我 |
各位大大午安,
實際情況如下,請幫忙解惑,謝謝。
在unit1中設了兩個全域變數,並在unit1私有程序中指定值。
unit1
interface
var UserId,PassWd:string;
...
implementation
...
procedure ....
...
UserId := Edit1.Text;
PassWd := Edit2.Text;
...
Edit3.Text := UserId; //(有成功show出來)
Edit4.Text := Passwd; //(有成功show出來)
...
在unit2中呼叫unit1
unit2
...
interface
use ...., unit1;
...
implementation
procedure ....
...
Label1.Caption := UserId;
Label2.Caption := PassWd;
...
end;
結果在unit2中接收變數的是空白,但如果在unit1中一開始就指定兩個變數的值,在unit2中就可以收得到,請問我在哪個程序列出了問題,讓變數在unit2一直接不到,感謝 另外
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
第一個問題:
我把您的代碼改一下:
unit1 interface type TForm1 = class(TForm) ...... public { Public declarations } UserId,PassWd:string; //全域變數放到這里 end; var Form1: TForm1; ... implementation ... procedure .... ... UserId := Edit1.Text; PassWd := Edit2.Text; ... Edit3.Text := UserId; //(有成功show出來) Edit4.Text := Passwd; //(有成功show出來) ... 在unit2中呼叫unit1 unit2 ... interface use ...., unit1; ... implementation procedure .... ... Label1.Caption := Form1.UserId; Label2.Caption := Form1.PassWd; //這兩句加上Form1 ... end;第二個問題: 如果您使用的是Delphi5、6、7的話,您可以在編譯運行時(先設置斷點),在Delphi IDE中按下Ctrl F7來調出“Evaluate/Modify”對話框,就可以查看您要查看的變量的值了。 如果您使用的是Delphi8或2005的話,就更方便了,編譯運行時,可以從“Local Variables”面板看到當前過程或函數中的全部變量的值,或者在“Watch List”面板中自己添加要監視的變量。
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
"在unit2中呼叫unit1" ?? 當你在 Unit2 中 uses Unit1 時, 你並沒有 "在unit2中呼叫unit1", 你只是引用了 Unit1 中定義的變數, 物件...等 你必須在 Unit2 中呼叫你在 Unit1 中定義的函數 或 物件的方法,而且該函數或方法 有設定 UserId,PassWd 的值才是你所謂的 "呼叫"...."接收呼叫"
========================= unit Unit1 ... procedure TForm1.Fun1; begin UserId := Edit1.Text; PassWd := Edit2.Text; end; ============================= unit Unit2 ... procedure TForm2.Fun2; ... Form1.Fun1; // 這是"呼叫" Label1.Caption := UserId; Label2.Caption := PassWd; .... =============================要在 DEBUG 時觀察變數, View-->Debug Windows-->Watches 加入欲觀察的變數(或按快速鍵 Ctrl-Alt-W), 這些基本操作應該自己去學學比較好... |
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
引言: 結果在unit2中接收變數的是空白,但如果在unit1中一開始就指定兩個變數的值,在unit2中就可以收得到,請問我在哪個程序列出了問題,讓變數在unit2一直接不到,感謝 >>< face="Verdana, Arial, Helvetica"> 補充一下: 程序剛運行時兩個String變數是為空字串值的,這時在Unit2中引用這兩個變數,當然顯示為空字符串了。衹有當這兩個變數賦為非空值之後, UserId := Edit1.Text; PassWd := Edit2.Text; Unit2中引用才會顯示為非空字串。
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
anderslee
初階會員 發表:2 回覆:32 積分:26 註冊:2002-06-03 發送簡訊給我 |
|
chateau_frank
一般會員 發表:20 回覆:32 積分:10 註冊:2005-07-07 發送簡訊給我 |
各位大大好,
由於試了幾次都不行,我把兩個unit間的程式都貼上來請您們指導,拜託了。
unit1 (login.exe)
unit loginctr; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables, ShellAPI; type TLoginForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; DataSource1: TDataSource; DBGrid1: TDBGrid; Query1: TQuery; Table1: TTable; Label2: TLabel; Label3: TLabel; procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } public { Public declarations } end; var LoginForm1: TLoginForm1; var UserId : string; var PassWd : string; implementation {$R *.dfm} var CheckId : string; procedure TLoginForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin If Key in [13] then Edit2.SetFocus; end; procedure TLoginForm1.Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin If key in [13] then begin UserId := TrimRight(Edit1.Text); UserId := UpperCase(UserId); PassWd := TrimRight(Edit2.Text); PassWd := UpperCase(PassWd); with Query1 do Query1.Active := False; Query1.SQL.Clear; Query1.SQL.Add('select * from emp'); Query1.SQL.Add('where Uid = ''' USERID ''''); Query1.SQL.Add('and Passwd = ''' Passwd ''''); Query1.Open; If Query1.IsEmpty then CheckId := '使用者名稱與密碼不合' else CheckId := DBGrid1.Fields[1].Value; Label1.Caption := '' CheckId ''; ShellExecute(application.handle,pchar('OPEN'),pchar ('D:\mainmenu1.exe'),nil,nil,0); end; end; end.unit2 (mainmenu1.exe) unit mainmenu; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, OleCtnrs, ShellAPI, Loginctr; type TForm1 = class(TForm) Panel1: TPanel; Label1: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption := UserId; Label2.Caption := Passwd; end; end. |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
ShellExecute(application.handle,pchar('OPEN'),pchar('D:\mainmenu1.exe'),nil,nil,0); ...??? 原來你是分兩支程式跑, 程式的全域變數 也是跨不過行程的, 所以你應該用帶參數的呼叫方式...
procedure TLoginForm1.Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var sExecWithParam: String; begin If key in [13] then begin UserId := TrimRight(Edit1.Text); UserId := UpperCase(UserId); PassWd := TrimRight(Edit2.Text); PassWd := UpperCase(PassWd); with Query1 do Query1.Active := False; Query1.SQL.Clear; Query1.SQL.Add('select * from emp'); Query1.SQL.Add('where Uid = ''' USERID ''''); Query1.SQL.Add('and Passwd = ''' Passwd ''''); Query1.Open; If Query1.IsEmpty then CheckId := '使用者名稱與密碼不合' else CheckId := DBGrid1.Fields[1].Value; Label1.Caption := '' CheckId ''; sExecWithParam := Format('D:\mainmenu1.exe %s %s',[UserId,Passwd]); ShellExecute(application.handle,pchar('OPEN'),pchar(sExecWithParam),nil,nil,0); end; end; end. .... procedure TForm1.FormCreate(Sender: TObject); begin if ParamCount=2 then begin Label1.Caption := ParamStr(1); Label2.Caption := ParamStr(2); end else begin Label1.Caption := '未傳入'; Label2.Caption := '未傳入'; end; end; |
chateau_frank
一般會員 發表:20 回覆:32 積分:10 註冊:2005-07-07 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
ShellExecute(application.handle,pchar('OPEN'),pchar(sExecWithParam),nil,nil,SW_SHOW); 如果不行, ShellExecute(application.handle,pchar('OPEN'),pchar('D:\mainmenu1.exe),pchar('test test'),nil,SW_SHOW); 因為 ShellExecute 的第3個參數是檔名, 第4個是要帶入的參數, 最後一個是顯示方式, 之前你用 0 (=SW_HIDE), 所以你的程式可能在暗中執行了.... 如果要 DEBUG mainmenu1.exe 是否有收到參數 可以 Run-->Parameters 在Parameters 中輸入 '(UserId的實際值) (Passwd的實際值)'....不包含引號哦 再 Debug 看 mainmenu1.exe 可否反應參數. 發表人 - malanlk 於 2005/07/26 21:10:26
|
chateau_frank
一般會員 發表:20 回覆:32 積分:10 註冊:2005-07-07 發送簡訊給我 |
malanlk大大
現在的問題只剩這一行指令了
ShellExecute(application.handle,pchar('OPEN'),pchar('D:\mainmenu1.exe'),pchar('UserId PASSWD')
,nil,0);
帶過去的值是UserId與PassWd兩個字,不是他們的值,我想是引號的問題了。
正在試驗中,但一直試不對,我已經試到以下了,請大大告知一下如何解。
pchar(''' UserId '' '' PassWd ''')
可以compile過,但是跑出參數未傳入,我會再試的。
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
唉! 你太執著於變數了.... sExecWithParam := Format('%s %s',[UserId,Passwd]); ShellExecute(application.handle,pchar('OPEN'),pchar('d:\mainmenu1.exe'),pchar(sExecWithParam),nil,SW_SHOW); 改成這樣看看, 可是要確定的是 UserId 或 Passwd 的值裡不能有空白... 發表人 - malanlk 於 2005/07/27 11:51:40
|
chateau_frank
一般會員 發表:20 回覆:32 積分:10 註冊:2005-07-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |