吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 815|回复: 6
收起左侧

[求助] 关于Delphi窗体的创建事件的过程?

[复制链接]
冥界3大法王 发表于 2023-9-12 08:50
本帖最后由 冥界3大法王 于 2023-9-12 08:59 编辑

我在 Form1.FormCreate中
执行替换字符串的函数:
牛逼路径 := StringReplace(GetDllPath, 'x32\plugins\MoreTool.dp32', 'NiuBi', [rfReplaceAll]); 这里得到的结果是正确的


再在其他的地方按钮调用 牛逼路径 ,得到的却是没有替换之前的。。而有时又是成功的,百思不解啊。

所以,我现在很纳闷一个窗体事件的执行过程?
先有谁(事件的过程),再有谁(事件的过程)。。。?
Form1.FormCreate这个不就是执行一次嘛?
为啥后面的内容有时正确有时又不正确呢?



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 冥界3大法王 发表于 2023-9-12 09:16
做了个试验:
这个明白了,我要的问题咋出的问题呢?

unit Unit7;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm7 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormAfterMonitorDpiChanged(Sender: TObject; OldDPI, NewDPI: Integer);
    function FormAlignInsertBefore(Sender: TWinControl; C1, C2: TControl): Boolean;
    procedure FormAlignPosition(Sender: TWinControl; Control: TControl; var NewLeft, NewTop, NewWidth, NewHeight: Integer; var AlignRect: TRect; AlignInfo: TAlignInfo);
    procedure FormBeforeMonitorDpiChanged(Sender: TObject; OldDPI, NewDPI: Integer);
    procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
    procedure FormClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.FormActivate(Sender: TObject);
begin
  showmessage('three');
end;

procedure TForm7.FormAfterMonitorDpiChanged(Sender: TObject; OldDPI, NewDPI: Integer);
begin
  showmessage('4');
end;

function TForm7.FormAlignInsertBefore(Sender: TWinControl; C1, C2: TControl): Boolean;
begin
  showmessage('5');
end;

procedure TForm7.FormAlignPosition(Sender: TWinControl; Control: TControl; var NewLeft, NewTop, NewWidth, NewHeight: Integer; var AlignRect: TRect; AlignInfo: TAlignInfo);
begin
  showmessage('6');
end;

procedure TForm7.FormBeforeMonitorDpiChanged(Sender: TObject; OldDPI, NewDPI: Integer);
begin
  showmessage('7');
end;

procedure TForm7.FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
begin
  showmessage('one');
end;

procedure TForm7.FormClick(Sender: TObject);
begin
  showmessage('9');
end;

procedure TForm7.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  showmessage('关闭时2');
end;

procedure TForm7.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  showmessage('关闭时1');
end;

procedure TForm7.FormCreate(Sender: TObject);
begin
  showmessage('two');
end;

procedure TForm7.FormDestroy(Sender: TObject);
begin
  showmessage('关闭时3');
end;

end.
头像被屏蔽
yulinsoft 发表于 2023-9-12 10:35
董督秀 发表于 2023-9-12 11:33
分别在对应事件用OutputDebugString函数调试输出看看......
 楼主| 冥界3大法王 发表于 2023-9-12 12:10
yulinsoft 发表于 2023-9-12 10:35
关键在于你这个GetDllPath获取没获取到路径,这才进关键。出错很可能就是获取失败。

@yulinsoft  
在.dpr里调用了一次
其他的Form里又重写了几次

function GetDllPath: string;
var
  ModuleName: string;
begin
  SetLength(ModuleName, 255);    //取得Dll自身路径(这里取得是插件所在完整路径)
  GetModuleFileName(HInstance, PChar(ModuleName), Length(ModuleName));
  Result := PChar(ModuleName);
end;
小雨网络 发表于 2023-9-12 12:17
这个是AI给我的回答

