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

zairkz

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

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

  • Посещение

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

    12

Сообщения, опубликованные zairkz

  1. На ListView скролл значительно лучше и без лагов, и вообще очень мощный компонент, все равно, рано или поздно вы откажетесь от ListBOX.

    Кнопку можно разместить стандартным способам в настройках самой ListView. Если же вам нужно сто кнопок в одном Итеме, тогда да придется чуток заморочиться. 

     

    post-412-0-33189300-1456827157_thumb.png Во первых надо в настройках 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. Приложение на андроид 5.1 компилится и работает корректно, на андроид 4.2.2 работает плохо, а на 4.0.3 вовсе не запускается и пишет(приложение не поддерживается устройством).

    В чём проблема?

    А какой проц на 4.2.2 и на 4.0.3?

    Если плохо работает, то скорее всего на 4.2.2 стоит Intel, а там эмулятор ARM вот он и тормозит,

    и сдается мне что и на 4.0.3 стоит Intel, а там эмулятора вообще нет вот он и не запускается.

  3. procedure TForm_Main.RegisterPush;
    var
      ADeviceID, ADeviceToken: string;
    begin
    {$IFDEF ANDROID}
      // Для Android
      APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
      APushService.AppProps[TPushService.TAppPropNames.GCMAppID] := '**************';
    {$ELSE}
      // Для iOS
      APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.APS);
    {$ENDIF}
      // Создаём подключение к серверу
      AServiceConnection := TPushServiceConnection.Create(APushService);
      // Активируем подключение
      AServiceConnection.Active := True;
      // Подключаем делегаты
      AServiceConnection.OnChange := OnServiceConnectionChange;
      AServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;
      ADeviceID := APushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
      ADeviceToken := APushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
     
      if (ADeviceID <> '') AND (ADeviceToken <> '') then 
      begin
        // Регистрируем устройство на сервере для отправки push сообщений
        RegisterDevice(ADeviceID, ADeviceToken, User_id.ToString);
     end;
    end;
     
    GCM не работает для apple. Я так понимаю Вы сертификаты еще не сгенерировали для PUSH в iOS? 
     
    Хотя судя по картинке может и работает)
  4. нее, это как раз несложная штука

    и она не меняется, андроид это или айос

    сервер вызывает google, google шлет пуш

     

    интересует именно то, что делается на клиенте

    сижу ковыряю

    А что именно в клиенте? В статье есть регистрация токенов и принятие OnReciveNotification, в iOS Push сообщения поддерживает перенос строки через (#13#10) или если на сервере PHP генерируете, тогда через %0A, кстати в пуше можно слать полноценный JSON, который не выводится в шторку (текст сообщения выводится), Zuby делал такое.

  5. На ListView будет достаточно сложно это реализовать.

    Попробуйте TPresentedScrollBox и элементы стиля.

    Стиль нужен: к примеру: post-412-0-62092500-1456819489.png

    Вам необходимо фиксированные размеры панелек, например глобальные переменные

      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

    post-412-0-16967200-1456819615_thumb.png

     

     

     

  6. если требуется отобразить тиканье времени, каким образом производится обновление перерисовки итема ?

    Нужен 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;
  7. Добрый день, это просто стрессовая ночь без сна, как меня з..бал APPLE ((

    Если кто то собирается выпускать сертификаты Apple (сертификаты разработчика или Push сертификаты), и начнет парится потому что сертификаты выпускаются просроченными, знайте что вы не виноваты)

     

    Вообщем в маке в "Связке ключей" в меню "Вид" кликнете на "Показать скрытые сертификаты"

    Далее в Связке "Система" найдите просроченный сертификат Apple и удалите его.

    После чего с кабинета разработчика скачайте и установите новый сертификат, ссылка на скачивания есть при создания нового сертификата в самом низу. ((

    Подробнее на 

    http://stackoverflow.com/questions/35390072/this-certificate-has-an-invalid-issuer-apple-push-services/35399656#35399656

     

    post-412-0-76857200-1455694433_thumb.png

    Извиняются...

  8.  

    Используйте 

     

    Судя по всему "решения из коробки" нет.

    Будем писать костыли... но считаю что наличие такой возможности по умолчанию для TScrollBox было бы не лишним.

    Спасибо за ответы.

    Тема открыта, может кто-то сталкивался с такой ситуацией. Не ленитесь делится опытом и кодом тут.

    Вам же написали, используйте OnTap прекрасно работает, не мешает при скроле.

    Вы хотите сказать что это не костыль?

     

    Какой же костыль)), костыль это при клике запускать таймер и если изменился фокус в течении секунды тогда что то делать, типа того, вот это костыль))

    Tap - Нажатие

  9. Используйте 

     

    Судя по всему "решения из коробки" нет.

    Будем писать костыли... но считаю что наличие такой возможности по умолчанию для TScrollBox было бы не лишним.

    Спасибо за ответы.

    Тема открыта, может кто-то сталкивался с такой ситуацией. Не ленитесь делится опытом и кодом тут.

    Вам же написали, используйте OnTap прекрасно работает, не мешает при скроле.

  10. Неужели никак нельзя получить доступ к вложенным элементам? Просто стилем накидать проще, чем городить свой объект с прямым доступом к дочерним элементам.

    ----

    Что самое интересное, в TStyledControl.FindStyleResource объект FResourceLink = nil.

    Вот так все работает, но может я не понял вопроса

     

    Желательно это делать в OnApplyStyleLookup данного объекта.

    например если хотите заполнить стилевой текст или картинку:

     

    Новый объект стиля TButton содержит TText, TLabel, TImage и TButton

    procedure TForm_main.Button1ApplyStyleLookup(Sender: TObject);

    begin
            TText(TButton(Sender).FindStyleResource('detail')).Text := 'Детали';
            TLabel(TButton(Sender).FindStyleResource('titul')).Text := 'Наименование';
            TImage(TButton(Sender).FindStyleResource('img')).Bitmap.Assign(BTMP);
            TButton(TButton(Sender).FindStyleResource('but_min')).Tag := 58;
            TButton(TButton(Sender).FindStyleResource('but_min')).OnClick := ButW_Min;
    end;

     

    Сделайте одну процедуру OnApplyStyleLookup и присвойте необходимым объектам. 

     
    Можно напрямую заполнять хоть откуда например 
     TText(Button1.FindStyleResource('detail')).Text := 'Детали';
    но тогда страшные аномалии происходят если ваш объект находятся допустим в скролбоксе.
  11.  

    Способов много, попробуйте например через ActionList, откройте пример на TabControl

    Запустите студию -> Open Sample Project -> Samples\Object Pascal\Mobile Snippets\TabSliding

    Запустил ради интереса этот пример. Если быстро двигать пальцем влево-вправо, приложение вылетает :)

     

    Да согласен не лучший пример)), но для освоения работы жестов думаю подойдет для начала ;)

  12.  

     

    Если вам подойдет можете на MultiView1 ->OnHidden прописать  

    ListBox1.ItemIndex:=-1;

     

    Удивительно, так тоже не работает! :) Выделение итема все равно остается...

     

    Да не может быть, все работает на MultiView.OnHidden

     

    procedure TForm1.MultiView1Hidden(Sender: TObject);
    begin
      ListBox1.ItemIndex := -1;
    end;

    post-412-0-04407200-1454920897_thumb.png

    post-412-0-95284400-1454920900_thumb.png

    post-412-0-35399000-1454920904_thumb.png

  13. Первое что пришло в голову в виде "бреда", точнее так уже сделали))

    Но не знаю насколько вам подойдет такое решение.

    У нас есть сервер базы данных, на сервере понятно есть все данные необходимые для печати, принтер настроен на сервере, на сервере есть служба которая мониторит базу (таблицу) в которой если появилась новая команда для печати тогда служба формирует документ из данных базы с использованием FastReport, и кидает на принтер по умолчанию для печати.

    Сервер (а точнее комп Pentium DualCore, 2 gb RAM) на котором MySQL, Windows (хотя FastReport есть и для Linux (beta)) работает автономно уже 8-й месяц, и за это время не прикоснулись к нему ни разу (даже если честно очень странно) :)

  14. попробовал я добавить, но нечего не вышло ошибку выдает когда указываю в Gestures жесты лево право таки дела=)

    Способов много, попробуйте например через ActionList, откройте пример на TabControl

    Запустите студию -> Open Sample Project -> Samples\Object Pascal\Mobile Snippets\TabSliding

     

    и посмотрите вебинары от Embarcadero 

    https://www.youtube.com/channel/UCtqzKKPLL1uoI7yyCBmKP1w/videos

     

    еще ведь есть компонент от Ярослава в составе FGX

    TfgFlipView - слайдер изображений
  15. Может можно таким же способом добавить ключ?

     
    <key>NSAppTransportSecurity</key>
      <dict>
        <key>NSAllowsArbitraryLoads</key>
          <true/>
      </dict>
     
     
    При добавлении получается:
    <key>NSAppTransportSecurity</key>
    <string>
      <dict>
        <key>NSAllowsArbitraryLoads</key>
          <true/>
      </dict>
    </string>
     
    ХЗ пройдет проверку или нет
×
×
  • Создать...