主窗体弹出子窗体用动态创建,在子窗体的代码里写一个函数来创建子窗体。比如, function LoadEditMap(ShowOrEdit: Boolean; BitMapStr: String): String; begin fmEditBitMap := TfmEditBitMap.Create(nil); Result := ''; with fmEditBitMap do begin if ShowOrEdit then Caption := '编辑BitMap' else Caption := '显示BitMap'; BitMapToStr(BitMapStr);//这个过程就是处理BitMapStr并将结果显示于窗体的控件里 if (ShowModal = mrOk) and ShowOrEdit then Result := StrToBitMap(StrBitMap); free; end; end;
form1:=tform.create(application);
{
//procedure...//这里为你要做的处理过程
}
form1.showmodal;
主窗体create->子窗体create->子窗体show->主窗体show你检查一下程序传递的文件顺序是否正确!
然后在子窗体的 OnShow 事件中处理。
function LoadEditMap(ShowOrEdit: Boolean; BitMapStr: String): String;
begin
fmEditBitMap := TfmEditBitMap.Create(nil);
Result := '';
with fmEditBitMap do
begin
if ShowOrEdit then
Caption := '编辑BitMap'
else
Caption := '显示BitMap'; BitMapToStr(BitMapStr);//这个过程就是处理BitMapStr并将结果显示于窗体的控件里
if (ShowModal = mrOk) and ShowOrEdit then
Result := StrToBitMap(StrBitMap);
free;
end;
end;
我所说的主窗体和子窗体不是MDI形式,是主界面和附属界面的意思,且都是Modeless窗体。而且我也确实试过在附属窗体的OnShow()过程中加入处理过程,但确实会引发异常——因为调试时发现附属窗体本身的值还是nil(就是没创建完),这时去访问该窗体本身肯定不行。
可是如果我等附属窗体创建完后,再去触发处理操作,就是正常的。第一次不能全部做完所有处理,> 1 次就可以了。
确实很苦恼。
附属窗体名为form2,要访问form2的属性:form2.Hint:=…… ,form2.WindowState:=...
等,这些 操作将引发异常。
大伙儿说的真是各有奇招,的确用OnPaint()中的过程就可以避免异常。但是这样一来,我改变一下子窗体的大小就会触发又一次的相同处理操作,而这是没有必要的。
我希望激活该子窗体后,自动处理完成,不管怎么动它应该不要再去重复处理。
你的 Form2 是怎么创建的?什么时候创建的?
procedure TForm1.FormShow(Sender: TObject);
begin
form2:=TForm2.Create(Application);
form2.show;
end;procedure TForm2.FormShow(Sender: TObject);
begin
form2.Hint :='fsdafds';
showmessage(hint);
form2.WindowState:=wsMaximized;
end;
Form2附属窗体是动态创建的,不知道为什么我的程序中在 OnShow()中Form2的值就是NIL(调试发现),而且此时Form2的窗体界面还没有显现(直到处理结束才出现)。