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

請問在MDI 中如何使用Timer與全區變數

答題得分者是:mine
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-01 17:22:02 IP:211.20.xxx.xxx 未訂閱
請問我使用MDI設計在MDIChild中用Timer加總數字,可是當我開啟很多視窗的時候,並不是每各視窗分別使用Timer,而是變數中的數值都變成相同,我希望產生的效果是每各MDIChild都獨立計數,是不是有方法可以解決,謝謝  
Main from    var
  Form1: TForm1;
  i:array[0..255] of integer;
  SS:integer;    implementation
uses Unit2;
{$R *.dfm}
Var child: TForm2;
procedure TForm1.N2Click(Sender: TObject);
begin
  child := TForm2.Create(Self);
  child.Caption:='文件' IntToStr(MDIChildCount);
  StatusBar1.Panels.Items[0].Text:='文件' IntToStr(MDIChildCount);
  StatusBar1.Panels.Items[1].Text:=ActiveMdichild.Name;
  SS:= SS 1;
end;    MDIChild    procedure TForm2.Timer1Timer(Sender: TObject);
begin      i[SS]:=i[SS] 1;
  label1.Caption:=IntToStr(i[SS]);
end;     
發表人 - juneo 於 2005/03/01 17:23:59
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-01 18:06:12 IP:220.244.xxx.xxx 未訂閱
Main From .. child := TForm2.Create(Self, SS); .. MDIChild Form TForm2 = class protected ChildID: integer; .. public constructor Create((AOwner: TComponent; ID: integer) end; procedure TForm2.Create(AOwner: TComponent; ID: integer); begin inherited Create(AOwner); ChildID := ID; end; procedure TForm2.Timer1Timer(Sender: TObject); begin i[ChildID]:=i[ChildID] 1; label1.Caption:=IntToStr(i[ChildID]); end; _________________________ Programming is a passion 發表人 - yyu10 於 2005/03/01 18:09:23
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-01 18:31:00 IP:61.221.xxx.xxx 未訂閱
hihi  我用的方法可能笨了點 給您參考一下,如果沒誤會你的意思是在主視窗上只建一個Timer?所以子視窗上都不建QQ??
MainForm
var
  Form1: TForm1;
  i:integer;
  ss:array[0..3]of integer;
  bb:array[0..3]of Tobject;
implementation    {$R *.dfm}    procedure TForm1.Timer1Timer(Sender: TObject);
var
k:word;
begin
for k:=0 to 3 do begin
 if bb[k]<>nil then begin
  ss[k]:=ss[k] 1;
  Tbutton(bb[k]).Caption:=inttostr(ss[k]);
 end;
end;
end;    ChieldForm
procedure TForm3.Button1Click(Sender: TObject);
var
i:word;
begin
for i:=0 to 3 do begin
 if bb[i]=nil then begin
  bb[i]:=Sender;
  break;
 end;
end;
if form1.Timer1.Enabled=False then
 form1.Timer1.Enabled:=True;
end;
不曉得跟您的想像會不會差很多QQ 搞不懂!搞不懂!永遠都搞不懂!! 發表人 - mine 於 2005/03/01 18:34:49
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-02 11:32:38 IP:211.20.xxx.xxx 未訂閱
感謝兩位大大的回應^^,我將問題與程式更釐清一些好了 yyu10大大提的方是以動態產生MDIChild Form,但Form2上還有其他元件也都要一並產生,未來可能會放上很多元件>"<,還有其它方式可以提供嗎 謝謝    mine Main Form上有控制按鈕 產生子視窗用 MDIChild Form 有timer 與 Label1等元件 以下是原始所有程式碼請兩位再幫我看看  
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls;    type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    StatusBar1: TStatusBar;
    procedure N2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;
  i:array[0..255] of integer;
  SS:integer;    implementation
uses Unit2;
{$R *.dfm}
Var child: TForm2;
procedure TForm1.N2Click(Sender: TObject);
begin
  child := TForm2.Create(Self);
  child.Caption:='文件' IntToStr(MDIChildCount);
  StatusBar1.Panels.Items[0].Text:='文件' IntToStr(MDIChildCount);
  StatusBar1.Panels.Items[1].Text:=ActiveMdichild.Name;
  SS:= SS 1;
end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  SS:=0;
end;
end.    unit Unit2;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;    type
  TForm2 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form2: TForm2;    implementation
uses Unit1;
{$R *.dfm}    procedure TForm2.Timer1Timer(Sender: TObject);
begin      i[SS]:=i[SS] 1;
  label1.Caption:=IntToStr(i[SS]);
end;    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= cafree;
end;    end.    以下是改成yyu10大大的方式紅字部分是跟yyu10大大有出入的部份,因為編譯有問題所以改成可以編譯的    main Form    unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls;    type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    StatusBar1: TStatusBar;
    procedure N2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;
  i:array[0..255] of integer;
  SS:integer;
  //ID:integer;    implementation
uses Unit2;
{$R *.dfm}
Var child: TForm2;
procedure TForm1.N2Click(Sender: TObject);
begin
  child := TForm2.Create(Self,SS);
  child.Caption:='文件' IntToStr(MDIChildCount);
  StatusBar1.Panels.Items[0].Text:='文件' IntToStr(MDIChildCount);
  StatusBar1.Panels.Items[1].Text:=ActiveMdichild.Name;
  SS:= SS 1;
end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  SS:=0;
end;    end.    MDIChild Form
unit Unit2;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;    type
  TForm2 = class(TForm)
    Label1: TLabel;
  protected
    ChildID: integer;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent; ID: integer);
  end;    var
  Form2: TForm2;    implementation
