DOBON.NETプログラミング道掲示板
(現在 過去ログ4 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■34747 / inTopicNo.1)  デフォルトプロパティを使いたい
  
□投稿者/ Wan 一般人(9回)-(2021/05/28(Fri) 10:13:10)
  • アイコン環境/言語:[Windows10 VisualStudio2019 VB.net WindowsForm] 
    分類:[.NET] 

    WebClientを使ってHtmlDocumentを取得してゴリゴリして各要素を取得したいと考えています。既に、クラスの作成は終わっています。
    Dim myHtmlData As New HtmlData
    myHtmlData.HtmlDocument = WebClient.DownloadString(Uri)
    myHtmlData.GetElementByTagName("a")
    のように、一旦インスタンス化してHtmlDocumentに代入した後に、メソッドを使う形になっています。これを、次のように使えるようにする方法を教えて頂けないでしょうか?
    Dim myHtmlData As New HtmlData = WebClient.DownloadString(Uri)
    myHtmlData.GetElementByTagName("a")

    HtmlDocumentプロパティは、String型なので、拡張メソッドでGetElementByTagNameを追加する方法も考えたのですが、全てのString型変数に拡張メソッドが表示されるので、余り好ましく無く感じています。
    HtmlDocumentをDefault指定すると配列にする必要(Indexが必要)になるので、少しずれると思っています。
    String型は、継承出来ないし・・・・
    何か?いい解決方法があれば教えて頂けないでしょうか?
    宜しくお願い致します。

引用返信 削除キー/
■34748 / inTopicNo.2)  Re[1]: デフォルトプロパティを使いたい
□投稿者/ Hongliang 大御所(603回)-(2021/05/28(Fri) 11:03:57)
  • アイコン
    HtmlDataクラスというのは自作クラスでしょうか?
    単にこのクラスに引数付きコンストラクタを用意すればいいように見えます。
    Class HtmlData
        Public Sub New(html As String)
            Me.HtmlDocument = html
        End Sub
        Public Function GetElementsByTagName(...) As ...
            以下略
    End Class
    
    Dim html As String = WebClient.DownloadString(url)
    Dim myHtmlData As New HtmlData(html)
    myHtmlData.GetElementsByTagName
    

引用返信 削除キー/
■34749 / inTopicNo.3)  Re[1]: デフォルトプロパティを使いたい
□投稿者/ 魔界の仮面弁士 大御所(1341回)-(2021/05/28(Fri) 11:33:46)
  • アイコン2021/05/29(Sat) 15:23:53 編集(投稿者)

    No34747に返信(Wanさんの記事)
    > WebClientを使ってHtmlDocumentを取得してゴリゴリして
    > 各要素を取得したいと考えています。既に、クラスの作成は終わっています。

    HtmlDocument というのは、
    System.Windows.Forms.HtmlDocument クラスのことでしょうか?

    これを WebBrowser 以外から使うのは無理ですね。


    System.Windows.Forms.HtmlDocument ではなく、
    COM の IHTMLDocument2 インターフェイスなら使えますが。

    Dim htmlDoc As New mshtml.HTMLDocument()
    DirectCast(htmlDoc, IPersistStreamInit).InitNew()
    Dim doc As mshtml.IHTMLDocument2 = htmlDoc.createDocumentFromUrl("https://dobon.net/vb/", "")


    > 既に、クラスの作成は終わっています。
    HTML の解析が目的なら、AngleSharp や HtmlAgilityPack がお手軽です。


    > HtmlDocumentプロパティは、String型なので
    ん…。

    HtmlDocument クラスではなく、自作の
    HtmlDocument プロパティの話でしたか。


    > Dim myHtmlData As New HtmlData = WebClient.DownloadString(Uri)

    Uri という変数名は、System.Uri クラスと競合してしまうので、
    別の名前にした方が良いと思いますよ。


    案1) Public Sub New(contents As Sring) を実装する。
     Dim myHtmlData As New HtmlData(WebClient.DownloadString(Uri))

    案2) Public Shared Function Create(url As String) As HtmlData を実装する
     Dim myHtmlData As HtmlData = HtmlData.Create(Uri)
