Spiel nur mit CD Soielen

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
verzichtet

File.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… :frowning:

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 hier

Return 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.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

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 :smile:

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… :smiley:

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!:slight_smile:

Danke für deine Hilfe,
Reinhard

Hallo,

File.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.

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… :frowning:

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 hier

Return 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 :smile:

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 :smile:

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 :smile:

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 :smile:

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 :smile:

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 :smile: 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 :smile:

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 :smile:

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 :smile:

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 :smile:

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… :smiley:

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 :smile:

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 :smile:

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 :wink:

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 :smile:

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 :smile: 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 :wink: 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. :smile:

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