Beiträge von BlackFoX

    @MWP : die Version 4.3 wurde nun auch für 0.3a konfiguriert sprich es gibt eine Separate 4.3 die aber soweit alle Funktionen der normalen 4.3 hat und haben wird falls 0.3a noch eine Zeit Aktuell sein sollte.


    @Multivan : Ich werde in nächster Zeit mal so etwas basteln ansonsten erkundige dich mal bei Ryder im Englischen Forum er hat mal so etwas ähnliches gebastelt.


    EliteTerror : Wie gesagt damit hat der Streamer nichts zu tun das liegt am Built In Streamer von Sa-mp der nochmal extra konfiguriert werden müsste ansonsten habe ich den Streamer wie gesagt
    ausgiebig getestet und mir sind bisher keine Fehler aufgefallen er läuft nach wie vor ohne besondere Vorkommnisse.


    Hauptgrund des Beitrags.
    So nun zum Update, die MapLoader Funktion wurde nun etwas aufgebessert , es wurde eine Separate Version für die 0.3a erstellt und in der für die 0.3b vorgesehenen Version
    kann man nun die Stream Distanz einstellen für den Built In Streamer sprich nochmal Separat mit einer extra Funktion während der Laufzeit , wird auch alles Echtzeit Aktualisiert.


    //EDIT :

    Und gleich noch ein Update , extra für den Maploader gibt es nun ein Virtuelles Variablen System um bestimmte Objekte anzusprechen ohne die Stream ID zu wissen,
    weitere Informationen im Hauptthema ganz unten über den Download Angaben.


    Achtung : Schnelles Update durchgeführt ~ 16:00

    if(newcar ==34 || newcar ==35|| newcar ==36 || newcar == 37||
    newcar ==38||newcar ==39 || newcar ==40 || newcar ==41 || newcar ==42
    || newcar ==43||newcar ==44 || newcar ==45 || newcar ==46 || newcar ==47
    || newcar ==48||newcar ==49 || newcar ==50 || newcar ==51 || newcar ==52
    || newcar ==53||newcar ==54 || newcar ==55 || newcar ==56 || newcar ==57
    || newcar ==58||newcar ==106|| newcar ==107 || newcar ==108 || newcar == 109
    || newcar ==110 ||newcar==111 ||newcar ==112 ||newcar ==113||newcar ==114
    || newcar ==115|| newcar ==116 || newcar ==117|| newcar ==118||newcar ==119
    || newcar ==120|| newcar ==121 || newcar ==122 || newcar ==123||newcar == 124)
    {
    if(TakingLesson[playerid] == 1) { }
    else if(!IsAnInstructor(playerid))
    {
    SendClientMessage(playerid,COLOR_GREY,"Du bist kein Fahrlehrer!");
    RemovePlayerFromVehicle(playerid);
    }
    }



    oder Möglichkeit 2 ...


    new fahrschule[5];

    fahrschule[0] = CreateVehicle(...);
    fahrschule[1] = CreateVehicle(...);


    forward bool:FahrschulAuto(playerid);
    bool:FahrschulAuto(playerid)
    {
    new bool:is_id;
    for(new i = 0;i<5;i++)
    {
    if(GetPlayerVehicleID(playerid) == fahrschule[i])
    {
    is_id = true;
    break;
    }
    }
    return is_id;
    }


    if(FahrschulAuto(playerid))
    {
    if(TakingLesson[playerid] == 1) { }
    else if(!IsAnInstructor(playerid))
    {
    SendClientMessage(playerid,COLOR_GREY,"Du bist kein Fahrlehrer!");
    RemovePlayerFromVehicle(playerid);
    }
    }

    Ich würde sagen selber Schuld wenn man einfach nur kopiert und einfach einfügt...


    • strtok definieren = Funktion
    • der Rest sind Variablen die nochmal nach definiert werden sollten
    • x_nr und tmp sollten nach Code wohl Zeichenketten sein bzw. als String dienen

    Kann ich dir nicht genau sagen, ich würde das Problem bei Sa-mp selber vermuten wobei ich bisher keine Probleme damit hatte,
    eventuell liegt es an den Built In Streamer Einstellungen, wie gesagt ich hatte bisher bei keinem Test Probleme nicht einmal Anzeichen.


    So hier mal Bilder zum Test : ( Test mit der Map Loader Funktion aus MTA Maps , Vacant.map )

    Die Sanft rotieren Funktion werde ich später nochmal einbauen ich muss mir vorerst aber eine Methode überlegen bei der Funktion
    den Ressourcen verbrauch bezüglich der Timer optimal zu halten.


    So nun zum Hauptgrund dieses Beitrags...


    b_LoadMap(Mapname[]);


    ist nun verfügbar, was diese Funktion kann ?
    sie lädt Objekte aus MTA Deathmatch Maps ab Version 1.0.4,
    ich habe sie auch schon getestet sie läuft im Moment einwandfrei und lädt alle Objekte auch richtig ;)
    Fehler oder derartiges einfach melden falls was sein sollte.
    Zum Test habe ich übrigens diese Map verwendet : Klick Mich
    Ihr Standort beginnt beim Stadium in Los Santos , falls wer testen möchte.


    mfg. BlackFoX_UD_ ;)

    BFX vielleicht kannst du ja noch die Funktion hinzufügen alle Objecte zu löschen
    b_DestroyAllObjects
    diese Funktion sollte dann alle Objekte löschen oder nur die per b_CreateObject erstellten..
    Oder gibt es eine andere möglichkeit bei einem GMX die Objecte zu entfernen da sie dannach immer doppelt da sind :-O


    Naja nice Again!
    (Wollte dir noch etwas anmerken: Bei deinem Dynamischen Haussystem steht oben im Script "forward ZeitTimer();" das kann raus da dieser Timer nicht exisitiert und nie aufgerufen wird :P sry das ich es hier mitreinschreibe kann dir halt keine PN schicken..)

    • b_DestroyAllObjects() wurde hinzugefügt.
    • Stream Radius wurde optimiert

    Falls die Objekte doppelt erscheinen einfach alle zerstören mit der neuen Funktion bei OnGameModeExit bzw. OnFilterScriptExit falls
    diese Rückrufe endlich richtig funktionieren sollten ansonsten im Kommando zerstören für den Neustart.
    INFO: Die Objekte werden mit der Funktion Global zerstört sprich alle Filterscripts und das Gamemode sind davon betroffen.

    Wie der Benutzer Schnacke es dir zeigt hat alles soweit seine Richtigkeit jedoch solltest du nicht weiter auf dieser Basis bestehen bleiben sondern dich im Falle dieser
    kleinen und simplen System mit den Möglichkeiten von Pawn beschäftigen, Stichpunkte dazu wären ...


    • Enum
    • Array Variablen
    • Strukturen
    • Schleifen
    • Logische Handlungen

    Der Punkte Logische Handlungen sagt soviel wie du solltest wenn du ein solches System gestaltest möglichst Ressourcensparend arbeiten denn so sparst du
    nicht nur einen Teil vom Speicher sondern feilst auch an der Geschwindigkeit deines Scripts was zum Beispiel bei einem jetzt sagen wir mal größeren Server
    eine hohe Relevanz besitzt da der Server auf dem dein Script läuft auch wieder eine Grenze an Belastbarkeit hat.


    Wie gesagt wenn du dich genauer mit der Sprache befasst kannst du viel mehr Ideen umsetzen und vor allem schneller umsetzen,
    nicht die Sprache ist schwer sondern die Denkarbeit kostet am Anfang viel Zeit.

    Naja da nun die Sperre für die d3d9.dll raus ist macht es wieder Sinn für einige was dran zu machen sprich
    die Leute die sich Scripts basteln können Standpunkte nun wieder speichern und verschiedene Tests durchführen,
    sonst hat sich jetzt eigentlich nichts geändert was von großen Interesse wäre, wenigstens werden die Fehler ausgebessert.
    Mal schauen wie das Endergebnis nachher aussieht sprich die 0.3b Final Version ;)

    forward bool:CheckClanFake(playerid,clan[],filename[]);
    bool:CheckClanFake(playerid,clan[],filename[])
    {
    new name[MAX_PLAYER_NAME],File:xopen,readin[32],
    bool:can_do;
    GetPlayerName(playerid,name,sizeof name);
    if(strfind(name,clan,true) == -1)return true;
    if(!fexist(filename))return true;
    xopen = fopen(filename,io_read);
    while(fread(xopen,readin))
    {
    if(!strcmp(readin,name,true,strlen(name)))
    {
    can_do = true;
    break;
    }
    }
    fclose(xopen);
    return can_do;
    }


    sollte so ja auch gehen, wenn ich mich nicht Irre ...
    Ansonsten trage dem Spieler doch ins Profil einen Schlüssel ein womit man sieht das er Offiziell im Clan ist,
    dann musst du die externe Datei nicht noch einmal durchlaufen sondern nur prüfen ob jetzt zum Beispiel [RLG] im Namen ist
    und wenn der Schlüssel existiert bzw. den Wert 1 enthält darf er fortfahren.

    Dazu gibt es nur eines zu sagen...
    Trottel gibt es hinter jeder Ecke.


    Zum anderen sind Clannamen nicht patentiert also kannst du dagegen auch nicht sonderlich Stark vorgehen außer eigene Justiz ausüben,
    wobei man bei solchen Angelegenheiten überhaupt keine Not hat soweit zu gehen.


    Ansonsten zum Schluss, stell den Namen unter Patent, bezahlt was dafür wenn es dir die Sache Wert ist oder hol dir einen neuen,
    letzte Möglichkeit wie bereits erwähnt, eigene Justiz ;)

    Bekomme Fehler...


    C:\Dokumente und Einstellungen\moritz\Desktop\PAWNO\gamemodes\moritz.pwn(20) : error 017: undefined symbol "StreamObject_OnGameModeInit"C:\Dokumente und Einstellungen\moritz\Desktop\PAWNO\gamemodes\moritz.pwn(48) : error 017: undefined symbol "StreamObject_OnGameModeExit"


    EDIT: geht mit der 8ter verison ...

    liegt vielleicht daran das diese Funktion nicht mehr existiert und nun "StreamObject_OnPlayerUpdate" dafür verwendet wird was
    wohl unter "OnPlayerUpdate" seinen Platz findet ;)

    enum dynamisch
    {
    inhalt[255],
    bool:exist
    }
    new dyn[200][dynamisch];




    // Laden
    new formater[32];
    for(new i = 0;i<200;i++)
    {
    format(formater,sizeof formater,"key_%i",i);
    if(dini_Isset("dateiname.ini",formater))
    {
    strmid(dyn[i][inhalt],dini_Get("dateiname.ini",formater),0,255,255);
    dyn[i][exist] = true;
    }
    }




    //Speichern


    for(new i = 0;i<200;i++)
    {
    if(!dyn[i][exist])continue; // schleife fortsetzen falls nicht existiert.
    format(formater,sizeof formater,"key_%i",i);
    dini_Set("dateiname.ini",formater,dyn[i][inhalt]);
    }


    // Beispiel


    if(!strcmp(cmdtext,"/addnew",true,7))
    {
    if(!cmdtext[9])return SendClientMessage(playerid,0xFF0000FF,"Nutze /addnew [text]");
    new slot = -1;
    for(new i = 0;i<200;i++)
    {
    if(dyn[i][exist])continue;
    slot = i;
    break;
    }
    if(slot == -1)return SendClientMessage(playerid,0xFF0000FF,"Kein Slot mehr Frei!");
    strmid(dyn[slot][inhalt],cmdtext[9],0,len(cmdtext[9]),255);
    dyn[slot][exist] = true;
    return SendClientMessage(playerid,0x00FF00FF,"Slot gesetzt!");
    }



    Nur als Beispiel für ein Dynamisches System, sollte so passen ;)

    Letzter Schritt, wir verwerfen die Ressourcen in "iox" sprich schließen den Stream und geben die Datei wieder frei.

    PHP
    iox.Close()



    Kommen wir zur Abfrage sprich dem Vergleich der Versionen,
    hier gilt vorerst eines zu sagen, wir speichern die neuen Informationen der Version in der Registrierung und werden sie von da auch immer abrufen
    weil es so keinen Dateisalat gibt und das ganze zudem dann auch sicher untergebracht ist.


    Wie man sieht wird die Version aus der Variable "ot" da wo wohin die Daten der Textdatei ausgelesen wurden überprüft und
    abgefragt "falls nicht" , wir überprüfen hier mit dem Schlüssel aus der Registrierung :

    Code
    HKEY_CURRENT_USER > Software > deinprodukt > version


    darin werden später auch die neuen Informationsdaten gespeichert ( dazu später mehr )


    sollte der Schlüssel nicht gefunden werden oder nicht ausgelesen werden können so wird als Standardwert "0.0" wiedergegeben
    also Version 0.0 halt

    SQL
    If Not ot = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\deinprodukt", "version", "0.0") Then



    So nun zudem was passieren soll wenn die Version ein Update erhalten >sollte<...


    Ich habe das ganze nochmal etwas auf gestaltet und bin so freundlich sag ich mal und frage den Benutzer nochmal ob er auch ein Update durchführen möchte.


    Ich frage hier ab ob der Benutzer Updaten möchte, sprich ich frage ab ob das Ergebnis der Nachrichtenbox "MsgBoxResult.Yes" ist sprich
    ob "ja" angeklickt wurde , sprich die Resultate der Aktion die in der Nachrichtenbox ausgeführt wurden, sollte eigentlich einfach zu verstehen sein ;)

    PHP
    If MsgBox("Eine Neue Version von 'deinprodukt' verfügbar , Version '" & ot & "'" & _
                  vbNewLine & "Möchten sie ein Update durchführen ?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Update") = MsgBoxResult.Yes Then



    So fahren wir fort, hat der Benutzer nun "ja" angeklickt so soll folgendes passieren , genau ein Update...


    dazu starten wir vom gleichen Verweis auf den Web Client einen Synchronisierten Download, dazu tun wir folgendes...
    wir nehmen die Variable Client noch einmal her und wählen die Option des Synchronisierten Downloads,
    als erstes übergeben wir wieder unsere Download Adresse um "Uri" Format dazu erstellen wir eine neue Uri
    wie man sehen kann und übergeben die Adresse darin , danach kommt wieder unser Zielpfad , den ihr genauso selber bestimmen könnt.

    PHP
    client.DownloadFileAsync(New System.Uri("deineurl/produkt.zip"), My.Application.Info.DirectoryPath & "\produkt.zip")



    So hier kommen wir nochmal zu den Extra wie den Fortschrittsbalken..
    dazu tut ihr folgendes , ihr geht wieder in den Designer eures Editors und dort wählt ihr in der Toolbox
    die "Progressbar" aus , diese zieht ihr nun so ins Fenster wie ihr sie haben wollt,
    nun geht zurück in den Code und es geht folgendermaßen weiter...



    So nun übergebt ihr die Rückrufe damit ihr den Fortschritt später sehen könnt bzw. ihn abfragen
    und schauen könnt wann euer Download Fertig ist.
    Die jeweiligen Rückrufe holt ihr aus der Web Client Variable denn daraus resultieren später auch die Fortschritte,
    wie ihr seht verweise ich "DownloadProgressChanged" auf "DownloadProgress"
    beim anderen genauso nur mit anderen Funktionen und einer anderen Subfunktion.


    PHP
    AddHandler client.DownloadProgressChanged, AddressOf DownloadProgress
    AddHandler client.DownloadFileCompleted, AddressOf DownloadFertig


    Hier mal die Subfunktionen dazu


    Wie ihr seht haben ihre Köpfe deren Parameter man so nicht herausfindet, diese findet man aber heraus indem man in "client" nochmal
    die Subelemente auswählt die benötigt werden und nachschaut, dort sollten sie dann in Klammern hinter den jeweiligen Aktionsnamen stehen ;)


    So kommen wir zu diesen Rückruffunktionen , ich hab bereits erwähnt wozu sie diesen und ihre Namen sagen bestimmt auch einiges aus...
    wie ihr seht lasse ich den Status des Fortschritts hier in den Fortschrittsbalken wandern der "Progressbar"
    die Fortschrittsinformationen holt ihr euch aus der Variable "e" die ihr dann direkt an den Fortschrittsbalken übergeben könnt.


    PHP
    Private Sub DownloadProgress(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
    Me.ProgressBar1.Value = e.ProgressPercentage
    End Sub


    So hier wird nun das getan was danach notwendig wäre, die neue Version einzutragen in den Pfad der Registrierung wo ihr auch
    die Aktuellen Informationen bezüglich eures Programms abruft.
    Das ganze wird dann extra beim beenden des Downloads erledigt, muss es aber nicht , eine andere Variante wäre das euer Programm diese
    beim Start eintragen lässt sprich diese überträgt so muss der Update Manager dies nicht tun, wäre aber auch nur eine Idee ;)


    PHP
    Private Sub DownloadFertig(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
    My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\deinprodukt", "version", ot)
    End Sub



    So zum Schluss gilt nur noch eines zu sagen , vergesst eure Abfragen nicht mit End if abzuschließen ;)
    so wäre der Code dann auch komplett und das wichtigste ergänzt eure Daten, Pfade und Zieladressen.


    So das war es soweit zu diesem Tutorial was eigentlich ganz simpel zu verstehen sein sollte, ich hoffe ihr kommt damit klar und kopiert nicht nur sondern lest
    auch wirklich und versucht es wirklich nachzuvollziehen denn wer auch mit eigenen Köpfchen arbeitet kapiert schneller.
    Das wichtigste ist das ihr schon Erfahrungen mit Visual Basic haben solltet sprich es wäre definitiv nichts für Anfänger denn diese
    würden sowieso nur kopieren sobald es nicht klappt , was sehr schade wäre.


    //EDIT: vollen Code nochmal als Anhängsel ;)


    http://pastebin.com/nE2cKNCG

    • Gebraucht : 1x Button , 1x ProgressBar , beide ohne bestimmten Namen und natürlich ein Formular

    Hallo Liebe Deutsche Sa-mp Community ,


    in diesem Tutorial möchte ich einfach mal erklären wie man mit ein paar Handgriffen ein simples Update Programm erstellt und damit seine eigenen Programme
    einfach mal auf dem neusten Stand hält.
    Wie gesagt dieses Tutorial bezieht sich voll und ganz auf die Sprache Visual Basic.NET und ja legen wir mal los ;)


    Als erstes startet ihr Visual Basic , sollte soweit sowieso klar sein dann führt ihr folgende Schritte aus...


    • Geht ins Menü auf Datei dort auf Neues Projekt
    • Startet eine Windows Forms Anwendung auf Visual Basic.NET Ebene ( Für die , die Visual Studio nutzen Visual Basic.NET auswählen als Sprache wie gesagt )


    So nun habt ihr ein leeres Formular vor euch sprich ein leeres Standardfenster, so als erstes solltet ihr wissen das es in Visual Basic.NET einfach ist Kontrollelemente zu erstellen,
    Buttons, List Boxen und so weiter , diese lassen sich mit ein paar Klicks einfach in dieses Leere Fenster hineinziehen sag ich mal,
    finden könnt ihr sie in der "Toolbox" sprich Werkzeugbox zu Deutsch.
    Nun solltet ihr auch wissen das Subfunktionen sprich Rückruffunktionen für diese Elemente ebenso einfach erstellt werden können um dies genauer zu erklären macht ihr folgendes...


    • zieht einen Button ins Formular ( Später unser Update Check Button ;) )
    • klickt doppelt drauf


    So nun solltet ihr sehen das das eine Rückruffunktion erstellt wurde die dann aufgerufen wird wenn der Button geklickt wird wie man ganz gut erkennen sollte,
    entweder an den Handle Eigenschaften die sich ziemlich genau hinten an der Subfunktion befinden oder auch an dem Namen und dahinter den Namen der gewünschten Aktion
    sprich "elementname_click" als Beispiel jetzt mal ;)
    Die Aktion "Click" brauchen wir später auch aber nun nochmal zur Informationen es lassen sich in Elementen auch ganz leicht andere Aktionen generieren,
    entweder man ändert die Eigenschaften der Handle Einstellung oder man klick sich in die Subfunktion rein sprich auf den Kopf drauf klicken und nun oben Rechts
    sollte man eine ausklappbare Liste haben diese klickt ihr an und wählt halt die jeweilige Rückruffunktion die euch der Code generieren soll sprich ihr müsste
    diese Rückrufe nicht selber extra eintippen, das zeichnet die IDE aus sprich der Editor vereinfacht euch halt einiges.


    So kommen wir endlich zum Hauptthema dem Updater , das waren jetzt nur nochmal schnelle Einstiegsinformationen ;)
    als geht ihr zur Click Aktion des Buttons und macht folgendes ...


    • Erstellt den Verweis auf den Web Client sprich der später die Dateien herunterlädt
    PHP
    Dim client As New Net.WebClient


    die Variable "client" enthält nun Subelemente für die Aktionen/Funktionen des Web Client, sprich sie speichert Informationen zum Download
    und weiteres.
    Kleine Erklärung nebenbei + Frage : "Warum eine neue Variable für einen Download ?"


    Ganz Einfach : Das hat damit zu tun das diese Funktion nur einen Download behalten kann bzw. ausführen sprich ihr könntet so keine Multifunktionalen Downloads ausführen dazu werden dann meist Klassen verwendet , so lassen sich neue Informationen / Funktionen aus solchen Klassen mit deren Funktionen ganz einfach in Variablen portieren und von da ausführen so kann man die Klasse mehrmals verwenden ohne jedes mal , sag ich mal einen neuen extra Code dafür zu schreiben bzw. ihn neu zu kopieren mit anderen Informationsspeichern sondern kann sie bequem der Befehl in eine Variable portieren
    und halt so neue Zugriffe verwalten mit neuen Informationsspeichern das spart nicht nur Zeit sondern auch Ressourcen.


    So wieder zurück zum Web Client ;)
    das erste was wir nun machen ist eine Textdatei erstellen und dort unsere Programmversion hinein zuschreiben wie z.b. 1.0 oder 0.2 oder was weiß ich,
    halt die Version eures Programms , diese nehmt ihr nun und ladet sie auf euren FTP hoch in einen Ordner wo ihr sie später downloaden werdet.
    Kleines FAQ nebenbei ;)


    Q : Wozu dient diese Datei ?
    A : Ganz einfach, sie wird später von eurem Programm Temporär heruntergeladen und dann ausgelesen und verglichen mit der Aktuellen Version ( dazu später mehr )



    So kommen wir zum Download dieser Datei bezüglich eures Codes, da ihr den Verweis auf den Web Client schon erstellt habt verwenden wir ihn nun auch,
    folgendermaßen.


    SQL
    client.DownloadFile("eureUrl/temptext.txt", My.Computer.FileSystem.SpecialDirectories.Temp & "\temptext.txt")


    so wie ihr seht nehme ich die variable und greife auf das Subelement "DownloadFile" zu , Format :


    Code
    .DownloadFile("Adresse","Zielordner")


    So wie ihr seht kommt erst unsere Adresse zur Textdatei auf eurer Seite und dann der Zielpfad wo die Datei gespeichert werden soll,
    hier im Code speichere ich sie in den Temp. Daten , halt als Trashdatei sprich Müll ;)
    Wir werden diese Datei dort auch wieder auslesen , kommen wir am besten auch gleich mal dazu...


    Also bevor ich hier mehr dazu von mir gebe sage ich erst einmal eines dazu, jeder hat seine Methode Dateien auszulesen,
    ich verwende hier meine die ich am besten finde und auch am sichersten sag ich mal also bitte keine Verbesserungen,
    sprich keine Kommentare diesbezüglich, danke ;)


    Nun erstellen wir eine Variable die sich hier iox nennt , ihr könnt sie natürlich so benennen wie es euch beliebt ;)
    damit greifen wir auf das Dateisystem zu und erstellen einen neuen StreamReader sprich damit lesen wir den Daten Stream aus die
    Daten Ströme zu Deutsch , wir können auch gleich angeben was ausgelesen werden soll wie ihr seht , nun lesen wir folgendes aus :


    Code
    My.Computer.FileSystem.SpecialDirectories.Temp & "\temptext.txt"


    dies ist aber nur ein Beispiel, dort kommt natürlich der Pfad hin wo die Textdatei gespeichert wurde.


    so als nächstes kommt das Format zum encodieren der Datei ist jedoch nicht wirklich wichtig
    aber ich stelle es zur Sicherheit auf "Default" sprich auf den Standardformat,
    so wird der Format genommen in dem die Datei halt besteht ;)


    SQL
    Dim iox As New IO.StreamReader(My.Computer.FileSystem.SpecialDirectories.Temp & "\temptext.txt", System.Text.Encoding.Default)



    So nächster Punkt, den Zugriff auf den Stream.
    wir erstellen hier eine Variable die ich mal "ot" genannt hab und verweise sie direkt auf den Inhalt vom Stream sprich lese die Datei aus
    der Inhalt landet als Stringformat in "ot", diese Variable enthält nun die Information bezüglich der Version.

    SQL
    Dim ot As String = iox.ReadToEnd

    das ist die Verwendung des Typus String in Visual Basic ;)
    damit meinte ich aber andere Sprachen , aus der Basis her ist String nichts anderes als eine Kette von Daten/Zeichen/Zahlen/Hexwerten wie man es auch nennen mag,
    String selber ist dabei nur ein Subdatentyp.


    Ich habe damit niemals den Typus String in Visual Basic gemeint, in Visual Basic wurde der Typus nur nochmal vereinfacht sprich anders zusammengesetzt.