PureBasic 5.22 - Form Designer

Anfängerfragen zum Programmieren mit PureBasic.
Lurchi
Beiträge: 14
Registriert: 07.05.2014 14:49

PureBasic 5.22 - Form Designer

Beitrag von Lurchi »

Hallo beisammen,

seit heute Nachmittag will ich auch zu der PB Nutzergemeinde gehören. Ich heiße Holger und lebe in Traunstein. Den ganzen Nachmittag lese ich schon alle möglichen Tutorials, Hilfeseiten, etc. um hinter die Logik des Form Designer zu kommen und wie man die code Teile richtig miteinander verknüpft. Für den Moment gebe ich es auf und versuche bei Euch Hilfe zu bekommen.
Kennt einer von Euch noch ein geschriebenes Tutorial, welches ich jetzt noch nicht gelesen habe oder ein Buch zum Thema, das mir weiterhelfen kann?

Danke für Eure Hilfe und Gruß aus dem Chiemgau

Holger
Zuletzt geändert von Lurchi am 08.05.2014 07:24, insgesamt 1-mal geändert.
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

Re: PureBasic 5.22 - Form Designer

Beitrag von ts-soft »

Hallo Holger,

hier findest Du eine kleine Hilfe: http://www.purebasic.com/german/documen ... _form.html

Den Einstieg in PB findeste Du aber leichter, wenn Du erstmal auf den Form-Designer verzichtest. Eine Form
zusammenschubsen bringt Dich nicht wirklich weiter und PB ist erstmal nicht drauf angewiesen einen Form-
Designer zu nutzen. Wenn Du Grundkenntnisse in PB hast, kann der Form-Designer sicherlich hilfreich sei,
aber ohne diese Grundkenntnisse ist er eher hinderlich.

Tutorials und Handbuch findest Du auf http://www.purearea.net
wobei diese Tutorials teilweise veraltet sind und nicht immer sofort lauffähig. Aber die Fehlersuche hilft auch
beim lernen. Ansonsten findest Du natürlich auch hilfe hier im Forum.

Gruß
Thomas
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
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: PureBasic 5.22 - Form Designer

Beitrag von TroaX »

Als ehemmaliger Berchtesgadener begrüße ich dich als Oberbayer auch herzlich hier im Forum ;)

Wenn duu schon Erfahrung in der prozeduralen Programmierung hast, wirst du PureBasic lieben. Was den Formdesigner angeht: Dieser hat sich über die Versionen hinweg weiter entwickelt. Es funktioniert mittlerweile ähnlich wie die aus dem Visual Studio oder SharpDevelop. Du klickst dir die Oberfläche zusammen, verknüpst die Ereignisse mit den Code-Prozeduren und schreibst in diesen den Code.

Du erstellst einfach über das Menü oben eine neue Form, legst dir die Gadgets an die gewünschten Stellen und die Gadgets, die eine Interaktion abbilden (z.B. Button's) belegst du im Event mit einer eigenen Prozedur. Speichere das Formular als pbf-Datei. Die Eventprozedur für die Gadgets tust du rechts in der Toolbox unter den Gadget-Eigenschaften bei Ereignis-Prozedur zuweisen. Dann erstellst du eine neue Code-Datei. In dieser schreibst du die Eventprozeduren. Am Ende der Datei machst du dann nur noch ein Include der PBF-Datei und führst die Prozedur zum öffnen des Forms aus.

Aber nicht vergessen. Was ts--soft sagt ist absolut richtig:
1. Sollte man bei einer neuen Programmiersprache immer zuerst mit dem trockenen Programmieren anfangen.
2. Sollte man auch erst eine GUI selber schreiben, bevor man sie zusammenklickt, damit man das System dahinter versteht.
3. Sind Formdesigner immer beschränkt. Sollte etwas nicht klappen, wie du es dir wünscht ist manuelles Hand anlegen gefragt.

Gruß Troax
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Lurchi
Beiträge: 14
Registriert: 07.05.2014 14:49

Re: PureBasic 5.22 - Form Designer

Beitrag von Lurchi »

Vielen Dank Euch beiden für Eure Antworten. Und Danke an Troax für die herzliche Begrüßung :bounce:

Wahrscheinlich habt Ihr recht damit, daß ich es erst "zu Fuß" lernen sollte... Der link zur purearea war super. Habe mir da schon viel rausholen können. Ich glaube, ich bin auf einem guten Weg :)

