![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GIF и ресурсы
markers © (2006-03-13 09:43:00)Здраствуйте!
Мне нужно достать GIF из недр своей программы в Run-time.
Я нашёл код, как выдёргивать Bitmap, но на GIF я полностью не смог переправить, подскажите пожалуйста как быть!
Function loadgraphic(naam:string):TBitmap;
var
HResInfo: THandle;
BMF: TBitmapFileHeader;
MemHandle: THandle;
Stream: TMemoryStream;
ResPtr: PByte;
ResSize: Longint;
null:array [0..8] of char;
begin
strpcopy (null, naam);
HResInfo := FindResource(Application.Handle, null, 'GIF');
ResSize := SizeofResource(Application.Handle, HResInfo);
MemHandle := LoadResource(Application.Handle, HResInfo);
ResPtr := LockResource(MemHandle);
Stream := TMemoryStream.Create;
try
Stream.SetSize(ResSize + SizeOf(BMF));
BMF.bfType := $4D42;
Stream.write(BMF, SizeOf(BMF));
Stream.write(ResPtr^, ResSize);
Stream.Seek(0, 0);
Result:= TBitmap.Create;
Result.LoadFromStream(Stream);
finally
Stream.Free;
end;
FreeResource(MemHandle);
end;
API (2006-03-13 10:55:00) [1]а создать глобальную переменную в которую тогде уже процедура будет пихать инфу
Не надо таких жертв.
А вообще - я проблемы так и не понял.
Загрузили - использовали - уничтожили.
Сергей М. (2006-03-13 10:51:00) [2]
> API © (13.03.06 10:35) [15]
> Нельзя, функция вернет "мертвый" указатель.
Имелось ввиду - выполнить Free той объектной переменной, которой был присвоен Result ф-ции, в теле которой объект был создан и ссылка на который была возвращена как результат.
> markers © (13.03.06 10:44) [17]
var
MyGIFImage: TGIFImage;
..
MyGIFImage := CreateGIFImageObjectFromResourceByName(имя ресурса);
try
.. работа с MyGIFImage
finally
MyGIFImage.Free; //уничтожение
end;
markers (2006-03-13 10:44:00) [3]А, освободить мне её нужно.
Представьте, у меня каталог продукции и если у каждой нет картинки и нет картинки (Сообщающая что её нет на данный продукт) на винте, то я её гружу из ресурсов, Сколько это ресурсов схавает? Дофига :)
markers (2006-03-13 10:40:00) [4]Не просто я в этой процедуре создаю Result записываю в него инфу, возвращаю и как мне его потом освободить? Или проще тогда юзать не Result, а создать глобальную переменную в которую тогде уже процедура будет пихать инфу...
/* Слушайте, а если сделать так
Procedure loadgraphic(naam:string, varImage:TGifImage);
Писал от руки могу ошибиться....... */
Идея добрая но мне не проканает :(
API (2006-03-13 10:35:00) [5]Как обычно - Result.Free
Нельзя, функция вернет "мертвый" указатель.
API (2006-03-13 10:33:00) [6]FreeAndNil(Result); - это в применении к Вашей функции.
Только зачем?
Вы же вернуть его из функции должны.
Или уже что-то переписали?
Сергей М. (2006-03-13 10:31:00) [7]
> как Result потом освободить?
Как обычно - Result.Free
markers (2006-03-13 10:26:00) [8]Тока вот как Result потом освободить? :(
markers (2006-03-13 10:20:00) [9]Всё оказалось гораздо проще :)
Result:= TGIFImage.Create;
Result.LoadFromResourceName(HInstance,UpperCase(naam),RT_GIF);
И больше ничего не нужно!
markers (2006-03-13 10:20:00) [10]Боольшое спасибо, за подсказку!!!!!!
Я просто изначально не в то место рыл :)
API (2006-03-13 10:16:00) [11]Не знаю, т.к. RxLib не использую.
По идее, если "поддерживает", то должно "проканать".
markers (2006-03-13 10:13:00) [12]У меня RxLib, он гифы поддерживает, проканает?
API (2006-03-13 10:11:00) [13]Вероятно, нужен компонент, предназначенный для работы с графическими файлами в формате GIF.
Смотрите тут: http://www.torry.net/quicksearchd.php?String=GIF&Title=Yes
markers (2006-03-13 10:05:00) [14]Просто на уровне stream я не силён, уж простите. :(
markers (2006-03-13 10:04:00) [15]Да я знаю, что нет... Но пока ничего не придуумал оставил на месте. Может вы подскажите как сделать?
API (2006-03-13 10:02:00) [16]Тобишь вы хотитте сказать, что нужна конвертация?
А разве TBitmap предназначен для работы с GIF'ами?
markers (2006-03-13 09:54:00) [17]Тобишь вы хотитте сказать, что нужна конвертация?
markers (2006-03-13 09:52:00) [18]Знаю, что нет. Но немог ничего подобрать
API (2006-03-13 09:50:00) [19]Stream.SetSize(ResSize + SizeOf(BMF));
BMF.bfType := $4D42;
Stream.write(BMF, SizeOf(BMF));
Stream.write(ResPtr^, ResSize);
Вы считаете, что этот код конвертирует GIF в BMP?
То есть, вот так, простым дописыванием 'BM' в начало?
Вот вам и последствия "Я нашёл код"...