Конференция "WinAPI" » Как загрузить анимационный курсор (ANI) из ресурсов? [D7, WinXP]
 
  • jetus (13.01.08 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 © (13.01.08 21:29) [21]
    Попробуй MAKEINTRESOURCE() вместо приведения к PChar. И посмотри размер скомпиленного ресурса - если он меньше суммарного размера .cur и .ani иконок, значит ресурс-компилер просто пропускает при построении реса этот .ani файл...

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

    в первый раз в жизни такое получаю ©
  • jetus (13.01.08 22:54) [22]

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

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

    Хотя, в принципе, ошибку выдаёт правильную "Указанное имя ресурса не найдено в файле образа.": в ресурсах ехе-файла в группе курсоров есть курсор 201, а 200-го нету. 200-ый лежит себе отдельным типом, а почему?
  • Dib@zol © (13.01.08 23:03) [23]
    > 200-ый лежит себе отдельным типом, а почему?
    А вот потому что
    > Error Cur.rc 1 13: Invalid cursor format

    Просто RC, вестимо (непонятно, правда, накой) маскирует ету проблему...
  • ага (14.01.08 10:50) [24]

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

    Дык потому, что это и есть отдельный тип - анимированный курсор.
    Выложи куда-нить этот файл курсора, попробую с ним скомпилить.
  • JetuS (14.01.08 11:28) [25]

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


    Да зачем выкладывать? Возьми любой .ani-файл (даже из папки винды) и попробуй с ним.
  • ALS (14.01.08 12:30) [26]
    Когда-то подключал анимированный курсор из rc-файла, прописывал код:
     DARROW 21 darrow.ani
    Были аналогичные проблемы, если в рессурсах модуля присутствовал XP-манифест.
  • icWasya © (14.01.08 17:16) [27]
    компилятор *.rc - файлов для дельфи отстаёт от микрософта, по этому -[26]
  • jetus (14.01.08 18:35) [28]

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

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


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

    Специально уже компилю через микрософтский rc.exe
  • ага (14.01.08 19:05) [29]

    > JetuS   (14.01.08 11:28) [25]


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

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

    > ALS   (14.01.08 12:30) [26]


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

    А у меня почему-то и с манифестом никаких проблем
  • jetus (14.01.08 21:04) [31]

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

    Гм...
    Ну, раз у тебя всё получается, то выложи куда-нибудь архив с проектом (с ехе-шником, rc и res-файлами), а ещё лучше - отправь на jetuso@gmail.com,
    буду тебе очень благодарен.
  • ага (14.01.08 21:55) [32]
    Да я бы отправил, да только твой сервак не хочет принимать архив с экзешником.
  • jetus (15.01.08 07:45) [33]

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

    Запакуй rar-ом, тогда ругаться не будет. А если лень, то кинь на jetus@rambler.ru :)
  • ага (15.01.08 15:25) [34]
    Дык я и так паковал - в ZIP, не приниало. Надо было попробовать ахиву расширение заменить, чет не сообразил с недосыпу:)) На рэмблер вроде ушло.
  • jetus (16.01.08 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-файл не тот выслал, то ли лыжи не едут )
  • ага (16.01.08 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 (17.01.08 08:09) [37]

    > Вот модуль:

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

    Кто-нибудь может объяснить мне, что происходит?!
    З.Ы. Пробовал на 6 разных .ani-файлах с размерами от 6кБ до 80кБ - одинаково.
  • JetuS (17.01.08 09:19) [38]
    Всё, проблема решена.
    Достаточно было удалить строку {$R WindowsXP.res}

    Большое спасибо за помощь )
  • ага (17.01.08 10:42) [39]

    > jetus   (17.01.08 08:09) [37]

    А я те говорил - давай твой курсор, попробую. Так нет, не послушал.
 
Конференция "WinAPI" » Как загрузить анимационный курсор (ANI) из ресурсов? [D7, WinXP]
Есть новые Нет новых   [134431   +14][b:0.001][p:0.002]