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

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

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

CHARFORMATのデフォルトについて

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■95068 / inTopicNo.1)  CHARFORMATのデフォルトについて
  
□投稿者/ Visual C#初心者 (11回)-(2020/06/21(Sun) 20:17:54)

分類:[C#] 

Visual studio 2019でCHARFORMATを
拡張メソッドで使用しています.
文字を太文字にしてからまた元に戻すといった
機能をもたせたいのですが,可能でしょうか?

ご教示お願いいたします.
引用返信 編集キー/
■95069 / inTopicNo.2)  Re[1]: CHARFORMATのデフォルトについて
□投稿者/ 魔界の仮面弁士 (2755回)-(2020/06/21(Sun) 23:06:18)
No95068 (Visual C#初心者 さん) に返信
> 文字を太文字にしてからまた元に戻すといった
> 機能をもたせたいのですが,可能でしょうか?

できますよ。
No94964 のスレッドに回答したときに、そのためのコードも掲載しています。
引用返信 編集キー/
■95075 / inTopicNo.3)  Re[2]: CHARFORMATのデフォルトについて
□投稿者/ 魔界の仮面弁士 (2756回)-(2020/06/22(Mon) 10:41:59)
No95069 (魔界の仮面弁士 さん) に返信
>>文字を太文字にしてからまた元に戻すといった
>>機能をもたせたいのですが,可能でしょうか?
> No94964 のスレッドに回答したときに、そのためのコードも掲載しています。

先のコードで使っている CHARFORMAT2 は、CHARFORMAT を拡張した物(構造体サイズが異なる)であり、
使い方は殆ど一緒です。CHARFORMAT2 / CHARFORMAT どちらでも同じように書けます。

また、『元に戻す』というのが、Ctrl+Z などの「アンドゥ」の話だとしたら、このあたりが参考になるかと思います。
http://pineplanter.moo.jp/non-it-salaryman/2017/11/29/csharp-undo-richtextbox/
引用返信 編集キー/
■95084 / inTopicNo.4)  Re[3]: CHARFORMATのデフォルトについて
□投稿者/ VisualC#初心者 (1回)-(2020/06/23(Tue) 00:14:21)
No95075 (魔界の仮面弁士 さん) に返信
> ■No95069 (魔界の仮面弁士 さん) に返信
> >>文字を太文字にしてからまた元に戻すといった
> >>機能をもたせたいのですが,可能でしょうか?
>>No94964 のスレッドに回答したときに、そのためのコードも掲載しています。
>
> 先のコードで使っている CHARFORMAT2 は、CHARFORMAT を拡張した物(構造体サイズが異なる)であり、
> 使い方は殆ど一緒です。CHARFORMAT2 / CHARFORMAT どちらでも同じように書けます。
>
> また、『元に戻す』というのが、Ctrl+Z などの「アンドゥ」の話だとしたら、このあたりが参考になるかと思います。
> http://pineplanter.moo.jp/non-it-salaryman/2017/11/29/csharp-undo-richtextbox/

ご丁寧にありがとうございます。
作成して頂いたコードですが拡張メソッド化したい場合、
SelectionBold等がboolで宣言されてるのでこれをvoidに変えて
みれば良いのでしょうか?



引用返信 編集キー/
■95085 / inTopicNo.5)  Re[4]: CHARFORMATのデフォルトについて
□投稿者/ VisualC#初心者 (2回)-(2020/06/23(Tue) 01:15:55)
No95084 (VisualC#初心者 さん) に返信
> ■No95075 (魔界の仮面弁士 さん) に返信
>>■No95069 (魔界の仮面弁士 さん) に返信
>>>>文字を太文字にしてからまた元に戻すといった
>>>>機能をもたせたいのですが,可能でしょうか?
> >>No94964 のスレッドに回答したときに、そのためのコードも掲載しています。
>>
>>先のコードで使っている CHARFORMAT2 は、CHARFORMAT を拡張した物(構造体サイズが異なる)であり、
>>使い方は殆ど一緒です。CHARFORMAT2 / CHARFORMAT どちらでも同じように書けます。
>>
>>また、『元に戻す』というのが、Ctrl+Z などの「アンドゥ」の話だとしたら、このあたりが参考になるかと思います。
>>http://pineplanter.moo.jp/non-it-salaryman/2017/11/29/csharp-undo-richtextbox/
>
> ご丁寧にありがとうございます。
> 作成して頂いたコードですが拡張メソッド化したい場合、
> SelectionBold等がboolで宣言されてるのでこれをvoidに変えて
> みれば良いのでしょうか?
>
>
>

拡張メソッドを扱うのが初めてなので、
正直サンプルコードをどのように変更すれば良いのか分かりません。
public static voidメソッド名とすれば良いのかは
なんとなく分かったのですが、構造体のCHARFORMAT/CHARFOMAT2構造体
の中身とどうリンクさせればいいか思いつかないです。

何となく思ってみたのが、boolでフォント状態を判定できるSelectionBold等が
あるので、これをpublic static vold メソッド(bool 引数)とし、引数にSelectionBold
を渡してあげるといった感じでしょうか?

ただ、メソッド内をどうすれば良いかが分からないので、ご教示頂けますと幸いです。

宜しくお願い致します。

引用返信 編集キー/
■95086 / inTopicNo.6)  Re[5]: CHARFORMATのデフォルトについて
□投稿者/ 魔界の仮面弁士 (2757回)-(2020/06/23(Tue) 07:22:35)
2020/06/23(Tue) 07:32:39 編集(投稿者)

