件名のオファーを検索しましたが、正しく取得できませんでした...
間違えたらごめんなさい。もしそうなら、ここで正しい質問を指してください。
さて、ビジネスに戻ります。状況:アプリケーションの一部のイベントの単純な「ステータスブリーフィング」プロバイダーとして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()アプローチ...オプションが多すぎますが...これは...混乱しています。:(
もちろん、主観的に最も効果的で最もコードのないソリューションを選択して指摘するのを手伝ってください。