C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

RichTextBoxへの制御コードの表示のされかた /暗黒魔界の王 佐藤 (23/09/28(Thu) 10:14) #102430
Re[1]: RichTextBoxへの制御コードの表示のされかた /魔界の仮面弁士 (23/09/28(Thu) 11:22) #102433
  └ Re[2]: RichTextBoxへの制御コードの表示のされかた /暗黒魔界の王 佐藤 (23/09/28(Thu) 14:41) #102440
    └ Re[3]: RichTextBoxへの制御コードの表示のされかた /魔界の仮面弁士 (23/09/28(Thu) 15:55) #102441
      └ Re[4]: RichTextBoxへの制御コードの表示のされかた /暗黒魔界の王 佐藤 (23/09/28(Thu) 18:51) #102442
        └ Re[5]: RichTextBoxへの制御コードの表示のされかた /魔界の仮面弁士 (23/09/28(Thu) 19:45) #102443
          └ Re[6]: RichTextBoxへの制御コードの表示のされかた /魔界の仮面弁士 (23/09/29(Fri) 09:46) #102444
            └ Re[7]: RichTextBoxへの制御コードの表示のされかた /暗黒魔界の王 佐藤 (23/10/03(Tue) 14:51) #102449 解決済み


親記事 / ▼[ 102433 ]
■102430 / 親階層)  RichTextBoxへの制御コードの表示のされかた
□投稿者/ 暗黒魔界の王 佐藤 (7回)-(2023/09/28(Thu) 10:14:08)

分類:[.NET 全般] 

byte[] buf = new byte[3];

buf[0] = 0x3;
buf[1] = 0x25;
buf[2] = 0xD;

string tempString = System.Text.Encoding.ASCII.GetString(buf, 0, 3);

richTextBox.AppendText(tempstring);


という風に制御コードをテキストボックスに表示させると
まともに表示されないとは思いますが、


あるパソコンAでは下記のように表示され
%
あるパソコンBでは下記のように表示されます。
└ 

同じデータなのに表示される記号が異なる理由を知りたく、
分かる方おられましたら教えていただけないでしょうか。
パソコンAもパソコンBもVisulStudioではフォントをArialに設定しています。
他に何か表示が変わる原因になるものがあるでしょうか?





[ □ Tree ] 返信 編集キー/

▲[ 102430 ] / ▼[ 102440 ]
■102433 / 1階層)  Re[1]: RichTextBoxへの制御コードの表示のされかた
□投稿者/ 魔界の仮面弁士 (3695回)-(2023/09/28(Thu) 11:22:45)
No102430 (暗黒魔界の王 佐藤 さん) に返信
> 同じデータなのに表示される記号が異なる理由を知りたく、
RichTextBox は、OS バージョンと .NET Framework バージョンによって
内部で呼び出される RICH EDIT CONTROL のバージョンが変わります。

> 他に何か表示が変わる原因になるものがあるでしょうか?
.NET Framework のバージョンが違っていませんか?


.NET 1.x 世代や ActiveX 版はとりあえず無視するとすると、
元々は RichEd20.DLL が利用されていたのですが、
4.6 以降では MsftEdit.DLL を優先利用する機能が用意されました。

しかし互換性上の理由から、4.6.x 系列では
特にしていない限り、RichEd20.DLL が利用されます。
その後、4.7 からは既定で MsftEdit.DLL が使われるようになりました。


この切替は、app.config によって指定可能です。

<configuration>
 <runtime>
  <!-- ★は true または false -->
  <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=★"/>
 </runtime>
</configuration>
[ 親 102430 / □ Tree ] 返信 編集キー/

▲[ 102433 ] / ▼[ 102441 ]
■102440 / 2階層)  Re[2]: RichTextBoxへの制御コードの表示のされかた
□投稿者/ 暗黒魔界の王 佐藤 (12回)-(2023/09/28(Thu) 14:41:25)
ご回答ありがとうございます。

Visual Studioの「対象のフレームワーク」の指定は
.NET Framework 4 Client Profile
です。

.NET Framework 4 Client Profileは
.NET Framework 4.6や4.7より古いバージョン? のため
パソコンの環境に依らず
呼び出されるRICH EDIT CONTROLのバージョンは
RichEd20.DLL
になるという認識は間違っているでしょうか?



app.configの件

  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=true"/>
  </runtime>
と
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=false"/>
  </runtime>

を<configuration></<configuration>の間に記述して それぞれどうなるか試してみましたが
表示に変化がありませんでした。

app.configの編集を始めてやったのですが、
ソリューションエクスプローラにあるapp.configを直接編集で問題ないでしょうか?

[ 親 102430 / □ Tree ] 返信 編集キー/

