Как использовать символы ASCII Art в диалоговых окнах сообщений приложений Delphi XE по умолчанию в Юникоде - PullRequest
1 голос
/ 30 декабря 2010

Я искал тематические предложения, но не смог найти правильного ...

Извините, если я ошибаюсь. Если да, пожалуйста, укажите правильный вопрос здесь.

Хорошо, вернемся к делу. Ситуация: я использую ShowMessage () в качестве простого поставщика «Status Briefing» для некоторых событий в приложении:

procedure SatusBriefingDialog();
begin
  if Sender = SomeObject then 
  begin
    Application.NormalizeToMosts;
    MessageDlg(Handle, PChar('The_string_that_forms_nice_informative_window / dialog'));
    Application.RestoreTopMosts;
  end;
end;

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

Вот подход, который использует функции OEMToANSI / OEMToChar и наоборот: http://www.experts -exchange.com / Программирование / Языки / Pascal / Delphi / Q_20381022.html . Я попробовал их без удачи, вероятно из-за:

Синтаксис из EDN / MS-Help

BOOL OemToChar (LPCSTR lpszSrc, LPTSTR lpszDst );

Параметры

lpszSrc [in] Указатель на строка символов, оканчивающаяся нулем из набора символов, определенного OEM.

lpszDst [out] Указатель на буфер для переведенной строки.

Если функция OemToChar используется как Функция ANSI, строка может быть переведен на место, установив Параметр lpszDst по тому же адресу в качестве параметра lpszSrc. Это не может быть сделано, если OemToChar используется как функция широких символов.

Мне нужен Чар (Орд (170)); Чар (Орд (180)); и Char (Ord (190)) - http://www.asciitable.com/. Очевидно, что по умолчанию с кодовой страницей WInXP я не могу их использовать. Теперь я немного погуглил и нашел это решение:


Код события FormShow:

procedure TMain.FormShow(Sender: TObject);
var
   i : longint;
begin
  re.Font.Name := 'Terminal';
  re.Font.Size := 9;
//seems that charset must be set last
  re.Font.Charset := OEM_CHARSET;
  re.DefAttributes.Name := 'Terminal';
  re.DefAttributes.Size := 9;
  re.DefAttributes.Charset := OEM_CHARSET;
  re.SelectAll;
  re.SelAttributes := re.DefAttributes;
//turn off richedit's auto font switching...
  i := SendMessage(re.Handle, EM_GETLANGOPTIONS, 0, 0);
  i := i and not IMF_AUTOFONT;
  SendMessage(re.Handle, EM_SETLANGOPTIONS, 0, i);
end;

Также эти шрифты будут отображаться правильно >> Новый Курьер Lucida Console MS Mincho


Теперь возникает вопрос: как лучше всего использовать Windows Dialogs (API), чтобы использовать OEM-кодировку без процедуры, которая запускает ShowMessage (); ? Переопределение ShowMessage (); ? Унаследовать некоторые функции richedit? Различные OwnerDraw () или WndProc () подходят ... слишком много вариантов, но ... которые ... я в замешательстве. (

Помогите мне выбрать и указать, конечно же, субъективно наиболее эффективное и наиболее бескодовое решение.

Ответы [ 2 ]

7 голосов
/ 30 декабря 2010

Если вы используете UNICODE-версию Delphi, перестаньте думать об искусстве ASCII с точки зрения символов ASCII.Каждый из этих символов для рисования прямоугольников имеет кодовую точку UNICODE.Редактор вашего Delphi прекрасно умеет работать с кодами напрямую, вы можете безопасно использовать их в ваших исходных файлах на Паскале.

Вот пример:

procedure TForm20.Button1Click(Sender: TObject);
begin
  ShowMessage(
     '┌─────────────────────────────────────────────┐'#13#10 +
     '│ You have UNICODE DELPHI, you may now write  │'#13#10 +
     '│ this without any problems. Just copy-paste  │'#13#10 +
     '│ the chars you need from the wikipedia page. │'#13#10 +
     '└─────────────────────────────────────────────┘'
  );
end;

Как я это написал?ОЧЕНЬ легко: откройте эту страницу http://en.wikipedia.org/wiki/Box-drawing_characters и скопируйте и вставьте нужные вам символы для рисования.Правильно, вы копируете и вставляете фактический символ (прямоугольные линии, горизонтальные линии, вертикальные линии, все, что вам нужно) - вам не нужно заботиться о самих кодовых точках Unicode.

Теперьконечно, чтобы эти символы правильно отображались на экране, это другое дело: для этого нужен шрифт с фиксированной точкой.AFAIK, вы не можете получить фиксированный шрифт с ShowMessage, вам нужно написать свою собственную версию ShowMessage ...

3 голосов
/ 30 декабря 2010

Если я вас правильно понимаю, вы хотите использовать некоторые символы рисования прямоугольников, которые находятся в диапазоне Юникод 2500-257F.Так что вам просто нужно показать сообщение с текстом Unicode.Если вы работаете в Delphi 2009 или более поздней версии, это очень просто, вы просто вставляете символы в вашу строку:

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  s := 'Test ' + #$2523;
  MessageBox(Handle, PChar(s), nil, MB_OK);
end;

Даже если вы работали в более ранней версии Delphi, вы все равно можете вызвать вариант Unicode, напримерфункцию MessageBox(), используя MessageBoxW() и передавая ей WideString.

...