Kleines Quiz?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

> ich glaub ihr versteht nicht ganz was ich meine.Ich möchte auf den Buttons meine Antworten stehen haben,geht das?Und zuvor mit MessageRequester... ne Frage stellen

Hab ich doch gepostet. Führ den Code doch mal aus.

Mal konkret:

Code: Alles auswählen

;//Antworten
#Antwort1 = #PB_MessageRequester_Yes
#Antwort2 = #PB_MessageRequester_No
#Antwort3 = #PB_MessageRequester_Cancel


;// Definitionen. Kannste überlesen ;)
#IDOK = 1
#IDCANCEL = 2
#IDABORT = 3
#IDRETRY = 4
#IDIGNORE = 5
#IDYES = 6
#IDNO = 7
#IDPROMPT = $FFFF
Global hHook
Global mbtitle$, mbmsg$, mbopt1$, mbopt2$, mbopt3$
#StringSpace = 80


Procedure MsgBoxHookProc2 (uMsg, wParam, lParam)
   If uMsg = #HCBT_ACTIVATE
      SetWindowText_ (wParam, mbtitle$)
      SetDlgItemText_ (wParam, #IDYES, mbopt1$)
      SetDlgItemText_ (wParam, #IDNO, mbopt2$)
      ;SetDlgItemText_ (wParam, #IDIGNORE, mbopt3$)
      SetDlgItemText_ (wParam, #IDPROMPT, mbmsg$)
      UnhookWindowsHookEx_ (hHook)
   EndIf
   ProcedureReturn #False
EndProcedure

Procedure MsgBoxHookProc3 (uMsg, wParam, lParam)
   If uMsg = #HCBT_ACTIVATE
      SetWindowText_ (wParam, mbtitle$)
      SetDlgItemText_ (wParam, #IDYES, mbopt1$)
      SetDlgItemText_ (wParam, #IDNO, mbopt2$)
      SetDlgItemText_ (wParam, #IDCANCEL, mbopt3$)
      SetDlgItemText_ (wParam, #IDPROMPT, mbmsg$)
      UnhookWindowsHookEx_ (hHook)
   EndIf
   ProcedureReturn #False
EndProcedure

Procedure Frage2 (parentWindow, title$, message$, button1$, button2$)
   mbtitle$ = title$
   mbmsg$ = message$
   mbopt1$ = button1$
   mbopt2$ = button2$
   mbopt3$ = button3$
   hInstance = GetModuleHandle_ (0)
   hThreadId = GetCurrentThreadId_ ()
   hHook = SetWindowsHookEx_ (#WH_CBT, @MsgBoxHookProc2 (), hInstance, hThreadId)
   ProcedureReturn MessageBox_ (parentWindow, Space (#StringSpace), Space (#StringSpace), #MB_YESNO)
EndProcedure

Procedure Frage3 (parentWindow, title$, message$, button1$, button2$, button3$)
   mbtitle$ = title$
   mbmsg$ = message$
   mbopt1$ = button1$
   mbopt2$ = button2$
   mbopt3$ = button3$
   hInstance = GetModuleHandle_ (0)
   hThreadId = GetCurrentThreadId_ ()
   hHook = SetWindowsHookEx_ (#WH_CBT, @MsgBoxHookProc3 (), hInstance, hThreadId)
   ProcedureReturn MessageBox_ (parentWindow, Space (#StringSpace), Space (#StringSpace), #MB_YESNOCANCEL )
EndProcedure

;//Ende von dem obligatorischen Code
;//
;//Jetzt geht dein Programm los



If Frage2(0, "Quiz Frage 1", "Die Hauptstadt von Deutschland?", "Berlin", "Bonn") = #Antwort1
    ;richtig
Else
    ;falsch
EndIf

If Frage3(0, "Quiz Frage 2", "In welchem Bundesland liegt München?", "Hessen", "Berlin","Bayern") = #Antwort3
   ;richtig
Else
    ;falsch
EndIf

If Frage2(0, "Quiz Frage 3", "Hat euch dieses Quiz gefallen?", "Ja", "Nein") = #Antwort1
    ;richtig
Else
    ;falsch
EndIf

EDIT: Hab den Fehler beim Requester mit 2 Antwortmöglichkeiten ausgebessert.
Zuletzt geändert von TomS am 18.03.2007 18:08, insgesamt 1-mal geändert.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

@TomS

Wann kapierst du's endlich: Das ist ein Anfänger. Da hat API nix verloren!!!
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

YAFW: Yet another flame war...

Hab ich nicht gesagt, dass er das da oben gar nicht anschauen braucht?
Denn wenn er nicht weiß, was diese Funktionen machen, isses doch egal. Also normaler User weiß man ja auch nicht was OpenWindow() eigentlich bedeutet. Man benutzt den Befehl und schert sich nicht drum, was der Compiler eigentlich draus macht. Er hat jetzt 2 Funktionen, deren Nutzen aus dem Code hervor geht.
Wenn ihm das nicht gefällt(, was er (noch) nicht gesagt hat), kann er ja deinen Code verwenden. Und wenn du ihm schon keine Windows zu traust, warum dann LinkedLists? Vlt, weil es die Funktionalität unterstützt, und beim Programmieren mit den endgültigen Funktionen gar nicht auffällt?!
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

ich selbst benutze jetzt PureBasic schon fast ein Jahr. Kann APIs immernoch nicht leiden. Zu LinkedLists gibt's ne deutsche Befehlsreferenz, in der man keine MemoryBuffer und sonst irgendnen Unsinn braucht. Ich traue keinem Anfänger zu, die API zu beherrschen. Wozu kauft man sich PureBasic? Damit man die nicht PureBasic Befehle benutzen kann, oder wie?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

Das Quiz-System:

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration
Enumeration
  #Text_0
  #Frage
  #Antwort_1
  #Antwort_2
  #Antwort_3
  #Antwort_4
EndEnumeration
Structure  Questions
  Frage.s
  Antwort1.s
  Antwort2.s
  Antwort3.s
  Antwort4.s
  RichtigeAntwort.b
  ID.d
EndStructure
Global NewList Fragen.Questions()
Global AnzahlFragen.d
#File = "FragenUndAntworten.txt"
If OpenPreferences(#File)
  ExaminePreferenceGroups()
  While NextPreferenceGroup()
    AddElement(Fragen())
    Fragen()\Frage = PreferenceGroupName()
    Fragen()\Antwort1 = ReadPreferenceString("Antwort 1","")
    Fragen()\Antwort2 = ReadPreferenceString("Antwort 2","")
    Fragen()\Antwort3 = ReadPreferenceString("Antwort 3","")
    Fragen()\Antwort4 = ReadPreferenceString("Antwort 4","")
    Fragen()\RichtigeAntwort = ReadPreferenceLong("RichtigeAntwort",0)
    Fragen()\ID = AnzahlFragen
    AnzahlFragen + 1
  Wend
Else
  MessageRequester("Fehler","Die Datei "+#File+" konnte nicht geladen werden."+Chr(13)+"Das Programm wird beendet",#MB_ICONSTOP)
  End
EndIf
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 220, 0, 600, 175, "QUIZ!",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateGadgetList(WindowID(#Window_0))
      TextGadget(#Text_0, 10, 20, 40, 20, "Frage:")
      TextGadget(#Frage, 60, 20, 530, 60, "")
      ButtonGadget(#Antwort_1, 30, 110, 130, 40, "")
      ButtonGadget(#Antwort_2, 170, 110, 130, 40, "")
      ButtonGadget(#Antwort_3, 310, 110, 130, 40, "")
      ButtonGadget(#Antwort_4, 450, 110, 130, 40, "", #PB_Button_MultiLine)
      
    EndIf
  EndIf
EndProcedure
Procedure NaechsteFrage()
  Zahl = Random(AnzahlFragen)
  ForEach Fragen()
    If Fragen()\ID = Zahl
      _Frage$ = Fragen()\Frage
      _Antwort1$ = Fragen()\Antwort1
      _Antwort2$ = Fragen()\Antwort2
      _Antwort3$ = Fragen()\Antwort3
      _Antwort4$ = Fragen()\Antwort4
      SetGadgetText(#Frage,_Frage$)
      SetGadgetText(#Antwort_1,_Antwort1$)
      SetGadgetText(#Antwort_2,_Antwort2$)
      SetGadgetText(#Antwort_3,_Antwort3$)
      SetGadgetText(#Antwort_4,_Antwort4$)
      For a = #Antwort_1 To #Antwort_4
        If GetGadgetText(a) = ""
          DisableGadget(a,1)
        Else
          DisableGadget(a,0)
        EndIf
      Next
    EndIf
  Next
EndProcedure
Procedure Ueberpruefen(ButtonID)
  AngezeigteFrage$ = GetGadgetText(#Frage)
  ForEach Fragen()
    If Fragen()\Frage = AngezeigteFrage$
      Antwort = Fragen()\RichtigeAntwort
      Break
    EndIf
  Next
  If ButtonID = Antwort
    MessageRequester("Info","RICHTIG!!!",#MB_ICONQUESTION)
  Else
    MessageRequester("Info","Leider falsch",#MB_ICONEXCLAMATION)
  EndIf
  NaechsteFrage()
EndProcedure
Open_Window_0()
NaechsteFrage()
Frage$ = GetGadgetText(#Frage)
Repeat
  NaechsteFrage()
Until Frage$ <> ""
Repeat
  
  Event = WaitWindowEvent()
  
  WindowID = EventWindow()
  
  GadgetID = EventGadget()
  
  EventType = EventType()
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #Antwort_1
      Ueberpruefen(1)
    ElseIf GadgetID = #Antwort_2
      Ueberpruefen(2)
    ElseIf GadgetID = #Antwort_3
      Ueberpruefen(3)
    ElseIf GadgetID = #Antwort_4
      Ueberpruefen(4)
    EndIf
    
  EndIf
  
Until Event = #PB_Event_CloseWindow ; End of the event loop

End
;
Programm, um Fragen hinzuzufügen:

Code: Alles auswählen

Dim Antwort.s(4)
nochmalprobieren:
If OpenPreferences("FragenUndAntworten.txt")
  ExaminePreferenceGroups()
  OpenConsole()
  PrintN("Tool zum Hinzufuegen von Fragen und Antworten")
  Repeat
    PrintN("")
    Print("Frage: ")
    Frage$ = Input()
    Frage2$ = LCase(Frage$)
    ok = 1
    While NextPreferenceGroup()
      If LCase(PreferenceGroupName()) = Frage2$
        PrintN("Fehler: Diese Frage wurde bereits eingetragen")
        ok = 0
        Break
      EndIf
    Wend
    If ok = 1
      For a = 1 To 4
        Print("Antwort"+Str(a)+" :")
        Antwort(a) = Input()
        If Antwort(a) = ""
          Break
        EndIf
      Next
      Print("Welche Antwort ist davon die richtige? (1-"+Str(a)+") ")
      richtig$ = Input()
      richtig2 = Val(richtig$)
      PreferenceGroup(Frage$)
      For a = 1 To 4
        WritePreferenceString("Antwort "+Str(a),Antwort(a))
      Next
      WritePreferenceLong("RichtigeAntwort",richtig2)
      PrintN("OK. Die Frage wurde erfolgreich eingetragen")
      For a = 1 To 4
        Antwort(a) = ""
      Next
    EndIf
  ForEver
Else
  If CreatePreferences("FragenUndAntworten.txt")
    Goto nochmalprobieren
  EndIf
EndIf
Habe ich jetzt gerade geproggt. OHNE API!!!
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Dark Skillu
Beiträge: 103
Registriert: 18.03.2007 15:03

Beitrag von Dark Skillu »

Von beiden Codes versteh ich max. die Hälfte :( ,finde aber selber PureBasics Lösung besser,da man komfortabel mit dem Programm die Fragen erstellen kann :allright:
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Es hilft den Anfängern nicht, wenn man ihnen fertige Lösungen präsentiert, wann hört diese Unsitte eigentlich auf ?
Man sollte sie immer nur stückchenweise in die richtige Richtung schubsen.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

na dann gib ihm doch mal einen Tipp, der ihm hilft, nachdem er von den Codes eh nur die Hälfte versteht. Und PB4's Lösung besser findet, weil er da gar nix mehr machen muss.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

tja.. ihr hättet eben gar nicht erst damit anfangen sollen... :lol:

am besten ist, rückfragen zu stellen.


es gäbe hier ja die möglichkeit, ihn erstmal an das schreiben/lesen von dateien heranzuführen.
das ist für nen fragenkatalog ja sinnvoll.

es wäre aber auch möglich,
dafür erst einmal Data-Sections oder fest programmierte strings zu nutzen,
um erst einmal auf die frage-antwort-programmierung einzugehen.

der allererste hinweis wäre gewesen:
Message-Requester kann nur Ja/Nein. (habt ihr ja gemacht)
also wäre es angebracht, auf die erstellung beschrifteter buttons einzugehen.
TomS hat geschrieben:...nachdem er von den Codes eh nur die Hälfte versteht.
genau das passiert eben, wenn man nem Einsteiger fertigen Code vor die Nase setzt.
in der selben Zeit hättet ihr ihm die grundlagen erklären können,
dann wäre er jetzt schon so weit, dass er über die Hälfte davon selber proggen könnte. ;)


@Dark Skillu
arbeite den Code durch und probiere, ihn nach und nach komplett zu verstehen.
das geht als einstieg auch, wenn du nun schon mal nen code hast.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Danach hat er aber nicht gefragt. Dass wir ihm "die Grundlagen" erklären sollen. :roll:
Ich kann nur für mich sprechen, aber mir hat es immer mehr geholfen, wenn ich einen Code hatte und dann gefragt habe, was der und der Befehl eigentlich genau macht (wenn ich aus der Hilfe nciht schlau wurde), als wenn jemand gesagt hat, schau in der Hilfe nach "NewList" oder so.

Das man als Anfänger keine Ahnung von Api hat, halte ich auch nur für bedingt richtig. Gibt ja auch pb-Anfänger, die vorher schon vb oder so programmiert haben.
Antworten