Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
14-66985
uuuu
2002-02-07 23:33
2002.03.21
Приветствую! Люди! помогите! как удалить файл из под делфи? Например c: windows kernel.3gh


3-66766
AlValK
2002-02-21 10:04
2002.03.21
Где найти TDBGrid с вертикальным расположением записей?


1-66872
Леонид
2002-03-04 11:49
2002.03.21
Translation manager


1-66833
Baz
2002-03-04 05:12
2002.03.21
Странное поведение при пошаговом прогоне


1-66862
Kettle of delphi
2002-03-04 17:05
2002.03.21
Подскажите пожалуйста! Код TForm2.Create(nil) вовсе не помещает создаваемую форму на панель задач! (он ее помещает на РАБОЧИЙ СТОЛ)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский