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

Ильдар

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

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

  • Посещение

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

    2

Сообщения, опубликованные Ильдар

  1. Добрый день всем, 

    Прошу помощи знающих: 

    Использую TidTCPClient, отрабатываю потерю связи в процессе работы (втупую выдергиваю провод).

    procedure TClient.onTimer(Sender: TObject);
      begin
    
        try
          self.FunctionRead(0);
        except
          self.Timer.Enabled:= FALSE;
          inc(self.cntErr);
        end;
      end;

    Получаю каскад сообщений "Socket Error: 10054" т.к. блок except не вызывается. 

    1. Каким образом отключить окна сообщений об ошибке?  (т.к. пользователю они в общем-то ни к чему)

    2. Каким образом корректно отловить эти ошибки, чтобы перезапустить соединение?

    3. Где вообще почитать информацию о Indy в FMX 10.3?   

    Заранее спасибо!

  2. 2 часа назад, Zyablik3000 сказал:

    Здравствуйте!

    Создаю компонент. Для компонента рассчитывается три точки TPointF в координатах родителя (одна по левому краю, одна в центре, одна по правому краю)ж

    Есть код

    
    MyComponent:=TMyComponent.Create(Self);
    MyComponent.Position.X:=Random(1000);
    MyComponent.Position.Y:=Random(1000);
    MyComponent.Parent:=(Self);

    Вопрос: можно ли отловить изменение Position чтобы там рассчитывать положение нужных мне трех точек.

    Понятно что можно сделать какой-нибудь MyComponent.CalcPoints где рассчитывать положение точек  и вызывать после каждого изменения положения компонента в программе, но хочется делать расчеты внутри компонента.

     

    в компоненте создать таймер в котором проверять/обрабатывать изменение положения?

  3. 11 часов назад, Alex7wrt сказал:

    Можете сами рисовать PopUp на той же канве. Любой формы, цвета и т.д. По событиям мыши переприсваивать булевы переменные показать/скрыть PopUp, по координатам курсора определять над каким Item находится курсор мыши и т.д. 

    Да, это более длинный подход, зато более универсальный.

    Это понятно. Тут больше хотелось разобраться в специфике работы/взаимодействия канвы и компонентов. Просто я был уверен, что это я где-то что-то некорректно делаю.

  4. Это не очень вариант, создавать костыли, чтобы разгребать костыли с подсветкой выбора айтемов. Но в любом случае большое спасибо за участие. 

    Попробую дома пересобрать в другой версии среды. 

  5. Не пойдет,

    1) При присваивании nil'a по вызову меню затирается вся канва ректангла.

    2) Если АOwner другой компонент - ситуация та же, пустой прямоугольник в левом верхнем углу.

    3) Если AOwner другой невидимый компонент - проблемы с канвой ректангла нет, все работает отлично. Но возникает новая штука - при наведении на айтемы меню - они не подсвечиваются.

  6. График отрисовывается на канве ректангла по таймеру.. 

    Создаем PopUp меню: 

        PopUp:= TPopUpMenu.Create(AOwner);
        PopUp.Parent:= TFMXObject(AOwner);
    
        ItemFormSet:= TMenuItem.Create(PopUp);
        ItemFormSet.Parent:= PopUp;
        ItemFormSet.Tag:= 1;
        ItemFormSet.text:= 'Item 1';
        ItemFormSet.OnClick:= self.MenuClicks;
    
       .....
    
        ItemLegend:= TMenuItem.Create(PopUp);
        ItemLegend.Parent:= PopUp;
        ItemLegend.Tag:= 3;
        ItemLegend.text:= 'Item 3';
        ItemLegend.OnClick:= self.MenuClicks;
    
        Rectangle.PopupMenu:= self.PopUp;

    При вызове PopUp правой клавишей - получаем вот такой "чистый" прямоугольник в левом верхнем углу. Соответственно он исчезает только при следующей перерисовке кадра. (даже если перерисовывать с высокой частотой, все равно при вызове меню видно мелькание в левом углу). Такое ощущение, что при вызове меню - оно создается и отображается там, затирая под собой канву а потом перемещается к координатам мыши.

    Если в меню PopUp'a содержится один item - прямоугольника нет. Начиная с добавления второго - он появляется и чем больше Item'ов тем он больше в высоту.  

    Собственно вопрос в том, как от этого эффекта избавиться?

    PopUp.jpg

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

    а каким цветом рисуете? )

    Черным, по дефолту)  Если тут поменять bm на Panel - на канве панели исправно рисуется черная линия.

    procedure TChart.Draw2;
    var
      A,B:TPointF;
    begin
      A:=TPointF.Create(0,0);
      B:=TPointF.Create(200, 200);
    
      bm.Canvas.BeginScene();
        bm.Canvas.DrawLine(A,B,1);
      bm.Canvas.EndScene;
    end;

    Прогуглил немного, раньше надо было обязательно добавлять bitmapchanged; но в 10.2 он вроде не доступен. Может, рисование на канве контрола и рисование на битмапе отличается чем то?

  8. Добрый день, идеология такая:

    - создать битмап, рисовать на нем, не делая его видимым.

    - нашлепать на канву панели подготовленный битмап.

     

    На деле не получается нарисовать линию на битмапе. Т.е после процедуры Draw2 прожимаю процедуру Draw - получаю на панели красный прямоугольник битмапа без нарисованной линии...

    Посоветуйте чего-нибуть, спасибо!

     

    
    //BITMAP
      Bm:= TBitmap.Create;
      bm.Width:= round (Panel.Width/2);
      bm.Height:= round (Panel.Height/2);
    
      bm.Canvas.BeginScene();
        bm.Canvas.Clear(TAlphacolorrec.Red); //($FF484848);
      bm.Canvas.EndScene;
    
    
    
    procedure TChart.Draw2;
    var
      A,B:TPointF;
    begin
      A:=TPointF.Create(0,0);
      B:=TPointF.Create(200, 200);
    
      bm.Canvas.BeginScene();
        bm.Canvas.DrawLine(A,B,1);
      bm.Canvas.EndScene;
    end;
    
    
    procedure TChart.Draw;
    var
      A: TPointF;
      R: TRectF;
    begin
      A.X:= Panel.Position.X+3;
      A.Y:= Panel.Position.Y+3;
      R:= TRectF.Create(A, bm.Width , bm.Height);
    
      panel.Canvas.BeginScene();
        Panel.Canvas.DrawBitmap(bm,r,r, 20);
      panel.Canvas.EndScene;
    end;

     

  9. 24 минуты назад, GASCHE сказал:

    Прям заставляете усомниться в своих знаниях. А можно подробней почему 

    Потому, что эта часть быдлокода к проблеме не относится)

     

    Сейчас интересует как корректно очистить канву компонента  FMX...

  10. 16 часов назад, RoschinSpb сказал:
    
    Если всё сделать в одном блоке BeginScene EndScene, и без Application.ProcessMessages и Repaint не заработает?
    
    if panel.Canvas.BeginScene then
    try
      // рисовать всё
    finally
      panel.Canvas.EndScene;
    end;
    

    нет (

     

    55 минут назад, Alexander сказал:

    Циклы проверьте, 

    For n:= 0 to n-1 do

     

     

    с ними все норм

  11. 15 часов назад, GASCHE сказал:

    Application.ProcessMessages; Это костыль для решения вашей проблемы, я бы вместо

    
    panel.Repaint; 

    очищал так 

    
    panel.Canvas.Clear(TAlphaColorRec.White); 

    Тогда Application.ProcessMessages не нужен.

    Костыль - само собой) Но это уже верное направление.

    15 часов назад, GASCHE сказал:

    panel.Canvas.Clear(TAlphaColorRec.White); 

    Это я пробовал еще до репэйнта. Тогда белым заливается вся форма. Стираются прочие элементы формы.

     

    объявление Чарта:

    TChart = class
      Panel: TPanel;
      public
      constructor Create (AOwner:TForm; W,H,X,Y:integer);
      procedure DrawGrid (cell: integer);
      procedure DrawLine (p1, p2: TPointF);
      procedure DrawSeries (Series: TSeries);
      procedure Clear;
    end;

    Процедура очищения:

    procedure TChart.Clear;
    begin
      panel.Canvas.BeginScene();
      self.panel.Canvas.Clear(TAlphaColorRec.White);
      panel.Canvas.EndScene;
    end;

     

     

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

    Ну почему. Если без этой процедуры все работает то что-то в ней вы написали не правильно, значит в ней и надо копать. Добавьте после неё Application.ProcessMessages;

    Воу, шайтан! -) Спасибо спасибо огромное.

    procedure TChart.Clear;
    begin
      panel.Repaint;
    end;

    Я так понимаю  Репэйнт заканчивался уже после отрисовки остального? -) Он выделяется в отдельный поток? оО

  13. Только что, GASCHE сказал:

     

    Смотрим отличия этих процедур, закомментируем лишнее //chart.Clear; и все "так же пусто" пропадает и мы видим график.

    Мне кажется вы не поняли суть вопроса. Если убрать очистку в начале - график конечно появится, но в следующем такте измененный график наложится на этот

  14. Только что, Ilya.Z сказал:

    знаю, я с этим сталкивался, когда пару лет назад рисовал свою панель, делал виртуальное окно внутри формы, видимо дело  в том как отрабатываются события, надо смотреть описание событий, очередей обработки, сейчас сложно вспомнить последовательность. По очереди работают,  а  как в одну ставишь - пустота. Сам удивлялся пока не разобрался)  и еще что вспомнил TPanel идет от TStyledControl, попробуй сменить на наследование от TRectangle он от TControl наследуется 

    Panel : TRectangle;

    ничего не изменилось, все так же пусто(

    А можно чуть поподробнее куда копать?

  15. Только что, Ilya.Z сказал:

    На сколько я понимаю не в том месте отрисовывание идет, в Firemonkey  все отрисовки идут в событии OnPaint

    иначе получаешь в итоге чистый лист

     

    хм, еще раз постараюсь описать)

    три процедуры. Если я выполняю их каждую в OnClick трех разных кнопок последовательно нажимая на них - получаю все как надо.

    Если я запаковываю их в один OnClick в той же последовательности - получаю чистую канву...

    т.е. 3 процедуры порознь работают. а упакованные в одну процедуру нет...

  16. procedure TForm1.btn_DrawClick(Sender: TObject);
    var
      i:integer;
    begin
     chart.Clear;
          Chart.DrawGrid(15);
          SetLength(Series, 99);
        for i := 0 to 99 do
          begin
            Series[i]:=PointF(i*10,Random(100));
            Series[i]:=PointF(i*10+5,Random(100));
          end;
        Chart.DrawSeries(Series);
    end;

     

    Предполагаемая последовательность действий:

    1. Очищаем панель

    2. Рисуем сетку

    3. Заполняем массив

    4. Рисуем серию из линий.

    По факту получаю пустую канву панели.

    Если же я раскидаю все шаги по разным кнопкам и буду нажимать их последовательно - то все выполняется корректно. Если заворачиваю в одну процедуру - пустая канва.

    Ткните носом в быдлокод, где я ошибся?  во вложении полный проект.

     

    Вложенные процедуры:

    procedure TChart.Clear;
    begin
      panel.Canvas.BeginScene();
      panel.Repaint;
      panel.Canvas.EndScene;
    end;
    procedure TChart.DrawGrid(cell: integer);
    var
      i,n:integer;
    begin
      n:= Floor(Panel.Width/cell);
      panel.Canvas.BeginScene();
      panel.Canvas.StrokeThickness := 0.3;
      for n := 0 to n do
        begin
          Panel.Canvas.DrawLine(PointF(Panel.Position.X + n*cell, Panel.Position.Y + 2),
                                PointF(Panel.Position.X + n*cell, Panel.Position.Y + Panel.Height - 2), 1);
        end;
    
      n:= Floor(Panel.Height/cell);
      for n := 0 to n do
        begin
          Panel.Canvas.DrawLine(PointF(Panel.Position.X + 2, Panel.Position.Y + n*cell),
                                PointF(Panel.Position.X + Panel.Width - 2, Panel.Position.Y + n*cell), 1);
        end;
      panel.Canvas.EndScene;
    end;

     

    procedure TChart.DrawSeries(Series: TSeries);
    var
      n: integer;
    begin
      n:=Length(Series);
    
      panel.Canvas.BeginScene();
      for n := 0 to n-1 do
        begin
          DrawLine(TPointF(Series[n]), TPointF(Series[n+1]));
        end;
      panel.Canvas.EndScene;
    end;

     

    _Chart.rar

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