Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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);


 
TForm   (2006-07-25 21:56) [41]

Блин, ну откуда эти ровные количества нормальных работ до возникновения ошибки?????????????????????????????????????????


 
TForm   (2006-07-26 22:39) [42]

Блин, ну че так все игнорируют эту тему?


 
tesseract ©   (2006-07-26 22:48) [43]

> [42] TForm   (26.07.06 22:39)

Твоя проблема описана в документациии Delphi.
Это абсолютно нормальное поведение.
Попробуй поиск.


 
TForm   (2006-07-27 01:50) [44]

> [43] tesseract ©   (26.07.06 22:48)

А что именно искать? Много уже чего перерыл... Да и стал бы я эту тему продолжать если бы хоть чего нибудь нашел...
Правда тут вопрос немного поменялся походу, может это сбивает с толку?
Вопрос о количестве нормальных работ до возникновения ошибки

> Это абсолютно нормальное поведение.

Нифигасебе :) помоему это ненормально:

> [16] TForm   (15.07.06 02:33)
> [24] TForm   (18.07.06 00:39)


> Твоя проблема описана в документациии Delphi.

Как и где она там описана?
Спасибо.


 
ЮЮ ©   (2006-07-27 08:51) [45]


> почему-то все время после четвертого создания формы,


Чисто случайно. Если бы положил Timer(TimerList) на обычную форму и закрыл её при активном timer-е, то получил бы AV с первого раза :)

Перед уничтожением формы следует дезактивировать таймеры


 
TForm   (2006-07-27 14:30) [46]

> [45] ЮЮ ©   (27.07.06 08:51)


> Чисто случайно.

тучу раз подряд и все время восемь (а уже не четыре, если этот пост с начала почитать, то там написано как было) раз нормально, вроде как, получается не случайно...TimerList имеется, а вот насчет деактивации timer"ов надо посмотреть. Очень большое спасибо. Вот это и называется предположения об ошибках...Сейчас проверю... А деактивировать нужно в OnDestroy формы?


 
TForm   (2006-07-27 15:01) [47]

> [45] ЮЮ ©   (27.07.06 08:51)
> почему-то все время после четвертого создания формы,

не создания а разрушения...

Добавил на дестрой - деактивацию таймеров - результат тот же
вот весь код уничтожения формы
Повторяюсь, ровно семь раз это срабатывает нормально, а на восьмом

procedure TFrDLL.FormDestroy(Sender: TObject);
var R, C: Byte;
Fl: File;
begin
 Tm1.Enabled:=False;
 TmLs.Active:=False;
 AssignFile(Fl, SetFlNm);
 try Rewrite(Fl,1);
 BlockWrite(Fl, DATA.To, SizeOf(DATA.To));
 BlockWrite(Fl, DATA.From, SizeOf(DATA.From));
 for R:=Low(DATA.WK) to High(DATA.WK)
  do BlockWrite(Fl, DATA.WK[R], SizeOf(DATA.WK[R]));
 for R:=Low(DATA.WL) to High(DATA.WL)
  do BlockWrite(Fl, DATA.WL[R], SizeOf(DATA.WL[R]));
 finally CloseFile(Fl); end;
 if BASSLOADED then for R:=0 to MAX_SND do begin  //MAX_SND=13
   SoundRes[R].StreamRes.Free;
   BASS_StreamFree(SoundRes[R].Snd);
  end;
 BASS_Free;
 for R:=1 to MAX_PICTS do try P[R].BMP.Free; except end; //MAX_PICTS=8
//Exit; //Если раскоментировать то ошибка не вылетает не на 4, не на 8, не на 50...n разе;
 try PBMP.Free; P2BMP.Free; except end;
 end;
end;
Вот сюда вылетаем после ошибки:
procedure TRxTimerList.RemoveItem(Item: TRxTimerEvent);
begin
 FEvents.Remove(Item);
-->  Item.FParentList := nil;
end;

вот создание

procedure TFrDLL.FormCreate(Sender: TObject);
begin
 BASSLOADED:=(HIWORD(BASS_GetVersion) = BASSVERSION)
             and (BASS_Init(-1, 44100, 0, Handle, nil));
 DLLPath:=GetModulePath(HInstance);
 EXEPath:=GetModulePath(0);
 ...
 if FileExists(SetFlNm) then begin
  AssignFile(Fl, SetFlNm);
 try Reset(Fl,1);
  BlockRead(Fl, DATA.To, SizeOf(DATA.To));
  BlockRead(Fl, DATA.From, SizeOf(DATA.From));
  for R:=Low(DATA.WK) to High(DATA.WK) do BlockRead(Fl, DATA.WK[R], SizeOf(DATA.WK[R]));
  for R:=Low(DATA.WL) to High(DATA.WL) do BlockRead(Fl, DATA.WL[R], SizeOf(DATA.WL[R]));
  finally CloseFile(Fl); end;
 end;
 PBMP:=TBitMap.Create;
 PBMP.LoadFromResourceName(Hinstance, "BMP");
 P2BMP:=TBitMap.Create;
 P2BMP.LoadFromResourceName(Hinstance, "2BMP");
 for R:=1 to MAX_PICTS do begin  
  P[R].BMP:=TBitMap.Create;
  P[R].BMP.LoadFromResourceName(Hinstance, "P"+IntToStr(R));
 end;
 if BASSLOADED then for R:=0 to MAX_SND do begin
  SoundRes[R].StreamRes:=TResourceStream.Create(hInstance, Pchar("SND"+IntToStr(R)), PChar("SOUND"));
  SoundRes[R].Snd:=BASS_StreamCreateFile(True, SoundRes[R].StreamRes.Memory, 0, SoundRes[R].StreamRes.Size, 0);
 end;
