Пользователи, работающие с компонентом TVirtualStringTree в Delphi XE2, иногда сталкиваются с проблемой, когда состояние галочки не обновляется должным образом после вызова MessageBox из обработчика события OnChecking. Проблема заключается в том, что после отображения MessageBox и подтверждения изменения состояния галочки, пользователю необходимо сделать второй клик, чтобы галочка изменила своё состояние. Это происходит из-за того, что при первом клике обработчик OnChecking не вызывается повторно.
Пример кода, демонстрирующий проблему:
procedure TForm3.VirtualStringTree1Checking(Sender: TBaseVirtualTree;
Node: PVirtualNode; var NewState: TCheckState; var Allowed: Boolean);
var
data: TObject;
begin
data := TObject(Sender.GetNodeData(Node)^);
if assigned(data) and (data is TMyData) and (TMyData(data).value = 'A') then
Allowed := Application.MessageBox('Are you sure?', 'Confirmation', MB_YESNO or MB_ICONQUESTION) = ID_YES
else
Allowed := true;
end;
Исправление:
Для решения данной проблемы можно использовать альтернативный подход, обрабатывая событие OnChecked, которое срабатывает уже после изменения состояния галочки:
procedure TForm3.VirtualStringTree1Checked(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
data: TObject;
begin
data := TObject(Sender.GetNodeData(Node)^);
if assigned(data) and (data is TMyData) and (TMyData(data).value = 'A') then
begin
if Application.MessageBox('Are you sure?', 'Confirmation', MB_YESNO or MB_ICONQUESTION) = IDYES then
Exit;
if Node.CheckState = csUncheckedNormal then
Node.CheckState := csCheckedNormal
else
Node.CheckState := csUncheckedNormal;
end;
end;
Также было предложено обойти проблему, изменив состояние галочки внутри обработчика OnChecking после подтверждения в MessageBox:
type
TBaseVirtualTreeAccess = class(TBaseVirtualTree);
procedure TForm1.VirtualStringTree1Checking(Sender: TBaseVirtualTree;
Node: PVirtualNode; var NewState: TCheckState; var Allowed: Boolean);
var
data: TObject;
begin
data := TObject(Sender.GetNodeData(Node)^);
if assigned(data) and (data is TMyData) and (TMyData(data).value = 'A') then
begin
Allowed := False; // Мы будем обрабатывать это сами
if Application.MessageBox('Are you sure?', 'Confirmation', MB_YESNO or MB_ICONQUESTION) = ID_YES then
begin
// Обновляем состояние и вызываем OnCheck, если нужно
TBaseVirtualTreeAccess(Sender).DoCheckClick(Node, NewState);
end;
end
else
Allowed := True;
end;
Подтверждено, что проблема существует и связана с обработкой сообщений мыши при отображении модальных диалогов. Предложенный обходной путь позволяет обойти эту проблему, но для более глубокого понимания и предложения общего решения потребуется дополнительное изучение кода компонента.
Эта статья предоставляет разработчикам, работающим с TVirtualStringTree в Delphi XE2, информацию о проблеме с обновлением состояния галочек и предлагает возможные пути её решения.
Пользователи могут столкнуться с проблемой, когда состояние галочки в компоненте `TVirtualStringTree` в Delphi XE2 не обновляется после использования `MessageBox`, и требуется дополнительный клик для изменения состояния.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.