Dennoch möchte ich gleich noch einmal beim form designer einhaken. Wenn ich den aufrufe und in das gezeigte Fenster einen Button platziere, entsteht ja schon mal ein code. Es werden hauptsächlich zwei Prozeduren erzeugt. Soweit ja klar. Wenn ich dieses äußerst unfertige "Programm" jetzt compiliere und ausführe, dann geht das ????????!!!!!!!!! Ich will damit sagen, der compiler verrichtet kommentarlos seinen Dienst und das Fenster wird angezeigt. Aber warum?? Es fehlt doch der aufrufende Programmteil. Könnt Ihr mir das bitte erläutern?

Danke und Gruß Holger
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: PureBasic 5.22 - Form Designer

Beitrag von TroaX »

Das ist schnell erklärt. Wenn du eine Form mit einem Button erzeugst, wird im Hintergrund eine Prozedur für das Erzeugen des Fensters und eine für die Event's erzeugt. Der Compiler baut bei einer PBF-Datei (PureBasic Form) automatisch beim Kompilieren eine eigene Nachrichtenschleife in das Programm ein, wodurch dein Fenster permanent sichtbar bleibt. Wenn du es zu Fuß machst, dann fehlt diese Schleife natürlich und dein Programm springt aus. Du müsstest dann eine eigene Nachrichtenschleife schreiben, damit es läuft. Ansonsten geht es nach dem starten direkt wieder zu.

In der PBF-Datei befindet sich also nur die Prozedur für die Events und die Prozedur für das Erzeugen der Form. Der Compiler selbst baut den Aufruf der Fensterprozedur ein und erzeugt dir eine Nachrichtenschleife. Mit einer Funktion wie BindEvent hast du dann die Möglichkeit, dieser automatischen Nachrichtenschleife Reaktionen auf Nutzereingaben hinzuzufügen. Zum Beispiel dem Klick auf einen Button. Über BindEvent registrierst du also für ein Objekt ein Event und definierst dazu eine entsprechende Callback-Prozedur dazu.

Callback: Ein Callback ist im Grunde die Fähigkeit einer Prozedur, den Rückgabewert an eine unbekannte Prozedur weiterzuleiten. Du schreibst also eine Prozedur selber, die eine API-Prozedur wie BindEvent bei der Implementierung noch nicht kennen kann und übergibst diese Prozedur als 2. Parameter an die BindEvent-Prozedur. BindEvent wartet, bis das Event ausgelöst wird, führt dann die ihm gerade erst mitgeteilte Prozedur aus und übergibt dieser wiederrum die Ereignisparameter als Rückgabewert, mit denen du in deiner eigenen Prozedur weiterarbeiten kannst. Schemenhaft so erklärt:

Code: Alles auswählen

DEINE_PROZEDUR ButtonGeklickt()
  MacheEtwas
ENDE_DEINE_PROZEDUR

BindEvent(#PB_Event_Gadget,@ButtonGeklickt(),#PB_All,#DEIN_BUTTON)
BindEvent wird ohne gesondertes Ereignis aufgerufen und registriert dein Klick-Event. Sobald die Nachrichtenschleife das Event registriert wird die Callback-Prozedur ButtonGeklickt() ausgeführt.

Ich denke grob sollte damit alles gesagt sein ;)

Gruß Troax
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Lurchi
Beiträge: 14
Registriert: 07.05.2014 14:49

Re: PureBasic 5.22 - Form Designer

Beitrag von Lurchi »

Hi Troax,

