Символы табуляции больше не работают в диалогах сообщений Delphi XE2 - альтернативы? - PullRequest
2 голосов
/ 22 марта 2012

Использование Delphi XE2 в 64-разрядной версии Win 7 для создания 32-разрядного приложения ...

В Delphi 6 мы использовали символ табуляции в сообщении для создания красивого многострочного двухстрочного диалогового окна.

str := 'Left item:' + #9#9 + 'Right Item' + #13#10 +
       'Next left item: + #9 + 'Next Right Item' + ...

if MessageDlg(str, mtConfirmation,[mbYes,mbNo],0) = mrYES then...

Это создает аккуратно выстроенный список данных для просмотра пользователем без необходимости настраиваемой формы просто для того, чтобы задать этот конкретный вопрос.Правый столбец хорошо выровнен и облегчает четкое представление данных.

В Delphi XE2 символы табуляции (# 9), встроенные в строку, полностью игнорируются, и вообще отсутствует пробел.Использование # 32 создает пробел, но не выравнивается как символ табуляции (# 9).Я сталкиваюсь с какой-то проблемой Unicode?

Есть ли какие-либо предложения, чтобы вернуть это форматирование, кроме использования пользовательской формы?

Приветствия!

РЕДАКТИРОВАТЬ:

Конечно, после того, как я опубликую вопрос, я придумываю несколько разных способов.

Во-первых, использование Application.MessageBox () поддерживает интервал между символами табуляции.

Во-вторых, как ни странно, этоПриведенный ниже код работает и поддерживает надлежащий пробел с символами табуляции.

procedure TForm1.Button1Click(Sender: TObject);
var AMsgDialog : TForm;
var str : string;
begin
  str := 'Left item:' + #9#9 + 'Right Item' + #13#10 +
         'Next left item:' + #9#9 + 'Next Right Item';
  AMsgDialog := CreateMessageDialog(str, mtConfirmation,[mbYes,mbNo],0);
  try
    if AMsgDialog.ShowModal = mrYES then begin
      //do something
    end;
  finally
    AMsgDialog.Release;
  end;
end;

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

Я знаю, что та же функция CreateMessageDialog срабатывает, когда я вызываю MessageDlg (), поэтому должно быть что-то среднее между удалением символов табуляции.Я не смог отследить код, чтобы выяснить, что убирает символы табуляции.

Надеюсь, это поможет кому-то другому.

1 Ответ

8 голосов
/ 22 марта 2012

В зависимости от некоторых внутренних проверок, таких как версия Windows (больше или равна vista), значение переменной UseLatestCommonDialogs и текущий визуальный стиль является родной темой Windows. MessageDlg использует класс TTaskMessageDialog ( TCustomTaskDialog ), который внутренне вызывает функцию TaskDialogIndirect WinApi. Эта функция обрабатывается самой Windows и насколько я знаю, что нет возможности распознавать символы Tab особым образом.

В противном случае, если одно из указанных выше условий не соответствует MessageDlg, используется функция CreateMessageDialog для создания диалога. Этот метод рисует сам диалог, используя вызовы VCL и WinApi, текст тела рисуется с помощью функции DrawText с включенным флагом DT_EXPANDTABS, который расширяет символы табуляции.

Таким образом, единственный способ, которым функция MessageDlg распознает символы Tab , - это когда внутренне используется CreateMessageDialog (вы можете принудить это поведение, установив значение UseLatestCommonDialogs в false ).

...