引用返信 削除キー/
■34750 / inTopicNo.4)  Re[2]: デフォルトプロパティを使いたい
□投稿者/ Wan 一般人(10回)-(2021/05/29(Sat) 10:51:13)
  • アイコンHongliangさん
    ご指導有難う御座います。
    確かに、コンストラクタで解決できますが、
    Excel VBAで
    Range("A1").Value="柿の種"を
    Range("A1")="柿の種"と書けることを
    VB.Netでもできないかな?っと言うのが始まりです。
    VB.NetでString型の場合
    Dim Range As String
    Range = "柿の種"
    とすれば値が代入できますよね?
    これを、独自のClassで出来ないかな?
    という質問でした。
    有難う御座いました。

    魔界の仮面弁士さま
    いつもお世話になっております。
    初めのうちは、Dom解析のために、WebBrowser.Navigateで読み込んでいましたが、
    WebClientに変えて、独自でグリグリとDom解析していました。
    今回教えて頂いた、AngleSharpメッチャ便利です。
    この際、コードを全て書き換えることにしました。
    いつも便利なツールを教えて頂き大変助かっております。
    有難う御座いました。


解決み!
引用返信 削除キー/
■34751 / inTopicNo.5)  Re[3]: デフォルトプロパティを使いたい
□投稿者/ 魔界の仮面弁士 大御所(1342回)-(2021/05/29(Sat) 15:20:51)
  • アイコンNo34750に返信(Wanさんの記事)
    > Range("A1")="柿の種"と書けることを

    いや……それと
    > Dim myHtmlData As New HtmlData = WebClient.DownloadString(Uri)
    は文法的に繋がらないですよね?


    > VB.Netでもできないかな?っと言うのが始まりです。
    最初の質問にあった
     Dim myHtmlData As New HtmlData = WebClient.DownloadString(Uri)
    は二重代入になるので NG ですが、代わりに
     Dim myHtmlData As HtmlData = WebClient.DownloadString(Uri)
    ならできます。これはデフォルトプロパティではなく、変換演算子のオーバーロードという手法です。

    Module Module1
      Sub Main()
        Dim r As HtmlData = "<html></html>"
      End Sub
    End Module

    Public Class HtmlData
      Public Property HtmlDocument As String
      Public Shared Widening Operator CType(contens As String) As HtmlData
        Return New HtmlData() With {.HtmlDocument = contens}
      End Operator
    End Class



    でもって、VBA の Range オブジェクトについては、内部的には
     Range("A1").[_Default] ="柿の種"
    として処理されます。

    Range オブジェクトには、"_Default" という名前のプロパティがあり、
    これはディスパッチ ID が 0 (DISPID_VALUE) に設定されているため、
    VBA 的には「既定のメンバー」呼び出しの意味になります。

    VBA 的にいえば、これは
     Public Property Let [_Default](Optional RowIndex As Variant, Optional ColumnIndex As Variant, ByVal vNewValue As Variant)
     Public Property Get [_Default](Optional RowIndex As Variant, Optional ColumnIndex As Variant) As Variant
    な定義に相当します。(実際には、VBA の構文では表現しきれないのですが)

    VBScript の GetRef 関数も、既定のメンバーを持つオブジェクトを返します。
    (こちらは、既定のプロパティでは無く規定のメソッドです)


    一方 VB.NET の場合、「既定のメンバー」は作れません。
    ただし「既定のプロパティ」なら作れます。Default Property ですね。


    残念ながら VB.NET の Default Property では、「省略されていない引数が 1 つ以上」必要という制限があります。
    とはいえ、VB として『宣言』できないだけで、他言語で作られたものであれば、
    引数のない既定のプロパティを呼び出すこともできます。(サンプルとして作成した DLL を添付しておきます)

    なお、既定のプロパティを呼び出す際には、丸括弧が必須となります。

      Dim myHtmlData As New HtmlData()
      myHtmlData() = "<html></html>"
      Dim x = myHtmlData() 'これは As String になる
      Dim y = myHtmlData  'これは As HtmlData になる。
解決み!
イメージ
test.zip
/1KB
引用返信 削除キー/
■34753 / inTopicNo.6)  Re[4]: デフォルトプロパティを使いたい
□投稿者/ Wan 一般人(12回)-(2021/06/02(Wed) 16:12:13)
  • アイコン再び丁寧なご指導有難う御座います。

    VBではできないことが判りました。

    サンプルとして作って頂いたDLLの使い方がよく分からないので
    試すことができませんでした。
    スキルが上がったら、再チャレンジしたいと思いまます。

    有難う御座いました。
引用返信 削除キー/
■34758 / inTopicNo.7)  Re[5]: デフォルトプロパティを使いたい
□投稿者/ Wan 一般人(14回)-(2021/06/03(Thu) 20:24:54)
  • アイコン忘れ
解決み!
引用返信 削除キー/



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

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -