Problem mit Anzeige in "EditorGadget"

Für allgemeine Fragen zur Programmierung mit PureBasic.
Algorab
Beiträge: 4
Registriert: 25.02.2020 13:46

Problem mit Anzeige in "EditorGadget"

Beitrag von Algorab »

Ein herzliches Hallo an das Forum,
ich bin neu im Forum. Ich habe schon vieles programmiert in PureBasic und bin auf ein Problem gestoßen wo ich nicht weiß, was ich falsch mache.
Im folgenden Code ist die Procedure Flash(EventType) gelistet.
Darin befindet sich der Befehl AddGadgetItem(#Display, -1, Text$). #Display ist ein EditorGadget.
Wenn ich die nachfolgende Anweisung mit dem MessageRequester nicht aufrufe wird der Text (Text$) erst NACH dem Ausführen der nachfolgenden Procedure Flash() angezeigt. Die Anweisung zum Anzeigen des Textes wird ignoriert.
Was mache ich falsch?
Leider kann ich das gesamte Programm nicht zum Testen schicken da es sich um ein Testprogramm für ein spezielle Gerät handelt und ohne dem Gerät nicht funktioniert. Daher nur jener Teil, wo der Fehler auftritt.

**************************

Code: Alles auswählen

Procedure Flash(EventType) 
  Modulname = "Flash"
  Write2Log("Modul: " + Modulname)
  CloseWindow(#A_AllData)
  GadgetInitialized = 0
  
  Pattern$ = "*.mot|*.mot"
  SetCurrentDirectory(GetCurrentDirectory() + "S-Files")
  
  File$ = OpenFileRequester("Datei auswählen", GetCurrentDirectory(), Pattern$, 0)
  SetWindowTitle(#SolarosMain, "Ausgewählte Datei   " + GetFilePart(File$))
  If File$
    ReadFile(#S_Records, File$)
    While Eof(#S_Records) = 0
      Gelesen$ = ReadString(#S_Records)
      Select Left(Gelesen$, 2)
        Case "S2"
          AddElement(SRecords())
          SRecords() = Right(Gelesen$, Len(Gelesen$) - 2)
        Case "S1", "S3"
          MessageRequester("Fehler", Left(Gelesen$, 2) + " in S-Records gefunden!", #PB_MessageRequester_Info)
          ProcedureReturn
      EndSelect
    Wend
  Else
    MessageRequester("Information", "** Keine Datei ausgewählt **", #PB_MessageRequester_Info | #PB_MessageRequester_Error)
    Write2Log("** Keine Datei ausgewählt **")
    ProcedureReturn
  EndIf
  
  CloseFile(#S_Records)
 
  Text$ = "                        ***  FLASH  ***" + Chr(10) + Chr(10) +
  "      Während des Flashens sind Tasten und Maus gesperrt!" + Chr(10) + Chr(10) +
  "        Warten Sie auf die Freigabe durch das Programm." + Chr(10) + Chr(10) +
  "          Das Flashen kann bis zu 90 Sekunden dauern."
  
 
  ClearGadgetItems(#Display) 
  AddGadgetItem(#Display, -1, Text$)

  Choice = MessageRequester("Information", "Soll ''" +  GetFilePart(File$) + "''" + Chr(10) +  "ins Gerät programmiert werden?" + Chr(10) + "Beachten Sie die Hinweise!", #PB_MessageRequester_YesNo | #PB_MessageRequester_Info)
  
  If Choice = #PB_MessageRequester_No
    ClearGadgetItems(#Display)
    HideGadget(#ReadAll, 1)
    ProcedureReturn
  EndIf 
  
  FlashDevice()
  
  Reset(EventType)

EndProcedure
******************************************

Für eine Hilfe oder einen Tipp wäre ich sehr dankbar.
Toni (Algorab ist nur der Nickname)

// Edit: Code-Tags hinzugefügt (Kiffi)
Benutzeravatar
HeX0R
Beiträge: 3056
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:

Re: Problem mit Anzeige in "EditorGadget"

Beitrag von HeX0R »

Das sind immer die selben Probleme, gab's da nicht mal ne schöne Beschreibung zum Eventhandling allgemein?

Zurück zum Thema:
Wenn Du einen Befehl an ein Fenster oder ein Gadget schickst (z.B. AddGadgetItem in Deinem Fall), wird das in die Event-Abarbeitungsschlange des Fensters gelegt.
Und NICHT sofort ausgeführt!
Erst bei (mehrmaligem) Aufruf von (Wait)WindowEvent(), wird diese Schlange abgearbeitet.

Wenn Du nach dem Aufrufen von AddGadgetItem() einen Messagerequester startest, blockiert Dein Programm genau an der Stelle und es ist unmöglich zu einem (Wait)WindowEvent() zu gelangen.
Das Fenster baut sich also nicht weiter auf, weil es die hinterlegten Events gar nicht abarbeiten kann.

[Edit]
Hier hat Danilo das auch mal ganz gut erklärt.
Wobei man das vielleicht mal aktualisieren sollte, dieses While WindowEvent() : Wend zur Eventverbrennung sollte man eher vermeiden.
Algorab
Beiträge: 4
Registriert: 25.02.2020 13:46

Re: Problem mit Anzeige in "EditorGadget"

Beitrag von Algorab »

Danke HeXOR für die Hilfe und den hilfreichen Link zu Danilo. Ich habe zu meinem Problem das Forum lange durchsucht und nichts gefunden. Konnte nicht ahnen, dass im Bereich "Event" zu suchen ist.

Erlaube mir noch eine Frage zu deiner Antwort:

Zitat:
"Wenn Du nach dem Aufrufen von AddGadgetItem() einen Messagerequester startest, blockiert Dein Programm genau an der Stelle und es ist unmöglich zu einem (Wait)WindowEvent() zu gelangen.
Das Fenster baut sich also nicht weiter auf, weil es die hinterlegten Events gar nicht abarbeiten kann."

Wenn ich das richtig verstanden habe dann wird in meinem Programm KEINESFALLS der Text angezeigt wenn der MessageRequester aufgerufen wird.
Aber: Genau das Gegenteil ist der Fall. Wenn ich den MessageRequester NICHT aufrufe, wird im EditorGadget erst dann was angezeigt wenn alles abgearbeitet ist. Das entspricht ja auch deiner und Danilos Erklärung mit der Warteschlange und der Abarbeitung der Events.

Nochmals: Vielen Dank, in Abwandlung eines Faust'schen Zitats: "...jetzt bin ich klüger als zuvor".
Benutzeravatar
HeX0R
Beiträge: 3056
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:

Re: Problem mit Anzeige in "EditorGadget"

Beitrag von HeX0R »

Um das zu beantworten, bräuchte ich einen lauffähigen Code.
Muss ja nicht alles sein, vielleicht bekommst Du das soweit zusammengekürzt, dass es gerade noch läuft und dennoch den Fehler zeigt.

Üblicherweise bemerkt man bei diesem Zusammenkürzen schon selbst, was man falsch macht ;)
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Problem mit Anzeige in "EditorGadget"

Beitrag von mk-soft »

Ganz wichtig :wink:

Code: Alles auswählen

EnableExplicit
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten