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

enatechno

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

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

  • Посещение

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

    26

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

  1. Like
    enatechno отреагировална kami в Нагрев устройства при работе программы Android   
    Зависит
    Например:
    - злоупотребление процессорным временем (постоянная загрузка процессора на 100% - неоптимальность алгоритмов и не-использование аппаратных возможностей ускорения)
    - злоупотребление частотой получения данных от периферии (датчики ускорения/GPS/наклона...)
    - злоупотребление яркостью экрана (некоторые устройства при включенном экране и максимальной яркостью разряжаются даже при подключенной штатной зарядке)
    Да мало ли еще чего, например - злоупотребление программированием вообще
  2. Like
    enatechno отреагировална Равиль Зарипов (ZuBy) в [TListBox] Как отобразить итемы в виде панелей?   
    я же наоборот использую ListView, для достижении своих целей


  3. Like
    enatechno отреагировална AngryOwl в [TListBox] Как отобразить итемы в виде панелей?   
    Не в первый раз вижу эту тему...
    TGridPanelLayout - далеко не предпочтительный вариант. Совсем.
    У ListBox с его Item'ами намного больше возможностей.
    С [xenon54] соглашусь, но не полностью. ListView действительно хорош (для мобильной платформы), однако он намного сложнее.
     
    Примеры применения стилей для ListBoxItem (не сочтите за рекламу, так проще было... нащелкал скринов для примера):
     

     
    Везде - ListBox.
    На последнем скрине - всплывающие сообщения на экране. Реализовано так же - прозрачная форма, ListBox и Item'ы со своим стилем В ВИДЕ ПАНЕЛЕК )
     

  4. Like
    enatechno отреагировална xenon54 в [TListBox] Как отобразить итемы в виде панелей?   
    50 элементов для ListBox в мобильной платформе это ооочень много. Вообще, где-то писали что ListBox следует использовать не более чем как для меню, т.е. количество элементов не более десятка, на вскидку. Если у вас список более 10 элементов, листбокс лучше не использовать. ListView очень хорош с большим количеством элементов. Основная его фишка ускорения работы, как я  понял, это то что он не держит кучу чилдрен контролов у себя и всю отрисовку делает только он сам, а вот листбокс это куча контролов, каждый из которых занимается отрисовкой. Есть у тебя 50  итемов, на них на каждом по 3 контрола, считай метод отрисовки вызовется 201 раз (1=сам листбокс, 50 это каждый итем, и еще 150 это по 3 контрола в каждом итеме).
  5. Like
    enatechno отреагировална Равиль Зарипов (ZuBy) в OnButtonClick vs OnItemClick   
    в итоге получилось так
     
    ContentView - TListView
    procedure TForm1.ContentViewItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF; const ItemObject: TListItemObject); var   pMy: TPoint;   pItem: TRect; begin   // вычисляем прямоугольник, где распологается кнопка   pItem.Left := trunc(ContentView.Width - ContentView.ItemAppearanceObjects.ItemObjects.Accessory.WidthWhenVisible -     ContentView.ItemAppearanceObjects.ItemObjects.TextButton.WidthWhenVisible) - 12;   pItem.Right := pItem.Left + trunc(ContentView.ItemAppearanceObjects.ItemObjects.TextButton.WidthWhenVisible);   pItem.Top := trunc((ContentView.ItemAppearance.ItemHeight / 2) -     (ContentView.ItemAppearanceObjects.ItemObjects.TextButton.HeightWhenVisible / 2));   pItem.Bottom := pItem.Top + trunc(ContentView.ItemAppearanceObjects.ItemObjects.TextButton.HeightWhenVisible); {  смотрим куда тыкаем   ShowMessage('click : ' + LocalClickPos.X.ToString + '  ' + LocalClickPos.Y.ToString + #13#10 + 'client: ' +     ContentView.Width.ToString + #13#10 + pItem.Left.ToString + '  ' + pItem.Top.ToString + #13#10 + pItem.Right.ToString + '  ' +     pItem.Bottom.ToString + #13#10); }   pMy.X := trunc(LocalClickPos.X);   pMy.Y := trunc(LocalClickPos.Y);   if PtInRect(pItem, pMy) then   begin     ShowMessage('Нажалось))');   end else  begin    // нажатие на Item, выполняем код тут, не в OnItemClick  end; end; стиль вот такой используется

  6. Like
    enatechno отреагировална Кривяков Виталий в TUITabControl   
    Добрый день!
     
    В теме про наш продукт http://fire-monkey.ru/topic/1519-1c-papyc-mobilnoe-prilozhenie-dlia-masterov-priemschiko/ меня просили поделиться исходным кодом компонента TabControl с поддержкой слайда табов пальцем. С удовольствием делюсь
    В составе архива сам компонент и пример его использования.
    FMXUI.zip
  7. Like
    enatechno получил реакцию от Brovin Yaroslav в [Отклонение] [Android] Не меняется KeyboardType при переходе на следующий TEdit   
    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;  
  8. Like
    enatechno получил реакцию от Brovin Yaroslav в [Отклонение] [Android] Не меняется KeyboardType при переходе на следующий TEdit   
    Чтоб лишний раз не менялась, добавил проверку на текущий тип
    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
  9. Like
    enatechno отреагировална xenon54 в стандартная работа с ListBox (delete,rename,move)   
    1. Все контролы в ФМ являются контейнерами.
    2. Итемы внутр листбокса являются контролами, а значит и контейнерами, следовательно вы можете делать там внутри что угодно хоть колонки, хоть кружочки, хоть что...
    3. поменять местами итемы можно так:
    ListBox1.ItemsExchange( ListBox1.ItemByIndex(0), ListBox1.ItemByIndex(1) ); 4. Чтобы в Листбокс итеме поменять текст, нужно поменять его паблишед свойство Text, делается это так:
    ListBox1.ItemByIndex(1).Text := '123';
  10. Like
    enatechno получил реакцию от krapotkin в [Отклонение] [Android] Не меняется KeyboardType при переходе на следующий TEdit   
    Чтоб лишний раз не менялась, добавил проверку на текущий тип
    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
  11. Like
    enatechno получил реакцию от krapotkin в [Отклонение] [Android] Не меняется KeyboardType при переходе на следующий TEdit   
    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;  
  12. Like
    enatechno получил реакцию от xenon54 в [Отклонение] [Android] Не меняется KeyboardType при переходе на следующий TEdit   
    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. Like
    enatechno отреагировална Brovin Yaroslav в [Вебинар] Новый подход к разработке компонентов FireMonkey в RAD Studio XE8. Часть 2   
    Тема: Новый подход к разработке компонентов FireMonkey в RAD Studio XE8. Часть 2 Дата и время: 10 июня 2015 года в 12:00 Участники: Денис Васильев и Бровин Ярослав Регистрация: ссылка Участие бесплатное Запись вебинара будет доступна здесь: http://www.youtube.com/playlist?list=PLNexYoB7XRWZv-6QviwJzdRKthKuBR_dG
    В рамках вебинара продолжим знакомство с новым подходом разработки компонентов FireMonkey "Контрол – Модель – Презентация". Создание нативных представлений для iOS. Разберем несколько примеров. 
    В вебинаре примет участие Ярослав Бровин, ведущий разработчик Embarcadero.
     

  14. Like
    enatechno получил реакцию от Равиль Зарипов (ZuBy) в Использовать edit в popup форме   
    Цитирую С.Рощина: "Как сказано в статье всплывающие формы идут отдельным списком, не бывают активными и поэтому не получают сообщения от клавиатуры". 
    Как вариант, могу предложить:
    1). использовать обычную форму с расположенным на нем TPopup
    или
    2). Использовать TRectangle разместив его на главной форме, сделав полупрозрачным и Align=Contents. Второй TRectangle - непрозрачный, поместить на первый, Align=Center. На последний поместить TEdit. Делать такую "модальную форму" видимой меняя Visibile первого TRectangle и помещать выше всех .BringToFront. 
  15. Like
    enatechno получил реакцию от rareMax в TStringGrid - объединение ячеек   
    Я бы в нулевой (невидимой) колонке хранил бы признак заголовка. И обрабатывал бы это значение в событии TStringGrid.OnDrawColumnCell.
    Вот набросал пример (заголовок остается заголовком, даже если менять колонки местами):
     

     
    testStringGrid.zip
  16. Like
    enatechno получил реакцию от Brovin Yaroslav в Как для колонок TStringGrid задавать разные шрифты?   
    по аналогии с этой темой
    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;
  17. Like
    enatechno получил реакцию от Gingercat в Как задать внутренний отступ padding для контента TScrollBox?   
    Перефразирую Ярослава: "Все контролы, которые вы кидаете в TCustomScrollBox находятся в дополнительном промежуточном контроле TScrollContent."
     
    т.е. Padding для VerticalScrollBox можно задать так:
    VertScrollBox1.Content.Padding.Top := 5;
  18. Like
    enatechno получил реакцию от Brovin Yaroslav в Автомасштабирование компонентов при измененнии масштаба формы   
    Поместите свою "кучу" на компонент TScaledLayout и задайте для последнего выравнивание (Align) Client (или Contents, или Fit, или Scale...)
  19. Like
    enatechno получил реакцию от Brovin Yaroslav в Как задать внутренний отступ padding для контента TScrollBox?   
    Перефразирую Ярослава: "Все контролы, которые вы кидаете в TCustomScrollBox находятся в дополнительном промежуточном контроле TScrollContent."
     
    т.е. Padding для VerticalScrollBox можно задать так:
    VertScrollBox1.Content.Padding.Top := 5;
  20. Like
    enatechno получил реакцию от zairkz в Как задать внутренний отступ padding для контента TScrollBox?   
    Перефразирую Ярослава: "Все контролы, которые вы кидаете в TCustomScrollBox находятся в дополнительном промежуточном контроле TScrollContent."
     
    т.е. Padding для VerticalScrollBox можно задать так:
    VertScrollBox1.Content.Padding.Top := 5;
  21. Like
    enatechno получил реакцию от Kitty в Как для колонок TStringGrid задавать разные шрифты?   
    по аналогии с этой темой
    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;
  22. Like
    enatechno отреагировална DirtyBorov в Как найти реальный индекс узла TTreeViewItem дерева?   
    Коллега, вы совершенно не верно подходите к решению задачи. TreeView - это представление, а база данных - это модель. Потому построение дерева должно опираться на данных в БД, а не наоборот. 
    Дерево в базе хранят обычно в одной таблице такой структуры:
    id - id объекта
    parent - id родителя
    text - наименование
     
    например ваша структура в БД будет примерно так выглядеть:
    1, null, Родитель 1
       2, 1, Потомок 1-1
       3, 1, Потомок 1-1
    4, null, Родитель 2
       5, 4, Потомок 2-1
       6, 4, Потомок 2-2
          7, 6, Потомок 2-3  - обратите внимание - потомок потомка
    и т.д.
     
    Для того что бы связать запись БД и Item в дереве используйте свойство Tag. Это просто и удобно. 
    Как строить дерево:
    1. Самый плохой способ  - при запуске программы, из БД считывается все данные и по ним строится полное дерево. При добавлении/удалении записи все повторяем - перечитываем полное дерево. Таким способом лучше не делать. За такой метод бьют ногами не похвалят. Причем и пользователи (за тормоза программы) и админ сервера БД (за нагрузку на сервер).
     
    2. Этот способ немного лучше -  при запуске мы точно также считываем полное дерево из БД. Но при добавлении записей, мы добавляем только конкретный Item в дерево и его Tag присваиваем ID который назначил сервер при создании записи в БД. Но тут все еще есть недостаток - полное построение дерева - если записей много, то может занимать много времени.
     
    3. Самый лучший способ - при запуске считываются только корневые записи (parent = null). А остальные подгружаются по мере необходимости. Когда пользователь разворачивает ветку, то из БД получаем все записи parent = Selected.Tag и добавляем детей к этой ветке.  Добавление новых записей так же как в способе 2.
     
    Рекомендую вам использовать именно способ 3. Во первых он самый быстрый, во вторых считывание из БД наиболее простое. Иначе вам без рекурсивных хранимых процедур будет сделать полное чтение дерево очень сложно.  Здесь же можно все выбирать простыми запросами. 
    Еще пара советов:
    если данных много и по дереву ходят много - то постепенно программа подгрузит много веток и это может занимать много памяти, что может привести к тормозам. Потому при сворачивании ветки, лучше всех детей удалять. 
    Когда ветка не имеет детей, то у нее нет слева стрелочки для разворачивания. Потому возникает вопрос - как же тогда развернуть ветку, чтобы подгрузить детей? Все просто. Надо создать одного фейкового ребенка. Т.е. просто Item-пустышку не связанную с БД. А когда ветку разворачивают, то первым делом надо пустышку удалить. Потом считать БД. Естественно при сворачивании делаем наоборот - сначала удаляем все реальные Item-ы, а потом вновь добавляем пустышку.
    Вот как то так.
×
×
  • Создать...