Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что за фишка, просто глюк какой-то. [D5, Win95/98, Win2k]


Страницы:   1 2

Weare ©   (2003-01-30 11:16:00) 

Добрый день, мастера. В Делфях есть такой примерчик:

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 при криейте формы, а убивал при дестрое. Результат очевиден - после нескольких запусков приложения приходилось перезагружать машину, т.к. опять выдавалось это сообщение.
Помогите, плиз!!!


Weare   (2003-01-30 15:30:00) [1]


>to Dms (30.01.03 14:52)


Ты пробовал именно с большими *.bmp (где-то 30-40Mb) и кликал некоторое кол-во раз?


Weare   (2003-01-30 14:53:00) [2]

Блин, так чего же тогда через некоторое кол-во кликов (опять же) выдает эти сообщения и нужно перегружать машину. Причем это наблюдается на многих Win98 машинах, а в Win2K нету.


Dms   (2003-01-30 14:52:00) [3]

У меня, например, все работает, но в D7. Возможно дело в глюке Дельфей 5, так называемых "утечках памяти". Надо глянуть patch на borland.com или еще где.


Романов Р.В.   (2003-01-30 14:41:00) [4]


> где я тут теряю память.

нигде


Weare   (2003-01-30 14:33:00) [5]

Хорошо, обойдемся без 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, где я тут теряю память.


Anatoly Podgoretsky   (2003-01-30 14:19:00) [6]

Ну так память не будет теряться


Романов Р.В.   (2003-01-30 14:17:00) [7]

см 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;


han_malign   (2003-01-30 14:14:00) [8]

Ну если это главная часть...
то ищи в ней ошибку сам, у меня всегда все нормально работало...


Weare   (2003-01-30 14:10:00) [9]

Код у меня большой, а главную его часть я привел выше (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;


Anatoly Podgoretsky   (2003-01-30 13:59:00) [10]

А чего ты хочешь, если ты 7-10 раз память теряешь.
Да и где код когда на кнопочку кликаешь.


han_malign   (2003-01-30 13:59:00) [11]

Ну тады давай по порядку
1. Загрузил Bitmap
2. Нарисовал в ней текст
3. ...
4. Отпустил Bitmap

Анамнез(предположительный):
2./3. Кому то отдаешь битмап не отпуская Handle
4. Если уж FormShow то FormClose, а не FormDestroy


Романов Р.В.   (2003-01-30 13:48:00) [12]

Ты нам пример скопировал, вот мы его и обсуждаем. Давай свой код мы его будем обсуждать.


Weare   (2003-01-30 13:42:00) [13]

Ребята, Вы бы лучше помогли с проблемкой разобрать, подсказали может как отследить что там пожирается так, что нужно машину перегружать, а не приводили перевод примера... :(


Weare   (2003-01-30 13:38:00) [14]

Да это только в примере делфийном. У меня только Free.


han_malign   (2003-01-30 13:38:00) [15]

это-же пример, а не работающий код, там ведь черным по белому(синим по серому) написано -
"BitMap2.ReleaseHandle; // This will actually losethe bitmap;"

Lingvo:
Lose -
v/t. [по]терять;
упускать [-стить];
проигрывать [-рать];
lose o.s. заблудиться pf.;
v/i. [по]терять ;
проигрывать(ся) [-рать(ся)];
отст(ав)ать (о часах)

З.Ы. И в хелпе помимо примеров есть еще описание методов...


Романов Р.В.   (2003-01-30 13:15:00) [16]

А зачем тебе
BitMap2.Dormant;
BitMap2.ReleaseHandle;
выкинь их на ...


Weare   (2003-01-30 13:13:00) [17]


>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


DVM   (2003-01-30 12:55:00) [18]

Может это в каком другом месте программы?


Weare   (2003-01-30 12:52:00) [19]

Но ведь суть та же. Я делаю:


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;


А память или что там, все равно забивается.


Weare   (2003-01-30 12:42:00) [20]

Что, никто с этим не сталкивался???


Страницы:   1 2

Наверх

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