Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизПоказ форм Найти похожие ветки
← →
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.56 MB
Время: 0.043 c