end;


 
ЮЮ ©   (2006-07-28 03:16) [48]

for R:=0 to MAX_SND
 SoundRes[R].

for R:=1 to MAX_PICTS
 P[R].BMP.Free;

что за звери SoundRes и P? где объявлены.
Уж больно подозрительные диапазоны циклов

Вот сюда вылетаем после ошибки:


Более важно откуда. Посмотри стек вызова на момент ошибки.


 
TForm   (2006-07-28 03:46) [49]

Запутал в корень всех, своим кодом? Все догадки пропали... или наоборот стоко дофига, что и незнай с чего начать?


 
TForm   (2006-07-28 04:00) [50]

Извеняюсь за  [49] TForm   (28.07.06 03:46) чего то обнавилась страница не вовремя.
> [48] ЮЮ ©   (28.07.06 03:16)


> Более важно откуда. Посмотри стек вызова на момент ошибки.

Здесь я ничего не понял.
Каким образом это сделать, и на что конкретно нужно смотреть?

const
MAX_SND   = 13;
MAX_PICTS = 8;

type
TP = record                    
 BMP:  TBitMap;            
 Name: String;            
end;
TPs = array [1..MAX_PICTS] of TP;

TRSound = record
 Snd      : HSTREAM;
 StreamRes: TResourceStream;
end;
TRSounds = array [0..MAX_SND] of TRSound;

var      P: TPs;
 SoundRes: TRSounds;


Это все в этом же модуле c формой


 
ЮЮ ©   (2006-07-28 04:12) [51]

var      P: TPs;
SoundRes: TRSounds;

Это все в этом же модуле c формой


глобальные переменные, что-ли? Перенеси их в поля формы!!!


 
ЮЮ ©   (2006-07-28 04:19) [52]

Или у тебя бывает только один экземпляр этой формы создан? Если да, то это, конецно, не критично


 
ЮЮ ©   (2006-07-28 04:23) [53]

кстати, после Tm1.Enabled:=False можно поставить Tm1.Clear, что, по-идее, исключит возможность попадания в TRxTimerList.RemoveItem в дальнейшем.


 
TForm   (2006-07-28 16:04) [54]

Переменные глобальные, описаны в модуле с формой.

> ЮЮ ©   (28.07.06 04:19) [52]

Так точно, в один момент времени загружена 1 форма из DLL ну и форма из exe, которая присутствует всегда.

> ЮЮ ©   (28.07.06 04:23) [53]
> кстати, после Tm1.Enabled:=False можно поставить Tm1.Clear

Спасибо, попробую.
Только Tм1 - это просто таймер, надо у ТмLs Clear сделать. Это я так, для себя.
P.S. > Более важно откуда. Посмотри стек вызова на момент ошибки.
И все же, как это сделать?


 
TForm   (2006-07-28 21:02) [55]

> [53] ЮЮ ©   (28.07.06 04:23)

Сделал после Tm1.Enabled:=False - Tm1.Clear;
Молодец! Спасибо!
Конечно это решило проблему (мою), но почему так происходило - ответа нет.
Хотелось бы услышать обаснованный ответ по вопросу.
Ну что бы не делать таких ошибок в дальнейшем. т.е. суть ошибки не понял.
Дело то наверное не RxTimersList"e - ведь если Exit; ставил перед убиванием TBitMap"ов ошибки то не было....


 
GrayFace ©   (2006-07-29 01:48) [56]

ЮЮ ©   (28.07.06 3:16) [48]
Посмотри стек вызова на момент ошибки.

Э.. А как?

TForm   (28.07.06 21:02) [55]
Дело то наверное не RxTimersList"e - ведь если Exit; ставил перед убиванием TBitMap"ов ошибки то не было....

Но убивание битмепок-то точно не при чем. Лучше всего посмотреть, что делается в исходниках RxTimersList.Clear


 
TForm   (2006-07-29 23:56) [57]

> [56] GrayFace ©   (29.07.06 01:48)
> Лучше всего посмотреть, что делается в исходниках RxTimersList.Clear

А чего там может делаться, очищаються таймеры из списка по "одному"
> Но убивание битмепок-то точно не при чем.
Да вот и я уже всю башню изломал, непойму что здесь при чем?
Да и ЮЮ чегото не говорит про стек вызовов, т.е. как его посмотреть и, самое главное, что там нужно увидеть....:(


 
TForm   (2006-07-30 18:41) [58]

Ну ладно, если все молчат, значит либо не знают, либо.....
Тема закрыта.
Спасибо всем.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.64 MB
Время: 0.059 c
3-1150146676
vvQuad
2006-06-13 01:11
2006.08.20
DBGrid, Query и печать


3-1150289387
Still Swamp
2006-06-14 16:49
2006.08.20
Out of memory в TIBQuery и FB


15-1153845017
oldman
2006-07-25 20:30
2006.08.20
Как съезжают программисты...


15-1153860806
Homo Sapiens
2006-07-26 00:53
2006.08.20
Часть исходника Windows XP!!!!!


2-1153999311
learner
2006-07-27 15:21
2006.08.20
Порядок объявления переменных.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский