-
Постов
187 -
Зарегистрирован
-
Посещение
-
Победитель дней
10
Весь контент RoschinSpb
-
На текущий момент можно менять только текстовые настрой целиком у всей таблицы. Grid1.TextSettings.HorzAlign Можно попробовать пользовательскую отрисовку ячеек по событию OnDrawColumnCell.
-
Если у вас не самоцель загружать именно исходные картинки, то можно присваивать просто номер изображения. // настройка ListView если хотите в Run-Time ListView2.Images := ImageList1; // Указываем коллекцию изображений // которая будет использоваться. ListView2.ItemAppearanceName := TAppearanceNames.ImageListItem; ListView2.ItemAppearanceObjects.ItemObjects.Image.Visible := True; ... Item := ListView2.Items.Add; // Добавляем новый пункт если надо if (Item.Objects.ImageObject <> nil) then begin Item.Objects.ImageObject.ImageIndex := Item.Index; // Присваиваем номер изображения // из коллекции изображений Item.Text := Format('Item with ImageIndex = %d', [Item.Objects.ImageObject.ImageIndex]); end; А вот тут пример загрузки из файла в ImageList
-
ImageList1.Bitmap(Size, Index); Возвращает картинку растянутую до указанного размера. Размер указывается в физических пикселях, т.е. учитывать масштаб надо самостоятельно (этот метод ни чего не знает о масштабе канвы). При этом выбирается наиболее подходящая по размеру картинка из тех, что имеется. Есть еще ImageList1.Draw который рисует на канве картинку. Там учитывается масштаб канвы. Т.е. если указали прямоугольник 16x16 а TCanvas.Scale = 2, то будет выбрана картинка 32x32 если имеется. >> практически полное управление всеми элементами Очевидно, в ImageList вы можете самостоятельно управлять всеми элементами иначе каким образом туда попадают данные из редактора. Может поможет статья. >> скажем пихать полученные битмапы в ListView Не пробовали посмотреть демку что ли? Там есть добавление пунктов в ListView в Run-Time C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\Multi-Device Samples\User Interface\ImageList\ImageListDemo.dpr
-
В update ни когда не меняется интерфейсная часть (все, что в Interface) так что только в следующей версии (х.з. как называется), которая будет как обычно где-то весной.
-
FMX.ImageList динамическое добавление элементов
RoschinSpb ответил Alzon вопрос в TImageList - с XE8
Соседняя тема имеет не совсем подходящее название "Загрузка иконок в TimageList из базы данных" Похоже, что там обсуждается именно ваш вопрос: http://fire-monkey.ru/topic/1596-zagruzka-ikonok-v-timagelist-iz-bazy-dannykh/?p=8599 -
Отправить жалобу в QC c приложенным демо-проектом, на котором это воспроизводится. Хотя мне думается, что для обновления запроса, не надо BeginUpdate/EndUpdate Beginupdate и endUpdate это у grid. К самому запросу (query) это отношение не имеет. Если я уберу эти Beginupdate и endUpdate, то глюк будет и в windows. Тогда, большая просьба все-таки написать жалобу с демкой в QC. И сюда ссылку для ускорения работ. Грид слегка полностью довольно сильно переделывается, вполне возможно, что в будущем релизе ошибка уже отсутствует, но проверить хотелось бы.
-
Сейчас StringGrid такого не позволяет. Надо делать TGrid, c обработкой OnGetValue, OnSetValue. Либо ждать следующего релиза.
-
Вот это, или это не пробовали смотреть?
-
А подскажите, какой стиль вы используете? И происходит ли перекрытие, если не использовать TClientDataSet, а просто заполнить строки чем-нибудь?
-
Да, я про загрузку каждой картинки в отдельности в Source. В RAD Studio 10.1 Berlin (Version 24.0) появились методы TSourceCollection.AddOrSet и TCustomImageList.AddOrSet Как мне кажется смысл параметров довольно очевиден и не требует дополнительных пояснений. function AddOrSet(const SourceName: string; const Scales: array of Single; const FileNames: array of string; const TransparentColor: TColor = TColors.SysNone; const Width: Integer = 0; const Height: Integer = 0): TCustomSourceItem;
-
... b.Bitmap.Assign(b.CreateBitmap('C:\Delphi\Images\GlyFX\glyFX\Icons\Aero\BMP\32x32\arrow_left_32_h.bmp')); ... vStream.WriteComponent(imgMain); 1. TransparentColor еще и хранится в fmx файле, и используется редактором IDE. На что недвусмысленно намекает документация по TransparentColor. CreateBitmap используется в редакторе изображений, она создает картинку по указанным параметрам, её можно и по своему усмотрению использовать, допустим вывести окошко и спросить "а действительно ли вы хотите добавить именно такую картинку". Почему используются свойства а не параметры функции? Ну потому, что заточена она для массовой загрузки нескольких однотипных изображений, скорее всего у них будут одинаковые параметры. P.S. Хотя в общем и целом принял к сведению возникшее затруднение, постараюсь как-нибудь упростить. 2. CreateBitmap создало картинку. Assign скопировало данные из этой картинки. А исходная картинка созданная CreateBitmap осталась в памяти и ссылки на неё нету. 3. В вашем примере сохраняется и загружается вся коллекция + разная служебная информация, что не добавляет скорости. Лучше бы сохранять и загружать сами битмапы из Source.MultiResBitmap с использованием LoadFromFile, SaveToFile (как в первом примере). Это будут файлы родные png и они будут грузится системными API функциями с максимальной скоростью. А CreateBitmap использовать только при первой загрузке чтобы cмасштабировать и сконвертировать в png. Хотя и так тоже можно, но я бы не стал.
-
Загрузка картинки будет выглядеть примерно так. 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.
-
Попробую. Выкладывайте на всеобщее обозрение здесь, или в комментариях к статье.
-
Не похоже нет. См. демонстрационное видео 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
-
Что такое marker? Если TMapMarkerDescriptor, то это Record. Icon это просто поле которое ссылко на объект. Если объект будет уничтожен, то мы получим Access Violation. TImageList в Fire Monkey не имеет метода GetBitmap. Зато есть метод Bitmap. О котором можно прочитать в документации: FMX.ImgList.TCustomImageList.Bitmap в частности Кроме того в предложенной статье написано: Т.е. в отличии от VCL-ного TImageList, в FMX, он не имеет постоянного размера. В зависимости от того, какой размер нам нужен будет сгенерирована картинка TBitmap растянутая/сжатая до нужных размеров с сохранением пропорций. Чтобы это не занимало слишком много времени последние сгенерироваyные картинки хранятся во внутреннем буфере из которого они могут "выталкиваться". В Image (как и для большинства классов) при присваивании экземпляра какого-нибудь объекта в сеттере вызывается метод Assign, т.е. копируется не ссылка на объект, а копируются данные. В этом случае нас не интересует дальнейшая судьба исходного объекта.
-
>>но хотелось бы и смысл шаманства узнать >>я думал,что Fit за меня должен все это сделать... Давайте для начала выясним, что вы хотите сделать. Исходя из этого будем определять смысл и способ шаманства. Если надо просто в определенном месте расположить картинку из TImageList, то используйте TGlyph, который создан специально, чтобы избежать всякого рода танцев с бубнами.
-
Если дважды кликнуть на картинку в разделе 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.
-
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.
-
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
-
TImageList Как работает TImageList c TButton ?
RoschinSpb ответил Vitaldj вопрос в TImageList - с XE8
Это типа: "Я вас по IP вычислю!....противные" Джентльмены, пожалуйста не поймите меня правильно, я человек маленький