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

請問兩個Unit間變數傳值的問題

尚未結案
chateau_frank
一般會員


發表:20
回覆:32
積分:10
註冊:2005-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-26 12:41:32 IP:211.20.xxx.xxx 未訂閱
各位大大午安, 實際情況如下,請幫忙解惑,謝謝。 在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-26 13:09:59 IP:222.248.xxx.xxx 未訂閱
第一個問題: 我把您的代碼改一下:
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-26 13:13:53 IP:203.69.xxx.xxx 未訂閱
"在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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-26 13:20:37 IP:222.248.xxx.xxx 未訂閱
引言: 結果在unit2中接收變數的是空白,但如果在unit1中一開始就指定兩個變數的值,在unit2中就可以收得到,請問我在哪個程序列出了問題,讓變數在unit2一直接不到,感謝 < face="Verdana, Arial, Helvetica"> 補充一下: 程序剛運行時兩個String變數是為空字串值的,這時在Unit2中引用這兩個變數,當然顯示為空字符串了。衹有當這兩個變數賦為非空值之後, UserId := Edit1.Text; PassWd := Edit2.Text; Unit2中引用才會顯示為非空字串。
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-26 13:21:07 IP:203.69.xxx.xxx 未訂閱
給 h@visli: 有一些名詞必須釐清楚, delphi 真的是有"全域變數" 而你所修改的並不是 "全域變數" 哦... 可否請你自己再說清楚一點
anderslee
初階會員


發表:2
回覆:32
積分:26
註冊:2002-06-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-26 15:07:14 IP:202.64.xxx.xxx 未訂閱
引言: [code] unit1 interface type TForm1 = class(TForm) ...... public { Public declarations } UserId,PassWd:string; //全域變數放到這里 end;
在 form1 之下 declare 的變數不是全域變數 !!! 只屬 form1 的 properties !!
chateau_frank
一般會員


發表:20
回覆:32
積分:10
註冊:2005-07-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-26 18:01:04 IP:211.20.xxx.xxx 未訂閱
各位大大好, 由於試了幾次都不行,我把兩個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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-26 19:12:41 IP:203.69.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-26 20:07:39 IP:211.20.xxx.xxx 未訂閱
報告大大 按您的方法試了,mainmenu1.exe開不起來,但檢查變數是對的,sExecWithParam 為 ('D:\mainmenu1.exe (UserId的實際值) (Passwd的實際值))沒錯 我會再試試看,感謝您
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-26 21:08:07 IP:210.68.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-27 11:10:34 IP:211.20.xxx.xxx 未訂閱
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-27 11:47:15 IP:203.69.xxx.xxx 未訂閱
唉! 你太執著於變數了....    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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-07-27 12:17:00 IP:211.20.xxx.xxx 未訂閱
感謝各位的幫忙,尤其是malanlk大大的耐心指導,讓我這個初學者得以了解到Delphi的奧妙之處,我真的越來越喜歡這個軟體了,感激。
系統時間:2024-06-02 12:22:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!