![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Показ форм [D7, WinXP]
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?