1

件名のオファーを検索しましたが、正しく取得できませんでした...

間違えたらごめんなさい。もしそうなら、ここで正しい質問を指してください。

さて、ビジネスに戻ります。状況:アプリケーションの一部のイベントの単純な「ステータスブリーフィング」プロバイダーとして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;

今、それを磨きたいので、拡張ASCIIテーブルを使用したいのですが、それらにアクセスするための最良の方法を選択することはできません。たぶん私はその魔法の機能を知らないだけです...

OEMToANSI / OEMToCharおよびその逆の関数を使用するアプローチは次のとおりです:http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_20381022.html。おそらく次の理由で、運が悪かったので試してみました。

EDN/MSからの構文-ヘルプ

BOOL OemToChar(LPCSTR lpszSrc、LPTSTR lpszDst);

パラメーター

lpszSrc[in]OEM定義の文字セットからのnullで終了する文字列へのポインタ。

lpszDst[out]変換された文字列のバッファへのポインタ。

OemToChar関数がANSI関数として使用されている場合、lpszDstパラメーターをlpszSrcパラメーターと同じアドレスに設定することにより、文字列をその場で変換できます。OemToCharがワイド文字関数として使用されている場合、これは実行できません。

必要なのはChar(Ord(170));です。、Char(Ord(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;

また、これらのフォントは正しく表示されます>> Courier New Lucida Console MS Mincho


さて、問題は、Windows Dialogs(API)がShowMessage()をトリガーするOEM文字セットwithprocedureを使用するための最良の方法は何でしょうか。?ShowMessage();をオーバーライドします。?いくつかのリッチエディット機能を継承しますか?さまざまなOwnerDraw()またはWndProc()アプローチ...オプションが多すぎますが...これは...混乱しています。:(

もちろん、主観的に最も効果的で最もコードのないソリューションを選択して指摘するのを手伝ってください。

4

2 に答える 2

7

Delphi の UNICODE バージョンを使用している場合は、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 コード ポイント自体を気にする必要はありません。

もちろん、これらの文字をディスプレイに適切に表示させることは別の問題です。これを行うには、固定小数点フォントが必要です。私の知る限り、で固定フォント ポイントを取得することはできません。独自のバージョンの...ShowMessageを作成する必要があります。ShowMessage

于 2010-12-30T14:22:08.990 に答える
3

私があなたを正しく理解しているなら、あなたはUnicodeの範囲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を使用している場合でも、を使用して渡すことにより、たとえばMessageBox()関数のUnicodeバリアントを呼び出すことができます。MessageBoxW()WideString

于 2010-12-30T14:09:23.447 に答える