在 Delphi 中,窗体的生命周期事件通常遵循以下顺序:
  • [color=var(--tw-prose-bold)]FormCreate 事件:在窗体创建时触发,通常用于初始化窗体上的控件和变量等操作。这个事件只会在窗体第一次创建时执行一次。
  • [color=var(--tw-prose-bold)]FormShow 事件:在窗体显示时触发,通常用于在窗体第一次显示时执行的操作。这个事件在窗体每次显示时都会触发。
  • [color=var(--tw-prose-bold)]FormActivate 事件:在窗体激活时触发,例如切换到该窗体时触发。这个事件在窗体每次激活时都会触发。
  • [color=var(--tw-prose-bold)]FormCloseQuery 事件:在窗体关闭前触发,通常用于询问用户是否允许关闭窗体。可以通过设置 CanClose 参数来控制窗体是否可以关闭。
  • [color=var(--tw-prose-bold)]FormClose 事件:在窗体关闭后触发,通常用于一些清理操作。这个事件在窗体关闭时触发。
根据你的描述,FormCreate 事件应该在窗体创建时执行一次,而且你在其中进行了字符串替换操作。问题可能出现在字符串替换的函数 GetDllPath 中,或者在其他地方对牛逼路径进行了重新赋值。有时正确有时不正确的问题可能取决于以下几个因素:
  • [color=var(--tw-prose-bold)]GetDllPath 函数的实现:请确保 GetDllPath 函数的实现没有副作用,并且在不同调用之间没有状态共享。
  • [color=var(--tw-prose-bold)]其他地方的操作:检查其他地方是否对牛逼路径进行了修改或重新赋值,这可能导致不一致的行为。
  • [color=var(--tw-prose-bold)]多线程操作:如果在多个线程中同时操作牛逼路径,可能会导致竞争条件和不一致的结果。
  • [color=var(--tw-prose-bold)]异常情况:考虑是否有异常情况可能导致牛逼路径的修改。
为了更好地理解问题,你可以在 FormCreate 和其他地方的按钮点击事件中添加调试输出,以跟踪牛逼路径的值和执行顺序,从而帮助诊断问题。
根据你提供的代码,你在窗体的不同事件中添加了 showmessage 弹出消息框以显示事件触发的情况。这是一个很好的方法来跟踪事件的触发顺序以及在哪些情况下触发。从你的代码中可以看出,你在 FormCreate、FormActivate、FormCloseQuery、FormClose 等事件中都添加了 showmessage 弹出消息框。每个事件都会在不同的情况下触发,例如:
  • FormCreate:窗体创建时触发。
  • FormActivate:窗体激活时触发。
  • FormCloseQuery:窗体关闭前触发。
  • FormClose:窗体关闭后触发。
通过这些消息框,你可以追踪事件的触发顺序以及在每个事件中的代码执行情况。这有助于你理解事件的生命周期和执行过程。如果你遇到了特定的问题,可以根据这些事件的触发情况来分析问题所在。如果你有进一步的问题或需要更多帮助,请提供具体的问题描述,我将尽力提供支持。
根据你的描述,你在 .dpr 文件和其他窗体中多次调用了 GetDllPath 函数,而且在不同的窗体事件中都可能使用了这个函数返回的路径。这可能会导致在不同事件中对相同路径进行不同操作,从而导致问题。在 Delphi 中,全局变量和函数可以在整个应用程序中访问,因此在不同的窗体或单元中调用相同的函数是正常的。但是,要确保在调用函数时获取的路径在不同地方一致,可以采取以下步骤:
  • [color=var(--tw-prose-bold)]确保函数返回的路径是正确的:在每个窗体中调用 GetDllPath 之前,确保该函数返回的路径是正确的。你可以在每次调用前添加调试输出或日志记录来验证路径是否正确。
  • [color=var(--tw-prose-bold)]避免在不同事件中修改路径:如果你在不同的事件中使用了 GetDllPath 返回的路径,确保不会在其中的任何事件中修改它。如果需要不同的路径,可以将其保存在不同的变量中。
  • [color=var(--tw-prose-bold)]尽量在需要时获取路径:只有在需要路径时才调用 GetDllPath 函数,避免在不同事件中多次调用,以减少潜在的混淆。
  • [color=var(--tw-prose-bold)]使用局部变量保存路径:如果只需要在特定事件中使用路径,可以将路径保存在局部变量中,而不是全局变量,以确保每个事件中使用的路径是独立的。
总之,确保在不同事件中使用的路径是一致的,并且避免在不同事件中修改它,可以帮助减少潜在的问题和混淆。如果你遇到特定的问题或需要更多帮助,请提供详细的问题描述,我将尽力提供支持。
头像被屏蔽
yulinsoft 发表于 2023-9-13 10:15
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表