http://www.delphi2007.net/DelphiVCL/html/delphi_20061222112800193.html
1,用窗體名稱作為傳入引數,建立窗體,怎麼避免重複建立?
如下面程式碼中註釋調的部分;使用not assigned()判斷返回的結果每次都是false
也就是說,assigned判斷結果一直為true。
function JaxCreateForm(const AFormName:string):boolean;
var
AForm: TForm;
AFormClass: TFormClass;
begin
try
if FindClass(AFormName) <> nil then
begin
try
AFormClass := TFormClass(FindClass(AFormName));
// if not assigned(TForm(copy(AFormName,2,Length(AFormName)-1))) then
AForm := AFormClass.Create(nil);
AForm.Show; //mdi型別form不能使用showmodal釋放窗體;
except
AForm.Free;
AForm := nil;
end;
end
else begin
showmessage(format('建立窗體"%s"出錯!',[AFormName]));
end;
except
end;
end;
2,動態建立的選單項,怎麼將其onclick事件與全域性tnotifyevent型別的函式關聯起來。
with tbutton.create(nil) do
begin
parent := self;
caption := '';
onclick := ?.
end;
這個 視窗是不是自動建立的?
Q: 1,用窗體名稱作為傳入引數,建立窗體,怎麼避免重複建立?
A: 看例項:
procedure TActionsModule.OpenForm(FormClass: TFormClass; var fm;
AOwner: TComponent);
var
Idx: Integer;
Child: TForm;
begin
for Idx := 0 to Pred(Screen.FormCount) do
if Screen.Forms[Idx].ClassType = FormClass then
begin
Child := Screen.Forms[Idx];
if Child.WindowState = wsMinimized then
ShowWindow(Child.handle,SW_SHOWNORMAL)
else
ShowWindow(Child.handle,SW_SHOWNA);
if (not Child.Visible) then Child.Visible:=True;
Child.BringToFront;
Child.Setfocus;
TForm(fm):=Child;
exit;
end;
Child := TForm(FormClass.NewInstance);
TForm(fm):= Child;
Child.Create(AOwner);
end;
OpenForm(TLogInformationForm, LogInformationForm, Application.MainForm);
Q:,動態建立的選單項,怎麼將其onclick事件與全域性tnotifyevent型別的函式關聯起來。
A: 看例項
procedure TMainForm.ButtonOnClick(Sender: TObject);
begin
if Sender is TButton then
Showmessage((Sender as TButton).Caption);
end;
with tbutton.create(nil) do
begin
parent := self;
caption := '';
onclick := ButtonOnClick
end
Q:,動態建立的選單項,怎麼將其onclick事件與全域性tnotifyevent型別的函式關聯起來。
with tbutton.create(nil) do
----------------------------
你的問題是選單項, 而你的程式碼是TBUTTON。呵呵。 沒有關係,選單項也是一樣的
1,看到了老馮的例項,不過我的建立方式和你有點不同;現在已經自己解決了;
將程式碼AForm:= AForm.create(nil);改成..create(Application);
然後用Application.findcomponent('AFormName');就可以了。
2,onclick := ButtonOnClick;
中如果buttononclick是在同一個類下是可以;但,相反,如果buttononclick是一個全域性定義函式,不屬於任何類下的話,好像不行。
再次請教。
對不起, 剛才一直無法上來。
procedure ButtonOnClick(Sender: TObject);
begin
Showmessage('Pointer, Pointer , I Hate You!');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with TButton.Create(nil) do
begin
Parent := Self;
Visible := True;
@OnClick := @ButtonOnClick;
end;
end;