如何在動態產生的btn內的onclick寫程式 |
尚未結案
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
您好,如下:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; procedure Label1Click(Sender: TObject); procedure Button1Click(Sender: TObject); private FButton:TButton; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Label1Click(Sender: TObject); begin if not Assigned(FButton) then begin FButton:=TButton.Create(Self); FButton.Parent:=Self; FButton.Top:=10; FButton.Left:=10; FButton.Caption:='按我產生另一個form'; FButton.OnClick:=Button1Click; end; end; procedure TForm1.Button1Click(Sender: TObject); var aForm:TForm1; begin aForm:=TForm1.Create(Self); try aForm.Caption:='這是產生的另外一個from'; aForm.Label1.Caption:='這是產生的另外一個form'; aForm.Position:=poScreenCenter; aForm.ShowModal; finally aForm.Free; end; end; end.畫面檔 object Form1: TForm1 Left = 192 Top = 107 Width = 696 Height = 480 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poDefault PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 120 Top = 64 Width = 102 Height = 13 Caption = '按我動態產生button' OnClick = Label1Click end end |
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
TATSU
版主 發表:50 回覆:135 積分:62 註冊:2003-01-16 發送簡訊給我 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure MyBtnClick(Sender : TObject) ; private { Private declarations } FMyBtnList : TList ; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i : Integer ; NewBtn : TButton ; begin for i := 1 to 10 do begin NewBtn := TButton.Create(self); with NewBtn do begin Left := 10 ; Top := 26 * i ; Height := 22 ; Width := 40 ; Tag := i ; Caption := 'No.' IntToStr(i) ; Parent := Self ; OnClick := MyBtnClick ; end; FMyBtnList.Add(NewBtn) ; end; end; procedure TForm1.MyBtnClick(Sender : TObject); var nIndex : Integer ; begin nIndex := (Sender as TButton).Tag ; Label1.Caption := 'Button no.' IntToStr(nIndex) ' clicked' ; end; procedure TForm1.FormCreate(Sender: TObject); begin FMyBtnList := TList.Create ; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FMyBtnList.Free ; end; end.這個簡單的示範沒有用什麼元件,你只要加入一個新的 button 就可以測試,當中除了新增十個 button 外,除將新的 Button 加入 TList 入,以備你還要參考十個 button 內某些資料。 |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi yx_huang77 您好:
試試這個
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Comobj, Excel2000, StdCtrls; type TForm1 = class(TForm) Button2: TButton; procedure Button2Click(Sender: TObject); private { Private declarations } MyOnClick : array [0..2] of TNotifyEvent; procedure a(Sender : TObject); procedure b(Sender : TObject); procedure c(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.a(Sender: TObject); begin ShowMessage('1st Click'); end; procedure TForm1.b(Sender: TObject); begin ShowMessage('2st Click'); end; procedure TForm1.c(Sender: TObject); begin ShowMessage('3st Click'); end; procedure TForm1.Button2Click(Sender: TObject); var MyButton : TButton; begin MyOnClick[0] := a; MyOnClick[1] := b; MyOnClick[2] := c; MyButton := TButton.Create(Self); MyButton.Parent := Self; MyButton.Caption := 'Now Button'; MyButton.Left := 10; MyButton.Top := 10; MyButton.OnClick := MyOnClick[2]; end; end.我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/04/21 14:59:40
------
我不是高手, 高手是正在銀幕前微笑的人. |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
不知道這是不是你要的
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private FNotify:array[0..2] of TNotifyEvent; procedure ButtonX0Click(Sender:TObject); procedure ButtonX1Click(Sender:TObject); procedure ButtonX2Click(Sender:TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:Integer; btn:TButton; begin for i:=0 to high(FNotify) do begin btn:=TButton.Create(Self); btn.Parent:=Self; btn.Top:=10 30*(i-0); btn.Left:=10; btn.Caption:='ButtonX' IntToStr(i 1); btn.OnClick:=FNotify[i]; end; end; procedure TForm1.ButtonX0Click(Sender: TObject); begin ShowMessage('這是第1個Button的OnClick事件'); end; procedure TForm1.ButtonX1Click(Sender: TObject); begin ShowMessage('這是第2個Button的OnClick事件'); end; procedure TForm1.ButtonX2Click(Sender: TObject); begin ShowMessage('這是第3個Button的OnClick事件'); end; procedure TForm1.FormCreate(Sender: TObject); begin FNotify[0]:=ButtonX0Click; FNotify[1]:=ButtonX1Click; FNotify[2]:=ButtonX2Click; end; end. |
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
TATSU
版主 發表:50 回覆:135 積分:62 註冊:2003-01-16 發送簡訊給我 |
引言: 其實我想要的是動態產生的btn內的onclick事件是從資料庫抓取,還有就是btn的產生數量也是由資料庫抓取,如何動態產生onclick事件事件 謝謝你先看看是否那多個欄位所對應的事件都是要處理什麼程序,其實程式已 令每個 button 有不同的資料去讓你識別,再下來,就是要你自己發揮如何 處理及運用。 procedure TForm1.Button1Click(Sender: TObject); var i : Integer ; NewBtn : TButton ; begin for i := 1 to 10 do begin NewBtn := TButton.Create(self); with NewBtn do begin Left := 10 ; Top := 26 * i ; Height := 22 ; Width := 40 ; Tag := i ; // 每一個按鈕的 Tag 及 caption 都不相同 Caption := 'No.' IntToStr(i) ; Parent := Self ; OnClick := MyBtnClick ; end; FMyBtnList.Add(NewBtn) ; end; end; procedure TForm1.MyBtnClick(Sender : TObject); var nIndex : Integer ; begin nIndex := (Sender as TButton).Tag ; Label1.Caption := 'Button no.' IntToStr(nIndex) ' clicked' ; //因應不同的欄位已經可以放入不同的程式碼 case nIndex of 0 : {your code} 1 : {your code} 2 : {your code} . . . . . . 100 : {your code} end; end;如果這樣的做法,你仍覺得不妥善,請你將你數據庫資料簡單列出,好讓你的問題盡快解決。 |
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
數據庫資料如下
btncaption Event
人事資料維護 openform(fma010)
廠商資料維護 openform(fma020)
採購資料維護 openform(fma030)
入庫資料維護 openform(fma040)
客戶資料維護 openform(fma050)
假設以上資料為數據庫資料,系統會依照使用者登入權限來判斷可使用的作業
例如
A使用者只能用
人事資料維護 openform(fma010)
廠商資料維護 openform(fma020)
採購資料維護 openform(fma030)
B使用者只能用
廠商資料維護 openform(fma020)
採購資料維護 openform(fma030)
客戶資料維護 openform(fma050)
其他維護則不顯示
|
TATSU
版主 發表:50 回覆:135 積分:62 註冊:2003-01-16 發送簡訊給我 |
引言: 數據庫資料如下 btncaption Event 人事資料維護 openform(fma010) 廠商資料維護 openform(fma020) 採購資料維護 openform(fma030) 入庫資料維護 openform(fma040) 客戶資料維護 openform(fma050) 假設以上資料為數據庫資料,系統會依照使用者登入權限來判斷可使用的作業 例如 A使用者只能用 人事資料維護 openform(fma010) 廠商資料維護 openform(fma020) 採購資料維護 openform(fma030) B使用者只能用 廠商資料維護 openform(fma020) 採購資料維護 openform(fma030) 客戶資料維護 openform(fma050) 其他維護則不顯示 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const BTN_MAX_COUNT = 5 ; BTN_ID_HR = 1 ; BTN_ID_SUPPLIER = 2 ; BTN_ID_PURCHASE = 3 ; BTN_ID_STOCK = 4 ; BTN_ID_CLIENT = 5 ; aBtnCaption : Array[1..5] of String = ('人事資料維護', '廠商資料維護', '採購資料維護', '入庫資料維護', '客戶資料維護') ; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure FormShow(Sender: TObject); procedure MyBtnClick(Sender : TObject) ; private { Private declarations } FUserID : Integer ; function GetUserPassword : Integer ; function CheckUserRights(UserID : Integer) : Boolean ; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var i, j : Integer ; NewBtn : TButton ; begin FUserID := GetUserPassword ; if FUserID = -1 then close else begin j := 0 ; for i := 1 TO BTN_MAX_COUNT do begin if CheckUserRights(FUserID, i) then begin inc(j) ; NewBtn := TButton.Create ; with NewBtn do begin Left := 10 ; Top := 26 * j ; Height := 22 ; Width := 40 ; Tag := i ; Caption := aBtnCaption[i] ; Parent := Self ; OnClick := MyBtnClick ; end; end; end; end; end; function TForm1.GetUserPassword : Integer ; begin {put your password check routine here} end; function TForm1.CheckUserRights(UserID : Integer) : Boolean ; begin {put user rights routine here} end; procedure TForm1.MyBtnClick(Sender : TObject); var nBtnID : Integer ; begin nBtnID := (Sender as TButton).Tag ; case nBtnID of BTN_ID_HR : {人事資料維護} BTN_ID_SUPPLIER : {廠商資料維護} BTN_ID_PURCHASE : {採購資料維護} BTN_ID_STOCK : {入庫資料維護} BTN_ID_CLIENT : {客戶資料維護} end; end; end.你嘗試在程式開首部份定義一堆 constant ,這樣做,除了可讀性增加,以後維護這支程式時,亦會簡單得多。 |
yachanga
資深會員 發表:24 回覆:335 積分:296 註冊:2003-09-27 發送簡訊給我 |
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
TATSU
版主 發表:50 回覆:135 積分:62 註冊:2003-01-16 發送簡訊給我 |
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
procedure TfmMain.MyBtnClick(Sender: TObject);
var
sFrom, sCommand, sSysName : String;
nBtnID : Integer ;
begin
nBtnID := (Sender as TButton).Tag ;
sSysName := Pchar(MyExeArray[nBtnID]);
sFrom := 'G:\Winprg\';
sCommand := sFrom + sSysName + '\' + sSysName + 'exe';
if WinExec(Pchar(sCommand), SW_MAXIMIZE)<31 then
begin
MyWarning('找不到該程式、請聯絡資訊人員!');
abort;
end
else
Application.Terminate;
end;
|
TATSU
版主 發表:50 回覆:135 積分:62 註冊:2003-01-16 發送簡訊給我 |
引言:procedure TfmMain.MyBtnClick(Sender: TObject); var sFrom, sCommand, sSysName : String; nBtnID : Integer ; begin nBtnID := (Sender as TButton).Tag ; // 你有檢查這個值是否正確? sFrom := 'G:\Winprg\' ; sSysName := MyExeArray[nBtnID]; // 這裏應該不用轉為 PChar,你也好列出這個 Array 讓我參考 sCommand := sFrom sSysName '\' sSysName 'exe'; if FileExists(sCommand) then begin if WinExec(Pchar(sCommand), SW_MAXIMIZE) < 32 then begin MyWarning('程式執行錯誤、請聯絡資訊人員!'); abort; end else Application.Terminate; end else MyWarning('找不到該程式、請聯絡資訊人員!'); end; |
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
TATSU
版主 發表:50 回覆:135 積分:62 註冊:2003-01-16 發送簡訊給我 |
|
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
|
TATSU
版主 發表:50 回覆:135 積分:62 註冊:2003-01-16 發送簡訊給我 |
MyExeArray: array of String; sCount := DM.qyTemp0.RecordCount ; setlength(MyExeArray,sCount); i := 0; j := 0; k := 0; nRow := 5 ; while not DM.qyTemp0.Eof do begin MyExeArray[k] := DM.qyTemp0.FieldByName('SYS_NO').AsString; NewBtn := Tbutton.Create(self) ; with NewBtn do begin parent := Self; top := j * 30 ((j 1) * 12); left := i*150 (i 1)*16; height := 30; width := 150; name := 'btn' inttostr(k); Tag := k ; <-------------------這裡的值無法給 Tag OnClick := MyBtnClick ; Font.Size := 12; end; Inc(k) ; Inc(j) ; if j = nRow then begin Inc(i) ; j := 0 ; end; DM.qyTemp0.Next; end;你這一段程式碼有問題 k := k 1; with tbutton.Create(self) do begin parent := Self; top := j*30 (j 1)*12; left := i*150 (i 1)*16; height := 30; width := 150; name := 'btn' inttostr(k); Tag := k ; <-------------------這裡的值無法給 Tag OnClick := MyBtnClick ; Font.Size := 12; MyExeArray[k-1] := DM.qyTemp0.FieldByName('SYS_NO').AsString; end; j := j 1;那麼 Tag 的值是由 1 開始 但你又懂得先減 1 ,再存放 string 入 Array。 如果你的 Array 有五個 string ,當你按第五個 Button 時,傳回 Tag 的值是 5。但你的 Array 是由 0 開始到 4 ,總數五個,你去找 MyExeArray[5] ,不出錯才怪耶。你試著將程式改到以上的格式,你較易找出錯誤的地方。 發表人 - tatsu 於 2004/04/23 15:14:39 |
yx_huang77
一般會員 發表:46 回覆:64 積分:22 註冊:2004-03-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |