Удерживать поток событий 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;