文字列に「&」を代入して表示するとアンダーラインになるのを回避するには?

解決


デル太  2009-11-13 03:46:08  No: 36155

よろしくお願いします。

Delphi6 を使っています。
次のコードで「&」が表示されず、次の文字にアンダーライン(下線)が付きます。

「&」に特別な働きがあるのでしょうか?
代入した文字列のまま表示することができるでしょうか?

var
  s: String;
begin
  s := 'www.example.com?a=aaa&b=bbb';
  showmessage(s); //表示された文字列には「&」が表示されず次の文字「b」にアンダーラインが付く
end;


されば  2009-11-13 03:52:35  No: 36156

二つ続ければ御利益あり


デル太  2009-11-13 04:18:08  No: 36157

ありがとうございます。
代入箇所を次のように修正し、表示上「&」がアンダーラインになる問題を回避できました。

  s := 'www.example.com?a=aaa&&b=bbb';

-----

変数に代入した文字を確認する目的で表示していたため、可能なら、変数に代入した文字には手を加えず、表示のときにアンダーラインになるのを抑止したいと思います。

そのような方法もあるでしょうか?

どうぞ、よろしくお願いいたします。


tor  2009-11-13 05:30:50  No: 36158

メッセージボックスを表示する関数は他にもいくつかありますが
Application.MessageBoxとかMessageDlgとかは試してみました?

どれがどれだか忘れましたが、APIのMessageBoxを直に呼び出しているものなら
&がアクセスキーと解釈されることはないはずです。


igy  2009-11-13 05:39:26  No: 36159

ShowMessage(StringReplace(S, '&', '&&', [rfReplaceAll]));
はいかがですか?


デル太  2009-11-13 17:47:35  No: 36160

tor さん、ありがとうございます。
Application.MessageBox でうまく表示できました。
期待通り、変数の値をそのまま表示してくれます。

MessageDlg は ShowMessage と同じ結果でした。

igy さん、ありがとうございます。
ご提案のコードで & がアンダーラインになる振る舞いを抑制できました。

テストしたコードを掲載します。

var
  s: String;
begin
  s := 'www.example.com?a=aaa&b=bbb';
  showmessage(s); //表示された文字列には「&」が表示されず次の文字「b」にアンダーラインが付く
  showmessage(StringReplace(s, '&', '&&', [rfReplaceAll]));
  MessageDlg(s, mtConfirmation, [mbOk], 0);  //表示された文字列には「&」が表示されず次の文字「b」にアンダーラインが付く
  Application.MessageBox(PChar(s), 'Test-&-Test', MB_OK); //「&」を含め、文字列がそのまま表示される(ウィンドウタイトル内にも表示可)
end;


ポムヌンティウス  2009-11-13 19:09:41  No: 36161

すでに解決済みですが・・・
ShowMessageも内部で的にMessageDlgを呼んでいるだけなので、MessageDlgを解決してみることに。

function MessageDlgNoAccelChar(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons): Integer;
var
  msgCtrl  :TComponent;
begin
  with CreateMessageDialog(Msg, DlgType, Buttons) do
    try
      msgCtrl := FindComponent('Message');
      if (msgCtrl <> nil) and (msgCtrl is TLabel) then begin
  TLabel(msgCtrl).ShowAccelChar := False;
      end;

      Position := poScreenCenter;
      Result := ShowModal;
    finally
      Free;
    end;
end;

procedure ShowMessageNoAccelChar(const Msg: string);
begin
  MessageDlgNoAccelChar(Msg, mtCustom, [mbOK]);
end;

使い方は以下の通り
var
  s:String;
begin
  s := 'www.example.com?a=aaa&b=bbb';
  MessageDlgNoAccelChar(s, mtConfirmation, [mbOk]);
  ShowMessageNoAccelChar(S);
end;


デル太  2009-11-13 20:13:32  No: 36162

ポムヌンティウス さん、ありがとうございます。

ShowMessage/MessageDlg の代替になる関数を試作してくださったんですね。

次の2つの関数が、変数をそのまま表示してくれました。

・MessageDlgNoAccelChar
・ShowMessageNoAccelChar


デル太  2009-11-13 20:14:04  No: 36163

補足します。

先の回答で、ポムヌンティウス さんが TLabel のアクセスキー指定を制御してくださいました。
別の記事でも、現象は TLabel のアクセスキー対応機能に起因すると回答を受けました。

  ShowMessage で「&」がアンダーラインになりますが、他にも同様の文字がありますか?
  https://www.petitmonte.com/bbs/answers?question_id=6611

  ※結果的に2重投稿の形となってしまいご不便をおかけします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加