線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1115
推到 Plurk!
推到 Facebook!

關於MDI.

答題得分者是:channel
yezi_ji
一般會員


發表:16
回覆:31
積分:9
註冊:2003-03-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-28 11:35:19 IP:218.14.xxx.xxx 未訂閱
請教各位大哥及前輩,我在MDI主窗口中做了一個Panel,但是我在彈出子窗口時,Panel會擋在子窗口的前面,我現在想在顯示子窗口時,這個Panel不能遮住子窗口,好能完全看的到子窗口。並且在關閉子窗口之後,Panel又能顯示。請問有什麽好的方法?謝謝! 我是菜鳥,請多指點! 不勝感激!!
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-28 11:49:39 IP:211.21.xxx.xxx 未訂閱
引言: 請教各位大哥及前輩,我在MDI主窗口中做了一個Panel,但是我在彈出子窗口時,Panel會擋在子窗口的前面,我現在想在顯示子窗口時,這個Panel不能遮住子窗口,好能完全看的到子窗口。並且在關閉子窗口之後,Panel又能顯示。請問有什麽好的方法?謝謝!
建議您一個作法: 在開啟子窗口,將Panel引藏起來,例: OpenForm(****,****);//開啟的procedure Panel1.Visible := False;//這一行緊接在開啟Form的程式後面 在關閉子窗口,將Panel顯示出來,例:
procedure TForm1.FormClose(Sender: TObject; Var Action: TCloseAction);
begin
  if MainForm.MDIChildCount <= 1 then
    MainForm.Panel1.Visible := True;
end;
~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
yezi_ji
一般會員


發表:16
回覆:31
積分:9
註冊:2003-03-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-28 12:15:09 IP:218.14.xxx.xxx 未訂閱
謝謝你,但是有沒有更簡單一點的方法,如果我做了4,5個Panel,又有很多的子菜單,那我在每個子菜單顯示時都要把每個Panel的Enabled給False了,那不是要寫好多的重復代碼。我是想在MDI的主界面里做一些像Windows桌面一樣的功能,能不用經過菜單直接在主界面里進行顯示操作,比如,顯示某些子窗口。 我是菜鳥,請多指點! 不勝感激!!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-28 12:57:10 IP:218.16.xxx.xxx 未訂閱
設定主窗口的 onActivate 及 onDeActivate 事件 :
procedure TForm1.FormActivate(Sender: TObject);
begin
  Panel1.Visible := true;
  Panel2.Visible := true;
end;    procedure TForm1.FormDeactivate(Sender: TObject);
begin
  Panel1.Visible := false;
  Panel2.Visible := false;
end;
這樣就不會在每個子窗口設定了。
引言: 能不用經過菜單直接在主界面里進行顯示操作,比如,顯示某些子窗口。
設定主窗口的 WindowMenu 為你其中一個主菜單項目元件 (通常是"窗口"那個),這樣所有開啟了的子窗口清單便會自動加在該菜單項目尾端。
yezi_ji
一般會員


發表:16
回覆:31
積分:9
註冊:2003-03-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-28 17:57:51 IP:218.14.xxx.xxx 未訂閱
謝謝你,我現在出現了另外一個問題,就是:我在登錄框里定義了一個變量,並賦有一定的值,接著,我在主窗口引用這個變量,但是程序報錯。而且,在主界面的程序里好像不能用Login(登錄框),比如t:=Login.Edit1.Text;(t為主界面的變量),程序也報錯。請問有什麽方法解決? 我是菜鳥,請多指點! 不勝感激!!
yezi_ji
一般會員


發表:16
回覆:31
積分:9
註冊:2003-03-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-28 18:03:51 IP:218.14.xxx.xxx 未訂閱
有沒有可能是這樣的,因爲我在主界面的OnCreate的事件里引用了登錄框的變量,而在登錄框它還沒有被賦值,所以才會報錯。你認爲呢? 那我是不是在主界面的OnShow事件之後才能引用登錄框的變量? 我是菜鳥,請多指點! 不勝感激!! 發表人 - yezi_ji 於 2003/03/28 18:07:41
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-28 18:12:03 IP:211.21.xxx.xxx 未訂閱
引言: 我在登錄框里定義了一個變量,並賦有一定的值,接著,我在主窗口引用這個變量,但是程序報錯
您宣告在什麼地方,您可以宣告在紅色字體那兩個地方的其中之一。
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;    type
  TLoginForm = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    t: String;
  end;    var
  LoginForm: TLoginForm;
  t: String;
