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

enatechno

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

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

  • Посещение

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

    26

Весь контент enatechno

  1. К примеру компонент TTMSFMXIPEdit реализован комбинацией TTMSFMXEdit и TLabel. Т.е. чтоб смотрелось красиво можно разместить стилизованные безрамочные TEdit и TLabel внутри какого-нибудь контейнера (TRectangle, TEdit...).
  2. Есть в примерах. Samples\Object Pascal\Mobile Snippets\InteractiveGestures\ImageZoom\ImageZoom.dproj или тут
  3. вариант ZuBy тоже не помог? var aFileStream: TFileStream; aBitmap: TBitmap; .... aFileStream := TFileStream.Create('.\images\ScenarioImage\actions\' + IntToStr(ActionID) + '.png', fmOpenRead); try if (aFileStream.Size > 0) then begin aBitmap := TBitmap.CreateFromStream(aFileStream); Item.StylesData['imageaction'] := TValue.From<TBitmap>(aBitmap); Item.StylesData['imageaction.visible'] := true; Item.ItemData.Bitmap.Assign(aBitmap); end; finally FreeAndNil(aFileStream); end; Этот вариант предпочтительнее для Вашего примера.
  4. Скорее всего ошибка при загрузке картинки с диска на мобильном устройстве. Вы ее прописали в Deploy?
  5. TImageList - это новый компонент http://blogs.embarcadero.com/roschinspb/2015/03/03/timagelistxe8ru/. Видео https://www.youtube.com/watch?v=YTU7o7xMbws Обсуждение http://fire-monkey.ru/forum/35-timagelist-s-xe8/
  6. Ваша ошибка в том, что вы присваиваете имя файла, а не TBitmap. Item.StylesData['imageaction'] := '.\images\ScenarioImage\actions\' + IntToStr(ActionID) + '.png'; Загрузка картинки с диска: var aFileStream: TFileStream; .... aFileStream := TFileStream.Create('.\images\ScenarioImage\actions\' + IntToStr(ActionID) + '.png', fmOpenRead); try if (aFileStream.Size > 0) then Item.StylesData['imageaction'] := TValue.From<TBitmap>(TBitmap.CreateFromStream(aFileStream)); finally FreeAndNil(aFileStream); end; если проблема останется, то вот еще тема.
  7. Согласен, что TGridPanelLayout проигрывает по памяти. Но за счет того, что листбокс занимается выгрузкой и загрузкой при скролле, мы и видим его притормаживание. Соответственно, автор должен решить, готов ли он платить памятью за плавный скролл? Для экономии памяти не обязательно грузить все панельки в TGridPanelLayout сразу. Достаточно загрузить порцию для 1.5-2 экранов (в указанном автором примере это будет 9-18 шт), а потом при скролле вниз подгружать по 6-9 шт. Автор привел пример с категориями ('Десерты', 'Салаты', ...). Это значит, что при перемещениях по категориям и подкатегориям, скорее всего, ему не придется подгружать большие порции для первых нескольких экранов. Конечно же было проще анализировать задачу, если б автор указал среднее количество панелек для каждой категории/подкатегории. Для данной задачи важен также и размер картинок в панельках. Повторю, я видел работающий пример. Все работало довольно шустро и плавно для 200 панелек в одной категории. (попробуйте сделать такое в листбокс и посмотрите на плавность скролла). У листбокса для этой задачи (категории/подкатегории) есть "подводные камни". Например: невозможно в событии OnItemClick перезаполнить содержимое этого листбокс без AV. Т.к. после этого обработчика в TCustomListBox.MouseUp (хе7) происходит попытка обратится к несуществующему Item-у: if Assigned(OnItemClick) then OnItemClick(Self, Item); P := Item.ScreenToLocal(LocalToScreen(TPointF.Create(X, Y))); // тут AV т.к. нет проверки, существует ли Item (а он будет уничтожен при перезаполнении листбокс) Item.MouseUp(Button, Shift, P.X, P.Y); Полностью поддерживаю. Но судя по теме, автор еще не настолько опытен в FMX, чтоб рекомендовать ему ListView для решения данной задачи.
  8. Но, ИМХО, это не верно. Да. Логично было бы если бы сама очистка устанавливала ItemIndex := -1; т.к. Combobox1.Items[0] в этот момент перестает существовать. А так приходится это делать самому. Combobox1 перезаполняется если происходит смена индекса, а в приведенном примере он не меняется (был 0 до очистки, присвоили 0 после очистки).
  9. Вы хотите менять фокус/тип клавиатуры по нажатию Enter на клавиатуре?
  10. На десктоп для ListBox свойство AllowDrag := true и можно перетаскивать. Для мобильных, думаю, нужно через Gesture.
  11. Чтоб лишний раз не менялась, добавил проверку на текущий тип if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) and (TVirtualKeyboardState.Visible in KeyboardService.VirtualKeyboardState) and (aEdit.KeyboardType <> FCurVKType) then begin KeyboardService.HideVirtualKeyboard; KeyboardService.ShowVirtualKeyboard(aEdit); FCurVKType := aEdit.KeyboardType; end; tstVK.zip
  12. procedure TForm1.Edit1Enter(Sender: TObject); begin CheckVK(Edit1); end; procedure TForm1.Edit2Enter(Sender: TObject); begin CheckVK(Edit2); end; procedure TForm1.CheckVK(const aEdit: TEdit); var KeyboardService: IFMXVirtualKeyboardService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) and (TVirtualKeyboardState.Visible in KeyboardService.VirtualKeyboardState) then begin KeyboardService.HideVirtualKeyboard; KeyboardService.ShowVirtualKeyboard(aEdit); end; end;
  13. По-прежнему считаю, что использование TGridPanelLayout предпочтительнее, так как имеет дополнительно функцию масштабирования. Тестировал TGridPanelLayout с 200 панельками (чужой проект). Загрузка большого количества панелек реализована порционной подгрузкой. Когда все загрузится, то скроллинг становится плавнее чем в ListBox.
  14. По рекомендации Ярослава сделал Listbox со стилизованными панельками (тестовый проект прилагается test.zip). Тестировал на 50 элементах с одной небольшой картинкой. Скроллинг с рывками. При компиляции на XE7/XE7upd1 наблюдается глюк: на картинке видно что текст после скроллинга вниз/вверх на некоторых кнопках не обновился (нумерация должна быть последовательная).
  15. Цитирую С.Рощина: "Как сказано в статье всплывающие формы идут отдельным списком, не бывают активными и поэтому не получают сообщения от клавиатуры". Как вариант, могу предложить: 1). использовать обычную форму с расположенным на нем TPopup или 2). Использовать TRectangle разместив его на главной форме, сделав полупрозрачным и Align=Contents. Второй TRectangle - непрозрачный, поместить на первый, Align=Center. На последний поместить TEdit. Делать такую "модальную форму" видимой меняя Visibile первого TRectangle и помещать выше всех .BringToFront.
  16. Почему именно из lisbox? Я думаю, для "панелек" лучше использовать TGridLayout
  17. Я бы в нулевой (невидимой) колонке хранил бы признак заголовка. И обрабатывал бы это значение в событии TStringGrid.OnDrawColumnCell. Вот набросал пример (заголовок остается заголовком, даже если менять колонки местами): testStringGrid.zip
  18. Поместите свою "кучу" на компонент TScaledLayout и задайте для последнего выравнивание (Align) Client (или Contents, или Fit, или Scale...)
  19. Перефразирую Ярослава: "Все контролы, которые вы кидаете в TCustomScrollBox находятся в дополнительном промежуточном контроле TScrollContent." т.е. Padding для VerticalScrollBox можно задать так: VertScrollBox1.Content.Padding.Top := 5;
  20. по аналогии с этой темой procedure TForm1.StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); var aTextRect: TRectF; aTextLayout: TTextLayout; begin aTextRect := Bounds; aTextRect.Right := Round(aTextRect.Right) + 2; // убираем вертикальную линию сетки aTextRect.Bottom := Round(aTextRect.Bottom) - 1; // оставляем горизонтальную Canvas.FillRect(aTextRect, 0, 0, AllCorners, 1); if StringGrid1.Selected = Row then Canvas.ClearRect(aTextRect, claAquamarine); // красим выделенную строку aTextLayout := TTextLayoutManager.DefaultTextLayout.Create; try aTextLayout.BeginUpdate; try aTextLayout.WordWrap := False; aTextLayout.Opacity := Column.AbsoluteOpacity; aTextLayout.Trimming := TTextTrimming.Character; aTextLayout.TopLeft := aTextRect.TopLeft; aTextLayout.Text := Value.ToString; aTextLayout.MaxSize := PointF(aTextRect.Width, aTextRect.Height); if Column.Index = 0 then begin aTextLayout.Font.Family := 'Times New Roman'; // меняем шрифт колонки aTextLayout.Color := claBrown; end; if Column.Index = 1 then begin aTextLayout.Font.Size := 18; // меняем шрифт другой колонки aTextLayout.Font.Style := [TFontStyle.fsBold]; end; finally aTextLayout.EndUpdate; end; aTextLayout.RenderLayout(Canvas); finally aTextLayout.Free; end; end;
  21. Вы хотите написать свое приложение, которое транслирует экран смартфона на ПК или просто транслировать изображение своего приложения со смартфона на ПК (используя стороннее ПО типа MyMobiler)?
×
×
  • Создать...