窗体创建和函数关联相关的两个小问题

ann790914 2006-12-22 11:28:00
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;
...全文
123 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ann790914 2006-12-22
  • 打赏
  • 举报
回复
1,看到了老冯的实例,不过我的创建方式和你有点不同;现在已经自己解决了;
将代码AForm:= AForm.create(nil);改成..create(Application);
然后用Application.findcomponent('AFormName');就可以了。

2,onclick := ButtonOnClick;
中如果buttononclick是在同一个类下是可以;但,相反,如果buttononclick是一个全局定义函数,不属于任何类下的话,好像不行。
再次请教。
老冯 2006-12-22
  • 打赏
  • 举报
回复
Q:,动态创建的菜单项,怎么将其onclick事件与全局tnotifyevent类型的函数关联起来。

with tbutton.create(nil) do

----------------------------

你的问题是菜单项, 而你的代码是TBUTTON。呵呵。 没有关系,菜单项也是一样的
老冯 2006-12-22
  • 打赏
  • 举报
回复
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

zhengsq007 2006-12-22
  • 打赏
  • 举报
回复
这个 窗口是不是自动创建的?
ann790914 2006-12-22
  • 打赏
  • 举报
回复
2,动态创建的菜单项,怎么将其onclick事件与全局tnotifyevent类型的函数关联起来。
with tbutton.create(nil) do
begin
parent := self;
caption := '';
onclick := ?.
end;
老冯 2006-12-22
  • 打赏
  • 举报
回复
对不起, 刚才一直无法上来。

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;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