• 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 ответов на этот вопрос

  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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...

Изменено пользователем Ильдар

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1
3 часа назад, Ильдар сказал:

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

Очистить можно так

Chart.7z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

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

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