in Deinem vorletzten Beitrag hast Du es vorausgesagt :-) :
...3. Sind Formdesigner immer beschränkt. Sollte etwas nicht klappen, wie du es dir wünscht ist manuelles Hand anlegen gefragt...
Jetzt bin ich schon da angekommen, wo was mit dem form designer nicht geht. Es ist offenbar nicht möglich, eine Toolbar mit Standard buttons mit dem form designer zu erzeugen... Naja, dann muß ich mir eben die nötigen Bildchen jetzt anderweitig besorgen...

Aber abgesehen davon, habe ich das Konzept jetzt soweit durchschaut. Meine erste Anwendung wächst. Und das unter Benutzung des form designers.

Danke an Deine, und auch aller anderen, Hilfe!!! Bestimmt brauche ich Euch sehr bald wieder :praise:

Viele Grüße
Holger
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: PureBasic 5.22 - Form Designer

Beitrag von TroaX »

Gerne gerne :)
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Lurchi
Beiträge: 14
Registriert: 07.05.2014 14:49

Re: PureBasic 5.22 - Form Designer

Beitrag von Lurchi »

Hi folks,

es passiert bei mir regelmäßig, daß der form designer meine Einstellungen zum Teil vergißt und diese dann an ganz anderer Stelle einbaut. Kann es sein, daß der form designer den Quelltext nicht fehlerfrei parst? Das ist sehr ärgerlich!!!! Kennt Ihr das und gibt's da Abhilfe?

Gruß
Holger
Lothar Schirm
Beiträge: 41
Registriert: 30.04.2012 16:38

Re: PureBasic 5.22 - Form Designer

Beitrag von Lothar Schirm »

Ist mir noch nicht passiert. Was für Einstellungen meinst du denn? Oder editierst du den vom Form Designer erzeugten Code und schaltest dann wieder um in die Design-Ansicht? Das geht in der Regel schief. Deswegen steht am Anfang des Codes auch ein entsprechender Warnhinweis. Man darf eigentlich Änderungen des Designs nur in der Design-Ansicht vornehmen.
Lurchi
Beiträge: 14
Registriert: 07.05.2014 14:49

Re: PureBasic 5.22 - Form Designer

Beitrag von Lurchi »

Hallo Lothar,

danke für die Nachfrage. Dein Einwand mit dem Verbot, in der generierten Datei Änderungen durchzuführen, ist mir klar. Das mache ich auch nicht.

(Hier ist mir gerade noch eingefallen, daß ich den Code doch verändert habe. Nämlich mit dem Ziel, die Registerreihenfolge zu ändern, habe ich die entsprechenden Zeilen im Code vertauscht. Ist das vielleicht die Ursache für das Problem??)

Ich versuche mal alles wichtige hier anzugeben. Zuerst mal das System:

Win7dt64bit
PureBasic 5.22 LTS (Windows - x64)

Das Problem ist blöd zu beschreiben. Habe ein Fenster mit einem Exit-Button und einem PanelGadget. Dieses Panel hat z. Zt. drei Reiter. In einem der Reiter befindet sich ein Button, dessen Ereignis-Prozedur komplett aus dem Designer verschwindet (wenn der Fehler auftritt, von dem ich noch nicht weiß, warum und zu welchen Zeitpunkt er auftritt). Ein gleicher Button ist auch in einem weiteren Panelreiter untergebracht. Die Variablen unterscheiden sich aber (BtnDefaultsUmgebung und BtnDefaultsConfig). Beide haben als Beschriftung "Default"; vllt. ist das ein Schlüsselwort und führt zu dem Verhalten?!?

Das Fenster an sich hat keine Ereignisprozedur. Wohl aber ein weiterer Button mit der Beschriftung "Übernehmen". Seine Variable lautet "BtnUebernehmenN2Config" und seine Ereignisprozedur "EventBtnUebernehmenN2Config". Wenn der hier beschriebene Fehler auftritt, bekommt das ganze Fenster genau diese Ereignisprozedur zugewiesen, was natürlich vollkommenen Nonsens ergibt.

Ich hänge den Code der *.pbf Datei hier mal an. Dann kann das vielleicht nachvolzogen werden. Wenn ich diese pbf Datei einzeln, außerhalb des Projekts, öffne, tritt der Fehler fast jedesmal auf. Die Ereignisprozeduren verschwinden bzw. werden falsch gesetzt

