Delphi 如何在dll窗体中显示背景图像并将面板居中?

Delphi 如何在dll窗体中显示背景图像并将面板居中?,delphi,dll,vcl,delphi-10-seattle,Delphi,Dll,Vcl,Delphi 10 Seattle,我想加载一个图像,这将是一个最大化的形式,留在dll的背景 dll是从Vcl表单应用程序调用的,但在无法在表单上加载背景图像的情况下遇到问题,dll总是崩溃 谢谢你的帮助 =========================================================================== 可执行文件 第一单元(表格): 第二单元: unit Unit2; interface Uses windows, Unit1, SysUtils; pr

我想加载一个图像,这将是一个最大化的形式,留在dll的背景

dll是从Vcl表单应用程序调用的,但在无法在表单上加载背景图像的情况下遇到问题,dll总是崩溃

谢谢你的帮助

===========================================================================

可执行文件

第一单元(表格):

第二单元:

unit Unit2;

interface

Uses
  windows,
  Unit1,
  SysUtils;

  procedure showform;

implementation

procedure showform;
begin
  Form1 := TForm1.Create(Form1);
  sleep(100);
  Form1.Show;
  Form1.Pnl1.Visible := True;
end;

end.

你的问题有很多问题,考虑到缺乏细节,我会尽力回答

  • 您正在使用表单,因此正在构建VCL应用程序。您需要让IDE将VCL框架分配给您的项目

  • 这句话大错特错:

    Form1 := TForm1.Create(Form1);  
    
    在这场演出中,我们从自己做起。我要说的是,很可能是这就是应用程序崩溃的原因。有关DLL中窗体的详细信息,请参阅

    如果无法正确调试应用程序,请在该行之前和之后各发出一声蜂鸣音(在它们之间进行延迟)

  • 我认为你的问题应该叫做“如何调试Delphi项目”

    您需要做的是获得程序崩溃的确切线路。这将让您了解出现错误/崩溃的原因(顺便说一句,您从未显示确切的错误消息)

    去检查(推荐)或EurekaLog(四轮马车)或(我从未尝试过。价格与其他两款相似)。确保您正在调试模式下运行,集成调试器处于打开状态(请参见IDE选项),并且EXE/DLL中的

    PS:你仍然可以调试你的应用程序,而不需要上面显示的三个记录器中的一个。只需将项目正确配置为在调试模式下运行

    要调试DLL,请参阅“运行->参数”菜单。在那里定义一个将加载DLL的主机应用程序。如果错误是DLL,调试器将控制并将光标放在生成崩溃的代码行

  • 我不知道你的最终目的是什么。因此,我必须警告您,您可能需要考虑以下问题:

    • ?

    • 为什么要将其构建为DLL?不能将应用程序编写为单个EXE吗?还是两个互相交流的前男友?


  • 你说它崩溃了,怎么了?您是否已调试到DLL中以查找错误发生的位置?我没有看到任何正在设置的图像,是否在设计时将图像设置为面板背景?@mirtile,
    是否在设计时将图像设置为面板背景
    背景图像不必在面板中,并且在dll的Form1上为“是”。Yes是在运行时这里定义的:
    img1.Picture.LoadFromFile(IncludeTrailingBackslash(GetCurrentDir)+'background.bmp')
    @Davison我刚刚构建了您在问题中提供的代码-它不会崩溃。这里没有人会下载项目并为您调试,所以请立即忘记这个想法。你的工作就是提出问题,提供完整的代码来重现你所遇到的问题。以您给我们的代码为例,从头开始,尝试重现问题。当你可以问一个完整的问题时,回来把你的问题和细节联系起来。奇怪的是,你不想调试自己的程序。如果您不允许自己选择调试,则很难取得任何进展。请阅读“主机应用程序”。表单可以拥有自己的功能-这是一个非常糟糕的想法,可能是问题的原因,但在这种情况下不是这样。OP的代码编译并运行良好。第三点和第四点都应该是评论——如果这是OP的问题,那就离题了。第三方的建议是离题的。要求澄清的问题属于评论。这真的不是一个答案。这是我们对提供的信息所能做的最好的:)至少,OP现在可以调试代码并查看它在哪里崩溃。可能他是在“发布”模式下运行的,或者如果他是在“调试”模式下,则项目配置不正确。一旦我们有了这些信息,我们将能够帮助他。如果你听了其他的评论,OP对调试不太感兴趣…@ja
    TForm
    无法拥有它自己。在语句
    TForm1.Create(Form1)
    中,
    Form1
    要么为
    nil
    ,要么指向
    TForm1
    的早期实例。
    unit Unit1;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;
    
    type
      TForm1 = class(TForm)
        img1: TImage;
        pnl1: TPanel;
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
        procedure CreateParams(var Params: TCreateParams); override;
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
       Params.WndParent:= Application.Handle;
      Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST or WS_EX_TRANSPARENT;
      Params.ExStyle := WS_EX_TRANSPARENT or WS_EX_TOPMOST;
    end;
    
    procedure TForm1.FormShow(Sender: TObject);
    begin
      brush.Style := bsclear;
      img1.Picture.LoadFromFile(IncludeTrailingBackslash(GetCurrentDir) + 'background.bmp');
      SetWindowPos(Form1.handle, HWND_TOPMOST, Form1.Left, Form1.Top, Form1.Width,
        Form1.Height, 0);
    
      ShowWindow(Application.handle, SW_HIDE);
    
      pnl1.Top := (self.Height div 2) - (pnl1.Height div 2);
      pnl1.Left := (self.Width div 2) - (pnl1.Width div 2);
    end;
    
    end.
    
    unit Unit2;
    
    interface
    
    Uses
      windows,
      Unit1,
      SysUtils;
    
      procedure showform;
    
    implementation
    
    procedure showform;
    begin
      Form1 := TForm1.Create(Form1);
      sleep(100);
      Form1.Show;
      Form1.Pnl1.Visible := True;
    end;
    
    end.
    
    Form1 := TForm1.Create(Form1);