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 что-бы она вела себя как модальная но была не модальной.


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

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


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

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

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


GrayFace   (2006-07-29 01:48:00) [3]

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

Э.. А как?

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

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


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

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

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


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

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

> ЮЮ ©   (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. > Более важно откуда. Посмотри стек вызова на момент ошибки.
И все же, как это сделать?


ЮЮ   (2006-07-28 04:23:00) [6]

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


ЮЮ   (2006-07-28 04:19:00) [7]

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


ЮЮ   (2006-07-28 04:12:00) [8]

var      P: TPs;
SoundRes: TRSounds;

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


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


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

Извеняюсь за  [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 формой


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

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


ЮЮ   (2006-07-28 03:16:00) [11]

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

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

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

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


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


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

> [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;


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

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


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

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


ЮЮ   (2006-07-27 08:51:00) [14]


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


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

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


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

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

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

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

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

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


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

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


tesseract   (2006-07-26 22:48:00) [16]

> [42] TForm   (26.07.06 22:39)

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


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

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


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

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


TForm   (2006-07-25 21:54:00) [19]

заменить

> if FrAvtPikTuz<>nil then FreeAndNil(FrAvtPikTuz);

на
if FrDLL<>nil then FreeAndNil(FrDLL);


TForm   (2006-07-25 21:52:00) [20]

Не пойму чего приводить здесь... все кучей...там много.
Убрал твои "исхищрения" т.е.
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?


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

Наверх

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