Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.18;
Скачать: CL | DM;

Вниз

Как загрузить анимационный курсор (ANI) из ресурсов?   Найти похожие ветки 

 
JetuS   (2008-01-11 12:35) [0]

Из файла загружается без проблем, но не охота таскать с собой дополнительные файлы, поэтому создаю файл Cur.res из rc-файла такого содержания:
BUSY ANICURSOR 4.ani

Пробую - не работает. Что не так?

Вот код:
const
 crMyCursor = 777;

implementation

{$R *.dfm}
{$R Cur.res}

procedure TForm1.Button1Click(Sender: TObject);
var
 h: THandle;
begin
 h := LoadImage(hInstance, "BUSY", IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
 ShowMessage(IntToStr(h));
 Screen.Cursors[crMyCursor] := h;
 Screen.Cursor := crMyCursor;
end;


 
Dimaxx ©   (2008-01-11 13:31) [1]

Я грузил с помощью LoadCursor и все работало.


 
clickmaker ©   (2008-01-11 13:34) [2]

h := LoadImage(hInstance, "BUSY", IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
if (h = 0) then
 RaiseLastWin32Error(); // что говорит?


 
JetuS   (2008-01-11 14:07) [3]


> RaiseLastWin32Error(); // что говорит?


"Указанный тип ресурса в файле образа отсутствует."
Как это понять?


 
JetuS   (2008-01-11 14:08) [4]


> Я грузил с помощью LoadCursor и все работало.


Покажи код, потому что я как ни пробовал - не работает.


 
clickmaker ©   (2008-01-11 14:13) [5]


> Как это понять?

буквально. Не находит ресурс.
Просто добавь в проект Project - Add to project - *.rc
res можно заранее и не делать


 
JetuS   (2008-01-11 14:48) [6]


> буквально. Не находит ресурс.Просто добавь в проект Project
> - Add to project - *.rcres можно заранее и не делать

Никакой разницы. Ошибка аналогичная.


 
clickmaker ©   (2008-01-11 15:05) [7]

я делал так
images.rc:
#include "resource.inc"

IDB_DIAGBRUSH     BITMAP        "res\\dpbrush.bmp"

resource.inc:
const
 IDB_DIAGBRUSH = 101;


*.pas:
{$I resource.inc}
...
FDisabledBitmap.LoadFromResourceID(hInstance, IDB_DIAGBRUSH);


по аналогии должно и с курсором работать
типа так
h := LoadImage(hInstance, MakeIntResource(IDC_BUSY), IMAGE_CURSOR, 0, 0, 0);


 
JetuS   (2008-01-11 15:49) [8]


> по аналогии должно и с курсором работать

С картинкой оно и у мненя работает.
Кажеться я понял: программа попросту не понимает, что мой ресурс есть курсором. Возможно я неправильно создаю rc-файл?
Как же тогда правильно указать?


 
clickmaker ©   (2008-01-11 16:38) [9]


> Как же тогда правильно указать?

BUSY CURSOR "1.ani"


 
jetus   (2008-01-11 17:37) [10]


> BUSY CURSOR "1.ani"


Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format


 
Dib@zol ©   (2008-01-11 18:07) [11]

> Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format

Ну и пиши ету твою иконку в RCDATA. Я как-то сам давным-давно сюда выкладывал меню с анимированными иконками. Это была главная часть их загрузчика. Грузит из любого раздела реестра. Надо только собсно раздел указать.
ЗЫ под ХРеновину и выше сей загрузчик работает на ура, а вот в 98-м (2К и МЕ не проверял) прут просто НЕРЕАЛЬНЫЕ лаги. В лучшем случае возвращается нулевой результат, в худшем - лично я пару раз словил BSOD. Поэтому предупреждаю сразу. А вообще, ИМХО, надо самому склепать расшифровщик, благо у ANI иконок не пользуется шифрование, а заголовочная запись не сильно огромна :)

function LoadIconEx(H:HINST; N, T:string):HICON;
var
 R : HRSRC;
 S : Cardinal;
 G : HGLOBAL;
 P : Pointer;
begin
 Result:=0;
 R:=FindResource(H, PChar(N), PChar(T));
 if R=0 then exit;
 S:=SizeOfResource(H, R);
 G:=LoadResource(H, R);
 P:=LockResource(G);
 Result:=CreateIconFromResource(P, S, true, $00030000);
end;


 
ага   (2008-01-12 11:08) [12]


> Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format

BRCC? Попробуй RC.exe от MS.


 
jetus   (2008-01-12 13:13) [13]


> Ну и пиши ету твою иконку в RCDATA...

Пробовал твой код, выё время вылетает AV (среда XP SP2, D2007)


> BRCC? Попробуй RC.exe от MS.

Действительно, RC.exe скомпилировал ресурсный файл.
Но программа ошибку выдаёт всё ту же :(


 
Dib@zol ©   (2008-01-12 13:24) [14]

> [13] jetus   (12.01.08 13:13)
>
> > Ну и пиши ету твою иконку в RCDATA...
>
> Пробовал твой код, выё время вылетает AV (среда XP SP2,
> D2007)
>
>
> > BRCC? Попробуй RC.exe от MS.
>
> Действительно, RC.exe скомпилировал ресурсный файл.
> Но программа ошибку выдаёт всё ту же :(

Это происходит потому, что вызывать мою функцию надо (если ты кнешн действительно положил иконку в раздел RCDATA) вот так:

var i:HICON;
...
i:=LoadIconEx(hInstance, "имя_твоей_иконки_в_ресах", RT_RCDATA);


 
ага   (2008-01-12 16:44) [15]


> jetus   (12.01.08 13:13) [13]

Какую ту-же? В общем, по шагам.
- имеем файл курсора 1.ani
- Создаем файл AniCusor.rc, в нем пишем одну строку
200 CURSOR "1.ani"
- Компилим из CMD командой
rc AniCursor.rc
только перейти в каталог не забудь
- В любой модуль проекта добавляем строку
{$R anicursor.res}
- Гди-нить, типа в OnCreate или по кнопке пишем код

var
 h: Cardinal;
begin
 h:= LoadCursor(hInstance, PChar(200));
// или
// h:= LoadImage(HInstance, PChar(200), IMAGE_CURSOR, 0, 0, 0);
// без разницы
 if h = 0 then RaiseLastOSError;
 Screen.Cursors[1]:= h;
 Screen.Cursor:= 1;

Запускаем и наслаждаемся.


 
jetus   (2008-01-12 17:11) [16]


> Запускаем и наслаждаемся.


Сделал точно как ты написал.
Вот:
System Error.  Code: 1814.
Указанное имя ресурса не найдено в файле образа.

Ты сам код проверял?


 
ага   (2008-01-13 05:52) [17]

2 jetus

> Ты сам код проверял?

Да, и не одноератно. И сейчас еще раз проверил - все работает. Глянь каким-нить просмотрщиком ресурсов полученный экзешник, Ресторатором например. А еще попробуй загрузить твой курсор прямо из файла
Screen.Cursors[1]:= LoadImage(0, "1.ani", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
Мож у тя исходный файл кривой.


 
jetus   (2008-01-13 10:43) [18]


> Да, и не одноератно. И сейчас еще раз проверил - все работает.
>  Глянь каким-нить просмотрщиком ресурсов полученный экзешник,
>  Ресторатором например. А еще попробуй загрузить твой курсор
> прямо из файлаScreen.Cursors[1]:= LoadImage(0, "1.ani",
> IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);Мож у тя исходный файл
> кривой.


Смотрел ресурс ResHacker"ом - всё на месте. Курсор грузил напрямую из файла - никаких проблем, грузиться отлично. Не знаю уже, в чём беда...


 
ага   (2008-01-13 14:45) [19]


> jetus   (13.01.08 10:43) [18]

Ну тады я тож не знаю. Пожоже ты один такой несчастливый. На всяк случай выложи код с объявлением ресурса и загрузкой курсора - мож чего увижу.

> Смотрел ресурс ResHacker"ом - всё на месте

А тип ресурса какой, Ani Cursor? Может в имени ошибся? Я ваще не люблю ресурсам имена давать, только числовые индексы - привычка.


 
jetus   (2008-01-13 21:10) [20]


> Ну тады я тож не знаю. Пожоже ты один такой несчастливый.
>  На всяк случай выложи код с объявлением ресурса и загрузкой
> курсора - мож чего увижу.


Значит так. Создаю файл "Cur.rc" такого содержания:
#define BUSY 200
#define CUR 201

BUSY CURSOR "4.ani"
CUR CURSOR "5.cur"

Файлы 4.ani (анимированый курсор) и 5.cur (простой курсор) присутствуют.
Компилируется ресурс нормально.

Код программы:
{$R Cur.RES}

procedure TForm1.Button1Click(Sender: TObject);
var
h: Cardinal;
begin
h:= LoadCursor(hInstance, PChar(200));
if h = 0 then RaiseLastOSError;
Screen.Cursors[1]:= h;
Screen.Cursor:= 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
h: Cardinal;
begin
h:= LoadCursor(hInstance, PChar(201));
if h = 0 then RaiseLastOSError;
Screen.Cursors[2]:= h;
Screen.Cursor:= 2;
end;


При нажатии на кнопку Button2 всё нормально - обычный курсор загружается, ошибок нет.
При нажатии на кнопку Button1 вылетает: "System Error.  Code: 1814. Указанное имя ресурса не найдено в файле образа."


 
Dib@zol ©   (2008-01-13 21:29) [21]

Попробуй MAKEINTRESOURCE() вместо приведения к PChar. И посмотри размер скомпиленного ресурса - если он меньше суммарного размера .cur и .ani иконок, значит ресурс-компилер просто пропускает при построении реса этот .ani файл...

ЗЫ Ну уж не знаю чего у тебя там происходит 0_о

в первый раз в жизни такое получаю ©


 
jetus   (2008-01-13 22:54) [22]


> Попробуй MAKEINTRESOURCE() вместо приведения к PChar. И
> посмотри размер скомпиленного ресурса - если он меньше суммарного
> размера .cur и .ani иконок, значит ресурс-компилер просто
> пропускает при построении реса этот .ani файл...

C  MAKEINTRESOURCE() всё аналогично.
Размер полученого .res-файла соответствующий.

Хотя, в принципе, ошибку выдаёт правильную "Указанное имя ресурса не найдено в файле образа.": в ресурсах ехе-файла в группе курсоров есть курсор 201, а 200-го нету. 200-ый лежит себе отдельным типом, а почему?


 
Dib@zol ©   (2008-01-13 23:03) [23]

> 200-ый лежит себе отдельным типом, а почему?
А вот потому что
> Error Cur.rc 1 13: Invalid cursor format

Просто RC, вестимо (непонятно, правда, накой) маскирует ету проблему...


 
ага   (2008-01-14 10:50) [24]


>  200-ый лежит себе отдельным типом, а почему?

Дык потому, что это и есть отдельный тип - анимированный курсор.
Выложи куда-нить этот файл курсора, попробую с ним скомпилить.


 
JetuS   (2008-01-14 11:28) [25]


> Дык потому, что это и есть отдельный тип - анимированный
> курсор.Выложи куда-нить этот файл курсора, попробую с ним
> скомпилить.


Да зачем выкладывать? Возьми любой .ani-файл (даже из папки винды) и попробуй с ним.


 
ALS   (2008-01-14 12:30) [26]

Когда-то подключал анимированный курсор из rc-файла, прописывал код:
 DARROW 21 darrow.ani
Были аналогичные проблемы, если в рессурсах модуля присутствовал XP-манифест.


 
icWasya ©   (2008-01-14 17:16) [27]

компилятор *.rc - файлов для дельфи отстаёт от микрософта, по этому -[26]


 
jetus   (2008-01-14 18:35) [28]


> Были аналогичные проблемы, если в рессурсах модуля присутствовал
> XP-манифест.

Гм... и как узнать, есть ли там манифест?


> компилятор *.rc - файлов для дельфи отстаёт от микрософта,
>  по этому -[26]

Специально уже компилю через микрософтский rc.exe


 
ага   (2008-01-14 19:05) [29]


> JetuS   (14.01.08 11:28) [25]


> Да зачем выкладывать? Возьми любой .ani-файл (даже из папки
> винды) и попробуй с ним.

С любым я уже пробовал - смотри ага   (13.01.08 05:52) [17]
Ну твои дела, как знаешь


 
ага   (2008-01-14 19:10) [30]


> ALS   (14.01.08 12:30) [26]


> Были аналогичные проблемы, если в рессурсах модуля присутствовал
> XP-манифест.

А у меня почему-то и с манифестом никаких проблем


 
jetus   (2008-01-14 21:04) [31]


> С любым я уже пробовал - смотри ага   (13.01.08 05:52) [17]
> Ну твои дела, как знаешь

Гм...
Ну, раз у тебя всё получается, то выложи куда-нибудь архив с проектом (с ехе-шником, rc и res-файлами), а ещё лучше - отправь на jetuso@gmail.com,
буду тебе очень благодарен.


 
ага   (2008-01-14 21:55) [32]

Да я бы отправил, да только твой сервак не хочет принимать архив с экзешником.


 
jetus   (2008-01-15 07:45) [33]


> Да я бы отправил, да только твой сервак не хочет принимать
> архив с экзешником.

Запакуй rar-ом, тогда ругаться не будет. А если лень, то кинь на jetus@rambler.ru :)


 
ага   (2008-01-15 15:25) [34]

Дык я и так паковал - в ZIP, не приниало. Надо было попробовать ахиву расширение заменить, чет не сообразил с недосыпу:)) На рэмблер вроде ушло.


 
jetus   (2008-01-16 18:48) [35]


>  На рэмблер вроде ушло.

Спасибо, пришло )
Действительно, ехе-шник рабочий.
А вот с кодом я чего-то не понял: модуль оказался "пустой":
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

