請問在MDI 中如何使用Timer與全區變數 |
答題得分者是:mine
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
請問我使用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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
感謝兩位大大的回應^^,我將問題與程式更釐清一些好了
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 發送簡訊給我 |
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 發送簡訊給我 |
找到方式了,紅字的地方我將變數設定只在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 發送簡訊給我 |
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |