Удерживать поток событий GUI до завершения метода

В настоящее время в моем приложении пользователь может создавать окна (пока нет элементов управления), которые прикреплены к элементу управления страницы. Каждый редактор имеет набор связанных с ними наборов инструментов. Этот набор сбрасывается при создании редактора и изменяется, когда наборы инструментов закрываются и открываются. При изменении вкладки управления страницей состояние наборов инструментов сохраняется, они закрываются, а затем восстанавливаются наборы инструментов для новой вкладки.

Мое приложение падает (на первый взгляд случайно), когда вы меняете вкладку. Я считаю, что когда вы очень быстро меняете вкладку (скорость двойного щелчка), обработка наборов инструментов в событии PageControl.OnChange не завершается до того, как начинается следующее событие PageControl.OnChange, и я получаю два события, работающие параллельно ". Мои вопросы:

1) Это звучит как правдоподобная теория? Я знаю, что есть поток обработки GUI, работает ли delphi, отправляя новые потоки для обработки событий?

2) Как бы вы предложили исправить это? Задержать сообщения, пока не закончится первый метод (это очень быстрый метод, поэтому не должно быть никакой задержки на самом деле)?

Вот код, который кто-то хотел бы посмотреть на проблему под другим углом.

Это код для события onchange.

procedure TMainForm.PageDockingAreaChange(Sender: TObject);
var
  count : integer;

  // Shortcut variables
  FormShortcut : TForm;
  WelcomeShortcut : TWelcomePageForm;
  BaseEditorShortcut : TBaseEditor;

begin

  // Set nil values
  FormShortcut := nil;
  WelcomeShortcut := nil;
  BaseEditorShortcut := nil;

  // Create shortcut value
  FormShortcut := Self.GetActiveForm;
  if (FormShortcut is TWelcomePageForm) then WelcomeShortcut := TWelcomePageForm(FormShortcut);
  if (FormShortcut is TBaseEditor) then BaseEditorShortcut := TBaseEditor(FormShortcut);

  // Hide all tabs when welcome page is visible
  if (WelcomeShortcut <> nil) then
    begin

      // Clear any existing toolboxes
      Self.ToolboxClearAll;

    end;
  {endif}

  // Try to execute toolbox setup
  try

    // Load toolbox state
    Self.ToolboxSetup(BaseEditorShortcut);

  except

    // Display fatal error to the user
    ShowMessage('Fatal Error : Unable to load toolboxes.');

  end;

  // Update last active editor
  if (BaseEditorShortcut = nil) then
    Self.LastActiveEditor := nil
  else
    Self.LastActiveEditor := BaseEditorShortcut;
  {endif}

end;

Этот метод закрывает все наборы инструментов и освобождает их по очереди.

procedure TMainForm.ToolboxClearAll;
var
  count : integer;
begin

  // Save toolbox state if needed
  if Assigned(Self.LastActiveEditor) then
    Self.LastActiveEditor.SaveToolboxState;

  // Close and free all toolboxes
  for count := 0 to length(Self.ActiveToolboxes)-1 do
    Self.ToolboxCloseAndFree(Self.ActiveToolboxes[count]);

  // Reset array size (should already be done though)
  SetLength(Self.ActiveToolboxes, 0);

end;

0 ответов

Другие вопросы по тегам