2010-12-30 3 views
1

私が間違えていた場合、私は...ユニコード・バイ・デフォルトのDelphi XEアプリケーションのメッセージダイアログでASCIIアート記号を使用する方法

申し訳ありませんが、被写体のオファーを検索しましたが、右のいずれかを取得するために管理していませんでした。もしそうなら、ここで正しい質問をしてください。

さて、ビジネスに戻ってください。状況:私は、アプリケーション内のいくつかのイベントのためのシンプルな「ステータスブリーフィング」プロバイダとして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; 

、私は最善の方法を選択することはできませんので、私はextended ascii tableを使用したい、それを磨くしたいのですが、それらにアクセスする。たぶん私はその魔法の機能を知らないだけ...

ここでは、OEMToANSI/OEMToCharと副機能を使用するアプローチです:http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_20381022.html。私はproboblyための、運でそれらを試してみました:

EDN/MS-Help

BOOL OemToChar(LPCSTR lpszSrc、 LPTSTR lpszDst )からの構文。 OEM定義の文字セットの文字 の NULLで終わる文字列へ

パラメータ

lpszSrc [中]のポインタ。

lpszDst [out]変換された文字列のバッファ へのポインタ。 OemToChar関数は ANSI関数として使用されている場合

、文字列がlpszSrcパラメータと同じアドレスに lpszDstパラメータを設定することにより、所定の位置に を翻訳することができます。 OemToCharがワイド文字機能の として使用されている場合、これはできません。

私は必要なもののChar(オード(170))です。 、Char(Ord(180)); Char(Ord(190)) - http://www.asciitable.com/。明らかに、デフォルトのWInXPコードページでは私はそれらを使うことができません。今、私は少しGoogleと、この解決策を見つけた:


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; 

をまた、これらのフォントが正しく表示されます>> クーリエ新 ルシーダコンソール MS明朝


今、質問は - どのようなWindowsのダイアログ(API)は、OEMのcharset withing手続きを使用すると言うには最良の方法ですtはShowMessage()をトリガーします。 ? ShowMessage()をオーバーライドします。 ?リッチデジット機能を継承していますか?さまざまなOwnerDraw()またはWndProc()がアプローチしています...あまりにも多くのオプションが、... ... ...私は混乱しています。 :(

私が選択して、主観的に最も効果的でほとんどのコードなしの解決策を指摘してください。

+4

あなたはあなたのプログラムをもっと悪く見せるだろうと思います。これはDOSではなく、UI全体を自分で提供する必要がありました。 OSはすでに見栄えの良いウィンドウを提供しています。独自のカスタムウィンドウを自由に作成することもできます。ボックス描画文字の代わりに、実際のボックスを描画するフォームにTPanelまたはTShapeを配置します。単純なメッセージボックスよりも少しだけ必要なものが必要な場合は、[* task dialog *](http://www.tmssoftware.com/site/atbdev5.asp)を使用してください。 –

+0

これは具体的です(私と私の目標は私が開発したこのアプリケーションのために設定しました) - 私は現在のWineHQ develスナップショットと少なくとも部分的に互換性のあるアプリケーションを書こうとしていますので、OwnerDrawや様々なShowMessageの導出/オーバーロード/ /継承する技術。これらのVCLのいずれかをShowMessageまたはMessageBoxに入れることにした場合、WIneHQ環境下でジェット安定ではないWindowsハンドル操作が含まれます。 URL AutoDetectionは今まで動作していません...そのような内部機能の侵入に対して何を期待するのですか? ;) –

+1

@HX_unbanned:パネルと形状のあるフォーム*が動作するはずです。 * that *を使用できない場合、なぜDelphiを使用しているのですか? –

答えて

3

あなたが正しく理解している場合は、Unicode range 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を渡します。

+0

申し訳ありません、正しい記号は表示されません。どちらもMessageBoxW(); ... PWideChar()param ...とWideString宣言... :(代わりに、デフォルトでは "unknown" char - Rectangle - が表示されます)また、変数としてではなくパラメータとして文字列を渡しています。 –

+2

+1。私たちはDelphi XEを使用しているので、Unicode文字を2段階のコードページ変換で取得するのではなく、直接使用することもできます。どちらの場合でも、メッセージボックスフォントを使用してボックス文字を組み込み、それらの文字の幅が囲まれたテキストの幅でうまく動作するようにします。優れたASCIIアートには、文字の寸法を知る必要があります。 –

+2

@HX_unbanned:表示したいグリフがフォントに含まれていない場合、それを回避するためのコーディング量は必要ありません。私はあなたがこれらのボックス文字をまったく使用しようとは思わないと思っています。Robはあなたの質問に完璧なコメントを書いています。 – mghie

7

ユニコード版のDelphiを使用している場合は、ASCII文字についてアスキー文字について考えるのをやめてください。それらのボックス描画文字のすべて1つに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の独自のバージョンを書く必要があります。

+0

うわー、うーん...私はアプローチを表示する低レベルのシンボルから前進しなければならないようです。信じられませんが、21世紀がやっとここに来たということですか? –

+0

私は指を表示するシンボルではないので、結果はかなり面白いです。 Ubuntu PCからWikiページを開くと、すべてのシンボルが正しく表示されます。 VirtualBoxed WinXP SP3 IE8からWIkiページを開くと、単線と二重線の描画シンボルだけが表示されます。コピー&ペーストしたシンボルをIDEにコピーすると、「未知のシンボル」の文字 - 長方形 - が表示されます。今、ネイティブのWindows XPとW7環境でexecアプリケーションを使って、Ubuntu 10.10用のVirtualBox 4.0のフォントサポートに問題があるかどうかを確認してください。注:VirtualBoxed WInXP SP3の下でUbuntuでコード化しています... –

+1

仮想化レイヤーはinvisible:Windows XP SP3を実行している現在の問題については、うまくいくはずです。私はHTMLでは大したことではありませんが、他のブラウザを試しましたか?私はOperaを使用しています。通常のUnicodeの文字はすべて正常に表示されます。デフォルトのフォントを使用していますか?表示したい文字を表示できるフォントが必要です。デフォルトはうまく動作しますが、代替案についてはわかりません。 –

関連する問題