Danke für Deine Hilfe,

Gruß
Holger

Code: Alles auswählen

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Global Einstellungen

Global BtnExitConfig, RegisterEinstellungen, Text_1, String_0, Text_2, Text_3, Text_4, Frame_0, BtnDefaultsUmgebung, Text_2_Copy1, Text_3_Copy1, Text_4_Copy1, Text_2_Copy2, Text_3_Copy2, Text_4_Copy2, Text_1_Copy1, Text_1_Copy1_Copy1, Text_1_Copy1_Copy1_Copy1, String_0_Copy1, String_0_Copy1_Copy1, Text_1_Copy1, String_0_Copy1, Option_0, Option_0_Copy1, GdgHeth, ListBMGewebeN2, ListBMGewebeHe, GdgHea, GdgHeb, GdgN2th, GdgN2a, GdgN2b, Text_0, Text_0_Copy1, Text_0_Copy2, GdgN2HeFaktor, BtnFaktorAnwendenConfig, BtnDefaultsConfig, GdgN2Nr, GdgHeNr, BtnUebernehmenN2Config, BtnUebernehmenHeConfig

Declare EventBtnUebernehmenN2Config(EventType)
Declare EventBtnExitConfig(EventType)
Declare EventBtnUebernehmenHeConfig(EventType)
Declare EventListBMGewebeHe(EventType)
Declare EventBtnDefaultsConfig(EventType)
Declare EventListBMGewebeN2(EventType)
Declare EventBtnFaktorAnwendenConfig(EventType)