No95085 (VisualC#初心者 さん) に返信
>>作成して頂いたコードですが拡張メソッド化したい場合、
>>SelectionBold等がboolで宣言されてるのでこれをvoidに変えて
>>みれば良いのでしょうか?

プロパティを拡張メソッドに変更する場合、setter と getter を別々のメソッドとして提供することになります。

たとえば DataRowExtensions では、
DataRow に対するインデクサの読み書きを
ジェネリックな拡張メソッドにするために、
getter と setter のペアが用意されています。

// getter 系の拡張メソッド
public static T Field<T> (this DataRow row, string columnName)

// setter 系の拡張メソッド
public static void SetField<T> (this DataRow row, string columnName, T value)


※実際にはもっと多くのオーバーロードがあります。
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarowextensions


で、上記 SetField 拡張メソッドの実装は、
 row[column] = (object)value ?? DBNull.Value;
となっています。


> 構造体のCHARFORMAT/CHARFOMAT2構造体
> の中身とどうリンクさせればいいか思いつかないです。
先のサンプルでは、
 public bool SelectionBold
 {
  get => GetCharFormat_Masks().HasFlag(CFE.Bold);
  set => SetCharFormat_Masks(CFM.Bold, value ? CFE.Bold : CFE.None);
 }
としていましたので、これを拡張メソッドにするなら、たとえば
 public static bool GetSelectionBold (this RichTextBox rtb) => GetCharFormat_Masks(rtb).HasFlag(CFE.Bold);
 public static void SetSelectionBold (this RichTextBox rtb, bool value) => SetCharFormat_Masks(rtb, CFM.Bold, value ? CFE.Bold : CFE.None);
などとします。


上記から呼ばれているヘルパーメソッドとなる
private void SetCharFormat_Masks(CFM dwMask, CFE dwEffects)
private CFE GetCharFormat_Masks()
については、インスタンスメソッドから static メソッドに変更したうえで
引数 RichTextBox rtb を追加しておき、元のサンプルで
 new HandleRef(this, Handle)
としていた箇所を
 new HandleRef(rtb, rtb.Handle)
と書き換えます。
引用返信 編集キー/
■95135 / inTopicNo.7)  Re[6]: CHARFORMATのデフォルトについて
□投稿者/ Visual C#初心者 (12回)-(2020/06/25(Thu) 03:39:54)
No95086 (魔界の仮面弁士 さん) に返信
> 2020/06/23(Tue) 07:32:39 編集(投稿者)
>
> ■No95085 (VisualC#初心者 さん) に返信
> >>作成して頂いたコードですが拡張メソッド化したい場合、
> >>SelectionBold等がboolで宣言されてるのでこれをvoidに変えて
> >>みれば良いのでしょうか?
>
> プロパティを拡張メソッドに変更する場合、setter と getter を別々のメソッドとして提供することになります。
>
> たとえば DataRowExtensions では、
> DataRow に対するインデクサの読み書きを
> ジェネリックな拡張メソッドにするために、
> getter と setter のペアが用意されています。
>
> // getter 系の拡張メソッド
> public static T Field<T> (this DataRow row, string columnName)
>
> // setter 系の拡張メソッド
> public static void SetField<T> (this DataRow row, string columnName, T value)
>
>
> ※実際にはもっと多くのオーバーロードがあります。
> https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarowextensions
>
>
> で、上記 SetField 拡張メソッドの実装は、
>  row[column] = (object)value ?? DBNull.Value;
> となっています。
>
>
>>構造体のCHARFORMAT/CHARFOMAT2構造体
>>の中身とどうリンクさせればいいか思いつかないです。
> 先のサンプルでは、
>  public bool SelectionBold
>  {
>   get => GetCharFormat_Masks().HasFlag(CFE.Bold);
>   set => SetCharFormat_Masks(CFM.Bold, value ? CFE.Bold : CFE.None);
>  }
> としていましたので、これを拡張メソッドにするなら、たとえば
>  public static bool GetSelectionBold (this RichTextBox rtb) => GetCharFormat_Masks(rtb).HasFlag(CFE.Bold);
> などとします。
>
>
> 上記から呼ばれているヘルパーメソッドとなる
> private void SetCharFormat_Masks(CFM dwMask, CFE dwEffects)
> private CFE GetCharFormat_Masks()
> については、インスタンスメソッドから static メソッドに変更したうえで
> 引数 RichTextBox rtb を追加しておき、元のサンプルで
>  new HandleRef(this, Handle)
> としていた箇所を
>  new HandleRef(rtb, rtb.Handle)
> と書き換えます。

ご回答ありがとうございます.
なんとかメソッドとして実装できましたが,
肝心のBold機能を実装したいです.

>  public static void SetSelectionBold (this RichTextBox rtb, bool value) => SetCharFormat_Masks(rtb, CFM.Bold, value ? CFE.Bold : CFE.None);

は恐らく太字の状態ならばデフォルトに戻す機能になって
いると思うので,BoldをNone,NoneをBoldに変えてみましたが
こちらも上手くいかないです.
そもそもSetCharFormat_Masks自体の中身がよく理解できていないので,
こちらも併せてご教示頂けますと幸いです.
引用返信 編集キー/
■95255 / inTopicNo.8)  Re[7]: CHARFORMATのデフォルトについて
□投稿者/ Visual C#初心者 (13回)-(2020/07/07(Tue) 20:53:01)
No95135 (Visual C#初心者 さん) に返信
> ■No95086 (魔界の仮面弁士 さん) に返信
>>2020/06/23(Tue) 07:32:39 編集(投稿者)
>>
>>■No95085 (VisualC#初心者 さん) に返信
>>>>作成して頂いたコードですが拡張メソッド化したい場合、
>>>>SelectionBold等がboolで宣言されてるのでこれをvoidに変えて
>>>>みれば良いのでしょうか?
>>
>>プロパティを拡張メソッドに変更する場合、setter と getter を別々のメソッドとして提供することになります。
>>
>>たとえば DataRowExtensions では、
>>DataRow に対するインデクサの読み書きを
>>ジェネリックな拡張メソッドにするために、
>>getter と setter のペアが用意されています。
>>
>>// getter 系の拡張メソッド
>>public static T Field<T> (this DataRow row, string columnName)
>>
>>// setter 系の拡張メソッド
>>public static void SetField<T> (this DataRow row, string columnName, T value)
>>
>>
>>※実際にはもっと多くのオーバーロードがあります。
>>https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarowextensions
>>
>>
>>で、上記 SetField 拡張メソッドの実装は、
>> row[column] = (object)value ?? DBNull.Value;
>>となっています。
>>
>>
> >>構造体のCHARFORMAT/CHARFOMAT2構造体
> >>の中身とどうリンクさせればいいか思いつかないです。
>>先のサンプルでは、
>> public bool SelectionBold
>> {
>>  get => GetCharFormat_Masks().HasFlag(CFE.Bold);
>>  set => SetCharFormat_Masks(CFM.Bold, value ? CFE.Bold : CFE.None);
>> }
>>としていましたので、これを拡張メソッドにするなら、たとえば
>> public static bool GetSelectionBold (this RichTextBox rtb) => GetCharFormat_Masks(rtb).HasFlag(CFE.Bold);
>>などとします。
>>
>>
>>上記から呼ばれているヘルパーメソッドとなる
>> private void SetCharFormat_Masks(CFM dwMask, CFE dwEffects)
>> private CFE GetCharFormat_Masks()
>>については、インスタンスメソッドから static メソッドに変更したうえで
>>引数 RichTextBox rtb を追加しておき、元のサンプルで
>> new HandleRef(this, Handle)
>>としていた箇所を
>> new HandleRef(rtb, rtb.Handle)
>>と書き換えます。
>
> ご回答ありがとうございます.
> なんとかメソッドとして実装できましたが,
> 肝心のBold機能を実装したいです.
>
>> public static void SetSelectionBold (this RichTextBox rtb, bool value) => SetCharFormat_Masks(rtb, CFM.Bold, value ? CFE.Bold : CFE.None);
>
> は恐らく太字の状態ならばデフォルトに戻す機能になって
> いると思うので,BoldをNone,NoneをBoldに変えてみましたが
> こちらも上手くいかないです.
> そもそもSetCharFormat_Masks自体の中身がよく理解できていないので,
> こちらも併せてご教示頂けますと幸いです.

自己完結できたので解決策済みします.
ありがとうございました。
引用返信 編集キー/
■95256 / inTopicNo.9)  Re[8]: CHARFORMATのデフォルトについて
□投稿者/ Visual C#初心者 (14回)-(2020/07/07(Tue) 20:53:26)
No95255 (Visual C#初心者 さん) に返信
> ■No95135 (Visual C#初心者 さん) に返信
>>■No95086 (魔界の仮面弁士 さん) に返信
> >>2020/06/23(Tue) 07:32:39 編集(投稿者)
> >>
> >>■No95085 (VisualC#初心者 さん) に返信
> >>>>作成して頂いたコードですが拡張メソッド化したい場合、
> >>>>SelectionBold等がboolで宣言されてるのでこれをvoidに変えて
> >>>>みれば良いのでしょうか?
> >>
> >>プロパティを拡張メソッドに変更する場合、setter と getter を別々のメソッドとして提供することになります。
> >>
> >>たとえば DataRowExtensions では、
> >>DataRow に対するインデクサの読み書きを
> >>ジェネリックな拡張メソッドにするために、
> >>getter と setter のペアが用意されています。
> >>
> >>// getter 系の拡張メソッド
> >>public static T Field<T> (this DataRow row, string columnName)
> >>
> >>// setter 系の拡張メソッド
> >>public static void SetField<T> (this DataRow row, string columnName, T value)
> >>
> >>
> >>※実際にはもっと多くのオーバーロードがあります。
> >>https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarowextensions
> >>
> >>
> >>で、上記 SetField 拡張メソッドの実装は、
> >> row[column] = (object)value ?? DBNull.Value;
> >>となっています。
> >>
> >>
>>>>構造体のCHARFORMAT/CHARFOMAT2構造体
>>>>の中身とどうリンクさせればいいか思いつかないです。
> >>先のサンプルでは、
> >> public bool SelectionBold
> >> {
> >>  get => GetCharFormat_Masks().HasFlag(CFE.Bold);
> >>  set => SetCharFormat_Masks(CFM.Bold, value ? CFE.Bold : CFE.None);
> >> }
> >>としていましたので、これを拡張メソッドにするなら、たとえば
> >> public static bool GetSelectionBold (this RichTextBox rtb) => GetCharFormat_Masks(rtb).HasFlag(CFE.Bold);
> >>などとします。
> >>
> >>
> >>上記から呼ばれているヘルパーメソッドとなる
> >> private void SetCharFormat_Masks(CFM dwMask, CFE dwEffects)
> >> private CFE GetCharFormat_Masks()
> >>については、インスタンスメソッドから static メソッドに変更したうえで
> >>引数 RichTextBox rtb を追加しておき、元のサンプルで
> >> new HandleRef(this, Handle)
> >>としていた箇所を
> >> new HandleRef(rtb, rtb.Handle)
> >>と書き換えます。
>>
>>ご回答ありがとうございます.
>>なんとかメソッドとして実装できましたが,
>>肝心のBold機能を実装したいです.
>>
> >> public static void SetSelectionBold (this RichTextBox rtb, bool value) => SetCharFormat_Masks(rtb, CFM.Bold, value ? CFE.Bold : CFE.None);
>>
>>は恐らく太字の状態ならばデフォルトに戻す機能になって
>>いると思うので,BoldをNone,NoneをBoldに変えてみましたが
>>こちらも上手くいかないです.
>>そもそもSetCharFormat_Masks自体の中身がよく理解できていないので,
>>こちらも併せてご教示頂けますと幸いです.
>
> 自己完結できたので解決策済みします.
> ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