▲[ 102440 ] / ▼[ 102442 ]
■102441 / 3階層)  Re[3]: RichTextBoxへの制御コードの表示のされかた
□投稿者/ 魔界の仮面弁士 (3697回)-(2023/09/28(Thu) 15:55:06)
2023/09/28(Thu) 15:58:24 編集(投稿者)

No102440 (暗黒魔界の王 佐藤 さん) に返信
> Visual Studioの「対象のフレームワーク」の指定は
> .NET Framework 4 Client Profile
> です。

"Client Profile" という事は、大元のプロジェクトが Visual Studio 2010 であるものと推察します。
(その当時は、DoNotLoadLatestRichEditControl パラメーター自体が存在しなかったはず)


requiredRuntime や supportedRuntime の指定は 20年前からあったと思いますが、
2010 当時は、.NET Framework 4 が最新であったため、
アプリケーション構成ファイルをそもそも作成していないか、あるいはあったとしても、
/configuration/startup/supportedRuntime での明示的な sku 指定が無い可能性がありますね。

<configuration>
 <startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
<supportedRuntime version="v2.0.50727" sku="Client"/>
</startup>
</configuration>

https://learn.microsoft.com/ja-jp/dotnet/framework/migration-guide/how-to-configure-an-app-to-support-net-framework-4-or-4-5?WT.mc_id=DT-MVP-8907


コードが同じであるのなら、疑うべきは実行環境という事になるわけですが、
パソコンA と B で、Windows のバージョンおよび .NET Framework のバージョンは同一ですか?


Windows 11 だと、.NET Framework 4.8 ないしは 4.8.1 が標準搭載されていて、
.NET Framework 4〜4.7.2 はインストールできません。

Windows 10 だと、21H1 以降は .NET Framework 4.8.x が標準搭載されています。
そして Windows Update によって、大抵のは Windows 10 は 22H2 以降になっているはずです。(LTSB/LTSC は別として)
ver1803/1809 だと .NET Framework 4.7.2〜4.8
ver1709 だと .NET Framework 4.7.1〜4.8
ver1703 だと .NET Framework 4.7〜4.8
ver1607 だと .NET Framework 4.6.2〜4.8
ver1511 だと .NET Framework 4.6.1〜4.6.2
ver1507 だと .NET Framework 4.6〜4.6.2

Windows 8.1 だと .NET Framework 4.5.1〜4.8
Windows 8 だと .NET Framework 4.5〜4.6.1
Windows 7 だと .NET Framework 3.5〜4.8 (2.0/3.0 を含む)
Windows Vista だと .NET Framework 3.0〜4.6 (2.0 を含む) + .NET Framework 1.1

※上記いずれも、.NET Framework 2.0/3.0/3.5 をサポートします。
※NT4 だと 1.0/1.1 のみ、98〜2000 世代だと 1.0/1.1/2.0 まで。
[ 親 102430 / □ Tree ] 返信 編集キー/

▲[ 102441 ] / ▼[ 102443 ]
■102442 / 4階層)  Re[4]: RichTextBoxへの制御コードの表示のされかた
□投稿者/ 暗黒魔界の王 佐藤 (13回)-(2023/09/28(Thu) 18:51:55)
いつもありがとうございます。

おっしゃられる通り、
元はVisual Studio 2010で作成したプロジェクトを
流用して作っており、
今はVisual Studio 2022を使用しております。

Properties.Settings.Defaultで設定の保存読み出しをしているせいか
プロジェクトエクスプローラーのところにapp.configがあり、
中身は設定内容が入っていました。
DoNotLoadLatestRichEditControlは一番下の</configuration>の上に追加しました。



> コードが同じであるのなら、疑うべきは実行環境という事になるわけですが、
> パソコンA と B で、Windows のバージョンおよび .NET Framework のバージョンは同一ですか?

コードは同じなので実行環境かと思ってます。
.NET Frameworkのバージョンは異なるかもしれません。

パソコンAはWindows 10 Pro 22H2
パソコンBはWindows 7 or 10 詳細不明
です。

パソコンAでは
%
のように表示される状況ですが、
「対象のフレームワーク」をコードそのままでコンパイルが通る範囲で様々変えてみても結果は同じでした。

パソコンAでも表示が変わる状況を再現したいところですが
何を変えればそうなるのか。。。
[ 親 102430 / □ Tree ] 返信 編集キー/

▲[ 102442 ] / ▼[ 102444 ]
■102443 / 5階層)  Re[5]: RichTextBoxへの制御コードの表示のされかた
□投稿者/ 魔界の仮面弁士 (3698回)-(2023/09/28(Thu) 19:45:01)
2023/09/28(Thu) 20:01:07 編集(投稿者)

No102442 (暗黒魔界の王 佐藤 さん) に返信
> パソコンAはWindows 10 Pro 22H2
> パソコンBはWindows 7 or 10 詳細不明


