Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Показ форм [D7, WinXP]


Страницы:   1 2 3

TForm ©   (2006-07-13 16:56:00) 

Чем отличается форма модальная от не модальной
Всмысле при вызове формы из DLL модальная ведет себя нормально а не модальная как то не так.
Синхронизацию делаю так - Apllication.handle для dll присваиваю handle проги
Как показать форму НЕ МОДАЛЬНО из DLL что-бы она вела себя как модальная но была не модальной.


GrayFace   (2006-07-15 18:17:00) [41]

Попробуй FrDLL.Release; В FrDLL.OnDestroy: FrDLL:=nil;


TForm   (2006-07-15 02:36:00) [42]

Извеняюсь, забыл код выделить. Sorry.


TForm   (2006-07-15 02:33:00) [43]


> 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 уйдет. Да и ошибка не екскепшенах вылетает. Ну и все, больше ничего такого не менял. Почему «производительность» выросла в два раза?


Loginov Dmitry   (2006-07-15 00:17:00) [44]

> Кстати это я пока тестирую, статически гружу Dll, потом
> буду хотеть динамически
> Разницы не будет или новая жопа начнется? :)


Наоборот, некоторые вероятные баги попросту исчезнут. Например злая бага, связанная с линкованием библиотек статически при использовании XPMan и при установленном XP-шном стиле (если в DLL на форме находятся определенные компоненты, например TGroupBox) (кстати, я эту багу обнаружил несколько месяцев назад и искал пути ее обхода на этом же форуме).


TForm   (2006-07-14 23:20:00) [45]


> 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 – создавалась и убивалась туеву хучу раз – нормально без ошибок.
Вопрос выделен. Надеюсь, что найдем эту закономерность. Спасибо.


GrayFace   (2006-07-14 22:05:00) [46]

А, я не совсем понял. Подумал что exe вообще форм не имеет. :)
Однако, очень советую все же попробовать с пакетами. По идее, ничего сложного не должно быть, зато не будет глюков и при достаточном кол-ве dll'ек (по-моему около 5) уже выйдет выигрышь по размеру.


TForm   (2006-07-14 13:44:00) [47]

Вот перед тем как получилось готовил пост.... который должен быть вместо

> 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 10:26:00) [48]

> function CreateFormDLL(const APP: TApplication; const TL: TPoint): THandle; stdcall;

А что потом делается с этим хендлом? (кстати, для окон принято использовать hwnd)

> Разницы не будет или новая жопа начнется? :)
Не будет. Но учти, что это все небезопано - возможны всякие неожиданные баги.
А в чем проблема с [9]?


TForm   (2006-07-14 04:09:00) [49]

Спасибо за помощь.
Два часа парился с этой бодягой нифига толком не получалось.
После уже более внимательно занелся кодом приведенным GrayFace ©   (14.07.06 00:04) [9] http://www.delphimaster.ru/cgi-bin/forum.pl?id=1152783516&n=0
Получилось вроде бы то че надо, а до этого пока парился таких приколов нахватал пока пытался сдружить 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 FrDLLnil 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 FrDLLnil then FreeAndNil(FrDLL);
end;

exports
 CreateFormDLL, FreeFormDLL;
begin

end.


Unit1 и Unit2 в uses - это RSDllForm1 и RSDllForm из кода по ссылке.

GrayFace Спасибо тебе большое.

Кстати это я пока тестирую, статически гружу Dll, потом буду хотеть динамически
Разницы не будет или новая жопа начнется? :)


GrayFace   (2006-07-14 00:04:00) [50]

Про пакеты: http://delphi.olympus.ru/dk/mastering/plugins.htm
Вот еще способ: http://www.delphimaster.ru/cgi-bin/forum.pl?id=1152783516&n=0

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;


Loginov Dmitry   (2006-07-13 22:43:00) [51]

> В какой-то книге давно читал что лучше для таких целей использовать
> пакеты Delphi. Но как их использовать не знаю и книги нет


Просто скомпилируй ехе-шку и все библиотеки с пакетами. Куча проблем отпадет с один миг. Все глобальные объекты, хранимые в пакетах (соответственно в стандартных библиотеках) будут общими. Классы - тоже.


TForm   (2006-07-13 20:46:00) [52]

Объяснил как смог. Вроде понятно. Если что непонятно спрашивайте а посылать на ... прошу ненадо. :)


TForm   (2006-07-13 20:44:00) [53]

В какой-то книге давно читал что лучше для таких целей использовать пакеты Delphi. Но как их использовать не знаю и книги нет.
Вообщем форма в Dll это типа плагина но не совсем плагин. тоесть если нет не одной dll то ехешник бесполезный в нем только загрузка этих dll и управление. В один момент времени может быть загружена одна Dll.
Т.е нужно сделать ехе и одну Dll как единое целое. При необходимости выгрузить Dll и загрузить следующую.


TForm   (2006-07-13 20:35:00) [54]

Show нужно что бы к ехе форме остался доступ....


TForm   (2006-07-13 20:32:00) [55]

Форма находится в 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 то таких "эффектов" нет.


Desdechado   (2006-07-13 17:37:00) [56]

Модальность формы означает недоступность других (ранее вызванных) элементов программы, пока не закроешь эту модальную форму.
Немодальная форма позволяет все это.
Так как должна себя вести форма, а то в
> что-бы она вела себя как модальная но была не модальной
противоречие.


blackcrazzy   (2006-07-13 17:06:00) [57]


> а не модальная как то не так.

А по конкретнее.


StriderMan   (2006-07-13 17:05:00) [58]


> Чем отличается форма модальная от не модальной

в чем по-Вашему разница?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо