Textausgabe verschwindet bei Gadget-Abfrage

Anfängerfragen zum Programmieren mit PureBasic.
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Textausgabe verschwindet bei Gadget-Abfrage

Beitrag 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
    Benutzeravatar
    Kiffi
    Beiträge: 10714
    Registriert: 08.09.2004 08:21
    Wohnort: Amphibios 9

    Re: Textausgabe verschwindet bei Gadget-Abfrage

    Beitrag 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
    ullmann
    Beiträge: 205
    Registriert: 28.10.2005 07:21

    Beitrag von ullmann »

    Danke für die Hilfe. Ich werde es probieren.

    Ein Updateberechtigung werde ich mir wohl demnächst zulegen.

    Grüße
    Rainer
    Benutzeravatar
    AND51
    Beiträge: 5220
    Registriert: 01.10.2005 13:15

    Beitrag 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?
    PB 4.30

    Code: Alles auswählen

    Macro Happy
     ;-)
    EndMacro
    
    Happy End
    Benutzeravatar
    ts-soft
    Beiträge: 22292
    Registriert: 08.09.2004 00:57
    Computerausstattung: Mainboard: MSI 970A-G43
    CPU: AMD FX-6300 Six-Core Processor
    GraKa: GeForce GTX 750 Ti, 2 GB
    Memory: 16 GB DDR3-1600 - Dual Channel
    Wohnort: Berlin

    Beitrag 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"
    PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
    Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
    Bild
    Antworten