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

событие TFrame.OnResize


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

Cтолкнулся с не большой проблемой. Разрабатываю фрейм, использованием событие OnResize. Суть проблемы создаем динамически очень много объектов, и в зависимости от размера фрейма, обсчитываем положение и обновление размеры обетов.

Приводит к зависанию всего приложения.

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

что за фрейм такой большой, что так много обсчитывается?

рецепт-то простой. расчеты не должны быть завязаны на компоненты. рассчитывайте на здоровье все в отдельном потоке. потом все рассчитанное разом вылить на экран

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

Событие OnResize может происходить несколько раз подряд. Код в этом событии должен быть как можно короче. Расчет большого количества динамических объектов в этом событии - плохая идея. Лучше действительно воспользоваться отдельным потоком (а для ускорения можно несколько). На вскидку, алгоритм примерно такой:  в событии OnResize запускаете поток, в который передаете размеры фрейма. В потоке делает расчеты и генерируете свое событие, которое обрабатывает фрейм - отображает эти самые объекты или их данные.  Конечно конкретная реализация зависит от задачи

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

не, OnResize правильное событие
просто и вправду нужно знать конкретику почему так долго.

может, у вас оно перезапускается много раз само из себя??

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

я походу переотдыхал, что за отдельные потоки(!), таймеры на вычисления размеров. что за бред?

покажите демо-проект.

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

может, у вас оно перезапускается много раз само из себя??

Именно. Возможно в расчетах что то дергается что приводи к повторному событию.  А вообще прав  ZuBy, без исходников можно долго гадать и предлагать самые фантастические решения. А на деле все может оказаться просто. :)

Ссылка на комментарий
В 02.08.2016 в 14:48, ZuBy сказал:

я походу переотдыхал, что за отдельные потоки(!), таймеры на вычисления размеров. что за бред?

Было написано костыль, для быстрого решение... то так идея с отдельным потом, мне нравится. Так как нет других решений.

Прилегаю файл, как и просили.

procedure TBlocksFrame.SetInitializationLattice;
var
  i, j: Integer;
  xRectangle: TLatticeRectangle;
  xHeight, xWidth: Single;
begin
  xHeight := Self.Height/ROW_COUNT_SIZE;
  xWidth  := Self.Width/COL_COUNT_SIZE;
  if (xHeight > 0) and (xWidth > 0) then
  begin
    for i := 0 to ROW_COUNT_SIZE - 1 do
      for j := 0 to COL_COUNT_SIZE - 1 do
      begin
        xRectangle := TLatticeRectangle.Create(Self);
        SetPostionRectangle(xRectangle,
          j * xWidth + 1.25, i * xHeight + 1.25, xHeight - 2.5, xWidth - 2.5);
        xRectangle.Row := i;
        xRectangle.Col := j;
        xRectangle.Parent := Self;
        xRectangle.OnEnter := RectangleOnEnter;
        xRectangle.OnMouseDown := RectangleOnMouseDown;
        xRectangle.OnMouseMove := RectangleOnMouseMove;
        xRectangle.OnMouseUp := RectangleOnMouseUp;
        FLatticeles.Add(xRectangle);
      end;
  end;
end;

procedure TBlocksFrame.SetUpDatesLattice;
var
  i, j, xIndex: Integer;
  xLattice: TLatticeRectangle;
  xHeight, xWidth: Single;
begin
  xHeight := Self.Height/ROW_COUNT_SIZE;
  xWidth  := Self.Width/COL_COUNT_SIZE;
  if (xHeight > 0) and (xWidth > 0) then
  begin
    for i := 0 to ROW_COUNT_SIZE - 1 do
      for j := 0 to COL_COUNT_SIZE - 1 do
      begin
        xIndex := i * COL_COUNT_SIZE + j;
        xLattice := FLatticeles[xIndex];
        if Assigned(xLattice) then
        begin
          SetPostionRectangle(xLattice,
            j * xWidth + 1.25, i * xHeight + 1.25, xHeight - 2.5, xWidth - 2.5);
        end;
      end;
  end;
end;

// сейчас так

procedure TBlocksFrame.TimerTimer(Sender: TObject);
begin
  if (FSelfHeight = 0) and (FSelfWidth = 0) then
  begin
    FSelfHeight := Self.Height;
    FSelfWidth := Self.Width;
    Self.SetInitializationLattice;
  end
  else
  begin
    if (FSelfHeight <> Self.Height) or (FSelfWidth <> Self.Width) then
    begin
      FSelfHeight := Self.Height;
      FSelfWidth := Self.Width;
      if FLatticeles.Count = 0 then
        Self.SetInitializationLattice
      else
      begin
        SetUpDatesLattice;
        SetUpDatesBlock;
      end;
    end;
  end;
end;

// было так

procedure TBlocksFrame.Resize;
begin
  inherited Resize;

  if (FSelfHeight = 0) and (FSelfWidth = 0) then
  begin
    FSelfHeight := Self.Height;
    FSelfWidth := Self.Width;
    Self.SetInitializationLattice;
  end
  else
  begin
    if (FSelfHeight <> Self.Height) or (FSelfWidth <> Self.Width) then
    begin
      FSelfHeight := Self.Height;
      FSelfWidth := Self.Width;
      if FLatticeles.Count = 0 then
        Self.SetInitializationLattice
      else
      begin
        SetUpDatesLattice;
        SetUpDatesBlock;
      end;
    end;
  end;
end;

block.zip

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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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