gleich 2 fragen bezüglich vb (MsgBox.style...)

  • hi leute,

    ich bin gerade dabei, für die schule ein spiel zu programmieren (deswegen für die schule, weil es ein wirtschaftsspiel ist ;-))... allerdings hab ich da zwei oder drei kleinere probleme.

    1. ich hab bei einer MsgBox folgenden code:

    Code
    antw = MsgBox("Wollen Sie wirklich alles zurücksetzen?" & Chr(13) & Chr(13) & "Alle Daten werden verloren gehen!", MsgBoxStyle.OkCancel & MsgBoxStyle.Information, "Zurücksetzen?")

    wenn ich das programm nun ausführe, und den button wo die MsgBox sich befindet anklicke, bekommm ich nur eben den dialog, aber nur einen OK-Button. bei einer anderen MsgBox funktioniert es so, keine ahnung warum:

    Code
    antw = MsgBox("Wollen Sie wirklich beenden? Alle Fortschritte werden verloren gehen!", MsgBoxStyle.Question & MsgBoxStyle.OkCancel, "Beenden")

    2. ich habe alle ergebnisse und sonstige wichtige daten in mehrere arrays gespeichert. wie kann ich jetzt diese arrays in einem neuen formular anzeigen lassen? bzw dass er automatisch das formular mit den array-inhalten ausfüllt, ohne dass man auf einen button oder so klicken muss..

    also ich hab mir das bereits so versucht:

    Code
    im hauptformular:
    Public periodengewinn(12) As Single
    
    
    und dann hab ich im ergebnis-formular:
    
    
    label1.Text = periodengewinn(i) & " €"

    (i incrementiere ich immer, und lass es dann in einem label ausgeben)

    ist dann das array mit public dimensionieren auch in anderen formularen verfügbar? kann ich das formular dann gleich ausfüllen lassen?

    ich hoffe ihr könnt mir helfen ;)

    achja: ich verwende Microsoft Visual Basic 2005 Express Edition

    danke schon im voraus, mfg SeekeR

    Gehe immer vom guten Willen Anderer aus!

  • verwendest du vb 6 oder .net ?

    evtl hängts mit den chars zusammen. machs mal so

    Code
    text = "Wollen Sie wirklich alles zurücksetzen?" & Chr(13) & Chr(13) & "Alle Daten werden verloren gehen!"
    antw = MsgBox(text, MsgBoxStyle.OkCancel & MsgBoxStyle.Information, "Zurücksetzen?")
  • .net verwende ich, ziemlich sicher^^ ..

    also cih hab das jetzt so umgeändert wie du es gesat hast:

    Code
    frage = "Wollen Sie wirklich alles zurücksetzen?" & Chr(13) & Chr(13) & "Alle Daten werden verloren gehen!"
            antw = MsgBox(frage, MsgBoxStyle.OkCancel & MsgBoxStyle.Question, "Zurücksetzen?")

    es ist noch das selbe wie vorher.. weißt du vl auch eine lösung für meine weite frage? das mit dem array auf einen anderen formular wiedergeben?

    mfg

    Gehe immer vom guten Willen Anderer aus!

  • also mit .net hab ich keine erfahrung.
    kenn mich nur mit vb 6 aus...

    aber normalerweise sollte der array verfügbar sein wenn
    du ihn als public definierst. evtl kannst auch mal n modul
    einfügen und dort des teil definieren... is sauberer


    zu dem anderen nochmal. versuch mal
    a) "zurücksetzen?" in "test" umbenennen -> probleme mit umlaute
    b) den inhaltstext mal durch"test" ersetzen -> probleme mit umbrüchen..

    mir is von vb6 da zwar kein konfligt bekannt, aber irgend wo muss da hund ja liegen.

  • hmm also das mit der message box hab ich probiert,

    Code
    antw = MsgBox("test", MsgBoxStyle.OkCancel & MsgBoxStyle.Question, "test")

    es geht noch immer nicht... aber: nur ein argument geht schon, also nur Question zum beispiel

    Gehe immer vom guten Willen Anderer aus!

  • Salut,

    @1: Du verknüpfst die Flags für MsgBox mit dem & Operator, statt dessen solltest du | (bzw. Or) verwenden. Ich weiß nicht, inwieweit Logik-Kenntnisse vorhanden sind, deshalb werde ich dich jetzt nicht mit einer ausführlichen Begründung erschlagen.

    Umbrüche in Strings solltest du vermeiden, da sollte dir der Compiler aber auch Fehlermeldungen um die Ohren hauen.

    @2: Du könntest eine statische Klasse erstellen und da das Array reinpacken, dann ist es aus allen anderen Klassen verfügbar (via KlassenName.ArrayName). Module gibt's in VB2005 nur noch für die alten VB?-Programmierer. Ist im Endeffekt ja auch nichts anderes als eine statische Klasse.


    Stefan

  • vbtricks, danke erstmal. also das mit der message box funktioniert jetzt, mit | ging es nicht, aber mit or. wenn du willst kannst du mir gerne eine ausführliche Begründung schreiben, ich interessiere mich dafür.

    zum 2ten.. ich hab das jetzt mal mit so gemacht, dass ich in beiden formularen das array mit public dimensioniert habe. zum testen bin ich leider noch nciht gekommen, weil mir noch ein paar logische fehler aufgefallen sind. so in ner stunde bin ich wieder zurück, dann kann ich das testen..

    mfg SeekeR

    Gehe immer vom guten Willen Anderer aus!

  • Salut,

    @1. http://www.webmasterpro.de/coding/article/php-bit-flags.html beschreibt es ganz gut (ist zwar für PHP, aber bei VB funktioniert das nicht anders). Die Werte der Flags findest du hier: http://msdn2.microsoft.com/en-us/library/139z2azd(VS.80).aspx )
    Du siehst, dass die ersten sechs Konstanten gerade die unteren drei Bits sind. Da sich die einzelnen Konstanten jeweils in ihrem Einsatzzweck widersprechen, kannst du sie nicht kombinieren, weshalb nicht jede Konstante eine eigene Bit-Position bekommen hat, es wird also komprimiert.
    Die nächsten vier Konstanten bilden wieder eine Gruppe usw. D.h., wenn du die einzelnen Flags veroderst, kannst du später aus dem Ergebnis wieder herleiten, welche Flags ursprünglich gesetzt wurden.

    Also z.B. dein Code:

    OKCancel = 1 = 00000001 (im Binärsystem)
    Question = 32 = 00100000

    Kombination mit Oder
    00000001
    00100000
    -----------
    00100001 (Ergebnis)

    Intern macht die MsgBox dann den Umkehrschluss, sie prüft für alle möglichen Flags, ob sie gesetzt sind, indem sie den Und-Operator verwendet:

    Prüfen auf Question: Kombination mit Und
    00100001 (der von dir übergebene Wert, das veroderte Ergebnis oben)
    00100000 (Question)
    -----------
    00100000 = Question => Question gesetzt


    Prüfen auf Exclamation: Kombination mit Und
    00100001
    00110000 (Exclamation)
    -----------
    00100000 != Exclamation => Exclamation nicht gesetzt


    Stefan

    Edit Warum lässt du zwei Buttons anzeigen, wenn du das Ergebnis nicht abfragst? Passiert doch dann dasselbe, egal welchen Button du anklickst.

  • wow also danke mal für die ausführliche erklärung.. ich schätz mal, so ähnlich wird das dann in allen anderen programmier-sprachen auch sein.

    natürlich mach ich danach eine abfrage ;-)... eine frage ob man zurücksetzen will ohne abbrechen macht nur begrenzt sinn

    Code
    If antw = vbOK Then
    Anweisungen....
    End If

    wenn das programm durch ist, möchte ich dann die ergebnisse auf einem neuen formular anzeigen lassen. wie mache ich das, dass es schon beim (zB) ergebnis_form.Show() befehl die ergebnisse eintragen kann?

    mfg

    Gehe immer vom guten Willen Anderer aus!

  • Salut,

    wie lädst du die Form konkret? VB2005 erlaubt da wieder die VB6-Notation die ich persönlich einen Rückschritt finde. "Richtig" ginge das so (Pseudo-Code):

    Code
    Dim ErgebnisFormInstanz As New ErgebnisForm()
    ErgebnisFormInstanz.WertZuweisen(Wert)
    ErgebnisFormInstanz.Show()

    Stefan

  • hmm, wärst du so nett und erklärst mir das genauer? im moment hab ich eben im hauptformular die zwei arrays so dimensioniert:

    Code
    Public periodengewinn(12) As Single
    Public menge_array(12) As Single

    und dann, wenn ein jahr fertig ist so in der art:

    Code
    ergebnis_form.Show()

    hab ich das dann so in der art?:

    Code
    Dim ergebnis_formInstanz As New ergebnis_form()
    ergebnis_formInstanz.periodengewinn() 
    ergebnis_formInstanz.menge_array()
    ergebnis_formInstanz.Show()

    ich bin leider noch ein ziemlicher Anfänger ;)

    Gehe immer vom guten Willen Anderer aus!

  • Salut,

    Möglichkeit 1, in eine statische Klasse

    Code
    Public Static Class StatischeEigenschaften ' evtl. auch shared statt static
      Public Static periodengewinn(12) as single
      Public Static menge_array(12) as single
    end class


    Die Arrays dann nicht mehr in der Form deklarieren und der Zugriff geht wie folgt

    Code
    StatischeEigenschaften.periodengewinn(0) = 0.9999


    Das funktioniert dann aus allen Forms.

    Möglichkeit 2, in beiden Forms deklarieren.

    Code
    Public Class ergebnis_form
      ' ...
      Public periodengewinn(12) As Single
      Public menge_array(12) As Single
    Code
    Dim ergebnis_formInstanz As New ergebnis_form()
    ergebnis_formInstanz.periodengewinn = Me.periodengewinn
    ergebnis_formInstanz.menge_array = Me.menge_array
    ergebnis_formInstanz.Show()


    Evtl. musst du die auch Eintrag für Eintrag kopieren, da bin ich mir nicht sicher.


    Stefan

  • wow danke.. also ich hab es mal mit der 2ten möglichkeit probiert, funktioniert perfekt^^

    ich hätte noch eine dritte frage, wenn es nichts ausmacht ;)

    also per zufallsgenerator lass ich ein wetter generieren, das mit schönen gifs illustriert werden soll. jetzt hab ich ein feld in meinen hauptform, dass sich PictureBox1 nennt. weiters hab ich dann eben die drei gifs unter den projectresources drinnen. jetzt möchte cih nach jeder periode das wetter-bild verändern lassen. mein bisheriger code:

    Code
    If weather = 1 Then
                PictureBox1.Load = Sonne.gif
            ElseIf weather = 2 Then
                PictureBox1.Load = wind.gif
            ElseIf weather = 3 Then
                PictureBox1.Load = regen.gif
    End If

    edit: mit "" hab ich es auch schon probiert, ebenfalls mit "resources/Sonne.gif" usw...

    Gehe immer vom guten Willen Anderer aus!

  • Salut,

    hm, müsste wie folgt funktionieren:

    Code
    Dim thisExe As System.Reflection.Assembly
            thisExe = System.Reflection.Assembly.GetExecutingAssembly()
    
    
    'GetManifestResourceStream("NamedeinerApplikation.BildName.Typ")
            Dim file As System.IO.Stream = _
                thisExe.GetManifestResourceStream("WindowsApplication2.logo.gif")
    
    
            Me.PictureBox1.Image = Image.FromStream(file)

    Stefan

  • hmmm also ich hab jetzt folgenden code:

    wenn ich bei GetManifestResourceStream("Wirtschaftsspiel.Regen.gif") das " ' " entferne, dann schreibt er mir:
    Fehler 1 Der Name "GetManifestResourceStream" wurde nicht deklariert.

    Das Programm hängt sich dann mit dieser Fehlermeldung auf:

    Eine Ausnahme (erste Chance) des Typs "System.ArgumentException" ist in System.Drawing.dll aufgetreten.

    Gehe immer vom guten Willen Anderer aus!

  • Salut,

    musste erst mal VB2008 installieren, um das zu testen. Der obige Code gibt in der Tat eine Exception. Besser geht's so:

    Code
    Select Case weather
                Case 1
                    Me.PictureBox1.Image = Wirtschaftsspiel.My.Resources.Sonne
                Case 2
                    Me.PictureBox1.Image = Wirtschaftsspiel.My.Resources.Wind
                Case 3
                    Me.PictureBox1.Image = Wirtschaftsspiel.My.Resources.Regen
            End Select

    Stefan

  • wow also danke erstmal, dass du extra vb2008 installiert hast. ich selber verwende 2005, hier dürfte es minimale unterschiede geben. er schreibt mir nämlich:

    "My" ist kein Member von "System.Windows.Forms.NotifyIcon".

    Aber ich glaube, ich lade mir einfach das neuere 2008 herunter, dass es dann geht. allerdings hab ich teilweise schon jetzt das problem, dass man mindestens .NET Framework 2.0.3 (glaub ich) braucht, um das programm zu starten. braucht man dann, mit vb2008, ein noch höheres .NET Framework?

    mfg SeekeR

    Gehe immer vom guten Willen Anderer aus!

  • hi, ich lade mir eh gerade das 2008 herunter, hab auch grad gesehen, dass es nun version 3.5 ist.

    wie meinst du erstellt? ich hab Visual Basic gestartet, bin auf neues projekt gegangen, hab Windows Anwendung ausgewählt und halt dann die forms erstellt usw ;-)..

    Gehe immer vom guten Willen Anderer aus!