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




Вниз

MDIChild в DLL 


MaxSit   (2002-03-04 20:32) [0]

Может кто подскажет как правильно поместить MDIChild в DLL.
Application и Screen передал, в инициализации переопределил, при выходе возвращаю назад, и вроде все нормально, но только дело касается CANVAS, как тут же начинают валиться какие-то ошибки, то FONT не может CREATE сделать, то перерисовка лезет не в свою память, короче бардак. Заметил, что все эти ошибки появляются, когда на форму кладу или RxSpliter или SpeedButton (это что сейчас точно выяснил).



MaxSit   (2002-03-04 21:42) [1]

Я, конечно понимаю, что это довольно ламеровский вопрос, который давно нужно поместить в FAQ, но мне очень нужно, горит проект.



MaxSit   (2002-03-04 22:13) [2]

Ну кто нибудь, ОБРАТИТЕ ВНИМАНИЕ!



Dzirt   (2002-03-05 01:12) [3]

Вопрос совсем не ламмерский, хотя с объективной точки зрения я не могу считать себя профессионалом, я задал подобный вопрос три дня назад - никто не ответил(естественно я искал везде и как ты в borland newsgroups?), я подумал и решил что буду делать обычные окна fsNormal, подумай.



Awex   (2002-03-05 09:48) [4]

Если хочешь поместить MDIChild в DLL то нужно ей передать и
TApplication и TScreen

Ну примерно так:

unit DllInterface;

interface

uses Controls,Forms;

type

TAppInterface = record
AppMain: TApplication;
AppScreen: TScreen;
end;

TUnitDLL = procedure(AppInterface: TAppInterface); stdcall;
TResetDLL = procedure; stdcall;
TProcedure = procedure(Control:TWinControl); stdcall;

procedure SetContext(AppInterface: TAppInterface);
function GetContext: TAppInterface;

implementation

procedure SetContext(AppInterface: TAppInterface);
begin
with AppInterface do
begin
Application := AppMain;
Screen := AppScreen;
end;
end;

function GetContext: TAppInterface;
begin
with Result do
begin
AppMain := Application;
AppScreen := Screen;
end;
end;

end.



library UserDLL;

uses
ShareMem,
SysUtils,
Windows,
Controls,
Classes,
Forms,
Dialogs,
DlllFormUnt in "DlllFormUnt.pas" {DLLForm},
DLLInterface;

var
DllInterface: TAppInterface;
DLLForm: TDLLForm = nil;

procedure InitDLL(AppInterface: TAppInterface); stdcall;
begin
DllInterface := GetContext; // Сохраняем констекст
SetContext(AppInterface); // Устанавливаем контекст приложения
end;

procedure ResetDLL; stdcall;
begin
DLLForm.Free;
SetContext(DllInterface); // Востанавливаем контекст
end;

procedure HelloWorld; stdcall;
begin
DLLForm := TDLLForm.Create(Application);
DLLForm.Show;
end;

exports
HelloWorld,
InitDLL,
ResetDLL;
begin
end.



MAIN
.......

var
DLLInstance: THandle;
HelloWorld: TProcedure;
UnitDLL: TUnitDLL;
ResetDLL: TResetDLL;


procedure TForm1.StartClick(Sender: TObject);
begin
DLLInstance := LoadLibrary("UserDLL.dll");
@UnitDLL := GetProcAddress(DLLInstance, "InitDLL");
@ResetDLL := GetProcAddress(DLLInstance, "ResetDLL");
UnitDLL(GetContext);

@HelloWorld := GetProcAddress(DLLInstance, "HelloWorld");
HelloWorld;
end;

procedure TForm1.StopClick(Sender: TObject);
begin
ResetDLL; // УБИВАЕМ ЯВНО !!!!
FreeLibrary(DLLInstance);
end;





Awex   (2002-03-05 10:02) [5]

Если неработает, пиши, есть рабочее приложение , вышлю.

Но помещение формы в DLL это еще и источник дополнительных грабель.

P/S
Насколько я помню на королевстве делфи есть статейка называется "Плагины в DLL", советую посмотреть.



MaxSit   (2002-03-05 13:18) [6]