Procedure OpenEinstellungen(x = 0, y = 0, width = 490, height = 520)
  Einstellungen = OpenWindow(#PB_Any, x, y, width, height, "Einstellungen", #PB_Window_Invisible | #PB_Window_Tool | #PB_Window_WindowCentered, WindowID(HauptFenster))
  BtnExitConfig = ButtonGadget(#PB_Any, 390, 480, 90, 30, "Ende")
  RegisterEinstellungen = PanelGadget(#PB_Any, 10, 10, 470, 460)
  AddGadgetItem(RegisterEinstellungen, -1, "Umgebung")
  Text_1 = TextGadget(#PB_Any, 15, 23, 175, 20, "Höhe über Meer [m]:")
  String_0 = StringGadget(#PB_Any, 195, 20, 45, 20, "0")
  Text_2 = TextGadget(#PB_Any, 250, 23, 20, 20, "-->")
  Text_3 = TextGadget(#PB_Any, 270, 23, 45, 20, "1013.25")
  Text_4 = TextGadget(#PB_Any, 315, 23, 35, 20, "mbar")
  Frame_0 = FrameGadget(#PB_Any, 15, 78, 225, 70, "Gewebesättigung zu Beginn:")
  BtnDefaultsUmgebung = ButtonGadget(#PB_Any, 375, 8, 75, 30, "Defaults")
  Text_2_Copy1 = TextGadget(#PB_Any, 25, 103, 25, 20, "->")
  Text_3_Copy1 = TextGadget(#PB_Any, 50, 103, 145, 20, "Stickstoff im Gewebe [bar]:")
  Text_4_Copy1 = TextGadget(#PB_Any, 195, 103, 35, 20, "0.0000")
  Text_2_Copy2 = TextGadget(#PB_Any, 25, 123, 25, 20, "->")
  Text_3_Copy2 = TextGadget(#PB_Any, 50, 123, 145, 20, "Helium im Gewebe    [bar]:")
  Text_4_Copy2 = TextGadget(#PB_Any, 195, 123, 35, 20, "0.0000")
  Text_1_Copy1 = TextGadget(#PB_Any, 15, 163, 130, 20, "Luftzusammensetzung:")
  Text_1_Copy1_Copy1 = TextGadget(#PB_Any, 150, 163, 110, 20, "Stickstoffanteil  [%]:")
  Text_1_Copy1_Copy1_Copy1 = TextGadget(#PB_Any, 150, 183, 110, 20, "Sauerstoffanteil [%]:")
  String_0_Copy1 = StringGadget(#PB_Any, 260, 160, 45, 20, "0.0")
  String_0_Copy1_Copy1 = StringGadget(#PB_Any, 260, 180, 45, 20, "0.0")
  Text_1_Copy1 = TextGadget(#PB_Any, 15, 48, 175, 20, "Wasserdampfdruck Lunge [bar]:")
  String_0_Copy1 = StringGadget(#PB_Any, 195, 45, 45, 20, "0.0000")
  Option_0 = OptionGadget(#PB_Any, 20, 218, 85, 20, "Süßwasser")
  SetGadgetState(Option_0, 1)
  Option_0_Copy1 = OptionGadget(#PB_Any, 120, 218, 85, 20, "Salzwasser")
  AddGadgetItem(RegisterEinstellungen, -1, "Dekompression")
  AddGadgetItem(RegisterEinstellungen, -1, "Bühlmann")
  GdgHeth = StringGadget(#PB_Any, 300, 370, 40, 18, "")
  ListBMGewebeN2 = ListIconGadget(#PB_Any, 20, 70, 180, 295, "Nr", 25, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(ListBMGewebeN2, 1, "T halbe", 51)
  AddGadgetColumn(ListBMGewebeN2, 2, "a", 50)
  AddGadgetColumn(ListBMGewebeN2, 3, "b", 50)
  ListBMGewebeHe = ListIconGadget(#PB_Any, 270, 70, 180, 295, "Nr", 25, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(ListBMGewebeHe, 1, "T halbe", 51)
  AddGadgetColumn(ListBMGewebeHe, 2, "a", 50)
  AddGadgetColumn(ListBMGewebeHe, 3, "b", 50)
  GdgHea = StringGadget(#PB_Any, 350, 370, 40, 18, "")
  GdgHeb = StringGadget(#PB_Any, 400, 370, 40, 18, "")
  GdgN2th = StringGadget(#PB_Any, 50, 370, 40, 18, "")
  GdgN2a = StringGadget(#PB_Any, 100, 370, 40, 18, "")
  GdgN2b = StringGadget(#PB_Any, 150, 370, 40, 18, "")
  Text_0 = TextGadget(#PB_Any, 20, 48, 90, 20, "Stickstoff")
  Text_0_Copy1 = TextGadget(#PB_Any, 270, 48, 90, 20, "Helium")
  Text_0_Copy2 = TextGadget(#PB_Any, 20, 18, 100, 20, "N2 -> He Faktor:")
  GdgN2HeFaktor = StringGadget(#PB_Any, 110, 15, 40, 18, "")
  BtnFaktorAnwendenConfig = ButtonGadget(#PB_Any, 155, 8, 70, 30, "Anwenden")
  BtnDefaultsConfig = ButtonGadget(#PB_Any, 375, 8, 75, 30, "Defaults")
  GdgN2Nr = StringGadget(#PB_Any, 20, 370, 25, 18, "")
  GdgHeNr = StringGadget(#PB_Any, 270, 370, 25, 18, "")
  BtnUebernehmenN2Config = ButtonGadget(#PB_Any, 50, 398, 130, 25, "Übernehmen")
  BtnUebernehmenHeConfig = ButtonGadget(#PB_Any, 290, 398, 130, 25, "Übernehmen")
  CloseGadgetList()
EndProcedure

Procedure Einstellungen_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case BtnExitConfig
          EventBtnExitConfig(EventType())          
        Case ListBMGewebeN2
          EventListBMGewebeN2(EventType())          
        Case ListBMGewebeHe
          EventListBMGewebeHe(EventType())          
        Case BtnFaktorAnwendenConfig
          EventBtnFaktorAnwendenConfig(EventType())          
        Case BtnDefaultsConfig
          EventBtnDefaultsConfig(EventType())          
        Case BtnUebernehmenN2Config
          EventBtnUebernehmenN2Config(EventType())          
        Case BtnUebernehmenHeConfig
          EventBtnUebernehmenHeConfig(EventType())          
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

Antworten