implementation    {$R *.DFM}    end.
引言: 而且,在主界面的程序里好像不能用Login(登錄框),比如t:=Login.Edit1.Text;(t為主界面的變量),程序也報錯。請問有什麽方法解決?
檢查一下您的Login視窗有沒有宣告LoginForm: TLoginForm;,也就是藍色字體的地方 ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
yezi_ji
一般會員


發表:16
回覆:31
積分:9
註冊:2003-03-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-28 18:44:11 IP:218.14.xxx.xxx 未訂閱
引言: 您宣告在什麼地方,您可以宣告在紅色字體那兩個地方的其中之一。
你的Unit1是不是我說的登錄框,沒有用的,我是這樣做的。我的程序是先顯示登錄框再顯示主界面,並且,我在主界面的OnCreat的事件里做了數據庫的ADOQuery,好像不能再主界面的OnCreate的事件里調用登錄框的變量。我做的是MDI界面,實在主界面的OnShow事件里調用登錄框的,所以在界面的OnCreate事件時,登錄框還沒有建立,(我不知道Form的事件順序,但我是這樣認爲的),登錄框的變量也就還沒有賦值。有沒有哪位大哥知?我還想知道Form事件的大概 執行順序。 我是菜鳥,請多指點! 不勝感激!!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-28 18:51:19 IP:218.16.xxx.xxx 未訂閱
引言: 有沒有可能是這樣的,因爲我在主界面的OnCreate的事件里引用了登錄框的變量,而在登錄框它還沒有被賦值,所以才會報錯。你認爲呢? 那我是不是在主界面的OnShow事件之後才能引用登錄框的變量?
對啦,Login 裡的變數,一定在你 Create 之後, Free 之前才可以使用的。 而且,還要看看你是甚樣 Create 的,用法會有不同哩。 如果你是以 Login := TLogin.Create(self); 來 Create 的話,你就可以在 Free 之前用 t : =Login.Edit1.Text; 但如果你是用 with TLogin.Create(self) do try ... ... finally free; end; 的話,你可以在 try 到 finally 之中用 t := Edit1.Text; 為甚麼沒有 Login 字眼呢? 因為跟本沒有使用這個變數 (沒有 Login := ...),而且 with XXX do 的意思即是說在之後的區段裡所有變數都是預設是 XXX 這個物件的,不用再加上 XXX 的物件名字。 如果 TLogin 和 TMainForm 都有 Edit1 甚辦呢? 由於預設是 TLogin 那個 Form 的,所以要存取 TLogin 的 Edit1 直接打 Edit1.yyy 就可以,反之,要存取 TMainForm 的就要加上 MainForm.Edit1.yyy。 如果要存取 TMainForm 的 Edit2, 而 TLogin 裡是沒有的,要用 MainForm. 嗎? 可以用也可以不用,因為在 預設的 XXX 裡找不到的,會自動當成是本地(TMainForm)的。
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-28 19:48:58 IP:211.21.xxx.xxx 未訂閱
引言: 你的Unit1是不是我說的登錄框,沒有用的,我是這樣做的。我的程序是先顯示登錄框再顯示主界面,並且,我在主界面的OnCreat的事件里做了數據庫的ADOQuery,好像不能再主界面的OnCreate的事件里調用登錄框的變量。我做的是MDI界面,實在主界面的OnShow事件里調用登錄框的,所以在界面的OnCreate事件時,登錄框還沒有建立,(我不知道Form的事件順序,但我是這樣認爲的),登錄框的變量也就還沒有賦值。有沒有哪位大哥知?我還想知道Form事件的大概 執行順序。
你的Unit1是不是我說的登錄框?是的
unit Loginfm;
interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type  TLoginForm = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  LoginForm: TLoginForm;
  t: String;宣告在這個地方,應該不會錯了,只是取到t的值是空的
implementation{$R *.DFM}
end.
我還想知道Form事件的大概執行順序。 您可以看一下Delphi Menu中的Project\View Source,大概的長相如下:
program Project1;    uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};    {$R *.RES}    begin
  Application.Initialize;-->程式就是從這開始執行的
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
所以您的程式執行的順序應該是主界面的OnCreate、OnShow、再執行登錄框的登錄程式! 如果您是要取得登錄者的Id及Password您可以將變數宣告在主界面,紅色字體的地方,在您的登錄框的程式中uese主界面將t := Edit1.Text;,這樣就可以了。 註:t的前面不用加unit Name,直接用就可以了
unit Mainfm;
interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type  TLoginForm = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  LoginForm: TLoginForm;
  t: String;
implementation{$R *.DFM}
end.    
~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
系統時間:2024-05-15 8:03:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!