Hallo Liebe Leutz,
Ich wollte euch fragen, wie man in vb2008 einen Schutz
Programmieren kann, womit man ein selbst programmiertes Spiel NUR mit CD/DVD Spielen kann.
Ich wäre mit jeder hilfe Dankbar!
Gruß
_Nevets_94_
Hallo Liebe Leutz,
Ich wollte euch fragen, wie man in vb2008 einen Schutz
Programmieren kann, womit man ein selbst programmiertes Spiel NUR mit CD/DVD Spielen kann.
Ich wäre mit jeder hilfe Dankbar!
Gruß
_Nevets_94_
Ich meine, wenn die CD mit dem Spiel nicht eingelegt ist, dass da eine Messagebox kommt, wie z.b.: Um das Spiel spielen zu können, müssen sie die CD einlegen!
Hallo,
Ich meine, wenn die CD mit dem Spiel nicht eingelegt ist, dass
da eine Messagebox kommt, wie z.b.: Um das Spiel spielen zu
können, müssen sie die CD einlegen!
1: Ermittle alle CD Laufwerke
2: Lege auf die CD eine Datei
3: Bastel Dir anhand der gefunden CD Laufwerke, einen Pfad zu der angelegten Datei zusammen.
4: Versuche nun in einer For Each Schleife auf die Datei zuzugreifen(Es kann ja mehrere CD Laufwerke geben)
5: Hast du Erfolg so hast DU den Pfad zur CD, hast Du keinen Erfolg so ist die CD nicht eingelegt.
Aber als Kopierschutz kannst du das nicht nehmen. Ich sage da nur zum Bsp. Dämon Tools.
Willst du so etwas realisieren, so ist der Aufwand imenz grösser und auch nicht mehr so einfach.
MfG Alex
3: Bastel Dir anhand der gefunden CD Laufwerke, einen Pfad zu
der angelegten Datei zusammen.
4: Versuche nun in einer For Each Schleife auf die Datei
zuzugreifen(Es kann ja mehrere CD Laufwerke geben)
Wie mache ich das?
Also wenn du an solch etwas simplen verzweifelst, möchte ich echt mal wissen wie du das Spiel zusammen bekommen hast. Aber nun gut, ein Weg wäre dieser. Auf Fehlerbehandlungen wurden verzichtet
Private Function CheckFile() As Boolean
For Each Drv As DriveInfo In DriveInfo.GetDrives
If Drv.DriveType = DriveType.CDRom AndAlso File.Exists(Drv.RootDirectory.ToString & "Data\game.dat") Then Return True
Next
Return False
End Function
Den NamenSpace System.Io musst du noch importieren. Die Function Checkfile liefert True zurueck wenn die Datei existiert, ansonsten False. Den Pfad und die Datei musst du noch in der Function anpassen.
MfG Alex
OT Nachfrage zu AndAlso
If Drv.DriveType = DriveType.CDRom AndAlso
File.Exists(Drv.RootDirectory.ToString & „Data\game.dat“) Then
Hallo Alex,
bei anderem .Net-Code wo ich eh nix verstehe hätte ich nicht nachgefragt, aber dies hier interessiert mich dann doch als Laie.
Zum einen, mein Englisch ist sowieso lausig, von mir aus kannste mir ja locker erzählen daß AndAlso ein reinrassiges engl. Wort ist.
Ich sah es halt noch nie und „Also“ kommt mir deutsch vor *Schulterzuck".
Ich frage wegen etwas anderem, hat da ein normales „And“ nicht ausgereicht?
Gruß
Reinhard
Also wenn du an solch etwas simplen verzweifelst, möchte ich
echt mal wissen wie du das Spiel zusammen bekommen hast. Aber
nun gut, ein Weg wäre dieser. Auf Fehlerbehandlungen wurden
verzichtetFile.Exists(Drv.RootDirectory.ToString & „Data\game.dat“) Then
Return True
Next
Return False
MfG Alex
Aber genau das brauche ich ja.
Ich möchte, das wenn das Spiel nicht eingelegt ist,
da eine Fehlermeldung kommt.
Ich habe das jetzt mal selbst probiert, bloß es gibt da erhebliche probleme…
Next
Wenn ich hier jetzt schreibe, „form1.show“
funzt alles,
ABER
Wenn ich hier
Return False
was reinsetze, z.b. ne msgbox,
dann passiert GARNICHTS.
Wäre nett, wenn du mir es noch einmal zeigen, oder erklären würdest.
Danke
_Nevets_94_
Hallo _Nevets_94_,
Aber genau das brauche ich ja.
Ich möchte, das wenn das Spiel nicht eingelegt ist,
da eine Fehlermeldung kommt.
na und, dann schreibste halt nach dem Then die Msgbox
Oder da wo du die Funktion aufrufst
If not CheckFile() Them MsgBox „xyz“
bzw.
If not CheckFile Them MsgBox „xyz“
Wenn ich hier jetzt schreibe, „form1.show“
funzt alles,
ABER
Wenn ich hierReturn False
was reinsetze, z.b. ne msgbox,
Ich kenne 2008 nicht. Aufgrund des Codes von Alex nehme ich an daß „Return“ die Funktion beendet, d.h. wenn innerhalb der For Schleife Return ausgeführt wird kommt es gar nicht dazu daß Zeilen unterhalb der For-Schleife angesprungen werden.
Würde Return nicht die Funktion beebnden wäre der Code Blödsinn weil dann immer Fals zurück käme.
Wenn dem allen so ist wie ich ja als Laie nur vermuten kann, dann müßtest du aber so Basics wissen wenn du sagst du hast da ein Spiel programmiert.
Um zu prüfen of die IF Beduingung erfüllt wird könntest du ja sowas nehmen oder F8 wenn es das in 2008 gibt:
Private Function CheckFile() As Boolean
For Each Drv As DriveInfo In DriveInfo.GetDrives
MsgBox Drv.DriveType = DriveType.CDRom
MsgBox File.Exists(Drv.RootDirectory.ToString & "Data\game.dat")
If Drv.DriveType = DriveType.CDRom AndAlso File.Exists(Drv.RootDirectory.ToString & "Data\game.dat") Then Return True
Next
Return False
End Function
Und nimm es bitte nicht persönlich, wenn Alex und ich sich wundern, daß du diese Probleme hast. Das ist keinerlei Herabwürdigung, auch Alex wußte mal früher nicht wie er „Hello world“ am Bildschirm anzeigen lassen kann.
Dieses Wundern ist sogar eher ein Kompliment, ein Spiel selbst zu programmieren, höchstwahrsheinlich in langer Zeit und mit viel Mühen und zum Laufen zu bringen ist schon superklasse.
Und macht stolz *weiß*
Ich erinnere mich an „Vier gewinnt“ daß ich mir mal versucht habe zu programmieren. Hat viel viel Zeit gekostet, da ich ausschließlich aus Foren, Google, F1 lerne.
Und, auch wenn der Code aus meiner heutigen (Wissens-) Sicht viel zu aufwendig, umständlich ist, das spielt für mich absolut keine Rolle.
ICH hatte es geschafft das zu programmieren, nur das zählt.
Gruß
Reinhard
Boaah, du bist der beste.
Es hat einwandfrei nach deiner Option geklappt!!!
100000000000000000000000000000000000000000 mal Danke!!!
Private Function CheckFile() As Boolean
For Each Drv As DriveInfo In DriveInfo.GetDrivesIf Drv.DriveType = DriveType.CDRom AndAlso :File.Exists(Drv.RootDirectory.ToString & „Data\a31.alb“) = False Then
Me.Hide()
MsgBox(„Bitte Legen sie die CD „„Game““ ein, um dieses Spiel spielen :zu können!“, MsgBoxStyle.Exclamation, „Game.exe - Keine CD :gefunden!“)
Me.Close()
Else
Me.Show()
End If
Next
Return False
End Function
End Class
So geht es, anders leider nicht!
Und nimm es bitte nicht persönlich, wenn Alex und ich sich
wundern, daß du diese Probleme hast. Das ist keinerlei
Herabwürdigung, auch Alex wußte mal früher nicht wie er „Hello
world“ am Bildschirm anzeigen lassen kann.
geht klar
Dieses Wundern ist sogar eher ein Kompliment, ein Spiel selbst
zu programmieren, höchstwahrsheinlich in langer Zeit und mit
viel Mühen und zum Laufen zu bringen ist schon superklasse.
Und macht stolz *weiß*
Das stimmt wirklich…
Ich erinnere mich an „Vier gewinnt“ daß ich mir mal versucht
habe zu programmieren. Hat viel viel Zeit gekostet, da ich
ausschließlich aus Foren, Google, F1 lerne.
Und, auch wenn der Code aus meiner heutigen (Wissens-) Sicht
viel zu aufwendig, umständlich ist, das spielt für mich
absolut keine Rolle.
ICH hatte es geschafft das zu programmieren, nur das zählt.Gruß
Reinhard
Da hast Du Vollkommen Recht!
Danke für deine Hilfe,
Reinhard
Hallo,
File.Exists(Drv.RootDirectory.ToString & „Data\game.dat“) Then
Return True
Next
Return FalseMfG Alex
Aber genau das brauche ich ja.
Ich möchte, das wenn das Spiel nicht eingelegt ist,
da eine Fehlermeldung kommt.
Also, das kannst du doch mit der Function erreichen!
Du rufst die Funktion auf und je nachdem ob die CD mit dem File eingelegt ist, bekommst du ein True oder ein False zurück. Genau das mache dir zu nutze! Frage einfach die Funktion ab, mittels If
Ich habe das jetzt mal selbst probiert, bloß es gibt da
erhebliche probleme…
Welche Probleme gibt es denn da?
Wenn ich hier jetzt schreibe, „form1.show“
funzt alles,
Also das ist auch eine Vorgehensweise die man nicht machen sollte!
Erstelle eine Refernez von der Form und lade oder zeige dann die Form über die Referenz ab! Was ich meinte ist
Dim frm as new Form1
frm.show
ABER
Wenn ich hierReturn False
Wo hast du dies eingesetzt? In der Funktion musst und sollst du nichts weiter abändern! Maximal dort noch eine Fehlerbehandlung rein machen! ( Stichwort ist Try/Catch/Finally)
was reinsetze, z.b. ne msgbox,
dann passiert GARNICHTS.
Wäre nett, wenn du mir es noch einmal zeigen, oder erklären
würdest.
Also gut nochmals von vorne
Du startest Dein Program in zum Bsp. Form1 und wenn die Datei xyz auf der CD Rom vorhanden ist, soll Form2 geladen werden.
Imports System.IO
Public Class Form1
Private Sub Form1\_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Drv As String = Nothing
If CheckFile(Drv) Then
Dim Frm As New Form2
Frm.ShowDialog()
Else
MsgBox("Es wurde nicht die entsprechende CD Rom gefunden!", MsgBoxStyle.OkOnly, "CD nicht gefunden") 'Wir geben eine Msgbox aus
End
End If
End Sub
Private Function CheckFile(ByRef Drv As String) As Boolean
Try
For Each D As DriveInfo In DriveInfo.GetDrives
If D.DriveType = DriveType.CDRom AndAlso File.Exists(D.RootDirectory.ToString & "Data\Game.dat") Then
Drv = D.RootDirectory.ToString
Return True
End If
Next
Return False
Catch ex As Exception
Return False
End Try
End Function
End Class
So nun fragst Du dich, ja toll und was passiert hier nun. Also nun gut
gehen wir Zeile für Zeile durch
Imports System.IO
Als erstes importieren wir den Namensspace System.Io. Das bedeutet wir können auf die Klassen und Member die in System.IO stecken zugreifen ohne sie speziell anzugeben
Public Class Form1
Die Standardimplementierung der Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Wir nutzen das Load Event der Form1 und setzen da an. Zu erkennen an der Handles Klausel
Dim Drv As String = Nothing
Wir declarieren eine Variable mit dem Namen DRV und sagen ihr das sie vom Typ String (Zeichenfolge ist) und derzeit den Wert von Nothing hat
If CheckFile(Drv) Then
Wir rufen nun die Funktion Checkfile auf und übergeben ihr als Parameter die Definierte Variable DRV welche zur Zeit den Wertt Nothing hat. Eine Abfrage via
If Function =True then ist das selbe wir If Function then
Also fragen wir hier ab, ob die Funktion True liefert.
Dim Frm As New Form2
Wir erstellen eine Referenz auf Form2
Du hast dadurch den Vorteil, das wenn du Eigenschaften in Form2
implementierst, du diese nun setzen könntest etc.
Auch hast du der Funktion doch den Parameter DRV übergeben, welcher in der Funktion als Byref behandelt wird, was wiederrum bedeutet das die Funktion den Parameter veraendern kann. So hast du nun in DRV das Rootverzeichnis der CD. Nun falls du ihn brauchst
Frm.ShowDialog()
und zeigen Sie als Dialog an!
Else
Wenn die Funktion nicht True ist, SONDERN False dann
MsgBox(„Es wurde nicht die entsprechende CD Rom gefunden!“, MsgBoxStyle.OkOnly, „CD nicht gefunden“) 'Wir geben eine Msgbox aus
Wir zeigen eine Meldung an, das die CD nicht eingelegt ist.
End
Und beenden das ganze
End If
Wir beenden die IF Bedingung
End Sub
Und beenden die Procedure
Nun zur Funktion
Private Function CheckFile(ByRef Drv As String) As Boolean
Wir definieren die Funktion. Als Rückgabewert wird ein Typ Boolean geliefert, welcher True ist wenn die Datei existiert und False wenn sie nbicht existiert. Als Parameter nimmt sie DRV von Typ String(Zeichenfolge() entgegen. Durch Byref übergibst du sie als Referenz und kannst sie Beliebig ändern
Try
Wir schalten die Fehlerbehandlung ein
For Each D As DriveInfo In DriveInfo.GetDrives
Wir declarieren D als Driveinfo. Driveinfo ist eine Klasse welche uns Eigenschaften und Methoden für die Laufwerke bereitsstellt. In der Schleife durchlaufen wir nun alle installierten logischen Laufwerke. Das geschieht durch Aufruf der Methode GetDrives.
If D.DriveType = DriveType.CDRom AndAlso
File.Exists(D.RootDirectory.ToString & „Data\Game.dat“) Then
Hier passiert nun folgendes …
In D stehen nun die Laufwerksinformationen. Wir fragen nun ab ob der Laufwerkstyp eine CDROM ist und ob es im Pfad Data die Datei Game.dat gibt. Das geschieht mittels einer Kurzschlussauswertung. Was das wiederrum ist, steht bei Reinhards antwort Lese Dir das dazu mal bitte durch. Ist eine nützliche Sache.
Die Eigenschaft Rootdirectory liefert uns das Rootdirectory ( z.Bsp. F:). File.Exists(Pfad) ruft die Klasse File im Namensspace System.IO auf und dort die Methode Exists. Diese Funktion überprüft ob eine Datei (Pfad) vorhanden ist und gibt True zurück falls sie existiert. False wenn nicht.
Also haben wir in der Zeile eigentlich nichts anderes gemacht, als
WENN LaufwerksTYP=CDROM und DATEI Existiert DANN
Drv = D.RootDirectory.ToString
WIr ändern nun den Parameter DRV ab und weisen ihm das Rootdirectory zu. Da Rootdirectory aber vom Typ DriveInfo glaub ist und nicht vom Typ String, rufen wir zusaetzlich die Methode ToString auf, die uns einen String daraus macht.
Return True
Durch Die Anweisung „Return“ wird die Funktion verlassen
und durch die Angabe von True nimmt die Funktion den Wert True an
End If
Wir beenden die IF Abfrage
Next
Wir springen wieder zum FOR bis keine Laufwerke mehr gefunden werden
Return False
Dadurch wir hier angekommen sind, wurde kein Laufwerk gefunden, was den Kriterien entspricht, denn sonst wäre die IF Bedingung erfüllt und durch Return True die Funktion schon längst verlassen worden. Also verlassen wir hier die Funktion und weisen der Funktion den Wert False zu.
Catch ex As Exception
Falls ein Fehler auftritt, wird der Ablauf in den Catch Zzweig verlegt.
Hier kannst du nun über EX auf deine Fehler reagieren.
Return False
Wir verlassen die Funktion mit dem Wert False
End Try
Und beenden die Fehlerbehandlung
End Function
'nun noch die Function beenden
End Class
Und letztendlich die Klasse ( Form)
So ich hoffe du hast nun verstanden, was der Source macht und kannst ihn entsprechend anpassen. Falls du noch fragen hast, so einfach her damit
Danke
_Nevets_94_
MfG Alex
Hallo Reinhard,
na und, dann schreibste halt nach dem Then die Msgbox
Oder da wo du die Funktion aufrufst
If not CheckFile() Them MsgBox „xyz“
bzw.
If not CheckFile Them MsgBox „xyz“
In der Function nichts ändern. Sondern wier du schon geschrieben hast, beim laden der Form
If Checkfile ..... then
else
end if
Ich kenne 2008 nicht. Aufgrund des Codes von Alex nehme ich an
daß „Return“ die Funktion beendet, d.h. wenn innerhalb der For
Schleife Return ausgeführt wird kommt es gar nicht dazu daß
Zeilen unterhalb der For-Schleife angesprungen werden.
Richtig. Return ist so etwas wie Exit Function in VB6
Der Unterschied ist das das Return True die Function mit dem Wert True verlassen wird. Return False = Verlaesst die Function mit dem Wert False. Also immer fein Return WERT
Würde Return nicht die Funktion beebnden wäre der Code
Blödsinn weil dann immer Fals zurück käme.
Richtig!
Wenn dem allen so ist wie ich ja als Laie nur vermuten kann,
dann müßtest du aber so Basics wissen wenn du sagst du hast da
ein Spiel programmiert.Um zu prüfen of die IF Beduingung erfüllt wird könntest du ja
sowas nehmen oder F8 wenn es das in 2008 gibt:
F8 gibt es in VB10 immernoch
Private Function CheckFile() As Boolean
For Each Drv As DriveInfo In DriveInfo.GetDrives
MsgBox Drv.DriveType = DriveType.CDRom
MsgBox File.Exists(Drv.RootDirectory.ToString &
„Data\game.dat“)
If Drv.DriveType = DriveType.CDRom AndAlso
File.Exists(Drv.RootDirectory.ToString & „Data\game.dat“) Then
Return True
Next
Return False
End Function
Nein Quatsch. Die Funktion nicht ändern! Einfach die Function aufrufen und das Resultat auswerten
Und nimm es bitte nicht persönlich, wenn Alex und ich sich
wundern, daß du diese Probleme hast. Das ist keinerlei
Herabwürdigung, auch Alex wußte mal früher nicht wie er „Hello
world“ am Bildschirm anzeigen lassen kann.Dieses Wundern ist sogar eher ein Kompliment, ein Spiel selbst
zu programmieren, höchstwahrsheinlich in langer Zeit und mit
viel Mühen und zum Laufen zu bringen ist schon superklasse.
Und macht stolz *weiß*Ich erinnere mich an „Vier gewinnt“ daß ich mir mal versucht
habe zu programmieren. Hat viel viel Zeit gekostet, da ich
ausschließlich aus Foren, Google, F1 lerne.
Und, auch wenn der Code aus meiner heutigen (Wissens-) Sicht
viel zu aufwendig, umständlich ist, das spielt für mich
absolut keine Rolle.
ICH hatte es geschafft das zu programmieren, nur das zählt.Gruß
Reinhard
MfG Alex
Hallo _Nevets_94_,
So geht es, anders leider nicht!
weiß ich nicht. Benutze aber bitte wenn du hier Code zeigst den Pre-Tag, wird unterhalb des Eingabefensters erläutert,
Dann sieht der Code so aus:
Private Function CheckFile() As Boolean
For Each Drv As DriveInfo In DriveInfo.GetDrives
If Drv.DriveType = DriveType.CDRom AndAlso :File.Exists(Drv.RootDirectory.ToString & "Data\a31.alb") = False Then
Me.Hide()
MsgBox("Bitte Legen sie die CD ""Game"" ein, um dieses Spiel spielen :zu können!", MsgBoxStyle.Exclamation, "Game.exe - Keine CD :gefunden!")
Me.Close()
Else
Me.Show()
End If
Next
Return False
End Function
End Class
Dieses Wundern ist sogar eher ein Kompliment, ein Spiel selbst
zu programmieren, höchstwahrsheinlich in langer Zeit und mit
viel Mühen und zum Laufen zu bringen ist schon superklasse.
Und macht stolz *weiß*Das stimmt wirklich…
Ic glaub dir das, einfach um zu lernen habe ich schon mehrmals „Dinge“ programmiert, die es schon tausenfach gibt, garantiert auch in besserer Programmierung, das ist mir wurscht, Hauptsache ich krieg das irgendwie hin und es läuft.
Würde ich die dafür aufgewendete Zeit nur so umrechnen daß ich in der Zeit auch nur für 6–10€ Zeitungen ausgetragen hätte, ich hätte mir da fertige Programme mehrfach kaufen können.
ABER, ich hätte nix gelernt ud das ist/war ja der Zweck der Übung.
Und zum Code,
eine Funktion macht ja nur Sinn wenn du den Rückgabewert auswertest.
Jetzt geschieht aber die Auswertung schon in der Funktion.
Also der Warnhinweis wird angezeigt oder halt nicht.
Wozu also noch das Return False?
Da langt doch eine Sub, die du mit Call o.ä. in .Net aufrufst.
Gruß
Reinhard
So geht es, anders leider nicht!
Doch. Wege gibt es da viele. Nur können wir nicht hellsehen.
Du kannst Deine Anwendung aus einem Modul heraus starten. Dort kannst du prüfen ob die CD eingelegt ist und wenn dann erst Form1 anzeigen
MfG Alex
Hallo Reinhard,
bei anderem .Net-Code wo ich eh nix verstehe hätte ich nicht
nachgefragt, aber dies hier interessiert mich dann doch als
Laie.Zum einen, mein Englisch ist sowieso lausig, von mir aus
kannste mir ja locker erzählen daß AndAlso ein reinrassiges
engl. Wort ist.
Ich sah es halt noch nie und „Also“ kommt mir deutsch vor
*Schulterzuck".
Ich frage wegen etwas anderem, hat da ein normales „And“ nicht
ausgereicht?
Ohje wie erkläre ich Dir das :s
Also es gibt AND, OR etc. Dazu gibt es noch ANDALSO und ORELSE
ANDALSO und ORELSE sind sogenannte Kurzschlußauswertungen. Vom Prinzip her ist es nichts weiter wie ein AND oder ein OR. Nur hast du besondere Vorteile
Um ein AND oder ein OR einzusetzen brauchst du ja 2 Bedingungen die du „vergleichst“
Nehmen wir mal ein Bsp.
Dim Regenschirmbenutzen as Boolean
Regenschirmbenutzen=Esregnet or ArgBewölkt
Wann wird hier der Regenschirm benutzt ? Wenn es regnet oder es stark bewölkt ist.
Eine Kurzschlußauswertung prüft den zweiten Teil nur wenn der erste Teil erfüllt ist ( Bei ANDALSO) oder wenn er nicht erfüllt ist (Bei ORELSE)
Sprich wenn es regnen würde, wäre Esregnet =True und somit eine Bedingung erfüllt. Die zweite Abfrage (Argbewölkt) würde garnicht mehr abgefragt werden, da Regenschirmbenutzen eh schon True ist, egal was Argbewölkt ist!
Welchen Sinn ergibt das alles. Hmm
schau mal warum soll das Proggi prüfen ob es argbewölkt ist, wenn es schon regnet und er eh den Regenschirm benutzen soll
Aber mal eben schnell ein praktisches Bsp. Nehmen wir uns mal irgendein Steuerelement. Dieses hat die Tag Eigenschaft. Wenn du sie nicht setzt ist sie Nothing oder hat halt einen Wert. Nun willst du diese Eigenschaft prüfen. Versuche dies mal mit
If Steuerelement.Tag is Nothing OR Steuerelement.Tag.Tostring="1" THEN
Du möchtest halt prüfen ob der Inhalt von Tag =1 ist oder nothing ist.
Unter .Net schmiert dir das Proggi akurat ab, da die ToString Methode (Sie macht aus dem Object ein String) kein Nothing akzeptiert. Sprich du läufst da in eine Exeption!
Anders ist es wenn du es wiefolgt schreibst
If Steuerelement.Tag is Nothing ORELSE Steuerelement.Tag.Tostring="1" THEN
Die Tag Eigenschaft ist nun Nothing, was bedeutet die erste Bedingung ist erfüllt. Die zweote prüfung findet garnicht mehr statt! Das Programm läuft in keine Exception
Zu Dem Bsp. vom Fragesteller
If D.DriveType = DriveType.CDRom AndAlso File.Exists(D.RootDirectory.ToString & "Data\Game.dat") Then
Wenn der Drivetyp = CDROM ist (true) dann wird überprüft ob das File existiert. Da bei einem AND beide Bedingungen True sein müssen , kann die Abfrage definitiv kein True mehr sein. Also wird der Zweite Teil garnicht geprüft, was Dir Zeitersparniss bringt Handelt es sich jedoch vom Typ her um ein CDROM ist die erste Bedingung True und nun wird die zweite Bedingung geprüft!
Wie du siehst, auf den ersten Blick Bullshit, aber auf dem zweiten Blick eine sehr nützliche Methode Welche man schnell zu schaetzen lernt und nicht mehr missen möchte!
Eine kurze Bündige Erklärung dafür wäre:
Eine Methode zur Auswertung Boolescher Ausdrücke, bei der die Auswertung nur so weit durchgeführt wird, bis das Ergebnis feststeht
Alles klar?
MfG Alex
Gruß
Reinhard
Hi Alex,
Alles klar?
mir nicht.
ich kann mir keine Bedingung vorstellen, unter der es anders wäre.
Warum verhält sich And nicht schon wie AndAlso? Wenn es für die weitere Prüfung keinen Grund gibt, braucht man das so doch nicht und auch nicht zwei Befehle?
Gruß Rainer
Hallo Rainer,
ein schönes Bsp. dazu hatte ich ja schon geschrieben :s
Pass auf. In .Net sind alles Objecte. Objecte können den Wert Nothing annehmen. Fast alle Steuerelemente haben eine Eigenschaft Tag wie unter VB5 oder 6. Diese Eigenschaft ist ein Object. Es heisst sie kann den Wert Nothing annehmen! Jedes Object hat desweiteren die ToString Methode! Die ToString Methode gibt den Object Namen zurück oder je nachdem ob die ToString Methode überschrieben ist, etwas anderes. Aber halt immer ein String!
Nun stelle Dir mal folgendes Szenario vor!
Ein Bild kann der User in eine PictureBox laden! Wenn er eines geladen hat, so setzt du die Tag Eigenschaft auf 1. Hat er keines geladen und es wird ein Standardbild geladen so setzt du der Tag Eigenschaft den Wert 0!
Nun klickt der User auf das Bild und du möchtest dies in einer separaten Form anzeigen, aber nur wenn der User ein Bild geladen hat! Ergo prüfst du die Eigenschaft Tag auf 0 oder 1! Es kann aber auch vorkommen das sie Nothing ist! Wenn der Wert Nothing ist und du setzt die ToString darauf an, so läufst du in eine Exception (Fehler). Also musst du zuerst die Tag Eigenschaft auf Nothing prüfen und wenn sie nicht Nothing ist, dann halt die andere Prüfung auf den Wert.
Wie würdest du dies in VB anstellen?
Desweiteren, zur Problematik des Fragestellers. Er soll nur schauen wenn der Laufwerkstyp ein CDROM ist. Du durchläufst alle logischen Laufwerke. Warum sollst du nun schauen auf JEDEM Laufwerk ob die Datei da ist, wenn schon nach der ersten Prüfung klar ist, das dies nicht der Fall ist! ( Laufwerk Kein CD ROM) Dann ist dies nur ein Performance Verlust.
Wie würdest du es denn unter VB anstellen? Das würde auch nur mit 2 Abfragen funktionieren! Oder halt jedesmal eine Prüfung, was wiederrum schlechte Performance bedeutet.
MfG Alex
Hi Alex,
ich meine den umgekehrten Fall.
Wann kann es sinnvoll sein, die zweite Bedingung noch zu prüfen, wenn das Ergebnis schon feststeht? Das ergibt doch nie einen Sinn.
Gruß Rainer
Hallo Rainer,
ich meine den umgekehrten Fall.
Wann kann es sinnvoll sein, die zweite Bedingung noch zu
prüfen, wenn das Ergebnis schon feststeht? Das ergibt doch nie
einen Sinn.
Genau das macht doch die Kurzschlußauswertung!!!
ORELSE -\> Der zweite Teil wird nur geprüft wenn der erste Teil False ist
ANDALSO -\> Der zweite Teil wird nur geprüft wenn der erste Teil True ist!
Es wird halt nur so weit geprüft, bis das Ergebnis durch die anderen Teile nicht mehr veraendert werden kann!
If a=1 orelse B=2 then ...
Der zweite Teil (B=2) wird nur geprüft wenn a1 ist.
Ist A=1, dann wird der zweite Teil nicht geprüft
If a=1 andalso B=2 then
Der zweite Teil (B=2) wird nur geprüft wenn a=1 ist
Ist a1 dann wird der zweite Teil nicht geprüft!
Anders ist es wie folgt
If a=1 or b=2 then....
if a=1 and b=2 then
'Egal welche Werte a und b haben. In beiden Faellen würden beide Bedingungen abgefragt werden! (Egal ob das Ergebnis schon bei der ersten Abfrage fest steht)Und genau das ist der Unterschied zwischen AND und ANDALSO und OR und ORELSE!
MfG Alex
Hi Alex,
Genau das macht doch die Kurzschlußauswertung!!!
ORELSE -> Der zweite Teil wird nur geprüft wenn der erste Teil
False ist
Das habe ich verstanden, das war nicht die Frage.
Was ORELSE tut ist klar, daß es sinnvoll ist, ist auch klar.
Aber OR tut das so nicht. Wozu soll das gut sein?
Der Sinn von ORELSE ist mir klar. Aber nicht der von OR.
Gruß Rainer