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

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

ImageLit [D7, WinXP]


Igor_thief ©   (2004-12-21 11:26:00) 

В ImageList при добавлении иконок в DesignTime есть такая кнопочка как Export, при помощти которой можно перегнать все содержимое ImageList в один BMP файл. Как потом загрузить иконки из этого файла обратно в ImageList программно?


Igor_thief   (2004-12-30 13:08:00) [1]

Ученик   (28.12.04 21:53) [12]
Вечерком проверю!


Ученик   (2004-12-28 21:53:00) [2]

На основе Delphi7\Source\Property Editors\ClxImgEdit.pas

Bitmap.LoadFromFile()


function ImageListFromBitmap(ImageList : TCustomImageList; Bitmap : TBitmap; MaskColor : TColor = clFuchsia) : Integer;
var
 X, Y: Integer;
 IWidth, IHeight: Integer;
 NewBitmap: TBitmap;
 SubDivideX, SubDivideY: Boolean;
 DivideX, DivideY: Integer;
begin
 Result := ImageList.Count;
 NewBitmap := TBitmap.Create;
 try
   IWidth  := ImageList.Width;
   IHeight := ImageList.Height;
   NewBitmap.Width  := IWidth;
   NewBitmap.Height := IHeight;

   SubDivideX := (Bitmap.Width > IWidth) and (Bitmap.Width mod IWidth = 0);
   SubDivideY := (Bitmap.Height > IHeight) and (Bitmap.Height mod IHeight = 0);

   if SubDivideX then
     DivideX := Bitmap.Width div IWidth
   else
     DivideX := 1;

   if SubDivideY then
     DivideY := Bitmap.Height div IHeight
   else
     DivideY := 1;

   for Y := 0 to DivideY - 1 do
     for X := 0 to DivideX - 1 do begin
       NewBitmap.Canvas.CopyRect(Rect(0, 0, NewBitmap.Width,
                 NewBitmap.Height), Bitmap.Canvas,
                 Rect(X * IWidth, Y * IHeight, (X + 1) * IWidth,
                 (Y + 1) * IHeight));
       ImageList.AddMasked(NewBitmap, MaskColor)
     end
 finally
   NewBitmap.Free
 end;
end;


Igor_thief   (2004-12-28 18:48:00) [3]

Leonid Troyanovsky ©   (25.12.04 13:44) [9]
Не работает!


Igor_thief   (2004-12-28 18:38:00) [4]

Leonid Troyanovsky ©   (25.12.04 13:44) [9]
Шас потестю!


Leonid Troyanovsky   (2004-12-25 13:44:00) [5]


> Igor_thief   (23.12.04 21:53) [6]
> А как обходился без экспорт?


by Vladimir Titov:


uses
 commctrl;

procedure ImageList_WriteData(ImageList: TImageList; Stream: TStream);
var
 SA: TStreamAdapter;
begin
 SA := TStreamAdapter.Create(Stream);
 try
   if not ImageList_Write(ImageList.Handle, SA) then
     raise EWriteError.Create('Failed to write ImageList data to stream');
 finally
   SA.Free;
 end;
end;

procedure ImageList_ReadData(ImageList: TImageList; Stream: TStream);
var
 SA: TStreamAdapter;
begin
 SA := TStreamAdapter.Create(Stream);
 try
   ImageList.Handle := ImageList_Read(SA);
   if ImageList.Handle = 0 then
     raise EReadError.Create('Failed to read ImageList data from stream');
 finally
   SA.Free;
 end;
end;

procedure ImageList_SaveToFile(ImageList: TImageList; const FileName: string);
var
 FileStream: TFileStream;
begin
 FileStream := TFileStream.Create(FileName, fmCreate);
 try
   ImageList_WriteData(ImageList, FileStream);
 finally
   FileStream.Free;
 end;
end;

procedure ImageList_LoadFromFile(ImageList: TImageList; const FileName:
string);
var
 FileStream: TFileStream;
begin
 FileStream := TFileStream.Create(FileName, fmShareDenyNone);
 try
   ImageList_ReadData(ImageList, FileStream);
 finally
   FileStream.Free;
 end;
end;


--
Regards, LVT.


Igor_thief   (2004-12-24 21:02:00) [6]

Просто Джо ©   (24.12.04 03:07) [7]
Дело в том, что мне надо чтобы все катинки из ImageList не были в ресурсе программы, а загружались в него из внешнего файла. Желательно чтобы он был один, а не равен числу картинок. Экспорт помогает решить это. НО также надо сделать возможность экспорта программно, так как количество картинок может меняться.


Просто Джо   (2004-12-24 03:07:00) [7]


> Igor_thief   (23.12.04 21:53) [6]

Ну и зачем "этот" экспорт так нужен?


Igor_thief   (2004-12-23 21:53:00) [8]

Leonid Troyanovsky ©   (21.12.04 21:02) [5]
Ух какой нервный!
Спокойно!
А как обходился без экспорт?


Leonid Troyanovsky   (2004-12-21 21:02:00) [9]


> Igor_thief   (21.12.04 16:47) [4]
> Смотрите Igor_thief   (21.12.04 11:57) [2]


Не буду я ничего смотреть.
Хотел, конечно, сначала извиниться за поздний пост,
(тем более, что это была техническая ошибка).
А потом решил, что не стоит. Никому не режет глаз кривой
сабж, никто не извиняется за допущенные ошибки.
Так вот, на моей D6 я могу сохранить в линию (не в двумерный
массив) хоть 150 иконок.
А в D3 я никогда и не знал таких прелестей (Export) и
прекрасно без оной обходился (хоть 200 иконок).

Вот так-то.

--
С уважением, LVT.


Igor_thief   (2004-12-21 16:47:00) [10]

Leonid Troyanovsky ©   (21.12.04 14:04) [3]
СмотритеIgor_thief   (21.12.04 11:57) [2]
--
С уважением, Igor_thief.


Leonid Troyanovsky   (2004-12-21 14:04:00) [11]


> Igor_thief   (21.12.04 11:26)  
> В ImageList при добавлении иконок в DesignTime есть такая
> кнопочка как Export, при помощти которой можно перегнать
> все содержимое ImageList в один BMP файл. Как потом загрузить
> иконки из этого файла обратно в ImageList программно?


FileLoad(rtBitmap, ..) ?

--
С уважением, LVT.


Igor_thief   (2004-12-21 11:57:00) [12]

Александр Иванов ©   (21.12.04 11:43) [1]
Пробывал, но по неизвестным мне причинам грузится только верхний ряд картинок (при условии что картинки разместились как матрица 3х3, 4х4...).


Александр Иванов   (2004-12-21 11:43:00) [13]

ImageList1.FileLoad(rtBitmap,FileName,clFuchsia)


Наверх

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