こちらの手元の環境は Win10 22H2 です。

VS2010 - ".NET Framework 4 Client Profile"
VS2022 - ".NET Framework 4 Client Profile"

でそれぞれコンパイルした exe を動かしたところ、
ひとまず結果に変化はありませんでした。

tempString の中身は、いずれにおいても
"\u0003\u0025\u000D" すなわち "\x3%\r" であり、
RichTextBox の表示は「%」の後に改行が出力されました。


また、表示された内容をクリップボードにコピーしてから内容を見ると、
 "Rich Text Format"
 "Rich Text Format Without Objects"
 "RTF As Text"
はいずれも、該当箇所の RTF 部は、期待通りの「\'03%\par」表記です。
テキストフォーマットについても
 CF_UNICODETEXT は 03 00 25 00 0d 00 0a 00 00 00
 CF_TEXT は 03 25 0d 0a 00 …
なので、まぁ想定通りですね。


app.config を確認すると、

【VS2010 側】
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>
</configuration>

【VS2022 側】
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup>
</configuration>

になっています。


こうなってくると、
> パソコンBはWindows 7 or 10 詳細不明
の詳しい情報を知りたいところですね。


あとは、一方のパソコンで
 richTextBox1.SaveFile(@"C:\何某\test.rtf", RichTextBoxStreamType.RichText);
としておいて、もう一方でそれを
 richTextBox1.LoadFile(@"C:\何某\test.rtf", RichTextBoxStreamType.RichText)
にした時に表示がどうなるか、とか。
[ 親 102430 / □ Tree ] 返信 編集キー/

▲[ 102443 ] / ▼[ 102449 ]
■102444 / 6階層)  Re[6]: RichTextBoxへの制御コードの表示のされかた
□投稿者/ 魔界の仮面弁士 (3699回)-(2023/09/29(Fri) 09:46:27)
2023/09/29(Fri) 10:23:50 編集(投稿者)

No102443 (魔界の仮面弁士 さん) に返信
> こちらの手元の環境は Win10 22H2 です。
> VS2010 - ".NET Framework 4 Client Profile"

この環境で、「%」な表示状態で
>  richTextBox1.SaveFile(@"C:\何某\test.rtf", RichTextBoxStreamType.RichText);
を行い、それを「wordpad test.rtf」で開いてみます。



Win10 22H2 環境では、C# アプリと同じ、見た目が半角幅の「・%」となりましたが
Win7 環境では、半角幅の「L%」っぽい見た目になりました。
(元質問者の「└」とはちょっと違うのかな?)

既定の MS UI Gothic のままで検証しましたが、
ワードパッド側で、後から Arial や Consolas にしても同様でした。
(Win7 は既定で、Arial が非表示設定なんですよね)


ちなみに RTF ファイルの中身はこうなっています。

{\rtf1\ansi\ansicpg932\deff0\deflang1033\deflangfe1041{\fonttbl{\f0\fnil\fcharset128 MS UI Gothic;}}
\viewkind4\uc1\pard\lang1041\f0\fs18\'03%\par
\par
}


お使いの「パソコン B」の仔細が不明なので予測しかできませんが、
恐らくは C# というか .NET 側の問題では無く、やはり
OS 側の RichEdit Control のバージョン依存の事象と見るべきでしょう。

実行環境の OS バージョン(と .NET Framework バージョン)を
改めて確認してみてください。
[ 親 102430 / □ Tree ] 返信 編集キー/

▲[ 102444 ] / 返信無し
■102449 / 7階層)  Re[7]: RichTextBoxへの制御コードの表示のされかた
□投稿者/ 暗黒魔界の王 佐藤 (14回)-(2023/10/03(Tue) 14:51:50)
いろいろご検証頂きありがとうございます。


> Win10 22H2 環境では、C# アプリと同じ、見た目が半角幅の「・%」となりましたが
> Win7 環境では、半角幅の「L%」っぽい見た目になりました。
> (元質問者の「└」とはちょっと違うのかな?)

半角幅の「└」なら合ってそうです。


> お使いの「パソコン B」の仔細が不明なので予測しかできませんが、
> 恐らくは C# というか .NET 側の問題では無く、やはり
> OS 側の RichEdit Control のバージョン依存の事象と見るべきでしょう。
>
> 実行環境の OS バージョン(と .NET Framework バージョン)を
> 改めて確認してみてください。

ありがとうございます。
結局、私のWindows10パソコンでは表示の変化を再現できなかったため
ちょっと悔しいですが実行環境の違いによる事象と考えておくことにします。

パソコンBの詳細ですが、
遠隔でかつパソコンに疎い方の所有物でして未だ確認できておりません。
(「└」の表示はカメラの画像を送ってもらいました)
解決済み
[ 親 102430 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -