Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
ВнизЧто за фишка, просто глюк какой-то. Найти похожие ветки
← →
Weare (2003-01-30 11:16) [0]Добрый день, мастера. В Делфях есть такой примерчик:
procedure TForm1.Button1Click(Sender: TObject);
var
BitMap1,BitMap2 : TBitMap;
MyFormat : Word;
begin
BitMap2 := TBitMap.Create;
BitMap1 := TBitMap.Create;
try
BitMap1.LoadFromFile("c:\Program Files\common Files\Borland Shared\Images\Splash\256color\factory.bmp");
BitMap2.Assign(BitMap1); // Copy BitMap1 into BitMap2
BitMap2.Dormant; // Free up GDI resources
BitMap2.FreeImage; // Free up Memory.
Canvas.Draw(20,20,BitMap2); // Note that previous calls don"t lose the image
BitMap2.Monochrome := true;
Canvas.Draw(80,80,BitMap2);
BitMap2.ReleaseHandle; // This will actually lose the bitmap;
finally
BitMap1.Free;
BitMap2.Free;
end;
end;
Так вот, если на кнопку нажимать много (где-то 7-20 раз), то в конце концов Вы увидите сообщение (в Win98) "Bitmap is not valid" или "Параметр задан неверно", правда бмпешку я брал размера эдак 15Mb(если размер больше, то через меньшее кол-во раз будет это сообщение).После выхода из проги и ее очередного запуска это будет повторяться уже через пару раз нажатия, а то и сразу. Избавиться от этого можно только после перегрузки машины, т.е. Вы сможете опять некоторое кол-во раз нажимать на кнопку. Получается, что Делфи не может корректно очистить какую-то там память или освободить ресурс. В Win2К я этого не заметил.
Как с этим бороться, может кто подскажет? Очень надо. У меня программа печатает текст на готовый *.bmp шаблон. Так вот такие казусы и происходят после нескольких отправок на печать. Тогда я переделал прогу: создавал Bmp при криейте формы, а убивал при дестрое. Результат очевиден - после нескольких запусков приложения приходилось перезагружать машину, т.к. опять выдавалось это сообщение.
Помогите, плиз!!!
← →
DVM (2003-01-30 12:40) [1]Так по-моему правильнее:
begin
BitMap2 := TBitMap.Create;
try
BitMap1 := TBitMap.Create;
try
...
finally
BitMap1.Free;
end;
finally
BitMap2.Free;
end;
end;
← →
Weare (2003-01-30 12:42) [2]Что, никто с этим не сталкивался???
← →
Weare (2003-01-30 12:52) [3]Но ведь суть та же. Я делаю:
procedure TForm1.FormShow(Sender: TObject);
begin
Bmp := TBitmap.Create;
Bmp.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Bmp.Free;
// или Bmp.Destroy;
А память или что там, все равно забивается.
← →
DVM (2003-01-30 12:55) [4]Может это в каком другом месте программы?
← →
Weare (2003-01-30 13:13) [5]
>to DVM ©
> Может это в каком другом месте программы?
Если ты имеешь ввиду, что ошибка возникает в другом месте программы, то это не так. Именно на LoadFromFile.
Я еще пробовал вместо *.bmp (31,4Mb) загрузить этот же файл, но в *.jpg формате (1,7Mb):
Jpg.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
Bmp.Assign(Jpg);
тогда эта ошибка выскакивает на Assign
← →
Романов Р.В. (2003-01-30 13:15) [6]А зачем тебе
BitMap2.Dormant;
BitMap2.ReleaseHandle;
выкинь их на ...
← →
han_malign (2003-01-30 13:38) [7]это-же пример, а не работающий код, там ведь черным по белому(синим по серому) написано -
"BitMap2.ReleaseHandle; // This will actually lose the bitmap;"
Lingvo:
Lose -
v/t. [по]терять;
упускать [-стить];
проигрывать [-рать];
lose o.s. заблудиться pf.;
v/i. [по]терять ;
проигрывать(ся) [-рать(ся)];
отст(ав)ать (о часах)
З.Ы. И в хелпе помимо примеров есть еще описание методов...
← →
Weare (2003-01-30 13:38) [8]Да это только в примере делфийном. У меня только Free.
← →
Weare (2003-01-30 13:42) [9]Ребята, Вы бы лучше помогли с проблемкой разобрать, подсказали может как отследить что там пожирается так, что нужно машину перегружать, а не приводили перевод примера... :(
← →
Романов Р.В. (2003-01-30 13:48) [10]Ты нам пример скопировал, вот мы его и обсуждаем. Давай свой код мы его будем обсуждать.
← →
Anatoly Podgoretsky (2003-01-30 13:59) [11]А чего ты хочешь, если ты 7-10 раз память теряешь.
Да и где код когда на кнопочку кликаешь.
← →
han_malign (2003-01-30 13:59) [12]Ну тады давай по порядку
1. Загрузил Bitmap
2. Нарисовал в ней текст
3. ...
4. Отпустил Bitmap
Анамнез(предположительный):
2./3. Кому то отдаешь битмап не отпуская Handle
4. Если уж FormShow то FormClose, а не FormDestroy
← →
Weare (2003-01-30 14:10) [13]Код у меня большой, а главную его часть я привел выше (Weare © (30.01.03 12:52)):
procedure TForm1.FormShow(Sender: TObject);
begin
Bmp := TBitmap.Create;
Bmp.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Bmp.Free;
end;
← →
han_malign (2003-01-30 14:14) [14]Ну если это главная часть...
то ищи в ней ошибку сам, у меня всегда все нормально работало...
← →
Романов Р.В. (2003-01-30 14:17) [15]см han_malign © (30.01.03 13:59)
На всякий случай сделай так
procedure TForm1.FormShow(Sender: TObject);
begin
if Assigned(Bmp) then
FreeAndNil(Bmp);
Bmp := TBitmap.Create;
Bmp.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(Bmp);
end;
← →
Anatoly Podgoretsky (2003-01-30 14:19) [16]Ну так память не будет теряться
← →
Weare (2003-01-30 14:33) [17]Хорошо, обойдемся без FormShow, FormDestroy, FormClose.
Почему с той же ошибкой работает следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp: TBitMap;
begin
Bmp := TBitMap.Create;
try
Bmp.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
finally
Bmp.Free;
end;
end;
происходит она на LoadFromFile, где я тут теряю память.
← →
Романов Р.В. (2003-01-30 14:41) [18]
> где я тут теряю память.
нигде
← →
Dms (2003-01-30 14:52) [19]У меня, например, все работает, но в D7. Возможно дело в глюке Дельфей 5, так называемых "утечках памяти". Надо глянуть patch на borland.com или еще где.
← →
Weare (2003-01-30 14:53) [20]Блин, так чего же тогда через некоторое кол-во кликов (опять же) выдает эти сообщения и нужно перегружать машину. Причем это наблюдается на многих Win98 машинах, а в Win2K нету.
← →
Weare (2003-01-30 15:30) [21]
>to Dms (30.01.03 14:52)
Ты пробовал именно с большими *.bmp (где-то 30-40Mb) и кликал некоторое кол-во раз?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c