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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.95086 の関連記事表示

<< 0 >>
■95086  Re[5]: CHARFORMATのデフォルトについて
□投稿者/ 魔界の仮面弁士 -(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)
    と書き換えます。
記事No.95068 のレス /過去ログ165より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -