meine anfänge - warum klappts nicht !? :-(

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
michel51
Beiträge: 84
Registriert: 01.11.2005 20:00
Wohnort: Dornhan-Weiden

Beitrag von michel51 »

whitelion hat geschrieben:ok, danke das geht so weit, allerdings hab ich noch eine verständnisfrage...
wenn ich result ganz weg lassen, also so:

Code: Alles auswählen

;simple messageboxa

a$ = "Die Antwort lautet:"

MessageRequester("Titel", "Bitte machen Sie Ihre Eingabe:", #PB_MessageRequester_YesNo)
If #PB_MessageRequester_Yes       ; Ja-Schalter wurde gedrückt
    b$ = "Ja"
ElseIf #PB_MessageRequester_No       ; Nein-Schalter wurde gedrückt
    b$ = "Nein"   
EndIf
    MessageRequester("Ergebnis", a$+b$ , #PB_MessageRequester_Ok)
End  
bekomme ich als antowort immer "ja". woran liegt das ?
ich bin möchte mein programm ja nicht unnötig verschachtel, deshalb benötige ich result eigentlich gar nicht...
Hier mal deinen Code korrigiert und erweitert.

Code: Alles auswählen

;simple messageboxa

a$ = "Die Antwort lautet: "

result = MessageRequester("Titel", "Bitte machen Sie Ihre Eingabe:", #PB_MessageRequester_YesNoCancel)
If result = #PB_MessageRequester_Yes       ; Ja-Schalter wurde gedrückt
    b$ = "Ja"
ElseIf result = #PB_MessageRequester_No       ; Nein-Schalter wurde gedrückt
    b$ = "Nein"   
Else
   b$ = "Abbruch!"    
EndIf
    MessageRequester("Ergebnis", a$+b$ , #PB_MessageRequester_Ok)
End  
Wie schon gesagt, musst du das Ergebnis des MessageRequesters vergleichen mit den entsprechenden Werten, sonst funktioniert die If-Abfrage nicht.
Ich denke, so wirde es deutlich :-)
michel51

Mac OS X Snow Leopard (10.6.8 ) Intel
PureBasic V 5.11(X64), V 5.21(x64)

Zum Lernen ist niemand zu alt.
Riacon
Beiträge: 61
Registriert: 21.01.2008 09:40

Beitrag von Riacon »

If #PB_MessageRequester_Yes ; Ja-Schalter wurde gedrückt

das problem dürfte folgendes mißverständnis sein:

#PB_MessageRequester_Yes bedeutet eben NICHT, daß der ja-schalter gedrückt wurde, sondern ist nichts weiter als eine (pb eigene) konstante mit einem bestimmten wert. dieser wert ist immer derselbe und ändert sich nie. deswegen ist diese abfrage immer wahr.

FALLS MessageRequester(...) auf gerufen wird und der benutzer ja/nein drückt, DANN gibt der messagerequester einen bestimmten wert als ergebnis zurück.
bei ja ist dieses ergebnis = dem wert der konstante #PB_MessageRequester_Yes
bei nein ist dieses ergebnis = dem wert der konstante #PB_MessageRequester_No

wenn du wissen willst ob ja oder nein, mußt du überprüfen welcher konstante das ergebnis gleicht und nicht ob irgendeine konstante einen wert hat. den hat sie ja immer.

das scheint auf den ersten blick umständlich gemacht, aber bei ein paar hundert solchen werten ist das viel übersichtlicher, als wenn man statt dessen mit zahlen hantieren würde
pb 4.51 win7 64
whitelion
Beiträge: 46
Registriert: 05.05.2008 18:16
Wohnort: Celle
Kontaktdaten:

Beitrag von whitelion »

ok, danke für die antworten ...... ich habe immer gedacht, dass #PB_MessageRequester_Yes / #PB_MessageRequester_No nach if nur einen wert bekommt, wenn auch ja oder nein gewählt wurde.
If prueft ob der Ausdruck wahr ist oder nicht. Da #PB_MessageRequester_Yes
einen Wert ungleich 0 hat, ist dieser Ausdruck immer wahr. Da das aber keinen
Sinn macht, musst du eben mit Result vergleichen.
das klingt sehr logisch, nur stelle ich mir noch die kleine frage: warum hat #PB_MessageRequester_Yes denn einen wert, wenn ich NICHT ja gedrückt habe und wie ist dieser wert ?

:-)

sorry dass ich mich so schwer tute, aber ich denke, wenn ich solche grundlagen nicht zu 100% im ff kann, dann wird ´s nix.

ich fand das mit dem debug ganz gut, ... könnte man damit meine frage nach dem wert beantworten ?
If MessageRequester("Frage", "Korekt?", #PB_MessageRequester_YesNo) = #IDYES
Debug "Ja"
Else
Debug "Nein"
EndIf
ist #IDYES die antwort auf meine vorherige frage ? - falls ja, wie könnte ich den wert von #IDYES auslesen, damit ich mal sehen kann welchen wert es bekommt, wenn es selektiert wurde und wenn nicht.
...das leben ist wie ein schlechtes adventure-game, aber die grafik ist verdammt geil!
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Da hast du wohl etwas missverstanden, das # zeigt das es sich hier um eine
Konstante handelt. Eine Konstante ist ein fester Wert der, nach dem der Wert
der Konstante zugewiesen wurde, nicht mehr geaendert werden kann.
Benutzt du eine Konstante in deinem Code, wird der Kompiler die Konstante
gegen ihren Wert tauschen.

Code: Alles auswählen

#huhu = 10 ; eine Konstante mit dem Wert 10
bla = #huhu ; die Variable bla erhaelt den wert 10
der Kompiler macht daraus dann

Code: Alles auswählen

bla = 10
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

#PB_MessageRequester_Yes (und alle anderen Namen, die in PB mit # anfangen) sind keine Variablen sondern Konstanten.

D.h. #PB_MessageRequester_Yes hat IMMER einen Wert, und zwar immer den gleichen. Du benutzt ihn nur, um ihn als Vergleichswert zu haben.

Beispiel: Du hast ein Kind, das noch keine Farbennamen sagen kann. Du willst ihm ein T-Shirt kaufen aber Du willst daß ihm die Farbe gefällt. Wenn Du nun fragst, welche Farbe soll's denn haben, dann kann es Dir den Farbnamen nicht nennen, aber Du könntest ihm jetzt z.B. ein rotes Blatt Papier, ein gelbes, ein grünes usw. zeigen und es sucht sich dann eines davon aus. Die Blätter sind allerdings konstant, sie ändern ihre Farbe nicht, sie dienen nur dazu, daß das Kind Dir die Farbe nennen kann. Wenn Du das Blatt nun in Deinen Rucksack steckst, dann ist Dein Rucksack sozusagen "Result". Aber das Blatt hat immer noch die gleiche Farbe und das wird sich auch nicht ändern :)

Ähnlich ist es mit den Konstanten in PB. Es gibt z.B. für die Tastatur-Abfrage für jede einzelne Taste eine Nummer. Diese willst Du niemals alle auswendig wissen. Auch die Antworten wie Yes und No eines MessageRequesters sind in Wirklichkeit Nummern. Da gibt's zwar nicht sooo viele Werte zum Auswendiglernen, aber dennoch, es ist umständlich. Und schlecht lesbar im Programmtext. Daher gibt es Konstanten, die Du als Vergleichswert herziehen kannst.

Wenn Du mal folgendes Programm schreibst und ausführst:

Code: Alles auswählen

Debug #PB_MessageRequester_Yes
Debug #PB_MessageRequester_No
Dann wirst Du die wahren Werte sehen können. Und mit diesen könntest Du Deine If-Abfrage genauso machen. Allerdings ist es, wie bereits geschrieben, weitaus unleserlicher, und Du mußt ständig wissen, was welchem Wert entspricht.

Ich hoffe, ich konnte Dir das einigermaßen erklären ;)
Man kann sich Konstanten übrigens auch selbst definieren, aber das kann zum Teil auch andere Gründe haben. Ist aber ein anderes Kapitel ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

#PB_MessageRequester_Yes und No haben IMMER einen Wert, da es sich um Konstanten handelt, sieht auch PB-Hilfe zum Thema Variablen und Konstanten.

Die Werte kannst du dir ganz leicht so anzeigen lassen:

Code: Alles auswählen

debug #IDYES
debug #PB_MessageRequester_Yes
;usw.
Die Konstanten sind dafür da damit du dir die Zahlenwerte nicht alle merken musst, da der Name eigentlich schon erklärt was der Wert bedeutet.

Ein Aufruf von MessageRequester() gibt dir einen Wert zurück, der dir sagt was der Anwender angeklickt hat. Diesen Wert vergleichst du mit den Konstanten und triffst dann abhängig davon eine Entscheidung

Beispiel:

Nehmen wir mal folgenden Code

Code: Alles auswählen

antwort.l = MessageRequester("Frage","Brauchst du die Datei noch?",#PB_MessageRequester_YesNo)
If antwort = #PB_MessageRequester_Yes
  Debug "Die Antwort war: "+Str(antwort)+" (ja)"
Else
  Debug "Die Antwort war: "+Str(antwort)+" (nein)"
  ;hier könnte z.B. ein Befehl stehen um eine Datei zu löschen...
EndIf
Der Compiler macht daraus:

Code: Alles auswählen

antwort.l = MessageRequester("Frage","Brauchst du die Datei noch?",4)
If antwort = 6
  Debug "Die Antwort war: "+Str(antwort)+" (ja)"
Else
  Debug "Die Antwort war: "+Str(antwort)+" (nein)"
  ;hier könnte z.B. ein Befehl stehen um eine Datei zu löschen...
EndIf
Riacon
Beiträge: 61
Registriert: 21.01.2008 09:40

Beitrag von Riacon »

whitelion hat geschrieben: das klingt sehr logisch, nur stelle ich mir noch die kleine frage: warum hat #PB_MessageRequester_Yes denn einen wert, wenn ich NICHT ja gedrückt habe und wie ist dieser wert ?
weil #PB_MessageRequester_Yes eine konstante ist. die ändert sich genauso wenig, wie sich #PI ändert,. da kannst du noch sooft drücken :mrgreen:
debug(#PB_MessageRequester_Yes)
pb 4.51 win7 64
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

So, jetzt haben wir 4x die gleiche Antwort :mrgreen:
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
whitelion
Beiträge: 46
Registriert: 05.05.2008 18:16
Wohnort: Celle
Kontaktdaten:

Beitrag von whitelion »

super, ich kann mir immer ein beispiel aussuchen! - und wie kreativ ihr antwortet :-) ... ich bin begeister!

langsam regt sich was in meinem hirn....

hier meine antwort:


Code: Alles auswählen

antwort = MessageRequester("White Lion haste es endlich geschnallt?", "Ich geb auf! (Abrechen) / Ne, nochmal bitte (wiederholen) / Ne, kappier ich nicht (nein)", 6)

If antwort = 2
MessageRequester("Ich geb auf (Abbrechen)", "Flag war: " +Str(antwort))
ElseIf antwort = 10
MessageRequester("Nochmal bitte (Wiederholen)", "Flag war: "+Str(antwort))
Else
MessageRequester("Ja, aber jetzt gibts eine Neue Frage (weiter)", "Flag war: " +Str(antwort))
OpenConsole()
    Print("Meine neue Frage:")
    Print("Woher weiss ich, welche Flags welchem Button zugeordnet sind ?")
    Print(" In diesem code wird es ja jetzt angezeigt, wenn ich allerdings irgendwann mal rausbekommen habe,")
    Print("wie man die Namen der Buttons selber festlegen kann(?), muss ich ja die Flags wissen um zu checken was der Anwender gedrückt hat (so wie jetzt). - als vordefinierte konstanten gibt es ja offensichtlich (laut hilfe) nur: #PB_MessageRequester_YesNo / #PB_MessageRequester_YesNoCancel und #PB_MessageRequester_Ok ! Da fehlt ja z.B. diese die ich jetzt benutze. oder muss man das auswendig lernen ?")
Delay(60000)

EndIf
End 
...das leben ist wie ein schlechtes adventure-game, aber die grafik ist verdammt geil!
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Also ein MessageRequester mit vorgegebenen Antworten wie Ja, Nein, Abbrechen wird bereits vom System zur Verfügung gestellt und hat daher feste Werte für die Buttons. Und damit Du diese festen Werte für die festen Buttons nicht in Deinem Code verwenden mußt, hast Du feste Konstanten für die festen Antworten ;)

Wenn Du völlig andere Buttons haben willst, also z.B. einen "Yeah was geht"- und einen "Leck mich am Arsch"-Button oder so ;) dann wirst Du eh nicht drumrum kommen, Dir ein eigenes Fenster zu definieren. Und da hat jeder Button eine Nummer, die Du selbst festlegst. Auch hier ist es dann üblich, Konstanten zu verwenden, um den Code sauber zu halten.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Antworten