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

Canvas,


Ильдар

Вопрос

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

Ссылка на комментарий

Рекомендуемые сообщения

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

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

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

 

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

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

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

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

Ссылка на комментарий
  • 0
38 минут назад, Ильдар сказал:

 

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

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

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

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

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

Ссылка на комментарий
  • 0
Только что, Ilya.Z сказал:

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

Panel : TRectangle;

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

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

Ссылка на комментарий
  • 0

 

15 минут назад, Ильдар сказал:

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

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

Ссылка на комментарий
  • 0
Только что, GASCHE сказал:

 

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

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

Ссылка на комментарий
  • 1
38 минут назад, Ильдар сказал:

Мне кажется вы не поняли суть вопроса.

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

Ссылка на комментарий
  • 0
Только что, GASCHE сказал:

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

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

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

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

Ссылка на комментарий
  • 0
2 часа назад, Ильдар сказал:

Воу, шайтан! -) 


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

 

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

panel.Repaint; 

очищал так 

panel.Canvas.Clear(TAlphaColorRec.White); 

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

Ссылка на комментарий
  • 0
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;

 

 

Ссылка на комментарий
  • 0
Если всё сделать в одном блоке BeginScene EndScene, и без Application.ProcessMessages и Repaint не заработает?

if panel.Canvas.BeginScene then
try
  // рисовать всё
finally
  panel.Canvas.EndScene;
end;
Ссылка на комментарий
  • 0
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

 

 

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

Ссылка на комментарий
  • 0
1 час назад, Ильдар сказал:

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

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

 

  SetLength(Series, 99);
    for i := 0 to 99 do 

считаете правильно?

Ссылка на комментарий
  • 0
24 минуты назад, GASCHE сказал:

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

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

 

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

Изменено пользователем Ильдар
Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...