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

如何使form的名稱置於視窗工作列

尚未結案
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-11 15:57:26 IP:219.80.xxx.xxx 未訂閱
各位前輩好 我同時開幾個form,如何使每個form的名字能同時出現在視窗工作列上 就像同時開幾個word檔可以同時出現在工作列上,還請前輩幫忙. sam
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-11 20:29:33 IP:202.39.xxx.xxx 未訂閱
大概得每個 Form 都是個獨立的 Application 才行
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-11 21:22:46 IP:61.64.xxx.xxx 未訂閱
給你一個範例, 自己玩玩看
// Project1.dpr
program Project1;    uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3};    {$R *.RES}    begin
  Application.Initialize;      Application.ShowMainForm := FALSE;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);      Application.Run;
end.
/////////////////////////////////////////////////////////////////////    // Unit1.pas
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Unit2, Unit3, StdCtrls, ExtCtrls;    type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    
  end;    var
  Form1: TForm1;    implementation    {$R *.DFM}    procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (Assigned(Form2)) and (Assigned(Form3)) then
  begin
    Form2.Visible := TRUE;
    Form3.Visible := TRUE;
    Timer1.Enabled := FALSE;
  end;
end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 100;
  Timer1.Enabled := TRUE;
end;    end.    /////////////////////////////////////////////////////////////////////
// Unit2.pas
unit Unit2;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;    type
  TForm2 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }        procedure CreateParams(var Params: TCreateParams); override;
  end;    var
  Form2: TForm2;    implementation    {$R *.DFM}    procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  Inherited;      Params.ExStyle := Params.ExStyle   WS_EX_APPWINDOW;
  Params.Caption := 'This is Form2!!';
end;    procedure TForm2.FormActivate(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;    end.    /////////////////////////////////////////////////////////////////////
// Uni3.pas    unit Unit3;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;    type
  TForm3 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }        procedure CreateParams(var Params: TCreateParams); override;
  end;    var
  Form3: TForm3;    implementation    {$R *.DFM}    procedure TForm3.CreateParams(var Params: TCreateParams);
begin
  Inherited;      Params.ExStyle := Params.ExStyle   WS_EX_APPWINDOW;
  Params.Caption := 'This is Form3!!';