uses Unit1;
{$R *.dfm}    constructor TForm2.Create(AOwner: TComponent; ID: integer);
begin
  inherited Create(AOwner);
  ChildID := ID;
end;    procedure TForm2.Timer1Timer(Sender: TObject);
begin
    i[ChildID]:=i[ChildID] 1;
    label1.Caption:=IntToStr(i[ChildID]);    end;    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   //Action:= cafree;
end;
end.     
自然就是寫程式最好的方式, 分享比獲得更快樂--Juneo 發表人 - juneo 於 2005/03/02 11:37:27
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-02 15:35:09 IP:61.221.xxx.xxx 未訂閱
hihi~~
main Form
procedure TForm1.Button1Click(Sender: TObject);
Var
child: TForm2;
begin
  child := TForm2.Create(self);
  child.Caption:='文件' IntToStr(MDIChildCount);
  Tag:=Tag 1;
  Child.Tag:=Tag;
end;    Child Form
uses unit1;
{$R *.dfm}
procedure TForm2.Timer1Timer(Sender: TObject);
begin
  i[Tag]:=i[Tag] 1;
  label1.Caption:=IntToStr(i[Tag]);
end;
至於釋放作個迴圈把Tag搜尋一下 或再作個陣列處理 不曉得這樣可以嗎QQ 搞不懂!搞不懂!永遠都搞不懂!!
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-02 15:37:25 IP:211.75.xxx.xxx 未訂閱
找到方式了,紅字的地方我將變數設定只在MDIChild用,當我產生很多份MDIChild的時候,I不會變成每各Timer都去寫入資訊,達到我要的效果, 但是也產生Main Form 的資訊要如何傳遞近來的問題>"<    type   TForm2 = class(TForm)     Timer1: TTimer;     Label1: TLabel;     procedure Timer1Timer(Sender: TObject);     procedure FormClose(Sender: TObject; var Action: TCloseAction);   private //宣告只在內部用的變數 i:Integer; { Private declarations } public //宣告內外部都可用變數 { Public declarations } end; var Form2: TForm2; implementation uses Unit1; {$R *.dfm} procedure TForm2.Timer1Timer(Sender: TObject); begin i:=i 1; //i[SS]:=i[SS] 1; //label1.Caption:=IntToStr(i[SS]); label1.Caption:=IntToStr(i); end; 自然就是寫程式最好的方式, 分享比獲得更快樂--Juneo
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-02 15:44:30 IP:61.221.xxx.xxx 未訂閱
hihi~~ 有點迷糊了搞不懂您想要傳什麼資訊呢
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-03 09:05:40 IP:211.20.xxx.xxx 未訂閱
我在做讓MDIChild能夠各自獨立計時, 主要Main from 只有控制流程 由MDIChild計時完成在後傳遞回其他參數 ^^ 之前因為沒有將共用變數區隔開來,導致 MDIChildA 1 MDIChildB 2 MDIChildC 3 計時變成同步,將區域變數區隔開來以後就變成非同步計時 也就是我要的計時效果 自然就是寫程式最好的方式, 分享比獲得更快樂--Juneo
系統時間:2024-06-08 16:40:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!