Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизПоказ форм Найти похожие ветки
← →
TForm (2006-07-13 16:56) [0]Чем отличается форма модальная от не модальной
Всмысле при вызове формы из DLL модальная ведет себя нормально а не модальная как то не так.
Синхронизацию делаю так - Apllication.handle для dll присваиваю handle проги
Как показать форму НЕ МОДАЛЬНО из DLL что-бы она вела себя как модальная но была не модальной.
← →
StriderMan © (2006-07-13 17:05) [1]
> Чем отличается форма модальная от не модальной
в чем по-Вашему разница?
← →
blackcrazzy © (2006-07-13 17:06) [2]
> а не модальная как то не так.
А по конкретнее.
← →
Desdechado © (2006-07-13 17:37) [3]Модальность формы означает недоступность других (ранее вызванных) элементов программы, пока не закроешь эту модальную форму.
Немодальная форма позволяет все это.
Так как должна себя вести форма, а то в
> что-бы она вела себя как модальная но была не модальной
противоречие.
← →
TForm (2006-07-13 20:32) [4]Форма находится в dll. Т.е есть несколко форм. Каждая в своей dll. Есть загрузчик. И exe и dll мои. При загрузке dll вызывается процедура создания формы вот код DLL:
library PrDll;
uses
SysUtils, Windows, Forms,
Unit1 in "Unit1.pas" {Form1};
{$R *.res}
function CreateTheForm(const HND: THandle; const TL: TPoint): THandle; stdcall;
begin
if Form1<>nil then begin Result:=Form1.Handle; Exit; end;
Application.Handle:=HND;
try
Form1:=TForm1.Create(nil);
Result:=Form1.Handle;
Form1.Left:=TL.X; Form1.Top:=TL.Y;
Form1.Show;
except Result:=0; end;
end;
procedure FreeForm; stdcall;
begin
if Form1<>nil then FreeAndNil(Form1);
end;
exports
CreateTheForm, FreeForm;
begin
end.
Вот если ее показывать Show то некоторые компаненты ведут себя неправильно например SpeedButton при Flat:=True; не подсвечиваються
А если ShowModal то таких "эффектов" нет.
← →
TForm (2006-07-13 20:35) [5]Show нужно что бы к ехе форме остался доступ....
← →
TForm (2006-07-13 20:44) [6]В какой-то книге давно читал что лучше для таких целей использовать пакеты Delphi. Но как их использовать не знаю и книги нет.
Вообщем форма в Dll это типа плагина но не совсем плагин. тоесть если нет не одной dll то ехешник бесполезный в нем только загрузка этих dll и управление. В один момент времени может быть загружена одна Dll.
Т.е нужно сделать ехе и одну Dll как единое целое. При необходимости выгрузить Dll и загрузить следующую.
← →
TForm (2006-07-13 20:46) [7]Объяснил как смог. Вроде понятно. Если что непонятно спрашивайте а посылать на ... прошу ненадо. :)
← →
Loginov Dmitry © (2006-07-13 22:43) [8]> В какой-то книге давно читал что лучше для таких целей использовать
> пакеты Delphi. Но как их использовать не знаю и книги нет
Просто скомпилируй ехе-шку и все библиотеки с пакетами. Куча проблем отпадет с один миг. Все глобальные объекты, хранимые в пакетах (соответственно в стандартных библиотеках) будут общими. Классы - тоже.
← →
GrayFace © (2006-07-14 00:04) [9]Про пакеты: http://delphi.olympus.ru/dk/mastering/plugins.htm
Вот еще способ: http://delphimaster.net/view/1-1152783516/
TForm (13.07.06 20:44) [6]
В один момент времени может быть загружена одна Dll.
Т.е нужно сделать ехе и одну Dll как единое целое.
Тогда все гораздо проще - не надо всего вышеописанного. (если dll"к много, то Build with Runtime Packages все-равно будет полезен)
Попростому:library dll;
procedure Show; export;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
← →
TForm (2006-07-14 04:09) [10]Спасибо за помощь.
Два часа парился с этой бодягой нифига толком не получалось.
После уже более внимательно занелся кодом приведенным GrayFace © (14.07.06 00:04) [9] http://delphimaster.net/view/1-1152783516/
Получилось вроде бы то че надо, а до этого пока парился таких приколов нахватал пока пытался сдружить dll c exe. Вот че получилось (нимного подрихтовал для себя)
Код DLL:
library FormaDLL;
uses
Windows, SysUtils, Classes, Unit1, Forms, Unit2,
UFrDLL in "UFrDLL.pas" {UFrDLL};
procedure SynchronizeApp(const H: THandle);
begin
if Application.Handle=H then Exit;
Application.Initialize;
Application.Handle:=H;
end;
function CreateFormDLL(const APP: TApplication; const TL: TPoint): THandle; stdcall;
begin
SynchronizeApp(APP.Handle);
if FrDLL<>nil then begin Result:=FrDLL.Handle; Exit; end;
try
Application.CreateForm(TFrDLL, FrDLL);
Result:=FrDLL.Handle;
FrDLL.Left:=TL.X; FrDLL.Top:=TL.Y;
FrDLL.Show;
FrDLL.Caption:=IntToStr(FrDLL.Handle);
except Result:=0; end;
end;
procedure FreeFormDLL; stdcall;
begin
if FrDLL<>nil then FreeAndNil(FrDLL);
end;
exports
CreateFormDLL, FreeFormDLL;
begin
end.
Unit1 и Unit2 в uses - это RSDllForm1 и RSDllForm из кода по ссылке.
GrayFace Спасибо тебе большое.
Кстати это я пока тестирую, статически гружу Dll, потом буду хотеть динамически
Разницы не будет или новая жопа начнется? :)
← →
GrayFace © (2006-07-14 10:26) [11]> function CreateFormDLL(const APP: TApplication; const TL: TPoint): THandle; stdcall;
А что потом делается с этим хендлом? (кстати, для окон принято использовать hwnd)
> Разницы не будет или новая жопа начнется? :)
Не будет. Но учти, что это все небезопано - возможны всякие неожиданные баги.
А в чем проблема с [9]?
← →
TForm (2006-07-14 13:44) [12]Вот перед тем как получилось готовил пост.... который должен быть вместо
> TForm (14.07.06 04:09) [10]
Это только ответ на
> GrayFace © (14.07.06 10:26) [11]
</I
> А в чем проблема с [9]?
>
То что предложил GrayFace © (14.07.06 00:04) [9] работает почти нормально но…
Опять бяка. Ниже код DLL и код EXE при таком раскладе работает наполовину ОК
Если нажать два раза кнопку из ехе ButtonCreate то впринципе усе нормально, единственное приходится два раза на крестик жать чебы закрыть прогу, причем хоть окно dll, хоть ехе закрывать, одна бодяга – после второго клика по кресту закрывается прога, я думаю что ето все из-за RUNa, вот заменить бы его как нибудь чем нибудь….
Если вызвать FreeFormDLL то форма из Dll нормально закрывается. Потом опять два раза на кнопку ButtonCreate… и опять ОК.
И вот еще если у формы Dll нажать один раз крестик(закрыть) то она не закрывается, но у нее пропадает нормальное отображение SpeedButton’ов (из TForm (13.07.06 20:32) [4]) причем навсегда даже если вызвать FreeFormDLL а потом заново создать (все – создается инвалидом уже:))
library FormaDLL;
uses
Windows, Forms, SysUtils, Classes,
UFrDLL in "UFrDLL.pas" {UFrDLL}; //просто новая форма содержит пару СпидБатонов плоских для контроля
function CreateFormDLL(const HND: THandle; const TL: TPoint): THandle; stdcall;
begin
if Application.Handle<> HND then Application.Handle:= HND;
if FrDLL<>nil then begin Result:=FrDLL.Handle; Exit; end;
try
Application.Initialize;
Application.CreateForm(TFrDLL, FrDLL);
Result:=FrDLL.Handle;
FrDLL.Left:=TL.X; FrDLL.Top:=TL.Y;
FrDLL.Caption:=IntToStr(FrDLL.Handle);
Application.RUN; //вот это бы чем нибудь заменить – несоображу никак, после этого в ехе не возвращается Result. Только после второго вызова когда ексит срабатывает
except Result:=0; end;
end;
procedure FreeFormDLL; stdcall;
begin
if FrDLL<>nil then FreeAndNil(FrDLL);
end;
exports
CreateFormDLL, FreeFormDLL;
begin
end.
Код ЕХЕ:
unit UEXE;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFrEXE = class(TForm)
ButtonCreate: TButton;
ButtonFree: TButton;
procedure ButtonCreateClick(Sender: TObject);
procedure ButtonFreeClick(Sender: TObject);
private
procedure FMv(var Ms: TMessage); message WM_MOVE;
{ Private declarations }
public
{ Public declarations }
end;
var
FrEXE: TFrEXE;
HNDDLLFR: THandle;
const DllNm=" FormaDLL.dll";
function CreateFormDLL(const HND: THandle; const TL: TPoint): THandle;
stdcall; external DllNm;
procedure FreeFormDLL; stdcall; external DllNm;
implementation
{$R *.dfm}
procedure TFrEXE.FMv(var Ms: TMessage);
begin
SetWindowPos(HNDDLLFR, HWND_TOPMOST, Left, Top+Height, Width, 300, SWP_NOACTIVATE); //здесь форма из Dll должна ездить за формой из ехе.
end;
procedure TFrEXE.Button1Click(Sender: TObject);
var TL: TPoint;
begin
TL.X:=Left; TL.Y:=Top+Height;
HNDDLLFR:=CreateFormDLL(Application.Handle, TL);
//Здесь пауза, только если еще раз нажать то ОК
Caption:=IntToStr(HNDDLLFR);
end;
procedure TFrEXE.Button2Click(Sender: TObject);
begin
FreeFormDLL;
end;
end.
Вот такая байда. В трабле вся фишка наверное в тех двух модулях где хинстанс подменяется, здесь я без них парился....
Спасибо еще раз.
ЗЫ. Приведенный здесь код работает с глюками. "Нормально работающий" см. выше.
← →
GrayFace © (2006-07-14 22:05) [13]А, я не совсем понял. Подумал что exe вообще форм не имеет. :)
Однако, очень советую все же попробовать с пакетами. По идее, ничего сложного не должно быть, зато не будет глюков и при достаточном кол-ве dll"ек (по-моему около 5) уже выйдет выигрышь по размеру.
← →
TForm (2006-07-14 23:20) [14]
> GrayFace © (14.07.06 22:05) [13]
С пакетами надо...надо, ну потом буду учиться. А пока так как есть хотца.
Ну вот ведь победили одну бяку... нивозможного не бывает...
>ALL
И вот другая бяка... (я понимаю что щас начнется опять про пакеты, help, F1, MSDN... и иже сними (морду бить тоже ни надо никому:)), просьба в сторону не уходить).
Блин, ошибки достали уже, точнее, наверное, моя тупость, незнание, криворукость ну и все такое. Вот сдружил exe и dll. Все вроде ничего, но почему-то все время после четвертого создания формы, при ее удалении (четвертый раз) вылетает ошибка и в коде подсвечивается эта строка
procedure TRxTimerList.RemoveItem(Item: TRxTimerEvent);
begin
FEvents.Remove(Item);
-> Item.FParentList := nil; //вот она гадина
end;
из модуля TimerLst из RxLib’a. Не верю что у них ошибка (вроде-бы нормальная библ.), а у меня, любимого, где-то косяк. (поясняю, после запуска ехе сразу вызываем из ехе метод (1) CreateTheForm (форма создалась усе ОК) следом (1) FreeForm (убилась ОК) потом опять (2) CreateTheForm опять (2) FreeForm …. опять (4) CreateTheForm (форма создалась усе ОК) и следом (4) FreeForm (ОШИБКА и строка из модуля TimerLst подсвечена) ни при создании, ни при закрытии формы нет обращения к RxTimerList).
Вопрос: ПОЧЕМУ строго после четвертого раза и почему не в моем модуле
Объясните пожалуйста, мне тупому, откуда такие закономерности могут быть?
Есть создание моих объектов при создании формы и их уничтожение при закрытии.
В момент работы они не уничтожаются (если бы не так (т.е. обращение к удаленному объекту) то вылетала бы все время, а это ровно через четыре раза) Это всего два объекта TBitMap, два-создал, два-убил.
Да, и пока все также статически подгружаю dll, пока на динамич. вызов не переделывал.
И еще эту же форму пробовал делать отдельно екзешником, т.е. саму по себе код тот же что и в Dll – создавалась и убивалась туеву хучу раз – нормально без ошибок.
Вопрос выделен. Надеюсь, что найдем эту закономерность. Спасибо.
← →
Loginov Dmitry © (2006-07-15 00:17) [15]> Кстати это я пока тестирую, статически гружу Dll, потом
> буду хотеть динамически
> Разницы не будет или новая жопа начнется? :)
Наоборот, некоторые вероятные баги попросту исчезнут. Например злая бага, связанная с линкованием библиотек статически при использовании XPMan и при установленном XP-шном стиле (если в DLL на форме находятся определенные компоненты, например TGroupBox) (кстати, я эту багу обнаружил несколько месяцев назад и искал пути ее обхода на этом же форуме).
← →
TForm (2006-07-15 02:33) [16]
> Loginov Dmitry © (15.07.06 00:17) [15]
Спасибо. Это радует немного... Я не использую ни манифест и ТГроупБоксов нет...
>ALL
Сделал кое-какие изменения в OnDestroy формы из Dll, кол-во нормальных создаваний увеличилось ровно в 2 раза теперь на восьмом FreeForm вылетает ошибка и строка теперь подсвечивается вот эта (из того же TimerLst):
procedure TRxTimerList.Clear;
var
I: Integer;
Item: TRxTimerEvent;
begin
for I := FEvents.Count - 1 downto 0 do begin
Item := TRxTimerEvent(FEvents[I]);
RemoveItem(Item);
-> if not (csDestroying in Item.ComponentState) then Item.Free; //Вот эта строчка
end;
end;
Блин, чем же я так обижаю TRxTimerList? :(((
Все что с ним связано – сделано на этапе проектирования в InspectorObject’e по ходу кода меняю его только Active и усе.
Какие изменения сделал? Да… сильно то не каких… позаключал удаление моих двух дитятей (экземпляров TBitMap) в try except. Ну и вот еще (думаю это не принципиально)
Image1: Timage; // это в протектед поле формы, Имидж на форме
IMG: Timage; //глобальная переменная
IMG:=Image1; //в коде OnCreate формы, ну надо так, чеб без преобразований указателя в Имидж (это далее в коде)
В Деструкторе формы добавил еще и IMG:=nil; но мне кажется что IMG это просто указатель и если рухнет Image1 то IMG автоматом в nil уйдет. Да и ошибка не екскепшенах вылетает. Ну и все, больше ничего такого не менял. Почему «производительность» выросла в два раза?
← →
TForm (2006-07-15 02:36) [17]Извеняюсь, забыл код выделить. Sorry.
← →
GrayFace © (2006-07-15 18:17) [18]Попробуй FrDLL.Release; В FrDLL.OnDestroy: FrDLL:=nil;
← →
GrayFace © (2006-07-15 18:19) [19]А лучше Fr.Close
В OnClose: Actiion:=caFree; FrDLL:=nil;
← →
TForm (2006-07-16 03:20) [20]
> GrayFace © (15.07.06 18:19) [19]
> GrayFace © (15.07.06 18:19) [19]
> А лучше Fr.Close В OnClose: Actiion:=caFree; FrDLL:=nil;
Спасибо. Сейчас пару дней не смогу пробовать, после попробую
FrDLL.Release; При моем коде, при вызове FreeFormDll, помоему, событие OnClose в форме Dll не проходит т.е. ставил ShowMessage("Close") в OnClose и ShowMessage("Destroy") в OnDestroy на destroy показывается на Close нет, а если програмно вызвать Close формы Dll (FrDLL.Close) то она закрывается но потом после вызова CreateFormDll создается уже неправильная ну SpeedButtonы опять глючат и все такое...
И с Actiion:=caFree; пробовал. А у меняif FrDLL<>nil then FreeAndNil(FrDLL);
разве не установит форму в nil? Может на FrDLL.OnDestroy: FrDLL:=nil; еще поставить? т.е. при вызове FreeFormDll сработает if FrDLL<>nil then FreeAndNil(FrDLL); здесь вызовется OnDestroy там ставлю ее в nil после OnDestroy во FreeAndNil она опять ставится в nil, ничего страшного не будет два раза в nil?
И может это влиять на количество (строго одинаковое) нормальных созданий формы из Dll? Спасибо.
← →
TForm (2006-07-17 01:13) [21]
> GrayFace © (15.07.06 18:17) [18]
> Попробуй FrDLL.Release; В FrDLL.OnDestroy: FrDLL:=nil;
Сделал такif FrDLL<>nil then begin
FrDLL.Release;
FrDLL:=nil;
end;
тажа история после восьмого удаления - Access violation at address 004CF006 in module "FormaDLL.dll". Read of address 00B6FFD8
толь теперь вроде бы не выкидывает в модуль TimerLst.
Спасибо тебе за старание помочь.
>ALL
> TForm (14.07.06 23:20) [14]
> TForm (15.07.06 02:33) [16]
Вопрос в силе.
Почему когда напишешь мало, т.е. мало инфы про проблему - неотвечают или пишут инфы мало опишите подробней. А я тут старался расписывал усе как было и есть у меня ... и тоже тишина....
Конечно сечас начнеться, ну типа вываливай исходник, смотреть надо...
Да, вопрос то простой - наверника у знающих есть предположения/догадки отчего да почему. Ну это я про ошибку которая вылетает строго на одном и том же месте и строго после определенного количества раз создания/удаления формы. Ну вот и хочется "услышать" эти предположения/догадки и пробовать самому искать ошибку в своем коде... не выкладывая исходник, и дело не втом что жалко или еще чего... оригинально там все равно ничего нет...Спасибо.
← →
GrayFace © (2006-07-17 11:32) [22]TForm (16.07.06 3:20) [20]
А у меня if FrDLL<>nil then FreeAndNil(FrDLL);
разве не установит форму в nil?
Устанавливает. Только тут проверка на FrDLL<>nil не нужна - и так делается.
Инфы действительно мало. На мой вопрос в [11] ты не ответил. Application.CreateForm(TFrDLL, FrDLL) - по замыслу при закрытии формы из dll должно закрываться все?
← →
TForm (2006-07-17 21:47) [23]
> GrayFace © (14.07.06 10:26) [11]
> А что потом делается с этим хендлом? (кстати, для окон принято
> использовать hwnd)
->Поставлю HWND.
Потом используется для обратной связи формы из exe с формой из dll
Типа вот этого:
procedure TFrEXE.FMv(var Ms: TMessage);
begin
SetWindowPos(HNDDLLFR, HWND_TOPMOST, Left, Top+Height, Width, 300, SWP_NOACTIVATE); //здесь форма из Dll должна ездить за формой из ехе.
end;
Это работает.
> Application.CreateForm(TFrDLL, FrDLL) - по замыслу при
> закрытии формы из dll должно закрываться все?
По замыслу при вызове FreeFormDll должна закрыться форма из DLL и выгрузиться эта библиотека (DLL), потом - CreateFormDLL(Application.Handle, TL); для другой dll и опять из нее (DLL) должна создасться новая(другая) форма. Действия со стороны exe одинаковые для всех форм из dll.
Повторяюсь, в один момент времени должна быть загружена 1 Dll и создано 1 окно из этой DLL. т.е. поработали с этим окном закрыли, выгрузили и загрузили новую DLL и из нее создали новое окно. Окно из exe всегда присутствует и оно как бы первая(верхняя) половина окна, вместе с формой из Dll получается одно "целое" окно, формы в DLL не имеют заголовка (стиль bsNone) и только при закрытии окна из exe - закрывается все.
GrayFace огромное тебе спасибо за старание мне помочь.
А вот насчет ошибки нет никаких догадок, предположений?
Вопрос остается. :(
← →
TForm (2006-07-18 00:39) [24]Нашел в каком месте вылетает ошибка.
У меня на OnDestroy формы из DLL "убиваются" два экземпляра класса TBitMap.
Если перед ихим "убийством" поставить Exit; то ошибка НЕвылетает НЕ после восьмого НЕ после пятидесятого разов.
Описаны как глобальные переменные типа TBitMap;BMP1: TBitMap;
BMP2: TBitMap;
Вот как они создаються - на OnCreate формы DLL есть строки:....
BMP1:=TBitMap.Create;
BMP1.LoadFromResourceName(Hinstance, "BMP1");
BMP2:=TBitMap.Create;
BMP2.LoadFromResourceName(Hinstance, "BMP2");
....
на OnDestroy....
BMP1.Free;
BMP2.Free;
....
попробовал и так
if Assigned(BMP1) then FreeAndNil(BMP1);
такая же ерунда - восемь раз нормально, потом ошибка.
Может их ненадо "убивать"-то вооще тогда, но я думаю, что это неправильно и что их "убивать" всетаки надо. Всетаки радителя/хозяина у них, получается, нет. Почему в момент ихого уничтожения (причем только начиная с восьмого) вылетает эта гребаная ошибка да еще и в модуле некоким боком не касающимся этих битмапов?
← →
GrayFace © (2006-07-19 00:19) [25]Я ступил - по идее, после включения "Build with runtime packages" можно отказаться от моих исхищрений. (минус - то, что надо таскать с собой несколькомегабайтную dll, но при большом кол-ве своих окупается). Попробуй.
if Assigned(BMP1) then FreeAndNil(BMP1);
Во Free итак делается проверка на <>nil.
← →
TForm (2006-07-19 00:53) [26]
> GrayFace © (19.07.06 00:19) [25]
Чет ничего непонял, извени...
← →
TForm (2006-07-19 10:52) [27]Прочтите пожалуйста
> TForm (14.07.06 23:20) [14]
> TForm (15.07.06 02:33) [16]
> TForm (18.07.06 00:39) [24]
Хочется понять в чем дело...
← →
GrayFace © (2006-07-19 18:32) [28]Попробуй включить Project -> Options -> Packages -> Build with runtime packages у обоих проектов и убрать мои исхищрения.
← →
TForm (2006-07-19 18:45) [29]
> GrayFace © (19.07.06 18:32) [28]
Тут я подумал, что это не нужно мне....
т.е. хочу что-бы DLL потом можно было и на других языках писать и использовать с моим EXE на Delphi...
Вот такая бадяга.
А про ошибку ничего подсказать не сможешь?
Спасибо большое. Один мне помогаешь.
← →
TForm (2006-07-20 00:34) [30]Люди добрые ну подскажите, пожалуйста, по вопросу закономерности ошибки из
> TForm (15.07.06 02:33) [16]
> TForm (18.07.06 00:39) [24]
если загружать каждый раз разные DLL (т.е. одинаковые, копии оригинальной, первой) то усе ОК ну если на одной зациклиться то только восемь раз и AV. Гружу их теперь динамически.
← →
TForm (2006-07-20 16:59) [31]Неужели ни у кого никаких догадок нет....?????????
ОБЫДНО. ДОСАДНО.... ДА ЛАДНО.
← →
TForm (2006-07-20 23:55) [32]Новую тему, что ли заводить?
← →
GrayFace © (2006-07-21 01:27) [33]Ошибка либо из-за исхищрений, либо где-то в коде. Первое даже более вероятно.
← →
TForm (2006-07-22 04:27) [34]
> GrayFace © (21.07.06 01:27) [33]
> Ошибка либо из-за исхищрений,
> TForm (20.07.06 00:34) [30]
если загружать каждый раз разные DLL (т.е. одинаковые, копии оригинальной, первой) то усе ОК
либо где-то в коде.
>TForm (18.07.06 00:39) [24]
Мне интересно почему 8?, сначало было чеыре (я писал уже про это) ...
Походу наверное не исхищрения, а в коде, но ПОЧЕМУ ВОСЕМЬ раз нормально и потом только ошибка??????????
← →
Забывчивый (2006-07-23 02:58) [35]Неужели кроме GrayFace © никто не читает эту тему?
← →
TForm (2006-07-23 18:21) [36]
> Забывчивый (23.07.06 02:58) [35]
Точно...
Вопрос в силе.
Может модераторам следует перенести ее куда нибудь?
Хочется обсудить мой вопрос...
Или НУ ВООБЩЕ НИКАКИХ предположений нет?
Может вопрос неинтересный? или непонятный?
← →
GrayFace © (2006-07-24 00:53) [37]В твоем коде искать ошибку, не видя его, мало кто сможет. Попробуй [28].
← →
TForm (2006-07-24 13:41) [38]Ну ладно, попробую привести код в удобочитаемом виде... тока позже...
покажу...
А что....
> Забывчивый (23.07.06 02:58) [35]
> Неужели кроме GrayFace © никто не читает эту тему?
всамом деле?
← →
TForm (2006-07-25 21:52) [39]Не пойму чего приводить здесь... все кучей...там много.
Убрал твои "исхищрения" т.е.
library FormaDLL;
uses
//Windows, SysUtils, Classes, Unit1, Forms, Unit2,
Windows, SysUtils, Classes, Forms,
UFrDLL in "UFrDLL.pas" {UFrDLL};
Стало опять 4 раза (само собой форма из dll неправильная(speedbuttons)
Это с SynchronizeApp(APP.Handle); TForm (14.07.06 04:09) [10]
Без SynchronizeApp(APP.Handle); 12 раз
Чё за фигня?
Потом вернул все на место.
Делал (так ради интереса)
procedure TForm1.Button1Click(Sender: TObject);
var N: Integer;
begin
N:=LoadLibrary(<DllName>));
if N<>0 then begin
@CreateFormDLL:=GetProcAddress(N, "CreateFormDLL");
@FreeForm:=GetProcAddress(N, "FreeForm");
end;
if CreateFormDLL(Application, FDLL) then begin
Width:=FDLL.FW;
SetWindowPos(FDLL.HNDDLLFR, HWND_TOPMOST, Left, Top+Height, FDLL.FW, FDLL.FH, SWP_NOACTIVATE);
end;
//FreeLibrary(N); //форма остается
end;
сразу после CreateFormDLL вызвал FreeLibrary(N); (закомент.)
форма из dll остается - это так и должно быть?
или FreeLibrary(N); НЕ выгружает DLL?
Я уже после FreeForm в DLL возвращал Хэндл ее на место, и выгружать пытался
procedure FreeForm; stdcall;
begin
if FrAvtPikTuz<>nil then FreeAndNil(FrAvtPikTuz);
//FreeLibrary(HInstance); // так 5 раз работает (Я думаю что это не правильно)
//if OLDHND<> Application.Handle then Application.Handle:=OLDHND; // ничего не меняет
end;
Как можно выгрузить DLL в процедуре FreeForm?
← →
TForm (2006-07-25 21:54) [40]заменить
> if FrAvtPikTuz<>nil then FreeAndNil(FrAvtPikTuz);
на
if FrDLL<>nil then FreeAndNil(FrDLL);
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.04 c