Конференция "KOL" » Исходники... [Delphi]
 
  • SPeller © (28.03.09 02:47) [20]
    А я разбирал IconGroup в ресурсах :) В чем именно проблема?
  • MTsv DN (28.03.09 09:48) [21]
    У меня MAINICON содержит 12 иконок (4 размера для 3 разных битностей).
    Мне надо вытащить в PIcon любую по параметрам или индексу.
    Это исходное задание было.

    А в моем последнем посте здесь, грабли вот какие. Размер MAINICON в ICON_GROUP всего 118 байт, хотя сама иконка около 160 кБ. Как правильно до иконки добраться?
  • SPeller © (28.03.09 20:04) [22]
    Есть у меня такой старый исходник:

    procedure TPageRes.LoadIconGroup(ANode: PResNode; IsIcon: Boolean);

     function SearchNode( ID: Word; iType: Cardinal; Root: PResNode ): PResNode;
     var
       I: Integer;
     begin
       Result := nil;
       if not Root.IsDirectory then
       begin
         if (Root.ID = ID) and (Root.DataType = iType) then
           Result := Root
         else
           Result := nil;
         Exit;
       end;

       for I := 0 to Root.SubDirs.Count - 1 do
       begin
         Result := SearchNode( ID, iType, Root.SubDirs.Items[ I ] );
         if Result <> nil then
           Break;
       end;
     end;

    var
     St: PStream;
     GID: PGrpIconDir;
     IDE: TGrpIconDirEntry;
     Buf: Pointer;
     I, N: Integer;
     ItemNode: PResNode;
    begin
     St := NewReadFileStream(MainWindow.FileName);

     FFrm.lstImgGroup.Clear;

     GetMem( Buf, ANode.DataSize );
     St.Seek( ANode.DataRaw, spBegin );
     St.Read( Buf^, ANode.DataSize );
     St.Free;

     GID := Buf;

     for I := 0 to GID.Count - 1 do
     begin
       IDE := GID.Entries[ I ];
       if IsIcon then
         N := FFrm.lstImgGroup.Add(ImageCaption(IDE.Width, IDE.Height, IDE.BitCount, IDE.ID))
       else
         N := FFrm.lstImgGroup.Add(ImageCaption(IDE.Width, IDE.Width, IDE.BitCount, IDE.ID));
       if IsIcon then begin
         ItemNode := SearchNode(IDE.ID, Cardinal(RT_ICON), ResTreeRoot);
         FFrm.lstImgGroup.ItemData[N] := Cardinal(ItemNode);
       end
       else begin
         ItemNode := SearchNode(IDE.ID, Cardinal(RT_CURSOR), ResTreeRoot);
         FFrm.lstImgGroup.ItemData[N] := Cardinal(ItemNode);
       end;
       ItemNode.ImgX := IDE.Width;
       ItemNode.ImgY := IDE.Height;
       ItemNode.ImgColorDepth := IDE.BitCount;
     end;
     //FFrm.lstImgGroup.CurIndex := 0;
     SearchMaxDepthAndSize;
     FFrm.lblImgInfo.Visible := not IsIcon;
     FFrm.lstImgGroupSelChange(nil);

     FreeMem( Buf );
    end;



    Писалось всё по msdn. Работает :) Мож кто знает, писал я плагин для ТС, PEViewer называется. Было дело ковырял ресурсы, но так и не дошло это дело до релизов плагина.

    Тип ResNode выглядит так:

     TResNode = object( TObj )
     private
    ...
     public
       constructor Create;
       destructor Destroy; virtual;
       property Parent: PResNode read fParent write fParent;
       property IsRoot: Boolean read fIsRoot;
       property IsDirectory: Boolean read fIsDirectory write fIsDirectory;
       property SubDirs: PList read fSubDirs;
       property DataRaw: Cardinal read fDataRaw write fDataRaw;
       property DataSize: Cardinal read fDataSize write fDataSize;
       property DataType: Cardinal read fDataType write fDataType;
       property DisplayName: string read FDisplayName write FDisplayName;
       property Name: string read fName write fName;
       property Lang: Cardinal read fLang write flang;
       property CodePage: Cardinal read fCodePage write fCodePage;
       property ID: Word read fID write fID;
       property ImgX: Integer read FImgX write FImgX;
       property ImgY: Integer read FImgY write FImgY;
       property ImgColorDepth: Byte read FImgColorDepth write FImgColorDepth;
     end;


    Объект носит информационный характер, акромя конструктора и деструктора методов нет. Пока еще не ковырялся до тех мест, где это всё задаётся значениями. ВОбщем, структуру кода выемки ресурсов из потока, думаю, поймешь. Если что не ясно спрашивай.
  • SPeller © (28.03.09 20:15) [23]
    Видимо, ты не учел то, что icongroup - это лишь ссылки на тип ресурса single icon.
    На всякий вот еще подсказка:
     PGrpIconDirEntry = ^TGrpIconDirEntry;
     TGrpIconDirEntry = packed record
       Width: Byte;
       Height: Byte;
       ColorCount: Byte;
       Reserved: Byte;
       Planes: Word;
       BitCount: Word;
       BytesInRes: DWord;
       ID: Word;
     end;

     PGrpIconDir = ^TGrpIconDir;
     TGrpIconDir = packed record
       Reserved: Word;
       iType: Word; // 1 for icons, 2 for cursors
       Count: Word;
       Entries: array[ 0..0 ] of TGrpIconDirEntry;
     end;

  • MTsv DN (28.03.09 20:51) [24]
    Твой исходник, ща гляну...спасибо.

    А про твой последний пост. Эти 2е записи я знаю, по ним я работаю с иконками с диска... А вот "Видимо, ты не учел то, что icongroup - это лишь ссылки на тип ресурса single icon." это да, тока так и не понял где. Щас буду разбираться...
  • MTsv DN (28.03.09 21:57) [25]
    Все... Разобрался... Огромный респект...

    Все упиралось в то, что при работе с файлом используется:
    Offset : DWORD;


    а при использовании ресурса:
    ID: Word;

  • MTsv DN (28.03.09 22:16) [26]
    Всем привет...

    Благодаря помощи SPeller...закончил проект по работе с мультииконками.

    Работает как с файлами на диске, так и с ресурсами RT_GROUP_ICON.
    http://ru.uus4u.com/downloads/sources/multiicons.7z
  • mdw (29.03.09 14:18) [27]

    > http://ru.uus4u.com/downloads/sources/multiicons.7z

    Миша, а ты бы на сайт выкладывал сразу, в "графику". А то когда подтебуется, и не вспомнишь что лежит на uus4u... Да и предыдущие WAV, FLAC и т.д тоже в раздел ММ можно....
  • MTsv DN (29.03.09 15:07) [28]
    Это ж больше демки... Хорошо, займусь как-нибудь...
  • MTsv DN (29.03.09 15:10) [29]
    Кстати, обновил (пока у себя) проект MultiIcon.

    Изменения:
    Функции возвращают сразу требуемую иконку, а не поток. Просто автоматизация некоторые действий.

    Ссылка та же:
    http://ru.uus4u.com/downloads/sources/multiicons.7z
  • имя (08.04.09 01:57) [30]
    Удалено модератором
  • имя (16.04.09 13:58) [31]
    Удалено модератором
  • Игорь © (21.04.09 19:43) [32]
    Некоторые товарищи замучили вопросом "Как запустить процесс от имени системы"

    Вот хочу поделиться исходником, довел вроде до ума http://www.onlinedisk.ru/file/125336/ 2000 -XP
  • имя (14.08.09 05:04) [33]
    Удалено модератором
 
Конференция "KOL" » Исходники... [Delphi]
Есть новые Нет новых   [134465   +0][b:0][p:0.003]