Vielerlei Fragen - Basic zeug [solved]

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Vielerlei Fragen - Basic zeug [solved]

    Hallo ,
    tut mir leid ich habe nen paar mehr fragen und wollte keine meheren Threads machen , so entschuldigt bitte den nichts aussagenden Titel :)
    Frage 1 : Muss ich die Anzahl an Items fest definieren wenn ich ein Array erstelle ?
    Frage 2 : Kann man ein Array erstellen was 2 Werte beinhaltet , oder müsste ich das über ein weiteres Array machen ?
    Ich möchte einen Alarm erstellen, der nur prüfen soll ob die Stunden und Minuten Anzahl gleich ist als gerade (timeofday)
    Frage 3 : Wie kann ich überprüfen ob Array einträge bereits existieren oder alle in eine Listbox exportieren ?
    Frage 4 : Was geht schneller um den Quelltext einer Seite auszulesen, wie könnte man es via Httpwebrequest machen oder wie könnte ich einen neuen webbrowser unabhängig (nicht sichtbar) von der form erstellen ?
    Frage 5 : Ich möchte Textdateien abspeichern und quasi eine Art Archiv erstellen auf die man Via Vb zugreifen kann , gibt es eleganteres als textdateien ?

    Ich bedanke mich im voraus für eure Hilfe

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Walller66“ ()

    Ist zwar schon spät, aber mir ist langweilig. Deshalb kriegst du eine ausführliche Beantwortung :D

    Frage 1:

    Bei einem Array, ja. So wie du fragst, nehme ich an, dass du beliebig viele Items hinzufügen willst.
    Deshalb nimm eine Liste (List Of).

    Beispiel:

    VB.NET-Quellcode

    1. Dim vieleZahlen As New List(Of Integer)


    Mit der Methode Add kannst du nun so viele Integer hinzufügen, wie du möchtest:

    VB.NET-Quellcode

    1. vieleZahlen.Add(25)
    2. vieleZahlen.Add(144)
    3. vieleZahlen.Add(123)


    Frage 2:
    Ein Array ist nur eine bestimmte Anzahl Elemente eines Datentyps. Das kann also ein String, ein Integer oder etwas anderes sein.
    Du hast nun mehrere Möglichkeiten:
    1) Du machst das mit einem zwei-dimensionalen Array
    2) Eine Klasse, welche du mit Properties schmückst
    3) Mit einer Struktur. (Empfehlung)

    Beispiel (Nehmen wir diese zwei Datentypen: Integer und String).
    Deklaration der Struktur:

    VB.NET-Quellcode

    1. Public Structure XYZ
    2. Dim wert_int As Integer
    3. Dim wert_string As String
    4. End Structure


    Array definieren, füllen, auslesen:

    VB.NET-Quellcode

    1. 'Deklaration
    2. Dim liste_structure(1) As XYZ
    3. 'Struktur
    4. liste_structure(0) = New XYZ With {.wert_int = 22, .wert_string = "text1"}
    5. liste_structure(1) = New XYZ With {.wert_int = 66, .wert_string = "text2"}
    6. 'Werte auslesen
    7. MessageBox.Show("Integer des ersten Eintrages: " & liste_structure(0).wert_int.ToString)


    Ich hoffe du kannst nun eine Struktur mit Stunde und Minute erstellen :)

    Frage 3:
    Meiner Meinung nach sind das zwei Fragen.

    Frage 3a:
    Überprüfen kannst du das nur, indem du jeden Eintrag im Array durchgehst. Am besten schreibst du dir eine Methode, welche dir einen Boolean zurück gibt (Existiert: ja / nein).
    Dieser Methode übergibst du dann die zu überprüfenden Werte. In dieser Methode vergleichst du jeden Eintrag des Arrays mit den übergebenen Werte. Falls diese gleich sind, gibst du ein True zurück.
    Ansonsten nichts. Am Ende der Methode wird False zurück gegeben, da an dieser Codestelle bereits alle Einträge des Arrays geprüft worden sind und keiner überein stimmte.

    Beispiel mit dem Beispiel von Frage 2:

    VB.NET-Quellcode

    1. Private Function existInArray(ByVal xyz As XYZ) As Boolean
    2. For Each eintrag As XYZ In liste_structure
    3. If eintrag.wert_int = xyz.wert_int AndAlso eintrag.wert_string = xyz.wert_string Then
    4. Return True
    5. End If
    6. Next
    7. Return False
    8. End Function


    Frage 3b:
    Wieder mit einer Schleife durchgehen und der Listbox hinzufügen.

    Beispiel mit dem Array von oben:

    VB.NET-Quellcode

    1. For Each eintrag As XYZ In liste_structure
    2. ListBox1.Items.Add("Wert Int:" & eintrag.wert_int.ToString & _
    3. "Wert String:" & eintrag.wert_string.ToString)
    4. Next


    Frage 4:
    Beides nicht ;)
    Nimm einen Webclient, dann wird das ein Einzeiler.

    Beispiel mit Google:

    VB.NET-Quellcode

    1. Dim wc As New System.Net.WebClient
    2. Dim sourcecode As String = wc.DownloadString("http://www.google.ch")


    In der Variable sourcecode steht nun der komplette Quelltext der Seite.

    Frage 5:
    Ich empfehle dir ein DataSet. Mehr dazu in einem der besten Tutorials auf VBP: DatasetOnly: DB-Programmierung ohne Datenbank

    Das wars. Hoffe das hilft dir.
    Greez Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    Walller66 schrieb:

    Muss ich die Anzahl an Items fest definieren wenn ich ein Array erstelle ?
    ja. Für Variable Größen sind List(Of Datentyp) zu nutzen.

    Walller66 schrieb:

    Kann man ein Array erstellen was 2 Werte beinhaltet , oder müsste ich das über ein weiteres Array machen ?
    Ein Array in einem Array ist möglich, allerdings geht auch ein DIctionary mit Key und Value. Du erwähnst Stunde und Minute. Die werden doch eh in einem Object, der DateTime gespeichert, da sind keine 2 Objekte nötig.

    Walller66 schrieb:

    Wie kann ich überprüfen ob Array einträge bereits existieren oder alle in eine Listbox exportieren ?
    Benutze für sowas direkt die List(of Datentyp), ist dort sehr einfach.

    Walller66 schrieb:

    Was geht schneller um den Quelltext einer Seite auszulesen, wie könnte man es via Httpwebrequest machen oder wie könnte ich einen neuen webbrowser unabhängig (nicht sichtbar) von der form erstellen ?
    Quelltext auslesen geht via WebClient.DownloadString(Async). Für HttpWebRequest siehe Google.Einen WebBrowser erstellst du im Code wie jede andere Variable, der ist dann nicht in der Form sichtbar, so lange du ihn nicht zur Form.Controls Auflistung hinzufügst. Mit WithEvents hast du alle Events verfügbar. Also bspw: Private WithEvents wb1 as new webbrowser

    Walller66 schrieb:

    Ich möchte Textdateien abspeichern und quasi eine Art Archiv erstellen auf die man Via Vb zugreifen kann , gibt es eleganteres als textdateien ?
    Datenbanken, Datasets, XML, serialisierte Klassen, blablabla, da kenne ich mich nicht genug aus, um eines empfehlen zu können.

    edit: woah, 2 Min zu spät..

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Zu Frage 2: Bei Wertepaaren, die zusammengehören, ist ein Dictionary vorzuziehen - für so etwas ist diese Klasse ja im FW vorhanden.
    Zu Frage 3: Schaue dir ContainsKey bzw. ContainsValue einmal an.
    Welche Werte da der TE jetzt wirklich meint, die muss er noch genauer definieren. Bei Stunde und Minute gilt @vb-checker 's Aussage...
    Wenn du eine Alarmzeit speichern möchtest - dann versuche es einmal mit Settings
    Dieses Buch würde ich dir empfehlen, da wird sogar ein Weckerbeispiel durchgearbeitet...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()

    Walller66 schrieb:

    ob die Stunden und Minuten Anzahl gleich ist als gerade
    Nimm die DateTime-Struktur, schneide die Sekunden und Millisekunden weg und nutze die überladenen Operatoren.

    VB1963 schrieb:

    ist ein Dictionary vorzuziehen
    Da bin ich anderer Meinung. Gegenbeispiel: 4 Wertepaare - die Eckpunkte <x,y> eines Vierecks.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB1963 schrieb:

    unterstrichen zusammengehören
    Ich hab Dich schon verstanden. ;)
    Fakt ist, dass bei der Spezifikation die meisten Fehler gemacht werden, und hier wäre Platz für einen solchen.
    Darauf wollte ich hinweisen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Eine Frage wäre da noch, wie kann ich bei dieser XYZ Struktur Items hinzufügen, und ist in deinem Beispiel durch die Deklaration

    VB.NET-Quellcode

    1. Dim alarm(1) As XYZ
    die Anzahl der Elemente begrenzt ?

    Wo ich auch nicht weiter komme :

    VB.NET-Quellcode

    1. Private Function existInArray(ByVal xyz As XYZ) As Boolean
    wie rufe ich diese Funktion dann auf und muss ich parameter übergeben ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Walller66“ ()

    Wenn XYZ als

    VB.NET-Quellcode

    1. Public Struct XYZ
    2. Public Property X As Integer
    3. Public Property Y As Integer
    4. Public Property Z As Integer
    5. End Struct
    definiert ist, kannst du daran nichts ändern. XYZ ist mit diesen drei Elementen definiert.
    Das alarm(1) ist eine Array-Deklaration. Arrays sind grundsätzlich von fester Länge - du kannst also kein Element hinzufügen.
    Die Alternative dazu: Dim alarm As List(Of XYZ). Dort gibt es die Methode Add(item As XYZ), mit der du dynamisch Elemente hinzufügen kannst.

    Zu deiner zweiten Frage: mit einer List(Of XYZ) gibt es zudem die Methode Contains(item as XYZ) As Boolean. Damit brauchst du die Funktion existInArray nicht.

    Walller66 schrieb:

    wie kann ich bei dieser XYZ Struktur Items hinzufügen
    Indem Du sie als List(Of T) deklarierst:

    VB.NET-Quellcode

    1. Dim alarm As List(Of XYZ)

    @AliveDevil Keine Alternative, sondern die einzig richtige Lösung. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Walller66 schrieb:

    VB.NET-Quellcode

    1. Dim alarm(1) As XYZ
    die Anzahl der Elemente begrenzt ?

    Unabhängig davon, ob dies gut ist, aber wenn du schreibst "dim Alarm(1) as xyz" hast du bereits 2 Elemente im Array (die Zählung beginnt bei 0) .. Wenn du also nur 1 Element aktuell haben willst musst du dim Alarm(0) machen... Also im Hinterkopf behalten.

    Walller66 schrieb:


    Das alarm(1) ist eine Array-Deklaration. Arrays sind grundsätzlich von fester Länge - du kannst also kein Element hinzufügen.

    Sooo fest ist die Länge nicht, du kannst jederzeit mit REDIM bzw. REDIM preserve neue Elemente hinzufügen.

    Hat vielleicht noch einen kleinen Vorteil (gegenüber anderen Nachteilen), das du einfacher Einzelne Elemente deiner Structur ändern kannst.

    Alarm(2).x = 20
    kannst du bei einer List OF... nicht so einfach machen:-)
    Das ist richtig, kannst du aber bei keiner Structure :P und Redim ist eine Methode, die man niemals und unter keinen Umständen nutzen sollte. Warum geht sowas aus den Köpfen der Entwickler nicht raus?

    Funktioniert einwandfrei:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim l As New List(Of XYZ) From {New XYZ(0, 1, 2), New XYZ(2, 1, 2), New XYZ(5, 2, 0)}
    4. Debug.WriteLine(l(2).X = 5)
    5. l(2).X = 10
    6. Debug.WriteLine(l(2).X = 10)
    7. End Sub
    8. End Module
    9. Public Class XYZ
    10. Public Property X As Integer
    11. Public Property Y As Integer
    12. Public Property Z As Integer
    13. Public Sub New(x As Integer, y As Integer, z As Integer)
    14. Me.X = x
    15. Me.Y = y
    16. Me.Z = z
    17. End Sub
    18. End Class

    Wird die XYZ von Class in Structure geändert, funktioniert das ganze nicht mehr - Referenz- und Werttypen sei Dank.
    Erzähl also keinen Schmarn, @RoulettePilot

    RoulettePilot schrieb:

    VB.NET-Quellcode

    1. Dim alarm(1) As XYZ
    @Walller66 Aber Achtung: In C# liefert die Zeile

    C#-Quellcode

    1. XYZ[] alarm = new XYZ[1];
    nur ein Element.
    Das ist aus Kompatibilitätsgründen so, weil es Zeiten gab, wo Basic-Arrays mit Index 1 anfingen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!