又一个小问题,求解?(10分)

  • 主题发起人 主题发起人 易名烦
  • 开始时间 开始时间

易名烦

Unregistered / Unconfirmed
GUEST, unregistred user!
PROCEDURE TFrmain.MShowWindow(WinNAME:STRING;WIN:TFORM;WINCOMP:TCOMPONENTCLASS);
Begin
IF APPLICATION.FindComponent(WINNAME)<>NIL THEN
BEGIN
WIN.Show;
EXIT;
END;
APPLICATION.CreateForm(WINCOMP,WIN);
WIN.Show;
End;

我用 MSHOWWINDOW('FRSETUP',FRSETUP,TFRSETUP);调用时出错在WIN.SHOW这一行!
 
改一下:
PROCEDURE TFrmain.MShowWindow(WinNAME:STRING;WIN:TFORM;WINCOMP:TCOMPONENTCLASS);
Begin
IF APPLICATION.FindComponent(WINNAME)<>NIL THEN
BEGIN
showwindow(winname.handle,sw_showmaximized);
EXIT;
END;
APPLICATION.CreateForm(WINCOMP,WIN);
WIN.Show;
End;

 
关注一下。
不等于nil不见得存在啊?
 
大哥,这样是不行的!
begin
IF APPLICATION.FindComponent(WINNAME)<>NIL THEN
BEGIN
ShowWindow(win.Handle,SW_SHOWMAXIMIZED);
win.BringToFront;
win.SetFocus;
EXIT;
END;
APPLICATION.CreateForm(WINCOMP,WIN);
WIN.Show;
end;
照样出错!
 
var windowshand:Hwnd ;
Begin
WindowsHand:=Findwindow(nil,WINNAME);
if WindowsHand<>0 then
begin
if Isiconic(WindowsHand) then //返回非0为最小化窗口;
showwindow(WindowsHand,SW_SHOW) //显示窗口;
else
SetForegroundWindow(WindowsHand); //将窗口推至前台;
exit;
end;
end;
 
如果你是为了在MDI中打开子窗体,我建议用这个过程:(我一直都这么用)
procedure OpenForm(FormClass: TFormClass; var fm; AOwner:TComponent);
var
i: integer;
Child:TForm;
begin
for i := 0 to Screen.FormCount -1 do
if Screen.Forms.ClassType=FormClass then
begin
Child:=Screen.Forms;
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(TLRForm,LRForm, self);//LRForm是要打开的窗体的名子
这种方法在多个子窗口混合存在时使用起来尤其方便!
 
TO ccweifen:
我不知道为什么,你写的代码不太行得通!
最起吗一点,FINDWINDOW这个有点不严谨,要是两个窗口标题都一样,怎么办?
 
to dodo:
你写的太长,我大概看懂了,不全懂,不用这么长吧,窗口自己创建就好了,为什么非
要重新来的TFORM变量?
 
GG,JJ们就给我看看为什么WIN.SHOW会出错,要怎么改,可你不能叫我改得面目全非啊。
给我感觉改过了一点代码都不属于我的,全是你们写的!
 
谢谢大家关注!接着吧!
 
首先,你的代码可读性太差了,不能全部大写吧?
其次,问题很简单,加一个VAR就搞定了:
//由于传入var参数时要求完全类型匹配,所以干脆不指定任何类型,直接用“var WIN; ”
procedure MShowWindow(WinNAME: string; var WIN; WINCOMP: TComponentClass);
begin
if Application.FindComponent(WINNAME) <> nil then
begin
TForm(WIN).Show; //强制转换成TForm
Exit;
end;
Application.CreateForm(WINCOMP, WIN);
TForm(WIN).Show;
end;
 
有两行win.show
出错是哪一行
 
to dedman:
第一个!
 
第一个的话,可能WIN还没创建,或者创建后又释放了。
 
唉,不谈了,xianjun前辈的代码完全通过,简单,明了,呵呵!我的QQ:15751071,常在
线,希望前辈们加我,我好问问题哈。谢谢你们了,分太少,就只能给一个人了,对不住了!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
745
import
I
后退
顶部