怎样实现自动化执行?

时间:2022-10-27 05:58:12
    怎样在创建窗体同时完成本来是在窗体创建完成后进行的操作或处理?
    详细点说,主窗体中弹出子窗体时,子窗体立刻就把传递进来的文件处理掉(所谓立刻是指不需要用户干预,没有手工操作)同时显示子窗体界面,而这个处理又涉及一些对子窗体本身的操作。我已经试过在该窗体的.Create()、.Show()、.Activate()过程中加入处理过程,都会因为去访问该子窗体而出错。因为子窗体还没有完全建成,为nil。
    

19 个解决方案

#1


onshow事件应该可以,你的问题可能不是因为访问子窗体引起的!如果可以发一段处理过程的代码来看看!

#2


可以把处理放到子窗体中去

#3


您也可以这样:
form1:=tform.create(application);
{
//procedure...//这里为你要做的处理过程
}
form1.showmodal;

#4


你说的主窗体和子窗体是不是MDI格式的?如果是,主窗体的于子窗体的创建顺序应该是:
主窗体create->子窗体create->子窗体show->主窗体show你检查一下程序传递的文件顺序是否正确!

#5


讲的再仔细点:如果一个窗体已经创建了,即它的create事件已经执行过,就可以访问它本身了!所以你完全可以在子窗体的onshow事件中访问本身的资源!

#6


你要在主窗体的 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;

#8


    是我提的问题。
    我所说的主窗体和子窗体不是MDI形式,是主界面和附属界面的意思,且都是Modeless窗体。而且我也确实试过在附属窗体的OnShow()过程中加入处理过程,但确实会引发异常——因为调试时发现附属窗体本身的值还是nil(就是没创建完),这时去访问该窗体本身肯定不行。
    可是如果我等附属窗体创建完后,再去触发处理操作,就是正常的。第一次不能全部做完所有处理,> 1 次就可以了。
    确实很苦恼。

#9


贴点代码出来啊!不然我怎么帮你?

#10


    是我提的问题。
    附属窗体名为form2,要访问form2的属性:form2.Hint:=…… ,form2.WindowState:=...
等,这些 操作将引发异常。

#11


我的可以啊!一点错误都没有!告诉我还有什么?放心,我不会偷你的代码的,这点
职业道德我还是有的!

#12


不可能是没创建完窗体的事,oncreate事件结束后,一个窗体就创建完了!

#13


这样吧!我的OICQ号是:33291349。有什么需要和我联系!

#14


呵呵,要用OnPaint,没想到吧

#15


是我提的问题。
大伙儿说的真是各有奇招,的确用OnPaint()中的过程就可以避免异常。但是这样一来,我改变一下子窗体的大小就会触发又一次的相同处理操作,而这是没有必要的。
我希望激活该子窗体后,自动处理完成,不管怎么动它应该不要再去重复处理。

#16


 在 Form2.OnShow 中处理 form2.Hint:=…… ,form2.WindowState:=... 这些事情是不产生异常的。
你的 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;

#18


是我提的问题。
Form2附属窗体是动态创建的,不知道为什么我的程序中在 OnShow()中Form2的值就是NIL(调试发现),而且此时Form2的窗体界面还没有显现(直到处理结束才出现)。

#19


把你的代码贴出来,这样太笼统了,我们实在不好回答。期待!!!

#1


onshow事件应该可以,你的问题可能不是因为访问子窗体引起的!如果可以发一段处理过程的代码来看看!

#2


可以把处理放到子窗体中去

#3


您也可以这样:
form1:=tform.create(application);
{
//procedure...//这里为你要做的处理过程
}
form1.showmodal;

#4


你说的主窗体和子窗体是不是MDI格式的?如果是,主窗体的于子窗体的创建顺序应该是:
主窗体create->子窗体create->子窗体show->主窗体show你检查一下程序传递的文件顺序是否正确!

#5


讲的再仔细点:如果一个窗体已经创建了,即它的create事件已经执行过,就可以访问它本身了!所以你完全可以在子窗体的onshow事件中访问本身的资源!

#6


你要在主窗体的 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;

#8


    是我提的问题。
    我所说的主窗体和子窗体不是MDI形式,是主界面和附属界面的意思,且都是Modeless窗体。而且我也确实试过在附属窗体的OnShow()过程中加入处理过程,但确实会引发异常——因为调试时发现附属窗体本身的值还是nil(就是没创建完),这时去访问该窗体本身肯定不行。
    可是如果我等附属窗体创建完后,再去触发处理操作,就是正常的。第一次不能全部做完所有处理,> 1 次就可以了。
    确实很苦恼。

#9


贴点代码出来啊!不然我怎么帮你?

#10


    是我提的问题。
    附属窗体名为form2,要访问form2的属性:form2.Hint:=…… ,form2.WindowState:=...
等,这些 操作将引发异常。

#11


我的可以啊!一点错误都没有!告诉我还有什么?放心,我不会偷你的代码的,这点
职业道德我还是有的!

#12


不可能是没创建完窗体的事,oncreate事件结束后,一个窗体就创建完了!

#13


这样吧!我的OICQ号是:33291349。有什么需要和我联系!

#14


呵呵,要用OnPaint,没想到吧

#15


是我提的问题。
大伙儿说的真是各有奇招,的确用OnPaint()中的过程就可以避免异常。但是这样一来,我改变一下子窗体的大小就会触发又一次的相同处理操作,而这是没有必要的。
我希望激活该子窗体后,自动处理完成,不管怎么动它应该不要再去重复处理。

#16


 在 Form2.OnShow 中处理 form2.Hint:=…… ,form2.WindowState:=... 这些事情是不产生异常的。
你的 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;

#18


是我提的问题。
Form2附属窗体是动态创建的,不知道为什么我的程序中在 OnShow()中Form2的值就是NIL(调试发现),而且此时Form2的窗体界面还没有显现(直到处理结束才出现)。

#19


把你的代码贴出来,这样太笼统了,我们实在不好回答。期待!!!

#20