Форум: "Основная";
Текущий архив: 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 вроде без ексцесов.......
Вообщем грабель.......
Неизвестно где еще что всплывет....
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c