Seite 1 von 1

Textausgabe verschwindet bei Gadget-Abfrage

Verfasst: 28.10.2005 07:53
von ullmann
Hallo,
von PureBasic habe ich das Gefühl, dass es schwieriger ist als andere Basic-Dialekte, denn schon beim einfachsten Programm treten Probleme auf:

Ich möchte in einem Fenster (nicht Console) Text ausgeben und mit einem OK-Button bestätigen lassen. Der erste Text ist ein Hinweis zur Funktion des Programmes, der zweite Text soll errechnete Zahlen tabelliert darstellen. Deshalb möchte ich dazu nicht MessageRequester verwenden, da ich meine, dass eine tabellierte Darstellung damit nicht möglich ist.

Ich habe also 1. ein Fenster geöffnet, 2. mit Locate und DrawText Text ausgegeben (wurde auch angezeigt) und 3. mit CreateGadgetList und ButtonGadget einen OK-Button erzeugt und mit einer Repeat-Until-Schleife abgefragt.

Die Anzeige und Abfrage des OK-Buttons klappt perfekt, aber der oberhalb bereits ausgegebene Text ist verschwunden. Und das finde ich, ist für Basic ein Anfänger-unfreundlicher Aspekt.

Ich habe die Topos-Version 3.30.

Hier der Quelltext:

Code: Alles auswählen

IncludePath "..\..\includes\"
XIncludeFile "Konstanten_Fenster.pb"
fensternr.l=OpenWindow(0,100,100,800,500,#fenstd,"Dameproblem");#fenstd=Konstante für Standardfenster
If fensternr
  StartDrawing(WindowOutput())
  DrawingMode(1);Texthintergrund transparent
  Locate(0,0):DrawText("Es sind 8 Damen so auf einem Schachbrett zu platzieren, dass sie sich nach den Regeln des Damezuges")
  Locate(0,20):DrawText("im Schachspiel nicht gegenseitig schlagen können.")
  StopDrawing()
  If CreateGadgetList(WindowID())
    ButtonGadget(0,100,200,80,24,"Weiter")
  EndIf
  Repeat
    EventID=WaitWindowEvent()
    If EventID=#pb_eventgadget
      Select EventGadgetID()
        Case 0
          MessageRequester("Info","Button Weiter wurde geklickt.",0)
      EndSelect
    EndIf
  Until EventID=#pb_eventclosewindow
EndIf
End


P.S: Das ist ein ziemlich sinnloses Programm, ich habe es aber schon auf Taschenrechnern, verschiedenen Heimcomputern und in Lotus 1-2-3 programmiert, um die Rechengeschwindigkeit abzuschätzen und einen Einstieg in die jeweilige Programmiersprache zu finden.

Vielen Dank für Hilfe.

Rainer

    Re: Textausgabe verschwindet bei Gadget-Abfrage

    Verfasst: 28.10.2005 08:24
    von Kiffi
    > von PureBasic habe ich das Gefühl, dass es schwieriger ist als andere
    > Basic-Dialekte, denn schon beim einfachsten Programm treten Probleme
    > auf:

    es ist nicht so schwierig, wie es aussieht ;-)

    Folgendes: Du versuchst, Deinen Text auf WindowOutput() zu zeichnen.
    Die Online-Hilfe schreibt hierzu:
    Hinweis: Unter Windows ist es erforderlich, die mittels
    WindowOutput() direkt in ein Fenster gezeichneten Grafiken nach jedem
    Verdecken, Minimieren etc. des Fensters manuell neu zu zeichnen ("zu
    refreshen"). Es ist daher empfehlenswert, Grafiken über ImageOutput() in
    ein Bild zu zeichnen und dieses als ImageGadget() im Anwendungsfenster
    darzustellen sowie ggf. mittels SetGadgetState() upzudaten. Windows
    erledigt dann das Neuzeichnen der Grafiken automatisch.
    Möchtest Du also in ImageOutput() zeichnen, sähe Dein Code so aus:

    Code: Alles auswählen

    [...]
      If CreateGadgetList(WindowID())
        
        ButtonGadget(0,100,200,80,24,"Weiter")
        
        ImageID = CreateImage(0,800,500)
        StartDrawing(ImageOutput())
        BackColor(0,0,0)
        FrontColor(255,255,255)
        DrawingMode(1);Texthintergrund transparent
        Locate(0,0):DrawText("Es sind 8 Damen so auf einem Schachbrett zu platzieren, dass sie sich nach den Regeln des Damezuges")
        Locate(0,20):DrawText("im Schachspiel nicht gegenseitig schlagen können.")
        StopDrawing()
        
        ImageGadget(1,0,0,800,500,ImageID)
        
      EndIf
    [...]
    Allerdings würde ich vorschlagen, für die Textausgabe TextGadgets zu
    verwenden. Dann würde der Code folgendermaßen aussehen:

    Code: Alles auswählen

    [...]
      If CreateGadgetList(WindowID())
        
        ButtonGadget(0,100,200,80,24,"Weiter")
        
        TextGadget(1,0, 0,800,20,"Es sind 8 Damen so auf einem Schachbrett zu platzieren, dass sie sich nach den Regeln des Damezuges")
        TextGadget(2,0,20,800,20,"im Schachspiel nicht gegenseitig schlagen können.")
        
      EndIf
    [...]
    > [...] und einen Einstieg in die jeweilige Programmiersprache zu finden.

    kein Problem! Falls noch irgendwelche Fragen auftauchen sollten: scheue
    Dich nicht, sie hier zu stellen! :-)

    Noch was: Du weisst sicherlich, dass die Topos-Version recht veraltet ist?
    Die momentan aktuelle Versionsnummer von PB liegt bei 3.94.

    Grüße ... Kiffi

    Verfasst: 28.10.2005 09:31
    von ullmann
    Danke für die Hilfe. Ich werde es probieren.

    Ein Updateberechtigung werde ich mir wohl demnächst zulegen.

    Grüße
    Rainer

    Verfasst: 28.10.2005 14:04
    von AND51
    TextGadget(1,0, 0,800,20,"Es sind 8 Damen so auf einem Schachbrett zu platzieren, dass sie sich nach den Regeln des Damezuges")
    TextGadget(2,0,20,800,20,"im Schachspiel nicht gegenseitig schlagen können.")

    Anfangs dachte ich ja auch, dass man so vorgehen uss, um ein Zeilenumbruch in ein TextGadget() zu kriegen, aber das muss man nicht.
    Im Text reicht ein Chr(10) und schon ist bei mir der Zeilenumbruch im Text. Nur nicht vergessen, den TextGadget höher zu machen!

    Aber ich habe noch eine Frage:
    Wie "refresht" man denn nun so ein Fenster? Egal ob OpenWindow()-Fenster oder WindowedScreen()-Fenster?

    Verfasst: 28.10.2005 14:24
    von ts-soft
    >> Wie "refresht" man denn nun so ein Fenster? Egal ob OpenWindow()-Fenster oder WindowedScreen()-Fenster?
    Suche im CodeArchiv nach: "Window_ImageRepaint.pb"