end.


Ни упоминания о курсоре.
Естественно, при компиляции ехе-шник без курсора вышел.

То ли ты мне pas-файл не тот выслал, то ли лыжи не едут )


 
ага   (2008-01-16 19:27) [36]

Блин, точно пустой:(( Без понятия как оно получилось, чет с недосыпу начудил:( Вот модуль:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
{$R WindowsXP.res}
{$R Anicursor.res}

procedure TForm1.FormCreate(Sender: TObject);
var
 h: Cardinal;
begin
 h:= LoadCursor(HInstance, PChar(200));
 if 0 = h then RaiseLastOSError;
 Screen.Cursors[1]:= h;
 Screen.Cursor:= 1;
end;

end.


 
jetus   (2008-01-17 08:09) [37]


> Вот модуль:

Гы, действительно работает )
А теперь вот что я сделал: взял другой .ani-файл, назвал его "1.ani" и просто заменил твой. Скомпилировал ресурс. Перебилдил проект. Запускаю - выдаёт: "System Error.  Code: 1814. Указанное имя ресурса не найдено в файле образа."
Беру твой файл назад. Компилю ресурс. Билдю проект. Запускаю - работает.

Кто-нибудь может объяснить мне, что происходит?!
З.Ы. Пробовал на 6 разных .ani-файлах с размерами от 6кБ до 80кБ - одинаково.


 
JetuS   (2008-01-17 09:19) [38]

Всё, проблема решена.
Достаточно было удалить строку {$R WindowsXP.res}

Большое спасибо за помощь )


 
ага   (2008-01-17 10:42) [39]


> jetus   (17.01.08 08:09) [37]

А я те говорил - давай твой курсор, попробую. Так нет, не послушал.


 
имя   (2008-02-28 22:10) [40]

Удалено модератором



Страницы: 1 2 вся ветка

Текущий архив: 2009.01.18;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.026 c
2-1228457089
webpauk
2008-12-05 09:04
2009.01.18
Событие ListView


4-1204619883
Тфьу
2008-03-04 11:38
2009.01.18
Как узнать высоту заврапленного текста?


2-1228091350
Deled
2008-12-01 03:29
2009.01.18
Принтер


2-1228400690
istok2
2008-12-04 17:24
2009.01.18
изучить почему не удаляется файл...


15-1227066140
ArMellon
2008-11-19 06:42
2009.01.18
Нужен совет...