详细点说,主窗体中弹出子窗体时,子窗体立刻就把传递进来的文件处理掉(所谓立刻是指不需要用户干预,没有手工操作)同时显示子窗体界面,而这个处理又涉及一些对子窗体本身的操作。我已经试过在该窗体的.Create()、.Show()、.Activate()过程中加入处理过程,都会因为去访问该子窗体而出错。因为子窗体还没有完全建成,为nil。
19 个解决方案
#1
onshow事件应该可以,你的问题可能不是因为访问子窗体引起的!如果可以发一段处理过程的代码来看看!
#2
可以把处理放到子窗体中去
#3
您也可以这样:
form1:=tform.create(application);
{
//procedure...//这里为你要做的处理过程
}
form1.showmodal;
form1:=tform.create(application);
{
//procedure...//这里为你要做的处理过程
}
form1.showmodal;
#4
你说的主窗体和子窗体是不是MDI格式的?如果是,主窗体的于子窗体的创建顺序应该是:
主窗体create->子窗体create->子窗体show->主窗体show你检查一下程序传递的文件顺序是否正确!
主窗体create->子窗体create->子窗体show->主窗体show你检查一下程序传递的文件顺序是否正确!
#5
讲的再仔细点:如果一个窗体已经创建了,即它的create事件已经执行过,就可以访问它本身了!所以你完全可以在子窗体的onshow事件中访问本身的资源!
#6
你要在主窗体的 OnShow 事件中生成显示子窗体,
然后在子窗体的 OnShow 事件中处理。
然后在子窗体的 OnShow 事件中处理。
#7
主窗体弹出子窗体用动态创建,在子窗体的代码里写一个函数来创建子窗体。比如,
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;
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;
#8
是我提的问题。
我所说的主窗体和子窗体不是MDI形式,是主界面和附属界面的意思,且都是Modeless窗体。而且我也确实试过在附属窗体的OnShow()过程中加入处理过程,但确实会引发异常——因为调试时发现附属窗体本身的值还是nil(就是没创建完),这时去访问该窗体本身肯定不行。
可是如果我等附属窗体创建完后,再去触发处理操作,就是正常的。第一次不能全部做完所有处理,> 1 次就可以了。
确实很苦恼。
我所说的主窗体和子窗体不是MDI形式,是主界面和附属界面的意思,且都是Modeless窗体。而且我也确实试过在附属窗体的OnShow()过程中加入处理过程,但确实会引发异常——因为调试时发现附属窗体本身的值还是nil(就是没创建完),这时去访问该窗体本身肯定不行。
可是如果我等附属窗体创建完后,再去触发处理操作,就是正常的。第一次不能全部做完所有处理,> 1 次就可以了。
确实很苦恼。
#9
贴点代码出来啊!不然我怎么帮你?
#10
是我提的问题。
附属窗体名为form2,要访问form2的属性:form2.Hint:=…… ,form2.WindowState:=...
等,这些 操作将引发异常。
附属窗体名为form2,要访问form2的属性:form2.Hint:=…… ,form2.WindowState:=...
等,这些 操作将引发异常。
#11
我的可以啊!一点错误都没有!告诉我还有什么?放心,我不会偷你的代码的,这点
职业道德我还是有的!
职业道德我还是有的!
#12
不可能是没创建完窗体的事,oncreate事件结束后,一个窗体就创建完了!
#13
这样吧!我的OICQ号是:33291349。有什么需要和我联系!
#14
呵呵,要用OnPaint,没想到吧
#15
是我提的问题。
大伙儿说的真是各有奇招,的确用OnPaint()中的过程就可以避免异常。但是这样一来,我改变一下子窗体的大小就会触发又一次的相同处理操作,而这是没有必要的。
我希望激活该子窗体后,自动处理完成,不管怎么动它应该不要再去重复处理。
大伙儿说的真是各有奇招,的确用OnPaint()中的过程就可以避免异常。但是这样一来,我改变一下子窗体的大小就会触发又一次的相同处理操作,而这是没有必要的。
我希望激活该子窗体后,自动处理完成,不管怎么动它应该不要再去重复处理。
#16
在 Form2.OnShow 中处理 form2.Hint:=…… ,form2.WindowState:=... 这些事情是不产生异常的。
你的 Form2 是怎么创建的?什么时候创建的?
你的 Form2 是怎么创建的?什么时候创建的?
#17
下面这段代码编译通过。
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;
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;
#18
是我提的问题。
Form2附属窗体是动态创建的,不知道为什么我的程序中在 OnShow()中Form2的值就是NIL(调试发现),而且此时Form2的窗体界面还没有显现(直到处理结束才出现)。
Form2附属窗体是动态创建的,不知道为什么我的程序中在 OnShow()中Form2的值就是NIL(调试发现),而且此时Form2的窗体界面还没有显现(直到处理结束才出现)。
#19
把你的代码贴出来,这样太笼统了,我们实在不好回答。期待!!!
#20
#1
onshow事件应该可以,你的问题可能不是因为访问子窗体引起的!如果可以发一段处理过程的代码来看看!
#2
可以把处理放到子窗体中去
#3
您也可以这样:
form1:=tform.create(application);
{
//procedure...//这里为你要做的处理过程
}
form1.showmodal;
form1:=tform.create(application);
{
//procedure...//这里为你要做的处理过程
}
form1.showmodal;
#4
你说的主窗体和子窗体是不是MDI格式的?如果是,主窗体的于子窗体的创建顺序应该是:
主窗体create->子窗体create->子窗体show->主窗体show你检查一下程序传递的文件顺序是否正确!
主窗体create->子窗体create->子窗体show->主窗体show你检查一下程序传递的文件顺序是否正确!
#5
讲的再仔细点:如果一个窗体已经创建了,即它的create事件已经执行过,就可以访问它本身了!所以你完全可以在子窗体的onshow事件中访问本身的资源!
#6
你要在主窗体的 OnShow 事件中生成显示子窗体,
然后在子窗体的 OnShow 事件中处理。
然后在子窗体的 OnShow 事件中处理。
#7
主窗体弹出子窗体用动态创建,在子窗体的代码里写一个函数来创建子窗体。比如,
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;
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;
#8
是我提的问题。
我所说的主窗体和子窗体不是MDI形式,是主界面和附属界面的意思,且都是Modeless窗体。而且我也确实试过在附属窗体的OnShow()过程中加入处理过程,但确实会引发异常——因为调试时发现附属窗体本身的值还是nil(就是没创建完),这时去访问该窗体本身肯定不行。
可是如果我等附属窗体创建完后,再去触发处理操作,就是正常的。第一次不能全部做完所有处理,> 1 次就可以了。
确实很苦恼。
我所说的主窗体和子窗体不是MDI形式,是主界面和附属界面的意思,且都是Modeless窗体。而且我也确实试过在附属窗体的OnShow()过程中加入处理过程,但确实会引发异常——因为调试时发现附属窗体本身的值还是nil(就是没创建完),这时去访问该窗体本身肯定不行。
可是如果我等附属窗体创建完后,再去触发处理操作,就是正常的。第一次不能全部做完所有处理,> 1 次就可以了。
确实很苦恼。
#9
贴点代码出来啊!不然我怎么帮你?
#10
是我提的问题。
附属窗体名为form2,要访问form2的属性:form2.Hint:=…… ,form2.WindowState:=...
等,这些 操作将引发异常。
附属窗体名为form2,要访问form2的属性:form2.Hint:=…… ,form2.WindowState:=...
等,这些 操作将引发异常。
#11
我的可以啊!一点错误都没有!告诉我还有什么?放心,我不会偷你的代码的,这点
职业道德我还是有的!
职业道德我还是有的!
#12
不可能是没创建完窗体的事,oncreate事件结束后,一个窗体就创建完了!
#13
这样吧!我的OICQ号是:33291349。有什么需要和我联系!
#14
呵呵,要用OnPaint,没想到吧
#15
是我提的问题。
大伙儿说的真是各有奇招,的确用OnPaint()中的过程就可以避免异常。但是这样一来,我改变一下子窗体的大小就会触发又一次的相同处理操作,而这是没有必要的。
我希望激活该子窗体后,自动处理完成,不管怎么动它应该不要再去重复处理。
大伙儿说的真是各有奇招,的确用OnPaint()中的过程就可以避免异常。但是这样一来,我改变一下子窗体的大小就会触发又一次的相同处理操作,而这是没有必要的。
我希望激活该子窗体后,自动处理完成,不管怎么动它应该不要再去重复处理。
#16
在 Form2.OnShow 中处理 form2.Hint:=…… ,form2.WindowState:=... 这些事情是不产生异常的。
你的 Form2 是怎么创建的?什么时候创建的?
你的 Form2 是怎么创建的?什么时候创建的?
#17
下面这段代码编译通过。
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;
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;
#18
是我提的问题。
Form2附属窗体是动态创建的,不知道为什么我的程序中在 OnShow()中Form2的值就是NIL(调试发现),而且此时Form2的窗体界面还没有显现(直到处理结束才出现)。
Form2附属窗体是动态创建的,不知道为什么我的程序中在 OnShow()中Form2的值就是NIL(调试发现),而且此时Form2的窗体界面还没有显现(直到处理结束才出现)。
#19
把你的代码贴出来,这样太笼统了,我们实在不好回答。期待!!!