end;    procedure TForm3.FormActivate(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;    end.
/////////////////////////////////////////////////////////////////////
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-11 21:35:00 IP:61.64.xxx.xxx 未訂閱
簡單的說一下原理, 其實Delphi會幫應用程式產生一個隱藏的視窗用來接收和分配Windows Message, 這個隱藏的視窗其實就是TApplication所產生的, 而你所設計的每一個Form其實都在它的掌管之下, 在你所設計的Form當中需要有一個Main Form, 而Delphi為了讓使用者感覺不到隱藏的視窗, 所以對Main Form做了一些特殊處理, 讓它看起來"真的像"是主視窗, 你可以試試若不隱藏Main Form(就是我給你的範例的Form1), 當Form1最小化時, 其它的Form也會跟著最小化, 這就是我隱藏Main Form的原因. 主要程式碼是 Application.ShowMainForm := FALSE; ShowWindow(Application.Handle, SW_HIDE); 而其它的就沒什麼了, 我只是把每個子視窗的WS_EX_APPWINDOW打開而已, 打開這個屬性會讓視窗出現在工作列上
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-12 01:42:26 IP:61.31.xxx.xxx 未訂閱
var
  MyWindowClass: TWndClass = (
    style: 0;
    lpfnWndProc: @DefWindowProc;
    cbClsExtra: 0;
    cbWndExtra: 0;
    hInstance: 0;
    hIcon: 0;
    hCursor: 0;
    hbrBackground: 0;
    lpszMenuName: nil;
    lpszClassName: 'Test');    procedure TForm1.Button1Click(Sender: TObject);
var
  FHandle:THandle;
begin
  Windows.RegisterClass(MyWindowClass);
  FHandle := CreateWindow(MyWindowClass.lpszClassName,'23213',
    WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_Visible or WS_SYSMENU
    or WS_MINIMIZEBOX,
    GetSystemMetrics(SM_CXSCREEN) div 2,
    GetSystemMetrics(SM_CYSCREEN) div 2,
    0, 0, 0, 0, HInstance, nil);
end;
原理如上,進一步請自行斟酌調整。
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-12 11:01:58 IP:211.22.xxx.xxx 未訂閱
謝謝版主及前輩的解答,試了版主及前輩的例子,都可以在視窗工作列上看到form名稱,不過還有一個問題是: zard前輩的例子可以在視窗工作列上點選form的名稱,其對應的form就可以得到focus,但如果直接點選form,工作列上相對應的位置無法得到focus, 是否可以點選form時,工作列上相對應的位置得到focus? wameng版主的方法僅能顯示,無法有相對focus的功能?有請前輩及版主再 行幫忙. 謝謝 sam上
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-12 12:24:12 IP:210.243.xxx.xxx 未訂閱
引言: 謝謝版主及前輩的解答,試了版主及前輩的例子,都可以在視窗工作列上看到form名稱,不過還有一個問題是: zard前輩的例子可以在視窗工作列上點選form的名稱,其對應的form就可以得到focus,但如果直接點選form,工作列上相對應的位置無法得到focus, 是否可以點選form時,工作列上相對應的位置得到focus? wameng版主的方法僅能顯示,無法有相對focus的功能?有請前輩及版主再 行幫忙. 謝謝 sam上
在TForm2.CreateParams及TForm3.CreateParams中修改如下
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  Inherited;      //加入這行
  Params.WndParent := 0;      Params.ExStyle := Params.ExStyle   WS_EX_APPWINDOW;
  Params.Caption := 'This is Form2!!';
end;    procedure TForm3.CreateParams(var Params: TCreateParams);
begin
  Inherited;      //加入這行
  Params.WndParent := 0;      Params.ExStyle := Params.ExStyle   WS_EX_APPWINDOW;
  Params.Caption := 'This is Form3!!';
end;    
其它部份的程式碼不變
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-12 14:01:14 IP:219.80.xxx.xxx 未訂閱
試了前輩的方法可以了,謝謝 但是還有一個問題 將form1改成MDIForm.form2,form3改成MDIchild時又不行 還請前輩幫忙 sam上
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-12 19:36:57 IP:61.64.xxx.xxx 未訂閱
引言: 試了前輩的方法可以了,謝謝 但是還有一個問題 將form1改成MDIForm.form2,form3改成MDIchild時又不行 還請前輩幫忙 sam上
就我所知MDI無法做到這種效果, MDI是一種子視窗的範圍一定在主視窗內的應用程式.
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-15 09:41:39 IP:220.130.xxx.xxx 未訂閱
如果沒有delphi top.k似乎delphi學不下去了,謝謝版主及前輩的指點,這個問題雖然沒有達到100 %功能,但也有90%, 也學到新的技巧,謝謝, sam
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-24 23:08:50 IP:61.67.xxx.xxx 未訂閱
前輩好       不好意思,這兩天又測試了wameng版主提供的例題,工作列上form名稱前方的圖標總是一個windows飄搖的圖形,我想要把它變更成別的圖形試了許久總是無法達成,可否請版主或前輩再指教,謝謝,我改的程式如下 procedure TForm1.Button1Click(Sender: TObject); var   FHandle:THandle; begin   Windows.RegisterClass(MyWindowClass);   FHandle := CreateWindow(MyWindowClass.lpszClassName,'23213',     WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_Visible or            WS_SYSMENU  or WS_MINIMIZEBOX,     GetSystemMetrics(SM_CXSCREEN) div 2,     GetSystemMetrics(SM_CYSCREEN) div 2,        loadicon(application.Handle,IDI_application),        0,      0,     0,      HInstance,       nil); end;    
引言:
系統時間:2024-05-14 21:57:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!