Мой вариант очень похож (привожу ниже), и работает он нормально, но до тех пор, пока нет на форме, например, RxSpliter`a.
При изменении размеров ERROR: Cannot assigned TFont to TFont.
Это все проблемы из TCanvas.SetFont(Value: TFont); {Graphics}
Или если есть SpeedButton на дочерней форме, то он отрисовывается как-то по калечному. Выяснил, что все лечится, если не переопределять Application, если форма модальна и переустановить в DLL Application, то эти ошибки возникают все равно.

DLL:

unit UnitDLL;
interface
uses Forms, Windows, Controls, Messages;
var
OldApplication: TApplication;
OldScreen: TScreen;

procedure StartDICT(NewAppl: TApplication;NewScr: TScreen); StdCall; exports;
procedure OpenForm; StdCall; exports;

implementation

uses MyDLLForm;

procedure StartDICT(NewAppl: TApplication;NewScr: TScreen);
begin
Application:=NewAppl;
Screen:=NewScr;
end;

procedure CloseDICT;
begin
if KolForm=0 then PostMessage(Application.MainForm.Handle,WM_USER+1000,1,1);
{по этому событию в главном приложении идет FreeLibrary, вызываю по событию OnClose дочерней формы}
end;

procedure OpenForm;
begin
if Form1=nil then begin
Form1:=TForm1.Create(Application);
Form1.Show;
end else
Form1.WindowState:=wsMaximized;
end;

initialization
OldApplication:=Application;
OldScreen:=Screen;
finalization
Application:=OldApplication;
Screen:=OldScreen;

end.


MAIN:

procedure TfmMain.LoadDLL;
type TTip1 = procedure(NewAppl: TApplication;NewScr: TScreen); StdCall;
TTip2 = procedure; StdCall;
var MyLoadDict1: TTip1;
MyLoadDict2: TTip2;
hModule: HInst;
begin
hModule:=LoadLibrary(PChar("DLLName.DLL"));
if (hModule<>NULL)and(hModule<>0) then
@MyLoadDict1:=GetProcAddress(hModule,PChar("StartDICT"));
if Assigned(MyLoadDict1) then begin
MyLoadDict1(Application,Screen)
@MyLoadDict2:=GetProcAddress(hModule,PChar("OpenForm"));
if Assigned(MyLoadDict2) then MyLoadDict2;
end;
end;
end;



Awex   (2002-03-05 15:00) [7]

Да, со шрифтом тоже были заморочки, я так их и несмог бороть и установить в чем причина сего явления.. :((
Но путем проб и ошибок установил, что если в дочерней форме не менять шрифты, то есть оставить их по умолчанию то вроде все работает, на том и остановился.
На счет SpeedButton - можно заменить нечто другим - из TPanel сделать свой батон. Обработать CM_MOUSELEAVE и CM_MOUSEENTER, и сделать свою процедуру(!) прорисовки картинки.....



MaxSit   (2002-03-05 16:28) [8]

Да, но обнаружелось, что если форма модальна, то тот-же эффект, и, кроме того, если я не переопределяю Font, то все равно выскакивает ошибка. Мне кажется, что надо копать в SCREEN`е, но что именно копать, пока не понимаю.



MaxSit   (2002-03-05 17:54) [9]

Поменял RxSplittеr на обычный Splittеr, RxSpeedButton - > SpeedButton, все заработало, но может подскажешь, какие еще компоненты давали сбой, для дальнейшего недопущения ошибок.
Заранее спасибо.

За идею персоонально СПАСИБО Alex`у(Awex).



Awex   (2002-03-05 18:08) [10]

Так же в DLL передаю контекст TFIBDataBase, вроде работает.

Но возникла проблема с DevExpress, а точнее с ExpressBars.
Если в чилдере есть панели TdxBarDockControl а из главной формы
передаю контекст TdxBarManager главной формы, по при попытке перетащить на dxBarDockControl в чилдере пенель из главной формы возникает исключение (типа неверного приведение типов).
А сам QuantumGrid работает на чилдер форме в DLL вроде без ексцесов.......

Вообщем грабель.......
Неизвестно где еще что всплывет....




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




Наверх





Память: 0.75 MB
Время: 0.034 c
3-66804           AAAPLE                2002-02-22 14:17  2002.03.21  
Записи в BD


1-66847           maks                  2002-03-05 11:27  2002.03.21  
gxexplorer


1-66933           Light Elf             2002-03-06 09:29  2002.03.21  
regex


3-66762           Draculenok            2002-02-22 07:30  2002.03.21  
Подскажите где можно скачать Qreport Professional


1-66809           cad                   2002-03-04 08:47  2002.03.21  
Нажать на кнопку дрогого приложения