Как отобразить фоновое изображение и центрировать панель в форме DLL?
Я хочу загрузить изображение, которое будет фоном развернутой формы, которая остается в DLL.
DLL вызывается из приложения Vcl Form, но возникают проблемы, когда невозможно загрузить фоновое изображение в форме, DLL всегда вылетает.
Спасибо вам за помощь.
================================================== =========================
исполнимый
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm2 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
end;
var
Form2: TForm2;
implementation {$R *.dfm}
procedure LoadDLL;
type
TShowformPtr = procedure; stdcall;
var
HDLL: THandle;
Recv: TShowformPtr;
begin
HDLL := LoadLibrary('lib.dll');
if HDLL <> 0 then
begin
@Recv := GetProcAddress(HDLL, 'Recv');
if @Recv <> nil then
Recv;
end;
//FreeLibrary(HDLL);
end;
procedure TForm2.btn1Click(Sender: TObject);
begin
LoadDLL;
end;
end.
Dll
Главный:
library Project2;
uses
SysUtils, Classes, Unit1, Unit2;
{$R *.res}
procedure Recv; stdcall;
begin
showform;
end;
exports
Recv;
begin
end.
Блок 1 (Форма):
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.
Модуль 2:
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.
1 ответ
У вашего вопроса много проблем, поэтому я постараюсь ответить на него как можно лучше, учитывая отсутствие деталей.
Вы используете формы, поэтому вы создаете приложение VCL. Вы должны позволить среде IDE назначить инфраструктуру VCL вашему проекту.
Эта строка ужасно неверна:
Form1 := TForm1.Create(Form1);
В редких случаях показывай из себя самого. Я бы сказал, что, скорее всего, именно поэтому ваше приложение падает. Смотрите это для деталей о формах в DLL.
Если вы не можете правильно отладить приложение, поставьте звуковой сигнал перед этой строкой и один после (сделайте задержку между ними).
Я думаю, что ваш вопрос следует скорее назвать "как отладить проект Delphi".
Что вам нужно сделать, это получить точную линию, на которой происходит сбой программы. Это даст вам представление о том, почему появляется ошибка / сбой (кстати, вы никогда не отображали точное сообщение об ошибке).
Проверьте HadShi (рекомендуется), EurekaLog (глючит) или Smartinspect (я никогда не пробовал. Цена похожа на две другие). Убедитесь, что вы работаете в режиме отладки, встроенный отладчик включен (см. Параметры IDE) и что отладочная информация присутствует в вашем EXE / DLL.
PS: вы все еще можете отлаживать свое приложение без одного из трех регистраторов, показанных выше. Просто настройте свой проект правильно для запуска в режиме отладки!
Для отладки библиотеки DLL см. Меню "Run->Parameters". Определите там хост- приложение, которое будет загружать вашу DLL. Если ошибкой является DLL, отладчик возьмет управление на себя и поместит курсор на строку кода, которая вызвала сбой.
Я не знаю, какую конечную цель / что вы хотите достичь. В связи с этим я должен предупредить вас, что вам, возможно, придется принять во внимание следующие вопросы:
Почему вы строите это как DLL? Разве приложение не может быть написано как один EXE-файл? Или два EXE-файла, которые общаются друг с другом?