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

此FORM為何只在Activate時有作用,但Close沒有作用呢?

答題得分者是:wameng
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-18 10:17:49 IP:219.93.xxx.xxx 未訂閱
第一次貼程式碼,請各位大大見諒…
unit Main;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;    type
  TMainForm = class(TForm)
    OnActivateTmrTimer: TTimer;
    OnCloseTmrTimer: TTimer;
    CloseTimer: TTimer;
    procedure OnActivateTmrTimerTimer(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure OnCloseTmrTimerTimer(Sender: TObject);
    procedure CloseTimerTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  MainForm: TMainForm;    implementation    {$R *.dfm}    procedure TMainForm.OnActivateTmrTimerTimer(Sender: TObject);
begin
  with Self do
  begin
    Top := Top - 10;
    if Top <= (Screen.WorkAreaHeight - Height) then
      OnActivateTmrTimer.Enabled := False;
  end;
end;    procedure TMainForm.FormActivate(Sender: TObject);
begin
  with Self do
  begin
    Top := Screen.WorkAreaHeight;
    Left := Screen.Width - Width;
    OnActivateTmrTimer.Enabled := True;
  end;
end;
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-18 10:32:33 IP:219.93.xxx.xxx 未訂閱
貼不完,網路連線忙碌,繼續下面還沒完的:
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  with Self do
  begin
    Top := Screen.WorkAreaHeight - Height;
    Left := Screen.Width - Width;
    OnCloseTmrTimer.Enabled := True;
  end;
end;    procedure TMainForm.OnCloseTmrTimerTimer(Sender: TObject);
begin
  with Self do
  begin
    Top := Top   10;
    if Top > Screen.WorkAreaHeight then
      OnCloseTmrTimer.Enabled := False;
  end;
end;    procedure TMainForm.CloseTimerTimer(Sender: TObject);
begin
  Self.Close;
end;    procedure TMainForm.FormCreate(Sender: TObject);
begin
  CloseTimer.Enabled := True;
end;    end.
wameng
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-18 10:41:57 IP:61.222.xxx.xxx 未訂閱
您如果要什麼!可否直接說出您所要的。
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-18 10:46:39 IP:219.93.xxx.xxx 未訂閱
我的意思是指這個FORM在顯視時,它會好像msn那樣從下面昇上來,但它在Close時郤不會像msn那樣收回去,是程式某個地方出問題了嗎?
wameng
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-18 10:56:49 IP:61.222.xxx.xxx 未訂閱
在Close 時,就已經CLOSE 終止程式。 當然就不會執行 "Close時郤不會像msn那樣收回去" 1.可以在OnClose 事件。不要利用Timer 的事件,改用SLEEP 2. 若堅持要用TImer,可設置一變數 CanClose。 在第一次關閉視窗,觸發OnCloseTmrTimer。並設定變數及取消關閉。 當 procedure TMainForm.OnCloseTmrTimerTimer(Sender: TObject); begin with Self do begin Top := Top 10; if Top > Screen.WorkAreaHeight then begin OnCloseTmrTimer.Enabled := False; CanClose := True; Close; end; end; end;
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-18 11:33:12 IP:219.93.xxx.xxx 未訂閱
我剛剛試一下,還是不行… 請問一下,CanClose這個變數,要在OnCreate的Event裡先把它設成False嗎? 我是不是應該把它設成整體變數呢? var MainForm: TMainForm; CanClose: Boolean;
wameng
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-18 13:28:57 IP:61.222.xxx.xxx 未訂閱
type TForm1 = class(TForm) OnActivateTmrTimer: TTimer; OnCloseTmrTimer: TTimer; procedure OnActivateTmrTimerTimer(Sender: TObject); procedure OnCloseTmrTimerTimer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private CanClose : Boolean; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.OnActivateTmrTimerTimer(Sender: TObject); begin with Self do begin Top := Top - 10; if Top <= (Screen.WorkAreaHeight - Height) then OnActivateTmrTimer.Enabled := False; end; end; procedure TForm1.OnCloseTmrTimerTimer(Sender: TObject); begin with Self do begin Top := Top 10; if Top > Screen.WorkAreaHeight then begin OnCloseTmrTimer.Enabled := False; CanClose := True; Close; end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin CanClose :=false; end; procedure TForm1.FormActivate(Sender: TObject); begin with Self do begin Top := Screen.WorkAreaHeight ; Left := Screen.Width - Width; OnActivateTmrTimer.Enabled := True; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Top := Screen.WorkAreaHeight - Height; Left := Screen.Width - Width; OnCloseTmrTimer.Enabled := True; if Not CanClose then Action := caNone; end; 試試! 發表人 - wameng 於 2004/10/18 13:32:10
wameng
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-18 13:32:50 IP:61.222.xxx.xxx 未訂閱
不需要 CloseTimer: TTimer; 直接關閉視窗就可以了
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-18 15:55:33 IP:219.93.xxx.xxx 未訂閱
我剛剛試了一下,視窗一閃即逝… 跟要求的目標不同…
wameng
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-18 16:27:41 IP:61.222.xxx.xxx 未訂閱
我真搞不懂!我試的狀況會慢慢移動回去。 可以調整 OnCloseTmrTimer Interval 的時間參數。 OnActivateTmrTimer OnCloseTmrTimer 一開始就是(Enabled := false) Diable 狀態
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-18 16:38:42 IP:219.93.xxx.xxx 未訂閱
我剛剛檢查過了,兩個Timer的Enabled都是設成True的…
wameng
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-18 16:49:18 IP:61.222.xxx.xxx 未訂閱
>兩個Timer的Enabled都是設成True的… 暈!....請改為 False
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-10-18 17:38:34 IP:219.93.xxx.xxx 未訂閱
行了,謝謝大大的指導…
系統時間:2024-11-25 8:27:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!