NV_GeFreak Geschrieben 4. März 2009 Geschrieben 4. März 2009 (bearbeitet) Hallo allerseits. Ich bin neu sowohl hier im Forum, als auch im VB. Ich hatte etwas Programmier-Erfahrung mit Delphi (Schule und Freizeit). Nun wollte ich es mit VB probieren. Ich arbeite mit Microsoft Visual Studio 2008. Mein Programm ist ein Browser mit ein Paar erweiterten Funktionen. Eins davon soll folgendes erledigen: Aktuelle HTML-Seite (vom WebBrowser1) nach Links dursuchen und diese dann in einer ListBox (oder noch besser in einer ListView) anzeigen/ausgeben. Ich habe zwar beim Googeln das hier gefunden, aber schon an der Stelle mit "InStr" kommt diese Fehler meldung: "Error 2 Overload resolution failed because no accessible 'InStr' can be called without a narrowing conversion: 'Public Function InStr(Start As Integer, String1 As String, String2 As String, [Compare As Microsoft.VisualBasic.CompareMethod = Microsoft.VisualBasic.CompareMethod.Binary]) As Integer': Argument matching parameter 'Start' narrows from 'Long' to 'Integer'. 'Public Function InStr(String1 As String, String2 As String, [Compare As Microsoft.VisualBasic.CompareMethod = Microsoft.VisualBasic.CompareMethod.Binary]) As Integer': Argument matching parameter 'String1' narrows from 'Long' to 'String'. 'Public Function InStr(String1 As String, String2 As String, [Compare As Microsoft.VisualBasic.CompareMethod = Microsoft.VisualBasic.CompareMethod.Binary]) As Integer': Argument matching parameter 'Compare' narrows from 'String' to 'Microsoft.VisualBasic.CompareMethod'. C:\Users\BLA\Documents\Visual Studio 2008\Projects\WindowsApplication1\WindowsApplication1\Form1.vb 124 24 WindowsApplication1 " Und davon ca. 10 Stück. Was mache ich falsch? Vielleicht habe ich vergessen etwas zu deklarieren oder so? Hier mein Code: Public Class Form1 Private Sub ToolStripButton8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton8.Click WebBrowser1.Navigate(ComboBox1.Text) End Sub Private Sub WebBrowser1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserProgressChangedEventArgs) Handles WebBrowser1.ProgressChanged ToolStripStatusLabel2.Text = WebBrowser1.StatusText ToolStripProgressBar1.Visible = True Dim p, d, t As Integer d = e.CurrentProgress t = e.MaximumProgress If d <= 0 Then ToolStripProgressBar1.Value = 0 ToolStripProgressBar1.Visible = False Else ToolStripProgressBar1.Value = Math.Min(ToolStripProgressBar1.Maximum, Convert.ToInt32(Math.Floor(ToolStripProgressBar1.Maximum * (d / t)))) End If End Sub Private Sub ToolStripButton1_ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.ButtonClick WebBrowser1.GoBack() End Sub Private Sub ToolStripButton2_ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.ButtonClick WebBrowser1.GoForward() End Sub ' Disables the Forward button at the end of navigation history. Private Sub webBrowser1_CanGoForwardChanged( _ ByVal sender As Object, ByVal e As EventArgs) ToolStripButton2.Enabled = WebBrowser1.CanGoForward End Sub ' Disables the Back button at the beginning of the navigation history. Private Sub webBrowser1_CanGoBackChanged( _ ByVal sender As Object, ByVal e As EventArgs) ToolStripButton1.Enabled = WebBrowser1.CanGoBack End Sub ' Disables the Back button at the beginning of the navigation history. Private Sub webBrowser1_IsBusy( _ ByVal sender As Object, ByVal e As EventArgs) ToolStripButton5.Enabled = WebBrowser1.IsBusy End Sub Private Sub ToolStripButton6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton6.Click WebBrowser1.Refresh() End Sub Private Sub ToolStripButton5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton5.Click WebBrowser1.Stop() End Sub Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton3.Click WebBrowser1.GoHome() End Sub Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted TabPage1.Text = WebBrowser1.DocumentTitle End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' TabPage1.Text. End Sub Private Sub SpeichernUnterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SpeichernUnterToolStripMenuItem.Click If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then ' Set the FolderChoiceTextBox's Text to theFolderBrowserDialog's ' SelectedPath property. ' Me.FolderChoiceTextBox.Text = theFolderBrowser.SelectedPath End If End Sub Private Function HTML_GetAllURLs( _ ByVal sHTMLText As String) As Object ' Alle URL-Adressen im übergebenen HTML-Text suchen ' und als Array zurückgeben Dim sPos As Long Dim ePos As Long Dim hPos As Integer Dim nCount As Long Dim sTemp As String Dim sLink As String Dim sURL() As String nCount = 0 If sHTMLText <> "" Then ' an erster Position begonnen sPos = 1 Do ' nach einleitendem Link-Tag suchen "<a" sPos = InStr(sPos, LCase$(sHTMLText), "<a ") If sPos > 0 Then ' <a - Tag gefunden, jetzt End-Tag suchen ePos = InStr(sPos, sHTMLText, ">") If ePos > 0 Then ' End-Tag gefunden ' jetzt alles zwischen sPos und ePos filtern sTemp = Mid$(sHTMLText, sPos, ePos - sPos) If InStr(Mid$(sTemp, 2), "<") = 0 Then ' nur wenn < nicht nochmals vorhanden ist sTemp = Mid$(sTemp, 4) ' jetzt nach dem Schlüsselwort "HREF" suchen hPos = InStr(LCase$(sTemp), "href=") If hPos > 0 Then ' gefunden... jetzt die Link-Adresse auslesen sLink = Mid$(sTemp, hPos + 5) ' Prüfen, ob "-Zeichen vorhanden, ' wenn ja - "ausschneiden" If Left$(sLink, 1) = Chr$(34) Then sLink = Mid$(sLink, 2) sLink = strLeft(sLink, Chr$(34)) Else sLink = strLeft(sLink, " ") End If If Right$(sLink, 1) = Chr$(34) Then _ sLink = Left$(sLink, Len(sLink) - 1) ' Link in URL-Array speichern ReDim Preserve sURL(nCount) sURL(nCount) = sLink nCount = nCount + 1 ' Weitersuche ab "ePos" sPos = ePos - 1 End If End If End If sPos = sPos + 1 Else Exit Do End If Loop End If HTML_GetAllURLs = sURL End Function End Class Edit 1 Sorry, der Thread gehört natürlich in die Kategorie "C++: Compiler, IDEs, APIs ". Zu spät gesehen ... Bearbeitet 4. März 2009 von NV_GeFreak Zitieren
NV_GeFreak Geschrieben 4. März 2009 Autor Geschrieben 4. März 2009 (bearbeitet) OK, habe ein Paar Variablen-Typen geändert. Private Function HTML_GetAllURLs( _ ByVal sHTMLText As String) As Object ' Alle URL-Adressen im übergebenen HTML-Text suchen ' und als Array zurückgeben Dim sPos As Integer Dim ePos As Integer Dim hPos As Integer Dim nCount As Integer Dim sTemp As String Dim sLink As String Dim sURL() As String Dim strLeft As String nCount = 0 If sHTMLText <> "" Then ' an erster Position begonnen sPos = 1 Do ' nach einleitendem Link-Tag suchen "<a" sPos = InStr(sPos, LCase$(sHTMLText), "<a ") If sPos > 0 Then ' <a - Tag gefunden, jetzt End-Tag suchen ePos = InStr(sPos, sHTMLText, ">") If ePos > 0 Then ' End-Tag gefunden ' jetzt alles zwischen sPos und ePos filtern sTemp = Mid$(sHTMLText, sPos, ePos - sPos) If InStr(Mid$(sTemp, 2), "<") = 0 Then ' nur wenn < nicht nochmals vorhanden ist sTemp = Mid$(sTemp, 4) ' jetzt nach dem Schlüsselwort "HREF" suchen hPos = InStr(LCase$(sTemp), "href=") If hPos > 0 Then ' gefunden... jetzt die Link-Adresse auslesen sLink = Mid$(sTemp, hPos + 5) ' Prüfen, ob "-Zeichen vorhanden, ' wenn ja - "ausschneiden" If Left$(sLink, 1) = Chr$(34) Then sLink = Mid$(sLink, 2) sLink = strLeft(sLink, Chr$(34)) Else sLink = strLeft(sLink, " ") End If If Right$(sLink, 1) = Chr$(34) Then _ sLink = Left$(sLink, Len(sLink) - 1) ' Link in URL-Array speichern ReDim Preserve sURL(nCount) sURL(nCount) = sLink nCount = nCount + 1 ' Weitersuche ab "ePos" sPos = ePos - 1 End If End If End If sPos = sPos + 1 Else Exit Do End If Loop End If HTML_GetAllURLs = sURL End Function Jetzt habe ich nur noch Problem mit "Left$" - Fehler: "Error 3 'Public Property Left() As Integer' has no parameters and its return type cannot be indexed." Das Gleiche mit "Right$". Und "Chr$(34)" sagt mir: "Error 4 Type character '$' does not match declared data type 'Integer'." Und halt noch n Paar andere Kleinigkeiten ( Error 5 Type character '$' does not match declared data type 'Char'. Error 6 Too many arguments to 'Public ReadOnly Default Property Chars(index As Integer) As Char'. Error 7 Type character '$' does not match declared data type 'Char'. Error 8 Too many arguments to 'Public ReadOnly Default Property Chars(index As Integer) As Char'. Error 9 'Public ReadOnly Property Right() As Integer' has no parameters and its return type cannot be indexed. Error 10 Type character '$' does not match declared data type 'Integer'. Error 11 Type character '$' does not match declared data type 'Char'. Error 12 'Public Property Left() As Integer' has no parameters and its return type cannot be indexed. Error 13 Type character '$' does not match declared data type 'Integer'. ) Ideen was da Falsch ist? Bearbeitet 4. März 2009 von NV_GeFreak Zitieren
Amstelchen Geschrieben 4. März 2009 Geschrieben 4. März 2009 kann es sein, dass du einfach den quelltext aus klassischem VB hergenommen hast und in VB.NET umwandeln wolltest? da ist ziemlich viel VB6-müll drinnen im source. im übrigen würde ich entweder das projekt wegwerfen und von grund neu auf schreiben (dann hast du auch die basics) oder das ganze stark abmagern. und das HTML_GetAllURLs würde ich so aufsetzen, dass du nicht den vollständigen HTML-quelltext selbst parst (das ist unsauber, fehleranfällig und du erfindest zudem das rad neu), sondern einfach den DOM-baum des dokuments durchgehst. s'Amstel Zitieren
NV_GeFreak Geschrieben 4. März 2009 Autor Geschrieben 4. März 2009 Hmm... Also wie ich schon sagte, bin ich neu auf diesem Gebiet. Und wie mir deine Antwort gezeigt hat (völlig zurecht), habe ich nur einen blassen Schimmer von dem was ich da gerade tuhe. Vielleicht hätte ich als Anfänger mit den Basics anfangen sollen. Es ist schon peinlich genug zu sagen, dass ich nicht einmal genau weiss, wie die Sprache von Visual Studio heisst (VB oder VB.NET). Ich werde erst mal einen "Google Crash-Kurs" machen und mir die Grundlagen anschauen. Dennnoch wäre ich wirklich dankbar, wenn jemand von euch Profis mir den Code posten könnte, wie man diese Funtion umsetzen kann: Aktuelle HTML-Seite (vom WebBrowser1) nach Links dursuchen und diese dann in einer ListBox (oder noch besser in einer ListView) anzeigen/ausgeben./QUOTE] Zitieren
flashpixx Geschrieben 4. März 2009 Geschrieben 4. März 2009 Ich würde zur Lösung folgende Ansätze präferieren: falls es sich um ein valides XTML Dokument handelt, würde ich das XHTML mit einer XSLT in ein eigenes XML Dokument umwandeln, in dem nur die gewünschten Linkdaten enthalten sind. Dieses XML via DOM einfach auslesen und darstellen.falls es um ein valides HTML Dokument geht, kann man dies entweder nach XHTML umwandeln und via XSLT verarbeiten bzw wie Amstelchen beschrieben hat, das DOM verarbeitenbei nicht vaildem Code würde ich die Daten via RegExpr zu lesen Phil Zitieren
NV_GeFreak Geschrieben 4. März 2009 Autor Geschrieben 4. März 2009 Naja. Warum so kompliziert? Ich habs jetzt so gemacht: Public Function Find(ByVal quellcode As String) Dim QC As String Dim sPos As Integer Dim ePos As Integer QC = quellcode ListBox1.Items.Clear() Do sPos = InStr(ePos + 1, QC, "http://") If sPos > 0 Then ePos = InStr(sPos + 1, QC, ">") If ePos > 0 Then ListBox1.Items.Add(Mid$(QC, sPos + 0, ePos - sPos - 1)) End If End If Loop Until sPos = 0 Or ePos = 0 End Function Dann noch die JPEGs Filtern: Private Sub List() Dim SP As Integer Dim EP As Integer ListBox2.Items.Clear() For i = 0 To ListBox1.Items.Count - 1 Do SP = InStr(EP + 1, ListBox1.Items.Item(i), "http://") If SP > 0 Then EP = InStr(SP + 1, ListBox1.Items.Item(i), ".jpg") If EP > 0 Then ListBox2.Items.Add(Mid$(ListBox1.Items.Item(i), SP + 0, EP - SP - 1)) End If End If Loop Until SP = 0 Or EP = 0 Next End Sub Aufruf: Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted TabPage1.Text = WebBrowser1.DocumentTitle Call Find(WebBrowser1.Document.Body.InnerHtml) Call List() End Sub Nun habe ich folgendes Problem :upps - Die Items aus der Listbox2 in die ListView1 zu bringen. Mit dem hier Private Sub List2() For i = 0 To ListBox2.Items.Count - 1 Do ListView1.Items.Add(ListBox2.Items.Item(i)) Loop Until i = ListBox2.Items.Count - 1 Next End Sub klappt das auch aber: a) Nur wenn die ListBox2 NUR EINEN Eintrag hat (wenn mehr -> Endlosschleife) und In die Group "Default" - ich will sie aber ALLE in die Group "Bilder" (Index 0) haben. Bzw. wenn es Bilder sind (also ".jpg") -> Group(0) Videos (".avi") -> Group(1) usw. Vorschläge? Zitieren
NV_GeFreak Geschrieben 4. März 2009 Autor Geschrieben 4. März 2009 Ich habs: Private Sub List2() For i = 0 To ListBox2.Items.Count - 1 'Fügt ein Item in die LV1 in die erste Group aus der LB2 an der Stelle i mit dem ImageIndex 3 ListView1.Items.Add(ListBox2.Items.Item(i), 3).Group = ListView1.Groups(0) Next End Sub Die Endlosscheife kam von "Do - Loop Until" Was bei MSDN so alles drin steht Tja, das wars soweit. Bis zum nächsten Problem, Ciao :cool: Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.