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

Razmir

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

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

  • Посещение

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

  1. В 18.12.2015 в 10:55, Равиль Зарипов (ZuBy) сказал:
    function TextHeight(const AText: string; aTextSettings: TTextSettings; const MaxWidth: Single): Single;
    // uses FMX.Graphics, FMX.TextLayout, FMX.Types, Math
    var
      Layout: TTextLayout;
      aRect: TRectF;
      aWW: Boolean;
    begin
      Result := 24;
      if AText.IsEmpty then
        Exit;
    
      aWW := Pos(#13#10, AText) > 0;
      if (aTextSettings.WordWrap) or (aWW) then
        aRect := RectF(0, 0, MaxWidth, MaxSingle)
      else
        aRect := RectF(0, 0, MaxSingle, MaxSingle);
      Layout := TTextLayoutManager.DefaultTextLayout.Create;
      try
        Layout.BeginUpdate;
        Layout.TopLeft := aRect.TopLeft;
        Layout.MaxSize := PointF(aRect.Width, aRect.Height);
        Layout.Text := AText;
        Layout.WordWrap := aTextSettings.WordWrap;
        Layout.HorizontalAlign := TTextAlign.Leading;
        Layout.VerticalAlign := TTextAlign.Leading;
        Layout.Font.Assign(aTextSettings.Font);
        Layout.Color := aTextSettings.FontColor;
        Layout.RightToLeft := false;
        Layout.EndUpdate;
        aRect := Layout.TextRect;
      finally
        FreeAndNil(Layout);
      end;
      Result := aRect.Bottom;
    end;

    думаю для ширины не нужно показывать код, сами отредактируете

    Прошу прощения, что поднимаю некротему, но уже устал биться с такой проблемой - В Listbox выводится от 2х до 4х итемов с текстом разной длины, попытался применить этот код, нашел еще другие варианты, уже дошел до того, что тупо создаю label, присваиваю ему текст и autosize в true, высоту label присваиваю итему. Но проблема в том, что любой из кодов нормально работает, если listbox видим на главной форме. Ежели размещаю на другой форме, или на tabcontrol на не основном табе, то почему то код начинает работать только со второго раза. В первый вообще непонятно какие размеры ставятся. Почему так?

  2. 37 минут назад, Slym сказал:
    type
     TSpinBoxEx=class(TSpinBox)
     protected
       procedure SetData(const Value: TValue); override;
     end;
    
    { TSpinBoxEx }
    
    procedure TSpinBoxEx.SetData(const Value: TValue);
    begin
      if Value.IsType<string> then
       Self.Value := StrToFloatDef(Value.AsString,0)
      else
        inherited SetData(Value);
    end;
    
    procedure TForm1.StringGrid1CreateCustomEditor(Sender: TObject; const Column: TColumn; var Control: TStyledControl);
    begin
      if Column.Index=1 then
        Control:=TSpinBoxEx.Create(self);
    end;

     

    Спасибо, но ровно то же самое, появляется только после 2х кликов

  3. Всем доброго, вопрос такой.

    RAD Studio 11.2 Нашел как создать свой тип ячейки таким образом:

     

    type
      TSpinBoxCell = class(TSpinBox)
      private
    ...............................
      protected
        constructor Create(AOwner: TComponent); override;
      end;
     
    ...............................
     
    constructor TSpinBoxCell.Create(AOwner: TComponent);
    begin
      inherited;
    ...............................
    end;
     
    procedure TForm1.StringGrid1CreateCustomEditor(Sender: TObject;
      const Column: TColumn; var Control: TStyledControl);
    var
      XSpin: TSpinbox;
    begin
      if Column.Index=5
      then 
      begin
        XSpin:= TSpinBoxCell.Create(nil);
        XSpin.TagObject := Column;
        XSpin.text:='1';
        Control := XSpin;
      end;
    end;

     

    Проблема в том, что spinbox не отображается пока не кликнешь по ячейке 2 раза, ну и после перехода на другую ячеку он опять исчезает и соответственно не видно результата. Что надо сделать, чтобы это исправить? Заранее благодарю.

  4. 9 минут назад, krapotkin сказал:

    Собирайте пример, выкладывайте сюда

    Сравнил с вашим вариантом, я не использовал beginupdate, потому как у меня загружается items при onshow и тогда форма как бы подвисает, что не желательно, попробовал с кнопки создавать действительно, практически моментально все создается. Буду думать как организовать загрузку иначе. Спасибо. Уже не впервые выручаете. Отдельное спасибо за подсказку на счет фреймов.

  5. 3 минуты назад, krapotkin сказал:

    Очень медленно. Отключите стилизацию итема проверьте что это именно она. 

    Этот вариант как раз таки без стилизации, динамическое создание компонентов, со стилизацией еще медленнее

  6. 3 часа назад, krapotkin сказал:

    2) Зачем создавать динамически все контролы, если можно все оформить в TFrame и просто создавать его и класть хоть в listBox хоть в ScrollBox. (Это по сути одно и то же почти)

    Сейчас пробую TFrame, интересная штука, как то раньше не использовал, возможно то, что надо

  7. 3 часа назад, krapotkin сказал:

    Вполне можно было просто подложить rectangle и просто задавать его цвет у каждого item. Ведь на самом деле в стилях вы делаете именно это, просто меняете цвет rectangle который где-то там в стиле.

    То есть можно сделать стиль с кнопками и текстом не у итема, а у rectangle, который будет кидаться на пустой итем и у него менять цвет без всяких стилей? точно, надо попробовать.

     

  8. 21 часов назад, brunnengi сказал:

    Но в целом можно просто кинуть layout, в него VertScroll box, а в него уже создавать все нужные вами Items в real-time. 

    да, тоже думал о таком варианте, даже накидал код, но удалил его, так как такой вариант оказался не приемлем,  возникает несколько проблем, например сортировка, несколько колонок и так далее, конечно это все можно решить созданием тонны кода, но зачем тогда стандартные компоненты, если их нельзя использовать?

  9.  

    21 часов назад, krapotkin сказал:

    обычно когда что-то идет не так, смотрят кот и анализируют алгоритм

    Код как бы 2 варианта.

    Первый, это в стилях создаю тот итем как мне нравится, и в цикле присваиваю значения, на примере ListBox:

      for i := 0 to xcount-1 do
      begin
        n:=trunc(date-strtodate(s));
        list.Items.Add(nomenklatura[i]);
        with list.ListItems[list.Count-1] do
        begin
          if (n>3) and (n<10) then StyleLookUp:='ListBoxItemBrown1';
          if (n<=3) then StyleLookUp:='ListBoxItemGreen1';
          if (n>9) then StyleLookUp:='ListBoxItemRed1';
          StylesData['Label2.Text']:=xdate[i];
          if list.Name='ListBox1' then StylesData['Button1.OnClick'] := TValue.From<TNotifyEvent>(XItemClick);
          if list.Name='ListBox2' then StylesData['Button1.OnClick'] := TValue.From<TNotifyEvent>(form2.XItemClick);
        end;
      end;

    Здесь вроде как все элементарно, но со стилями вообще жуткие тормоза. 

    Второй вариант динамическое создание компонентов, здесь код побольше:

      begin
      FRectangle := TRectangle.Create(Owner);
        with FRectangle do
        begin
          Align:=TAlignLayout(9);
          Margins.Left:=3;
          Margins.Right:=3;
          Margins.Bottom:=3;
          Margins.Top:=3;
          XRadius:=7;
          YRadius:=7;
          locGradient := TGradient.Create;
          n:=trunc(date-xdate[i]);
          if (n>3) and (n<10) then
          with locGradient do
          begin
            Color  :=$FFFBFAFA;
            Color1 :=$FFDABC76;
          end;
          if (n<=3) then
          with locGradient do
          begin
            Color  :=$FF73FD11;
            Color1 :=$FF4EA43B;
          end;
          if (n>9) then
          with locGradient do
          begin
            Color  :=$FFFD834E;
            Color1 :=$FFC8311A;
          end;
    
    
          with Fill do
          begin
            Kind      := TBrushKind.Gradient;
            Gradient  := locGradient;
          end;
        end;
    
        FDate:=TLabel.Create(self);
        with FDate do
        begin
          Parent:=FRectangle;
          StyledSettings := [];
          Text:=xdate[i];
          Align:=TAlignlayout.Left;
          width:=80;
          Margins.Left:=3;
          Margins.Bottom:=3;
          Margins.Right:=3;
          Margins.Top:=3;
          textsettings.VertAlign:=TTextalign(0);
          TextSettings.HorzAlign:=TTextalign(0);
          TextSettings.Font.Size:=14;
          TextSettings.Font.Style:=TextSettings.Font.Style + [TFontStyle.fsBold];
        end;
    
        FName:=TLabel.Create(self);
        with FName do
        begin
          Parent:=FRectangle;
          Text:=nomenklatura[i];
          StyledSettings := [];
          Align:=TAlignlayout(9);
          Margins.Left:=5;
          Margins.Bottom:=3;
          Margins.Right:=0;
          Margins.Top:=3;
          TextSettings.HorzAlign:=TTextalign.Leading;
          textsettings.VertAlign:=TTextalign(0);
          textsettings.WordWrap:=true;
          TextSettings.Font.Size:=14;
          TextSettings.Font.Style:=TextSettings.Font.Style + [TFontStyle.fsBold];
        end;
    
       FButton:=TCornerButton.Create(self);
        with FButton do
        begin
          width:=40;
          Parent:=FRectangle;
          StyledSettings := [];
          Align:=TAlignlayout.Right;
          Margins.Left:=0;
          Margins.Bottom:=7;
          Margins.Right:=7;
          Margins.Top:=7;
          Xradius:=15;
          yradius:=15;
    
          TextSettings.HorzAlign:=TTextalign(0);
          textsettings.VertAlign:=TTextalign(0);
          textsettings.WordWrap:=true;
          TextSettings.Font.Size:=14;
    
          TextSettings.Font.Style:=TextSettings.Font.Style + [TFontStyle.fsBold];
          TextSettings.FontColor:=talphacolorRec.Ivory;
          text:='✔';
          OnClick:=FButtonClick;
        end;
        FKol:=TCornerButton.Create(self);
        with FKol do
        begin
          width:=40;
          Parent:=FRectangle;
          StyledSettings := [];
          Align:=TAlignlayout(2);
          Margins.Left:=7;
          Margins.Bottom:=7;
          Margins.Right:=0;
          Margins.Top:=7;
          Xradius:=15;
          yradius:=15;
          text:=floattostr(abs(хvolume[i]));
          OnClick:=FKolClick;
          TextSettings.HorzAlign:=TTextalign(0);
          textsettings.VertAlign:=TTextalign(0);
          textsettings.WordWrap:=true;
          TextSettings.Font.Size:=14;
          if h>=0 then TextSettings.FontColor:=talphacolorRec.Lightgreen else TextSettings.FontColor:=talphacolorRec.Red;
          TextSettings.Font.Style:=TextSettings.Font.Style + [TFontStyle.fsBold];
          tag:=x;
        end;

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

  10. Доброго времени. Есть массив данных о товаре, на основании которых должен выводится стилизованный список. Динамически создается Rectangle, который окрашивается градиентом в зависимости от даты поступления, на нем же 2 Button - 1 с информацией об излишке или недостаче, при нажатии на которую появляется окно для коррекции информации, 2 для обновления даты. Так же 2 Label, в которых выводится название товара и дата поступления. Проблема в следующем: пробовал использовать ListBox, ListView, TreeView. При создании списка жуткие тормоза. То есть пока все Item выведутся проходит пару тройку секунд и это при списке из 20 товаров, боюсь представить, как это долго если товаров будет 100 и больше. При чем на андроид таких тормозов нет, только под виндой. Как можно решить данную проблему?

  11. Ох как же я затупил ?‍♂️ ведь ларчик просто открывался. Оказывается проблема вообще не в JSON, на андроид почему то приходит GET запрос с дополнительным символом, из за него то и вылетает. Тема закрыта, спасибо.

  12. Только что, krapotkin сказал:

    а откуда берется JSON? и как на андроиде появился DBX-чего-то там

    Получается с сайта.
    
    Function TForm3.GetUTF8Page(URL: String):UTF8String;
    Var
      Stream: TStream;
    Begin
      Stream:=TMemoryStream.Create;
      Try
        NetHTTPClient1.Get(URL, Stream);
        Stream.Position:=0;
        SetLength(Result, Stream.Size);
        Stream.Read(Result[1], Stream.Size);
        Result:=UTF8ToString(Result);
      Finally
        Stream.Free;
      End;
    End;
    
    procedure TForm3.Button1Click(Sender: TObject);
    begin
    
     JSONText:=GetUTF8Page('https://*******');
    
    JSON:=SO(JSONText);'
    
    .............................................................
    
    end;

    Про  DBX сам не понимаю, это было в вашем ответе, касаемо JSON, ну и проверил, действительно короткий вариант работает

  13.  

    1 минуту назад, krapotkin сказал:
    
    procedure TForm1.btn1Click(Sender: TObject);
    var
      X:ISuperObject;
    begin
      x:=SO(m1.Lines.Text);
      m1.Lines.Text := x.AsJSON(true);
    end;

    проверил код на Win 64 и Android 10 @ Honor 10x lite

    все работает прекрасно

    Delphi 10.4.1

    Похоже понял в чем проблема, выше сократил данные для удобства восприятия, на самом деле гораздо длиннее. Нашел ваше:

    нужно забыть про передачу бинарников через string и использовать параметры TDBXStreamValue

    Вставил короткий вариант и он заработал. Я так понял, что проблема в том, что JSON больше 32кб. Но не понял как использовать TDBXStreamValue, ищу сейчас инфу

  14. 3 часа назад, krapotkin сказал:

    все как обычно, данные дайте посмотреть

    {"n":"2","c":[{"A":"F23","B":"Up","C":"5LLL"},{"A":"F12","B":"Down","C":"5LLF"},{"A":"F23","B":"Up","C":"3LLF"},{"A":"F48","B":"Up","C":"57LF"},{"A":"F15","B":"Down","C":"GLL5"}]}

    3 часа назад, krapotkin сказал:

    и о каких последних строчках идет речь?

    2 варианта, в каждом по 2 строчки, вторые строчки являются последними

     

    3 часа назад, krapotkin сказал:
    
    JSON := TJSONObject.ParseJSONValue(JSONText) as TJSONObject;
    JSONArray := JSON.Get('c').JsonValue as TJSONArray;

    а во втором

    
    JSON:= SO(JSONText);

    и все

    Без разницы. Так же, под виндой работает, под андроид вылетает ошибка

  15.  

    Второй день бьюсь, не могу понять в чем причина, надо спарсить данные с JSON, на винде все работает, на андроид вылетает ошибка - Acces violation at addres BAEDD64C, accessing address 0000000D.

    Использовал 2 варианта, родной System.JSON и XSuperObject:

    Вариант 1:
    JSON := TJSONObject.ParseJSONValue(JSONText) as TJSONObject;
    JSONArray := TJSONArray(JSON.Get('c').JsonValue);

    Вариант 2:

    JSON:=TSuperObject.Create;
    JSON:= SO(JSONText);

    Ошибки вылетают на последних строчках. В чем может быть проблема? Спасибо.

  16. Здравия всем. Мучаюсь второй день, ни как не получается. В стиле listitema есть кнопка, по нажатию которой необходимо что то выполнить. Перечитал всю ветку по этому вопросу, решения нет.

    Есть измененный стиль итема листбокса, в который добавлена кнопка. Вычитал здесь, что для обращения к ней, надо сделать так:

    xitem.StylesData['Button.OnClick'] := TValue.From<TNotifyEvent>(xonclick);

    Но так не работает. Выдает ошибку- Invalid Class Typecast

    Так же не получается изменить вид текста, то есть шрифт, цвет, толщину и т.д.

    Работает только одно:

    xitem.StylesData['button.Text'] := 'ОК';

    Подскажите как быть. Спасибо.

  17. 18 часов назад, GASCHE сказал:
    
    Попробуйте Width и Heigh взять из координаты ARect события OnPainting, мне помогло. 
    
        PROCEDURE pbGraphPainting( Sender : TObject; Canvas : TCanvas; const ARect : TRectF );
    
    ...
    
       _rGraph.OnPainting := pbGraphPainting;
    

     

    Попробовал, то же самое.

    В общем на панель кинул rectangle, сетку рисую на нем, а объекты размещаю на панели, так все норм

  18. Приветствую. Рисую координатную сетку с помощью такого кода:

      with Panel1 do
      begin
        Canvas.BeginScene;
        try
          Canvas.Stroke.Color:=talphacolorRec.Darkgrey;
          b:=trunc(Width/CellSize)-1;
          c:=trunc(height/CellSize)-1;
          for a := 0 to b do
          begin
            if (a mod 10 = 0) then Canvas.Stroke.Thickness:=2 else Canvas.Stroke.Thickness:=1;
            Canvas.DrawLine(PointF(a * CellSize + 0.5, 0.5), PointF(a * CellSize + 0.5, height-1), 1);
          end;
          for a := 0 to c do
          begin
            if (a mod 10 = 0) then Canvas.Stroke.Thickness:=2 else Canvas.Stroke.Thickness:=1;
            Canvas.DrawLine(PointF(0.5, a * CellSize + 0.5), PointF(width-1, a * CellSize + 0.5), 1);
          end;
          finally
          Canvas.EndScene;
        end;
      end;

    Проблема в том, что при размещении компонентов на панели, сетка рисуется и на них. Как от этого избавиться? Спасибо.

  19. В 09.10.2015 в 13:24, Евгений Корепов сказал:

    Огромное спасибо!!! Все заработало! Проблема видимо в косячном примере от embarcadero. 

     

    Проверку InAppPurchase.IsProductPurchased(ProductId) необходимо выполнять в событии OnProductsRequestResponse, т.е. после завершения ,видимо ассинхронного, InAppPurchase.QueryProducts.
    А никак не в OnSetupComplete как в примере от Embarcadero "CapitalIAP". Кстати в Delphi 10 тот же косяк в примере, видимо они даже не пробовали проверять его работоспособность.

    Доброго времени суток. С ембаркадеровским примером разобраться не смог, а здесь все доступно. Респект. Но все таки проблема есть. У меня почему то при попытке оплаты выдает - "Необходимо войти в аккаунт", хотя я в аккаунте и с других приложений все нормально проходит.

×
×
  • Создать...