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

Равиль Зарипов (ZuBy)

Модераторы
  • Постов

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

  • Посещение

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

    264

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

  1. Like
    Равиль Зарипов (ZuBy) отреагировална zairkz в listBoxItem управление цветом   
    На ListView скролл значительно лучше и без лагов, и вообще очень мощный компонент, все равно, рано или поздно вы откажетесь от ListBOX.
    Кнопку можно разместить стандартным способам в настройках самой ListView. Если же вам нужно сто кнопок в одном Итеме, тогда да придется чуток заморочиться. 
     
    Во первых надо в настройках ListView в ItemAppearance включить ImageListItemBottomDetailRightButton.
    Далее в ItemAppearanceObjects -> ItemObjects можете указывать любые настройки, через PlaseOffset.X - Y перемещать текст и детайл текст как хотите и куда хотите, тоже самое с картинкой и кнопкой, менять цвета и шрифты.
    Можете повесить обработчик в свойствах на OnItemClick, а также нажатие на саму кнопку OnButtonClick.
    При заполнении Item'ам присваивайте Tag и по ним ориентируйтесь. 
    Далее для покраски Item'ов подключите Хелпер Zuby(все таки не хелпер, а измененный исходник TListView) FMX.ListView.zip, пропишите пару процедур:
     
    procedure myDefaultItemColor(const aLV: TListView; const aItemIndex: integer; const aUseCustomColor: Boolean = false);
    begin   with aLV.Items[aItemIndex] do   begin     Data['aUseCustomColor'] := aUseCustomColor;   end; end;   /// <summary> устанавливаем кастомный цвет для Item'a </summary> procedure myCustomItemColor(const aLV: TListView; const aItemIndex: integer; const aCustomColor: TAlphaColor;   const aUseCustomColor: Boolean = true); begin   with aLV.Items[aItemIndex] do   begin     Data['aUseCustomColor'] := aUseCustomColor;     Data['aCustomColor'] := aCustomColor;   end; end;   Далее к примеру заполняем ListView  ListViewPoisk.BeginUpdate;   for i := 0 to 15 do   begin     ListViewPoisk.Items.Insert(0);     ListViewPoisk.Items[0].Tag := i;     ListViewPoisk.Items[0].Text := 'X_text';     ListViewPoisk.Items[0].Detail := 'X_detail';     ListViewPoisk.Items[0].ButtonText := 'X_buttext';     ListViewPoisk.Items[0].Data['offer'] := 0; //Если нужно хранить не отображаемые данные.     ListViewPoisk.Items[0].Bitmap.Assign(Image1.Bitmap);     if i mod 2 = 0 then        myCustomItemColor(ListViewPoisk, ListViewPoisk.Items[0].Index, TAlphaColors.Lime);     // TAlphaColors.Lime можно заменить TAlphaColorF.Create(70 / 255, 130 / 255, 180 / 255, 155 / 255).ToAlphaColor;   end;   ListViewPoisk.EndUpdate;
  2. Like
    Равиль Зарипов (ZuBy) отреагировална krapotkin в listBoxItem управление цветом   
    кстати, в D11 через месяц обещали какие-то вкусные плюшки как раз по ListView items, редактор и что-то там
  3. Like
    Равиль Зарипов (ZuBy) отреагировална zairkz в Как реализовать это?   
    Нужен Timer и ListView
    Например в ListView -> OnUpdateObjects
    procedure TForm1.ListViewPoiskUpdateObjects(const Sender: TObject; const AItem: TListViewItem); var   aTime: TListitemText; begin   aTime := AItem.Objects.FindDrawable('time') as TListitemText;   if aTime = nil then   begin     aTime := TListitemText.Create(AItem);     aTime.Name := 'time';     aTime.PlaceOffset.X := 0;     aTime.PlaceOffset.Y := 2;     aTime.Font.Size := 14;     aTime.TextVertAlign := TTextAlign.Center;     aTime.TextAlign := TTextAlign.Center;   end;   aTime.Width := 72;   aTime.Height := 20;   //Двигаем Text итема с отступом   AItem.Objects.TextObject.PlaceOffset.X := aTime.Width + 6; end; И таймер procedure TForm1.Timer1Timer(Sender: TObject); var   i: integer; begin   if ListView1.ItemCount > 0 then     for i := 0 to ListView1.ItemCount - 1 do       ListView1.Items[i].Data['time'] := FormatDateTime('ss сек.', Now); end;
  4. Like
    Равиль Зарипов (ZuBy) отреагировална Andrey Efimov в [Android]Каталог, вывод в 2-3 колонки   
    Отдельную тему создавайте (в правилах ясно указано: одна тема-один вопрос), здесь обсуждается другая тема.
  5. Like
    Равиль Зарипов (ZuBy) отреагировална zairkz в [Android]Каталог, вывод в 2-3 колонки   
    На ListView будет достаточно сложно это реализовать.
    Попробуйте TPresentedScrollBox и элементы стиля.
    Стиль нужен: к примеру:
    Вам необходимо фиксированные размеры панелек, например глобальные переменные
      ObjectHeight := 205;
      ObjectWidth := 160;
      PanHeight := 200;
      PanWidth := 148;
    Затем вычислить количество колонок на FormResize, тоже глобальные пр.
     
    procedure TForm_main.FormResize(Sender: TObject);
    begin
      PrColumns := Floor(Form_main.ClientWidth / ObjectWidth);
      AllMargins := (Form_main.ClientWidth - (PrColumns * PanWidth)) / (PrColumns + 1);
    end;
     
    Процедура заполнения, здесь только создания панелей в скроллбоксе, я использовал обычный button в виде панельки
    procedure TForm_main.LoadObject();
    var
      x, i: integer;
      LT: TLayout;
      Butt: TButton;
    begin
      x := 0;
      for i := 0 to OBJ.Count - 1 do
      begin
          if x mod PrColumns = 0 then
          begin
            LT := TLayout.Create(PresentScrolBox);
            LT.Parent := PresentScrolBox;
            LT.Position.y := PresentScrolBox.ContentBounds.Height + 100;
            LT.Align := TAlignLayout.Top;
            LT.Height := ObjectHeight;
            LT.HitTest := false;
          end;
     
          Butt:= TButton.Create(LT);
          Butt.Parent := LT;
          Butt.Position.x := LT.Width;
          Butt.Height := PanHeight;
          Butt.Width := PanWidth;
          Butt.Align := TAlignLayout.Left;
          Butt.Margins.Top := (ObjectHeight - PanHeight) / 2;
          Butt.Margins.Bottom := (ObjectHeight - PanHeight) / 2;
          Butt.Margins.Left := AllMargins;
          Butt.StyleLookup := 'buttonx';
          Butt.text := '';
          Butt.tag := 55; //Пример
          Butt.TextSettings.WordWrap := True;
          Butt.OnTap := Form_main.ButObjTap;
    {$IFDEF MSWINDOWS}
          Butt.OnClick := Form_main.ButtObjectClick;
    {$ENDIF}
          Butt.OnApplyStyleLookup := Form_main.ObjectStyle;
          x := x + 1;
        end;
      end;
      LT := TLayout.Create(SB_Object);
      LT.Parent := SB_Object;
      LT.Position.y := SB_Object.ContentBounds.Height + 100;
      LT.Align := TAlignLayout.Top;
      LT.Height := 72;
    end;
     
    После создания заполнять данными необходимо в Butt.OnApplyStyleLookup := Form_main.ObjectStyle;
    procedure TForm_main.ObjectStyle(Sender: TObject);
    var
      i: integer;
    begin
      for i := 0 to 9 do
        if TButton(Sender).tag=i then
        begin
          TButton(TButton(Sender).FindStyleResource('btn_add')).tag := i;
          // TButton(TButton(Sender).FindStyleResource('btn_add')).text := ‘+’;
          TButton(TButton(Sender).FindStyleResource('btn_add')).OnClick := Form_main.But_Main_Add;
          TText(TButton(Sender).FindStyleResource('text')).text := 'i = '+inttostr(i);
          TText(TButton(Sender).FindStyleResource('obj_price')).text := ‘500’;
          TImage(TButton(Sender).FindStyleResource('img')).Bitmap.Assign(Какой нибудь битмап);
          break;
        end;
    end;
     
    Желательно данные и картинки загрузить сперва в Record, затем заполнять их в OnApplyStyleLookup.
    ХЗ может подойдет вариант, на слабых телефонах лагов не много, но и ListView на слабых подлагивает.
     
    Как вариант старое наше с Zuby приложение по доставке еды Gepard, не судите строго мы его забросили): https://play.google.com/store/apps/details?id=kz.vbaze.Gepard

     
     
     
  6. Like
    Равиль Зарипов (ZuBy) отреагировална zairkz в TListViewHorz   
    https://yadi.sk/d/ziNcatNipiKZD
  7. Like
    Равиль Зарипов (ZuBy) отреагировална zairkz в [TTabControl] При переключении Tabs исчезает вкладка   
    Нет не было, но бывают такие аномальные явления, скорее всего из за вспышек на солнце или фаза луны не та.
    Исходник давай)
  8. Like
    Равиль Зарипов (ZuBy) отреагировална kami в vkbdhelper - поднятие компонентов над клавиатурой   
    Update. Исправили недостаток на Android 5. Большое спасибо Rusland за тестирование.
    Итоговый файл прикладываю.
     
    По прежнему не рекомендую использовать этот модуль, если создаваемые в runtime контролы ложатся напрямую на форму.
    Перед написанием претензий, пожалуйста прочитайте known issues в комментарии в начале файла.
     
    vkbdhelper.zip
  9. Like
    Равиль Зарипов (ZuBy) получил реакцию от enatechno в Как правильно зачистить ListBox   
    while TListBox Items.Count > 0 do TListBox Items.Delete(0);
  10. Like
    Равиль Зарипов (ZuBy) получил реакцию от zairkz в Как правильно зачистить ListBox   
    while TListBox Items.Count > 0 do TListBox Items.Delete(0);
  11. Like
    Равиль Зарипов (ZuBy) получил реакцию от zairkz в Как реализовать это?   
    нет, я просто отрисовал нужные контролы в Item'e. а тот класс это для покраски TListView, через него я убрал разделитель.
    все что вам нужно находиться в OnUpdateObjects, посмотрите на константы и как присваиваются данные
  12. Like
    Равиль Зарипов (ZuBy) получил реакцию от Владимир в Потоки и процедуры   
    использовать такую конструкцию
    //uses System.Threading; TTask.Run(      procedure      begin         // выполняем загрузку файла из интернета;         TThread.Synchronize(nil, procedure            begin               // выполняем действия связанные с визуальными компонентами            end); end); но помнить что из доп. потока нельзя запустить доп. поток
  13. Like
    Равиль Зарипов (ZuBy) получил реакцию от Владимир в [TBitmap] Загрузка изображений из интернета в приложение   
    idhttp1.Create(Application); - что это за бред?
    IdHTTP - это откуда взялось?
    никогда и никому этот код не показывай
     
    берем файлик во вложении подключаем в проекте и пишем
    with ListView1.Items.Add do begin   Text := 'Text';   Bitmap.LoadFromUrl('http://site.ru/icons/icon.png'); end; не проверял, но должно работать. не нужно пихать в поток, там итак уже используется
    FMX.Features.Bitmap.Helpers.zip
  14. Like
    Равиль Зарипов (ZuBy) получил реакцию от enatechno в Путь к файлам другой Android апликации   
    да, чтобы в android/data писать нужно через TPath.GetSharedDocumentsPath
  15. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Помогите начать   
    XE7 update 1 и выше могут собирать под андроид 5
    А то что у вас пути разные так это не проблема, если присмотреться в корне лежат линки с подобными путями.
  16. Like
    Равиль Зарипов (ZuBy) получил реакцию от enatechno в PushEvents без Provider   
    для основы статья хорошая, но она требует доработки в плане добавления заголовка для обоих платформ.
    если в android'е это делается дописыванием строчки
    $message = new \push\CodeMonkeysRu\GCM\Message($tokens, array("title" => $title, "message" => $text)); то в классе для IOS нужно пару строк добавить в ApnsPHP/Message.php
    переменка новая в классе class ApnsPHP_Message
    // ZuBy === protected $_sTitle; // === ZuBy и два метода
    // ZuBy === public function setTitle($sText) { $this->_sTitle = $sText; } public function getTitle() { return $this->_sTitle; } // === ZuBy и в мотоде protected function _getPayload() нужно добавить проверку есть ли у нас Title
    было примерно так (не помню уже)
    $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert'] = (string)$this->_sText; заменить на такую конструкцию
    // ZuBy === if (isset($this->_sTitle) and isset($this->_sText)){ if (!empty($this->_sTitle)){ $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert']['title'] = (string)$this->_sTitle; $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert']['body'] = (string)$this->_sText; } else { if (isset($this->_sText)) { $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert'] = (string)$this->_sText; } } } // === ZuBy в методе public function getPayload() нужно заменить следующее
    $sJSONPayload = str_replace( '"'.self::APPLE_RESERVED_NAMESPACE.'":[]', '"'.self::APPLE_RESERVED_NAMESPACE.'":{}', $sJSON); на вот такое
    // ZuBy === $sJSONPayload = str_replace( ['"'.self::APPLE_RESERVED_NAMESPACE.'":[]', '"alert":[]'], ['"'.self::APPLE_RESERVED_NAMESPACE.'":{}', '"alert":{}'], $sJSON); // === ZuBy и теперь мы можем вызвать наш новый метод
    # Устанавливаем параметры отправки сообщения $message->setSound(); $message->setTitle($title); // ZuBy $message->setBadge(0); $message->setText($text); если не ошибаюсь заголовок появился начиная в IOS 8.2
  17. Like
    Равиль Зарипов (ZuBy) получил реакцию от Rusland в PushEvents без Provider   
    для основы статья хорошая, но она требует доработки в плане добавления заголовка для обоих платформ.
    если в android'е это делается дописыванием строчки
    $message = new \push\CodeMonkeysRu\GCM\Message($tokens, array("title" => $title, "message" => $text)); то в классе для IOS нужно пару строк добавить в ApnsPHP/Message.php
    переменка новая в классе class ApnsPHP_Message
    // ZuBy === protected $_sTitle; // === ZuBy и два метода
    // ZuBy === public function setTitle($sText) { $this->_sTitle = $sText; } public function getTitle() { return $this->_sTitle; } // === ZuBy и в мотоде protected function _getPayload() нужно добавить проверку есть ли у нас Title
    было примерно так (не помню уже)
    $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert'] = (string)$this->_sText; заменить на такую конструкцию
    // ZuBy === if (isset($this->_sTitle) and isset($this->_sText)){ if (!empty($this->_sTitle)){ $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert']['title'] = (string)$this->_sTitle; $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert']['body'] = (string)$this->_sText; } else { if (isset($this->_sText)) { $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert'] = (string)$this->_sText; } } } // === ZuBy в методе public function getPayload() нужно заменить следующее
    $sJSONPayload = str_replace( '"'.self::APPLE_RESERVED_NAMESPACE.'":[]', '"'.self::APPLE_RESERVED_NAMESPACE.'":{}', $sJSON); на вот такое
    // ZuBy === $sJSONPayload = str_replace( ['"'.self::APPLE_RESERVED_NAMESPACE.'":[]', '"alert":[]'], ['"'.self::APPLE_RESERVED_NAMESPACE.'":{}', '"alert":{}'], $sJSON); // === ZuBy и теперь мы можем вызвать наш новый метод
    # Устанавливаем параметры отправки сообщения $message->setSound(); $message->setTitle($title); // ZuBy $message->setBadge(0); $message->setText($text); если не ошибаюсь заголовок появился начиная в IOS 8.2
  18. Like
    Равиль Зарипов (ZuBy) получил реакцию от Rusland в Видео с Евгением Крюковым   
    вот это?
    https://www.youtube.com/watch?v=eqrVYWZ8SPk
  19. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Видео с Евгением Крюковым   
    вот это?
    https://www.youtube.com/watch?v=eqrVYWZ8SPk
  20. Like
    Равиль Зарипов (ZuBy) отреагировална krapotkin в Сортировка TListBoxItem по алфавиту   
    что ж так сложно то O_O
    выделить из строки подстроку - на 100 строк процедура?
     
    а еще как обычно замечу, что данные нужно хранить в модели данных а не на экране
    тогда доступ к ним гораздо проще
    и сортировка тоже
  21. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в [DX10] Drag-and-Drop Пример   
    https://youtu.be/ta_N6DSi0Xg
  22. Like
    Равиль Зарипов (ZuBy) отреагировална ivadimos в Серьезно о FireMonkey на Android и iOS   
    Можно писать, как раз занимаюсь похожим, только функционал намного шире)
     
  23. Like
    Равиль Зарипов (ZuBy) получил реакцию от mrseagull в Серьезно о FireMonkey на Android и iOS   
    если выбрать правильные инструменты, то возможно.
    FMX + сервак + PHP (или любой серверный язык) всю работу с БД и с картами (такие как запросы геокодинга и прочие ssl запросы на другие сайты) на PHP, а клиент-приложение только в виде отображения контента.
    и можно делать не только одноформенные приложения, а сложные
  24. Like
    Равиль Зарипов (ZuBy) отреагировална Axbor в Расчет высоты объекта на основе высоты TLabel   
    Я предлагаю создать свой собственный класс для таких целей. Обработаем свойство Resize и всё, никаких проблем не будет. http://fire-monkey.ru/topic/2280-sobstvennyi-tlistboxitem-na-c/ тут я описал как создать собственный класс для ListBoxItem там же есть ссылка и для Delphi. Ниже приведен класс который я создал, только на C++. Посмотрите там обработчик события ApplyStyleLookup() и Resize(). И еще предлагаю вместо TLabel использовать TText.
    Если всё таки хотите своим путём тогда вычислите высоты с помощью TTextLayout, это делается так:
    var L : TTextLayout; begin L := TTextLayoutManager.DefaultTextLayout.Create; L.BeginUpdate; L.Text := FtextType.Text; {Вместо FTextType будет ваш Label} L.MaxSize := TPointF(FtextType.Width, 1000); L.Font := FTextType.Font; {} L.WordWrap := FTextType.WordWrap; L.HorizontalAlign := FTextType.HorzTextAlign; L.VerticalAlign := FTextType.VertTextAlign; L.EndUpdate; height := L.Height; end; Я не силён в Delphi, но думаю вы поймете.
    ListBoxItem.zip
  25. Like
    Равиль Зарипов (ZuBy) отреагировална enatechno в Серьезно о FireMonkey на Android и iOS   
    имхо: FMX - удачный инструмент. мы под даже под официанта все заточили. а клиенты бывают разные... 
×
×
  • Создать...