如何在Unicode-by-default Delphi XE Applications的消息对话框中使用ASCII Art符号

HX_*_*ned 1 delphi ascii dialog ascii-art delphi-xe

我搜索了主题优惠,但没有设法让一个...

对不起,如果我误会了.如果是,请在此处指出正确的问题.

好的,回到商界.情况:我正在使用ShowMessage()作为应用程序中某些事件的简单"状态简报"提供程序:

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;
Run Code Online (Sandbox Code Playgroud)

现在,我想打磨它,因此我想使用扩展的ascii表,但是,我无法选择访问它们的最佳方式.也许我只是不知道那个神奇的功能......

以下是使用OEMToANSI/OEMToChar和反向功能的方法:http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_20381022.html.我尝试了它们没有运气,因为:

来自EDN/MS-Help的语法

BOOL OemToChar(LPCSTR lpszSrc,LPTSTR lpszDst);

参数

lpszSrc [in]指向OEM定义的字符集中以空字符结尾的字符串的指针.

lpszDst [out]指向已翻译字符串的缓冲区的指针.

如果将OemToChar函数用作ANSI函数,则可以通过将lpszDst参数设置为与lpszSrc参数相同的地址来转换字符串.如果将OemToChar用作宽字符函数,则无法执行此操作.

我需要的是Char(Ord(170)); ,Char(Ord(180)); 和查尔(奥德(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;
Run Code Online (Sandbox Code Playgroud)

这些字体也将正确显示>> Courier New Lucida Console MS Mincho


现在,问题是 - 什么是最好的方式来说Windows对话框(API)使用OEM字符集与触发ShowMessage()的过程; ?覆盖ShowMessage(); ?继承一些richedit功能?各种OwnerDraw()或WndProc()接近...太多选项,但是... ...我很困惑.:(

当然,帮助我选择并指出主观上最有效和最无代码的解决方案.

Cos*_*und 7

如果您使用的是UNICODE版本的Delphi,请不要考虑ASCII字符的ASCII艺术.这些框绘图字符中的每一个都有一个UNICODE代码点.您的Delphi编辑器完全能够直接使用代码,您可以在pascal源文件中安全地使用它们.

这是一个例子:

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;
Run Code Online (Sandbox Code Playgroud)

我是怎么写的?非常简单:打开此页面http://en.wikipedia.org/wiki/Box-drawing_characters并复制粘贴您需要的方框图形字符.没错,你复制粘贴实际的字符(直角线,水平线,垂直线,你需要的任何东西) - 你不需要关心Unicode代码点本身.

当然,让这些字符正确地显示在显示器上是另一回事:你需要一个定点字体才能做到这一点.AFAIK你无法获得固定字体点ShowMessage,你需要编写自己的版本ShowMessage...

  • 如果这些简单的Unicode字符没有显示,则在执行任何其他操作之前,您需要修复Windows. (2认同)