Перейти к содержанию
Fire Monkey от А до Я

RoschinSpb

Пользователи
  • Постов

    187
  • Зарегистрирован

  • Посещение

  • Победитель дней

    10

Активность репутации

  1. Like
    RoschinSpb получил реакцию от FIL в Загрузка иконок в TimageList из файла   
    Не похоже нет. См. демонстрационное видео https://www.youtube.com/watch?v=3voFs62PYl0&feature=youtu.be&t=260
    Если у вас сохранилось имя файла, то можно заново загрузить все изображения с новыми параметрами и в числе прочего с новым цветом прозрачности.
    Хотя параметры изображения действительно применяются только в момент загрузки. Потому, что это все-таки не фотошоп и исходник картинки не хранится в FMX. То, что попадает в FMX это часто результат обработки с потерей данных. Т.е. если исходное изображение 128x128 сначала сделать 16х16, а потом 32х32, то качество количество деталей будет как у 16х16. Поэтому цвет и размеры применяются только один раз в момент загрузки, что позволяет минимизировать потери.
    В FMX-файле данные хранятся только в png-формате (во всяком случае на текущий момент).
    Редактор в IDE использует функцию TCustomBitmapItem.CreateBitmap.
    MultiresBitmap имеет свойства Width, Height, TransparentColor, SizeKind. Каждый элемент этой коллекции MultiresBitmap имеет свойство FileName, Scale.
     
    Функция CreateBitmap на основе этих данных создает TBitmap. Если она вернула не nil, то вы можете присвоить эту картинку элементу коллекции TMultiresBitmap.
     
    Кактотак мы перегружаем все изображения.
            MultiresBitmap.BeginUpdate;         try           for I := 0 to TMultiresBitmap.Count - 1 do           begin             FmxBitmapSource := MultiresBitmap[I].CreateBitmap;             try               if Assigned(FmxBitmapSource) then               begin                 MultiresBitmap[I].Bitmap.Assign(FmxBitmapSource);               end               else               begin                 MultiresBitmap[I].Bitmap.SetSize(0, 0);                 MultiresBitmap[I].FileName := '';               end;             finally               FreeAndNil(FmxBitmapSource);             end;           end;         finally           MultiresBitmap.EndUpdate; Если у вас TransparentColor не clNone, то просто попиксельно заменяется указанный цвет на полностью прозрачный. Если TransparentColor = clDefault, то используется цвет нижней левой точки. Исходники CreateBitmap доступны, так что можете взять за основу, и сделать что-то подобное, если данные грузятся не из файла.
    А что касается добавления картинок в TImageList, то можно посмотреть статью http://community.embarcadero.com/blogs/entry/timagelistxe8ru и демку, которая поставляется в составе Delphi, или взять её отсюда http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/trunk/Object%20Pascal/FireMonkey%20Desktop/ImageList
  2. Like
    RoschinSpb получил реакцию от rareMax в Загрузка иконок в TimageList из файла   
    Загрузка картинки будет выглядеть примерно так.
    procedure TForm11.Button2Click(Sender: TObject); const SourceName = 'Картинка'; procedure LoadPicture(const Source: TCustomSourceItem; const Scale: Single; const FileName: string); var BitmapItem: TCustomBitmapItem; TmpBitmap: TBitmap; begin BitmapItem := Source.MultiResBitmap.ItemByScale(Scale, True, True); if BitmapItem = nil then begin BitmapItem := Source.MultiResBitmap.Add; BitmapItem.Scale := Scale; end; BitmapItem.FileName := FileName; TmpBitmap := BitmapItem.CreateBitmap; try if TmpBitmap <> nil then BitmapItem.Bitmap.Assign(TmpBitmap); finally TmpBitmap.Free; end; end; var NewSource: TCustomSourceItem; NewDestination: TCustomDestinationItem; NewLayer: TLayer; begin if ImageList1.Source.IndexOf(SourceName) = -1 then begin NewSource := ImageList1.Source.Add; NewSource.Name := SourceName; NewSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia; NewSource.MultiResBitmap.SizeKind := TSizeKind.Custom; NewSource.MultiResBitmap.Width := 16; NewSource.MultiResBitmap.Height := 16; LoadPicture(NewSource, 1, 'D:\Мои веселые картинки\Icons\16x16\alarm16.bmp'); LoadPicture(NewSource, 1.5, 'D:\Мои веселые картинки\Icons\24x24\alarm24.bmp'); NewDestination := ImageList1.Destination.Add; NewLayer := NewDestination.Layers.Add; NewLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, NewSource.MultiResBitmap.Width, NewSource.MultiResBitmap.Height); NewLayer.Name := SourceName; ControlAction1.ImageIndex := NewDestination.Index; end; end; Здесь как видно грузится деве картинки 16х16 и 24х24, при этом используются масштабы 1 и 1,5. После загрузки меняется свойство ImageIndex у действия ControlAction1. Загруженная картинка должна автоматом появится на всех кнопках, которые используют ControlAction1.
     
     

  3. Like
    RoschinSpb получил реакцию от Andrey Efimov в Загрузка иконок в TimageList из файла   
    Не похоже нет. См. демонстрационное видео https://www.youtube.com/watch?v=3voFs62PYl0&feature=youtu.be&t=260
    Если у вас сохранилось имя файла, то можно заново загрузить все изображения с новыми параметрами и в числе прочего с новым цветом прозрачности.
    Хотя параметры изображения действительно применяются только в момент загрузки. Потому, что это все-таки не фотошоп и исходник картинки не хранится в FMX. То, что попадает в FMX это часто результат обработки с потерей данных. Т.е. если исходное изображение 128x128 сначала сделать 16х16, а потом 32х32, то качество количество деталей будет как у 16х16. Поэтому цвет и размеры применяются только один раз в момент загрузки, что позволяет минимизировать потери.
    В FMX-файле данные хранятся только в png-формате (во всяком случае на текущий момент).
    Редактор в IDE использует функцию TCustomBitmapItem.CreateBitmap.
    MultiresBitmap имеет свойства Width, Height, TransparentColor, SizeKind. Каждый элемент этой коллекции MultiresBitmap имеет свойство FileName, Scale.
     
    Функция CreateBitmap на основе этих данных создает TBitmap. Если она вернула не nil, то вы можете присвоить эту картинку элементу коллекции TMultiresBitmap.
     
    Кактотак мы перегружаем все изображения.
            MultiresBitmap.BeginUpdate;         try           for I := 0 to TMultiresBitmap.Count - 1 do           begin             FmxBitmapSource := MultiresBitmap[I].CreateBitmap;             try               if Assigned(FmxBitmapSource) then               begin                 MultiresBitmap[I].Bitmap.Assign(FmxBitmapSource);               end               else               begin                 MultiresBitmap[I].Bitmap.SetSize(0, 0);                 MultiresBitmap[I].FileName := '';               end;             finally               FreeAndNil(FmxBitmapSource);             end;           end;         finally           MultiresBitmap.EndUpdate; Если у вас TransparentColor не clNone, то просто попиксельно заменяется указанный цвет на полностью прозрачный. Если TransparentColor = clDefault, то используется цвет нижней левой точки. Исходники CreateBitmap доступны, так что можете взять за основу, и сделать что-то подобное, если данные грузятся не из файла.
    А что касается добавления картинок в TImageList, то можно посмотреть статью http://community.embarcadero.com/blogs/entry/timagelistxe8ru и демку, которая поставляется в составе Delphi, или взять её отсюда http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/trunk/Object%20Pascal/FireMonkey%20Desktop/ImageList
  4. Like
    RoschinSpb получил реакцию от Andrey Efimov в Загрузка иконок в TimageList из файла   
    Попробую. Выкладывайте на всеобщее обозрение здесь, или в комментариях к статье.
  5. Like
    RoschinSpb получил реакцию от Rusland в Png в TImage из TImageList   
    Если дважды кликнуть на картинку в разделе Selected Image, или Source of Images то можно увидеть редактор TMultiresBitmap.
    Дело в том, что каждая картинка может иметь несколько вариантов которые адаптированы под разные масштабы. В Selected Image всегда задаются размеры для масштаба 1.
    Когда добавляется новая картинка которая имеет характерные размеры кратные 8 то для неё автоматически выбирается масштаб исходя из того, что картинка в масштабе 1 имеет размеры 16x16. Потом Вы можете добавить еще несколько изображений.
    Да размер картинки на выходе зависит от того размера, который укажете. Из нескольких картинок будет выбран наиболее подходящий вариант и вписан в указанные размеры с сохранением пропорций.
     
    Например рисовать можно так:
    procedure TForm25.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin   ImageList1.Draw(Canvas, TRectF.Create(10, 10, 32, 34), 0, 1); end; Я не совсем понял что значит старым способом, но до исходных картинок можно добраться примерно так
      ImageList1.Source[0].MultiResBitmap.Items[0].Bitmap; Есть небольшая статья. Также есть демка ImageListDemo.dpr, которая должна по идее входить в состав Delphi.


  6. Like
    RoschinSpb получил реакцию от Равиль Зарипов (ZuBy) в Png в TImage из TImageList   
    Что такое marker? Если TMapMarkerDescriptor, то это Record. Icon это просто поле которое ссылко на объект. Если объект будет уничтожен, то мы получим Access Violation.
    TImageList в Fire Monkey не имеет метода GetBitmap. Зато есть метод Bitmap. О котором можно прочитать в документации: FMX.ImgList.TCustomImageList.Bitmap в частности
     
    Кроме того в предложенной статье написано:
    Т.е. в отличии от VCL-ного TImageList, в FMX, он не имеет постоянного размера. В зависимости от того, какой размер нам нужен будет сгенерирована картинка TBitmap растянутая/сжатая до нужных размеров с сохранением пропорций. Чтобы это не занимало слишком много времени последние сгенерироваyные картинки хранятся во внутреннем буфере из которого они могут "выталкиваться".
    В Image (как и для большинства классов) при присваивании экземпляра какого-нибудь объекта в сеттере вызывается метод Assign, т.е. копируется не ссылка на объект, а копируются данные. В этом случае нас не интересует дальнейшая судьба исходного объекта.
  7. Like
    RoschinSpb получил реакцию от krapotkin в Png в TImage из TImageList   
    Что такое marker? Если TMapMarkerDescriptor, то это Record. Icon это просто поле которое ссылко на объект. Если объект будет уничтожен, то мы получим Access Violation.
    TImageList в Fire Monkey не имеет метода GetBitmap. Зато есть метод Bitmap. О котором можно прочитать в документации: FMX.ImgList.TCustomImageList.Bitmap в частности
     
    Кроме того в предложенной статье написано:
    Т.е. в отличии от VCL-ного TImageList, в FMX, он не имеет постоянного размера. В зависимости от того, какой размер нам нужен будет сгенерирована картинка TBitmap растянутая/сжатая до нужных размеров с сохранением пропорций. Чтобы это не занимало слишком много времени последние сгенерироваyные картинки хранятся во внутреннем буфере из которого они могут "выталкиваться".
    В Image (как и для большинства классов) при присваивании экземпляра какого-нибудь объекта в сеттере вызывается метод Assign, т.е. копируется не ссылка на объект, а копируются данные. В этом случае нас не интересует дальнейшая судьба исходного объекта.
  8. Like
    RoschinSpb получил реакцию от xenon54 в Png в TImage из TImageList   
    Что такое marker? Если TMapMarkerDescriptor, то это Record. Icon это просто поле которое ссылко на объект. Если объект будет уничтожен, то мы получим Access Violation.
    TImageList в Fire Monkey не имеет метода GetBitmap. Зато есть метод Bitmap. О котором можно прочитать в документации: FMX.ImgList.TCustomImageList.Bitmap в частности
     
    Кроме того в предложенной статье написано:
    Т.е. в отличии от VCL-ного TImageList, в FMX, он не имеет постоянного размера. В зависимости от того, какой размер нам нужен будет сгенерирована картинка TBitmap растянутая/сжатая до нужных размеров с сохранением пропорций. Чтобы это не занимало слишком много времени последние сгенерироваyные картинки хранятся во внутреннем буфере из которого они могут "выталкиваться".
    В Image (как и для большинства классов) при присваивании экземпляра какого-нибудь объекта в сеттере вызывается метод Assign, т.е. копируется не ссылка на объект, а копируются данные. В этом случае нас не интересует дальнейшая судьба исходного объекта.
  9. Like
    RoschinSpb получил реакцию от Andrey Efimov в Как правильно использовать MultiresBitmap в TImageList?   
    image1.Bitmap.Assign(imagelist1.Bitmap(TSizeF.Create(258, 344),0));
    Imagelist1 ни чего не знает о масштабе. Просто согласно указанного размера выбирается наиболее подходящая картинка и растягивается таким образом, чтобы вписаться в размеры. Т.е. в данном случае будет выбираться картинка с размерами наиболее близкими к 258, 344. Тут надо самостоятельно определять масштаб и умножать на него размеры.
      Scale := Canvas.Scale;   Image1.Bitmap.Assign(imagelist1.Bitmap(TSizeF.Create(258 * Scale, 344 * Scale),0)); Если хотите лишить себя удовольствия разбираться с масштабами, то воспользуйтесь компонентом TGlyph, который сам рисует учитывая свои размеры и масштаб.
    См. также маленький пример.TestScaledImageList.zip
  10. Like
    RoschinSpb получил реакцию от Andrey Efimov в Как правильно использовать MultiresBitmap в TImageList?   
    image1.MultiResBitmap.Count = 2 Да, в памяти обе картинки. Чтобы добавить ложку меда, они хранятся в png-формате до первого обращение непосредственно к TBitmap. По этой причине если к примеру нужно узнать ширину картинки, то лучше обращаться к элементу коллекции
    W := Image1.MultiResBitmap[I].Width; // остается в запакованном виде чем к битмапу
    W := Image1.MultiResBitmap[I].Bitmap.Width; // распаковываем картинку, хотя она не нужна. А вообще говоря по этой причине лучше не использовать TImage для хранения изображений в fmx-файлах.
    Как я писал в статье что если мы захотим в Run-Time динамически формировать большое количество контролов с картинками (например, пункты TListBox), то мы будем иметь множество копий одних и тех же графических данных. При использовании TImageList каждый пункт будет содержать только номер изображаемой картинки.
     
    Нет, 1.3 не бывает. У моего Nexus 7: Scale = 1.33125   Картинки в основном сжимаются. Только если картинка чуть-чуть (1/5) меньше чем надо, то она растягивается. 
    Т.е. если есть картинки в масштабе 1 и 2 и требуемый масштаб 1.2, то будет использована картинка в масштабе 1. Если требуемый масштаб 1.21 то будет использована картинка в масштабе 2.
     
  11. Like
    RoschinSpb получил реакцию от Kitty в Как правильно использовать MultiresBitmap в TImageList?   
    image1.Bitmap.Assign(imagelist1.Bitmap(TSizeF.Create(258, 344),0));
    Imagelist1 ни чего не знает о масштабе. Просто согласно указанного размера выбирается наиболее подходящая картинка и растягивается таким образом, чтобы вписаться в размеры. Т.е. в данном случае будет выбираться картинка с размерами наиболее близкими к 258, 344. Тут надо самостоятельно определять масштаб и умножать на него размеры.
      Scale := Canvas.Scale;   Image1.Bitmap.Assign(imagelist1.Bitmap(TSizeF.Create(258 * Scale, 344 * Scale),0)); Если хотите лишить себя удовольствия разбираться с масштабами, то воспользуйтесь компонентом TGlyph, который сам рисует учитывая свои размеры и масштаб.
    См. также маленький пример.TestScaledImageList.zip
  12. Like
    RoschinSpb получил реакцию от Kitty в Как правильно использовать MultiresBitmap в TImageList?   
    image1.MultiResBitmap.Count = 2 Да, в памяти обе картинки. Чтобы добавить ложку меда, они хранятся в png-формате до первого обращение непосредственно к TBitmap. По этой причине если к примеру нужно узнать ширину картинки, то лучше обращаться к элементу коллекции
    W := Image1.MultiResBitmap[I].Width; // остается в запакованном виде чем к битмапу
    W := Image1.MultiResBitmap[I].Bitmap.Width; // распаковываем картинку, хотя она не нужна. А вообще говоря по этой причине лучше не использовать TImage для хранения изображений в fmx-файлах.
    Как я писал в статье что если мы захотим в Run-Time динамически формировать большое количество контролов с картинками (например, пункты TListBox), то мы будем иметь множество копий одних и тех же графических данных. При использовании TImageList каждый пункт будет содержать только номер изображаемой картинки.
     
    Нет, 1.3 не бывает. У моего Nexus 7: Scale = 1.33125   Картинки в основном сжимаются. Только если картинка чуть-чуть (1/5) меньше чем надо, то она растягивается. 
    Т.е. если есть картинки в масштабе 1 и 2 и требуемый масштаб 1.2, то будет использована картинка в масштабе 1. Если требуемый масштаб 1.21 то будет использована картинка в масштабе 2.
     
  13. Like
    RoschinSpb получил реакцию от xenon54 в Как правильно использовать MultiresBitmap в TImageList?   
    image1.Bitmap.Assign(imagelist1.Bitmap(TSizeF.Create(258, 344),0));
    Imagelist1 ни чего не знает о масштабе. Просто согласно указанного размера выбирается наиболее подходящая картинка и растягивается таким образом, чтобы вписаться в размеры. Т.е. в данном случае будет выбираться картинка с размерами наиболее близкими к 258, 344. Тут надо самостоятельно определять масштаб и умножать на него размеры.
      Scale := Canvas.Scale;   Image1.Bitmap.Assign(imagelist1.Bitmap(TSizeF.Create(258 * Scale, 344 * Scale),0)); Если хотите лишить себя удовольствия разбираться с масштабами, то воспользуйтесь компонентом TGlyph, который сам рисует учитывая свои размеры и масштаб.
    См. также маленький пример.TestScaledImageList.zip
  14. Like
    RoschinSpb получил реакцию от Brovin Yaroslav в Как правильно использовать MultiresBitmap в TImageList?   
    image1.Bitmap.Assign(imagelist1.Bitmap(TSizeF.Create(258, 344),0));
    Imagelist1 ни чего не знает о масштабе. Просто согласно указанного размера выбирается наиболее подходящая картинка и растягивается таким образом, чтобы вписаться в размеры. Т.е. в данном случае будет выбираться картинка с размерами наиболее близкими к 258, 344. Тут надо самостоятельно определять масштаб и умножать на него размеры.
      Scale := Canvas.Scale;   Image1.Bitmap.Assign(imagelist1.Bitmap(TSizeF.Create(258 * Scale, 344 * Scale),0)); Если хотите лишить себя удовольствия разбираться с масштабами, то воспользуйтесь компонентом TGlyph, который сам рисует учитывая свои размеры и масштаб.
    См. также маленький пример.TestScaledImageList.zip
  15. Like
    RoschinSpb получил реакцию от Brovin Yaroslav в [TScrollBox] Можно ли изменить зону оттягивания у ScrollBox?   
    Такой возможности нет
  16. Like
    RoschinSpb получил реакцию от xenon54 в Как работает TImageList c TButton ?   
    Поменять размер картинки можно путем изменения стиля.

    Вот результат:

    Можно пойти и традиционным путем и просто вставить в кнопку контрол TGlyph

     
     

    Если в каких-то стилях не отображается, или отображается не так красиво, как хотелось бы, то надо сообщить в QC. Проблема скорее всего в стиле. Возможно в него просто забыли добавить TGlyph.
    P.S. по предыдущему вопросу, что умолчательный размер картинки 16 рассчитан на кнопки умолчательного размера. Вот как это выглядит в VCL
  17. Like
    RoschinSpb отреагировална Brovin Yaroslav в Перевод массива кодов символов в строку   
    Да, вы правы. Ошибся.
     
    StringOf использует текущую кодировку на платформе, на Windows - это ANSI, на мобильных платформах - это UTF8:
    function StringOf(const Bytes: TBytes): UnicodeString; begin if Assigned(Bytes) then Result := TEncoding.Default.GetString(Bytes, Low(Bytes), High(Bytes) + 1) else Result := ''; end; Поэтому лучше используйте TEncoding.ANSII:
    TEncoding.ANSI.GetString(BufferOfBytes, Low(BufferOfBytes), High(BufferOfBytes) + 1);
  18. Like
    RoschinSpb получил реакцию от Andrey Efimov в Мне кажется, что TNumberBox работает не так   
    Вообще всегда приходит либо KeyChar, либо Key. Вроде бы об этом написано в тут и тут.
    Key - это код виртуальной клавиши vkXXX. Он зависит от конкретной нажатой клавиши, при чем на разных платформах он приводится к виндовым эквивалентам. 
    KeyChar - это символ который может быть изображен где-нибудь в поле ввода. Он зависит от текущего языка, раскладки, IME, способа ввода (в числе прочего можно использовать голосовой ввод) и еще неизвестно чего, короче его подставляет система по не известным в общем случае правилам. 
    Сделано так специально, чтобы не путали и не пытались выводить в виде текста букву А, когда нажато сочетание клавиш Ctrl+A. Эти два параметра принципиально по разному обрабатываются.
  19. Like
    RoschinSpb получил реакцию от Brovin Yaroslav в Мне кажется, что TNumberBox работает не так   
    Вообще всегда приходит либо KeyChar, либо Key. Вроде бы об этом написано в тут и тут.
    Key - это код виртуальной клавиши vkXXX. Он зависит от конкретной нажатой клавиши, при чем на разных платформах он приводится к виндовым эквивалентам. 
    KeyChar - это символ который может быть изображен где-нибудь в поле ввода. Он зависит от текущего языка, раскладки, IME, способа ввода (в числе прочего можно использовать голосовой ввод) и еще неизвестно чего, короче его подставляет система по не известным в общем случае правилам. 
    Сделано так специально, чтобы не путали и не пытались выводить в виде текста букву А, когда нажато сочетание клавиш Ctrl+A. Эти два параметра принципиально по разному обрабатываются.
  20. Like
    RoschinSpb получил реакцию от Andrey Efimov в Как программно реализовать подгонку картинки в TImage в RunTime, так же как это делает MultiResBitmap Editor?   
    Ну... очень странно. Вот видео http://youtu.be/x9AiC9pmWfU
    А в прикрепленном файле проект
    Project1.zip
×
×
  • Создать...