Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Вниз

Как передать иконку? 


SlavaNew   (2002-01-14 12:50) [0]

Создал DLL в которой зашита форма.
Как сделать чтобы иконка у этой формы была такая же как и у программы, вызывающей эту DLL?



Yuri-7   (2002-01-14 13:52) [1]

1. Передай Application.Handle в DLL
2. При активизации формы задай:
Form1.Icon.Assign(Application.Icon);



SlavaNew   (2002-01-15 05:35) [2]

Пробовал так.
Выдается ошибка "Cannot assign a TIcon to a TIcon" ;о((
Что делать?
Может я что не так в DLL написал?



SlavaNew   (2002-01-15 12:17) [3]

Неужели не возможно?



Yuri-7   (2002-01-15 13:41) [4]

Попробуй так. Я пробывал - получается.

В DLL:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure showform(AH: THandle;AIcon:THandle);stdcall;
exports showform;
var
Form1: TForm1;

implementation
{$R *.DFM}
procedure showform(AH: THandle;AIcon: THandle);
begin
Application.Handle:=AH;
try
Form1:=TForm1.Create(Application);
Form1.Icon.Handle:= AIcon;
Form1.ShowModal;
finally
Form1.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;

end.

А в вызывающей программе:...
procedure showform(AH: THandle;AIcon: THandle); stdcall; external "project1.dll";

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
showform(Application.Handle,Application.Icon.handle);
end;



ValeraVV   (2002-01-15 17:17) [5]

Откомпилируй DLL и EXE с packages (хотя бы только с VCL50) и Assign будет работать.



SlavaNew   (2002-01-16 06:24) [6]

> Yuri-7
Я DLL загружаю динамически. И делаю точно так же как и ты написал, но...
При первом вызов функции из DLL иконка передается нормально, но если второй раз вызвать функцию, то иконкой становиться виндовый логотип.

Функция в DLL

function GetStrAll(AppHandle: THandle; Ic: THandle): PChar; stdcall;
begin
Application.Handle:=AppHandle;
DllForm := TDllForm.Create(Application);
DllForm.Icon.Handle:=Ic;
DllForm.ShowModal;
Result:=PChar(AllString);
DllForm.Free;
end;

Вызываю так:

GetStrAll: function(AppHandle: THandle; Ic: THandle): PChar; stdcall;

procedure TForm1.Button1Click(Sender: TObject);
Var HandleN: THandle;
GetStr: String;
begin
@GetStrAll:=Nil;
HandleN := LoadLibrary("Nabor.dll");
If HandleN >= 32 Then
Begin
@GetStrAll:=GetProcAddress(HandleN, "GetStrAll");
If @GetStrAll<>Nil Then
GetStr:=StrPas(GetStrAll(Application.Handle, Application.Icon.Handle));
End;
FreeLibrary(HandleN);
end;



Yuri-7   (2002-01-16 10:00) [7]

Попробуй статически описать функцию. У меня в примере - сколько раз не вызывай, все время передается нормально. Если все-таки не получиться, сообщи, я еще посмотрю.



SlavaNew   (2002-01-16 10:50) [8]

Статически тоже самое, даже еще хуже...
На DllForm := TDllForm.Create(Application); затыкается и все, Виндовз висит круто, только рзет спасает...




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.03 c
1-8896            solsoft               2002-01-16 11:45  2002.02.04  
Формат заголовок архиватора IMP


1-8924            SGS                   2002-01-17 18:20  2002.02.04  
Как получить версию ActiveX?


1-8863            twinc                 2002-01-15 16:31  2002.02.04  
ListView Report


1-8919            Alku                  2002-01-17 14:36  2002.02.04  
Как в программе получить Handle запускаемой из нее подпрограммы?


3-8799            otari                 2002-01-06 23:15  2002.02.04  
никто не знает INTERBASE?