Einfaches Projekt zum Runterladen?

Anfängerfragen zum Programmieren mit PureBasic.
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Einfaches Projekt zum Runterladen?

Beitrag von Plenz »

Ich programmiere seit Jahrzehnten mit BASIC (zuletzt Visual Basic .NET) und möchte unter Win10 ein kleines Programm schreiben, das auch unter Linux laufen soll. Deswegen bin ich zu PureBasic gekommen.

Ich stehe total auf dem Schlauch und sehe den Wald vor lauter Bäumen nicht. Ich kann zwar eine Form entwerfen und Gadgets hinzufügen und alles erfolgreich compilieren, aber ich schaffe es nicht, einen Button zu beschriften und mit enem Event zu verknüpfen. Der Code dafür muss anscheinend in eine zusätzliche Datei geschrieben werden.

Gibt es irgendwo ein einfaches Beispiel zum Herunterladen (z.B. Form mit Canvas und Button, auf Buttonclick wird ein Filemenü geöffnet, ein dort gewähltes Bild wird im Canvas dargestellt), wo ich sehen kann, wie der Code organisiert ist und wie er in welcher Datei abgespeichert wird?
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Einfaches Projekt zum Runerladen?

Beitrag von DrShrek »

Examples Ordner waere auch vorhanden ;)
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Einfaches Projekt zum Runerladen?

Beitrag von mk-soft »

Wenn faul bis und an automatische Code Generierung gewöhnt bis, kannst du dir ja mein EventDesigner (Signatur) anschauen.

Aber auf jeden fall die Beispiele und die Einleitung in der PB Hilfe durcharbeiten ...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Einfaches Projekt zum Runterladen?

Beitrag von Plenz »

Ah, danke, die Beispiele hatte ich noch gar nicht gesehen. Hab gerade PureBasic gestartet, da kommt ja sogar ein Hinweis auf die Beispiele :/
Ja, diese Beispiele sollten genügen, um zu sehen, wie das mit den Events etc. funktioniert.

"Wenn faul bis und an automatische Code Generierung gewöhnt bis"
Hmm... sieht so aus, also ob ich beim Projektmanager und Formdesigner erst mal völlig falsch war und dass man die Form am besten manuell erstellt, oder?
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Einfaches Projekt zum Runterladen?

Beitrag von mk-soft »

Der FormDesigner von PB Funktioniert, ist aber etwas eingeschränkt. Die Event Erstellung sollte man in Einstellungen -> Form ausschalten und diese selber Programmieren. Auch mehrere Fenster zu erstellen geht, aber als einzelne Form Dateien. Man muss aber selber auf die ID Kennung achten (Variablen oder Konstanten)
Ich selber bevorzuge Konstanten mit Enumeration (Einstellungen -> Form)

Wichtig im Event Managment
Es gibt im Programm IMMER nur eine Event-Schleife und in dieser IMMER nur einmal die Funktion "WaitWindowEvent()"
Die Funktion WaitWindowEvent ist die Übergabeschnittstelle von Ereignisse vom Betriebssystem zu deinem Programm.
Diese müssen in einer Endlos-Schleife ohne Pause (Delay) ständig abgearbeitet werden.

Pause ...

Abfragen der Ereignisse:
Es ist wichtig bei der Abfrage von Ereignisse die Hierarchie einzuhalten. Das heisst die Abfrage von welchen Gadget das Ereignis kommt, "EventGadget()", wenn von WaitWindowEvent das Ereignis #PB_Event_Gadget ansteht.

Ein kleines Grundgerüst um Programme zum testen zu erstellen

Code: Alles auswählen

;-TOP

; Constant
Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBars
  #Menu
EndEnumeration

Enumeration MenuItems
  #MenuExitApplication
EndEnumeration
  
Enumeration Gadgets
  #Splitter
  #List
  #Edit
EndEnumeration

Enumeration Statusbar
  #Status
EndEnumeration

; Global Variable
Global ExitApplication

; ***************************************************************************************

; Functions
Procedure UpdateWindowMain()
  
  Protected x, y, dx, dy, menu, status
  
  menu = MenuHeight()
  If IsStatusBar(#Status)
    status = StatusBarHeight(#Status)
  Else
    status = 0
  EndIf
  x = 0
  y = 0
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - menu - status
  ResizeGadget(#Splitter, x, y, dx, dy)
  
EndProcedure

; ***************************************************************************************

Procedure MyLogs(Text.s)
  
  Protected temp.s, c
  
  temp = FormatDate("%HH.%II.%SS - ", Date())
  temp + Text
  AddGadgetItem(#List, -1, temp)
  c = CountGadgetItems(#List)
  If c > 1000
    RemoveGadgetItem(#List, 0)
    c - 1
  EndIf
  c - 1
  SetGadgetState(#List, c)
  SetGadgetState(#List, -1)
  
EndProcedure

Global MutexLogs = CreateMutex()

Macro Logs(Text)
  LockMutex(MutexLogs) : MyLogs(Text) : UnlockMutex(MutexLogs)
EndMacro

; ***************************************************************************************

;- Main

Procedure Main()
  
  Protected event, style, dx, dy
  
  style = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
  dx = 800
  dy = 600
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, dx, dy, "Main", style)
    
    ; Menu
    CreateMenu(#Menu, WindowID(#Main))
    MenuTitle("Ablage")
    MenuItem(#MenuExitApplication, "Be&enden")
    
    ; Gadgets
    ListViewGadget(#List, 0, 0, 0, 0)
    EditorGadget(#Edit, 0, 0, 0, 0)
    SplitterGadget(#Splitter, 0, 0, dx ,dy, #List, #Edit)
    SetGadgetState(#Splitter, dy * 2 / 3)
    
    ; Statusbar
    CreateStatusBar(#Status, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; For Mac
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      ; Mac default menu
      If Not IsMenu(#Menu)
        CreateMenu(#Menu, WindowID(#Main))
      EndIf
      MenuItem(#PB_Menu_About, "")
      MenuItem(#PB_Menu_Preferences, "")
    CompilerEndIf
    
    UpdateWindowMain()
    
    BindEvent(#PB_Event_SizeWindow, @UpdateWindowMain(), #Main)
    
    ; Main Loop
    Repeat
      event = WaitWindowEvent()
      Select event
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                MessageRequester("Info", "Basis v1.0")
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                ExitApplication = #True
                
            CompilerEndIf
              
            Case #MenuExitApplication
              ExitApplication = #True
              
          EndSelect
              
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #List
              Select EventType()
                Case #PB_EventType_LeftClick
                  
                Case #PB_EventType_LeftDoubleClick
                  
                Case #PB_EventType_RightClick
                
              EndSelect
                  
            Case #Edit
              Select EventType()
                Case #PB_EventType_Change
                  
              EndSelect
              
          EndSelect
          
        Case #PB_Event_SizeWindow
          Select EventWindow()
            Case #Main
              ; UpdateWindow() ; Bearbeitung über BindEvent
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              ExitApplication = #True
              
          EndSelect
          
      EndSelect
      
    Until ExitApplication
    
  EndIf
  
EndProcedure : Main()

End

;- BOTTOM
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Einfaches Projekt zum Runterladen?

Beitrag von Plenz »

Danke für diese Hinweise, aber zuerst verwirrt mich noch der grundsätzliche Aufbau eines Programms.

Der Form.Desingner erzeugt Prozeduren:

Code: Alles auswählen

Global Window_0

Global Canvas_0, Button_0

Procedure OpenWindow_0(x = 0, y = 0, width = 810, height = 550)
....
EndProcedure

Procedure Window_0_Events(event)
....
EndProcedure
aber in den Beispielen ist alles in riesige IF-Blöcke gepackt:

Code: Alles auswählen

If OpenWindow(0, 100, 100, 500, 300, "PureBasic - Image")
  If CreateImage(0, 255, 255)
    ....
  Endif
  ....
Endif
Gibt es irgendwelche Gründe für oder gegen eine dieser Versionen?
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Einfaches Projekt zum Runterladen?

Beitrag von mk-soft »

Man sollte immer prüfen ob eine Funktion erfolgreich abgeschlossen wurde und nicht von ausgehen das es schon geht.

Daher prüfe ich nach dem Aufruf OpenWindow_XYZ (FormDesigner) mit IsWindow ob das Fenster existiert. (nicht immer)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: Einfaches Projekt zum Runterladen?

Beitrag von Axolotl »

Ich kann aus eigener Erfahrung sagen, dass am Anfang die Syntax komisch aussieht. Allerdings versteht man nach kurzer Zeit die Logik.
Es ist a.m.S. hilfreich wenn man sich mit der Ereignis-verabreitung (also den Hintergründen von Windows) auskennt.
Nur Mut und ausprobieren.

Anmerkung: Leider sind viele Beispiele (inklusive des FormDesigner-Codes) ohne Abfrage der Rückgabewerte. Das sollte meistens funktionieren, aber wenn nicht ...

Darüberhinaus empfehle ich noch die Verwendung von EnableExplicit und die Debug -Funktion.
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Einfaches Projekt zum Runterladen?

Beitrag von tft »

Hallo,
die Prüfung des Rückgabe wertes macht sinn. Du must aber immer eine Fehlerausgabe dranhängen. Sonst weist du nicht warum da etwas nicht funktioniert. Und da man bei fielen Sachen den Rückgabe wert ja braucht. Empfehle ich folgende Schreibweise. Nur als Beispiel.

Code: Alles auswählen

Define Hwnd = OpenWindow(0,0,0,200,200,"Client") : If Hwnd = 0 : BreakCode(#PB_Compiler_Line,"Konnte Fenster nicht öffnen") : EndIf
In PB gibt es fiele Wege. Unten ist ein kleines Standard Programm das ich immer zum austesten benutze. In diesem Fall zum testen der Netzwerk Funktion. Es ist so konstruiert, das ich lange If Blöcke vermeide. Denn auch die finde ich sehr mühsam. Die Font Sachen mache ich. Weil ich auf FullHD Monitoren Arbeite. Mit den ";{" und ";}" definiere ich einen Bereich, der im Code Optisch zusammengeklappt werden kann. Ich benutze eine andere Event Abfrage. Die aber genauso Funktioniert. Die Funktion BreakCode(#PB_Compiler_Line,"Konnte Fenster nicht öffnen"), gibt dann in dem separaten Consolenfenster gleichzeitig die Nummer der Zeile aus. Wo der Fehler entstand. Das ist nur ein Beispiel. Du wirst sicher mit der Zeit deine eigene Vorgehensweise finden.

Code: Alles auswählen

EnableExplicit

InitNetwork()

;{ Consolen Font ändern

; Aufrufen nach öffnen der Console mit "ConsoleFont(#Null,#Null,"Lucida Console",20)"
Import "kernel32.lib"
  SetCurrentConsoleFontEx.i(hConsoleOutput.i,bMaximumWindow.i,*lpConsoleCurrentFontEx)
EndImport

Structure CONSOLE_FONT_INFO_EX
  cbSize.l
  nFont.l
  dwFontSize.COORD
  FontFamily.l
  FontWeight.l
  FaceName.w[#LF_FACESIZE]
EndStructure

Procedure.i ConsoleFont(*Buffer,BufferSize.i,FontName.s,FontSize.i)
  Protected cfiex.CONSOLE_FONT_INFO_EX
  Protected res.i
  Protected length.i
  Protected font_resource.i
  With cfiex
    length = Len(FontName)
    If length < #LF_FACESIZE
      \cbSize = SizeOf(CONSOLE_FONT_INFO_EX)
      \nFont = #Null
      \dwFontSize\x = #Null
      \dwFontSize\y = FontSize
      \FontFamily = #FF_DONTCARE
      \FontWeight = #FW_DONTCARE
      If *Buffer And BufferSize
        AddFontMemResourceEx_(*Buffer,BufferSize,#Null,@res)
      EndIf
      length << 1
      CopyMemory(@FontName,@\FaceName[0],length)
      ProcedureReturn SetCurrentConsoleFontEx(GetStdHandle_(#STD_OUTPUT_HANDLE),#False,@cfiex)
    EndIf
    ProcedureReturn #False
  EndWith
EndProcedure

Procedure BreakCode(line,error.s)
  OpenConsole() 
  ConsoleFont(#Null,#Null,"Lucida Console",16)
  Debug("Line : "+Str(line)+" "+error.s) 
  PrintN("Line : "+Str(line)+" "+error.s)   
  Input() 
  End 
EndProcedure

;}

Define Hwnd = OpenWindow(0,0,0,200,200,"Client") : If Hwnd = 0 : BreakCode(#PB_Compiler_Line,"Konnte Fenster nicht öffnen") : EndIf

Define Verbindung = OpenNetworkConnection("127.0.0.1", 6000 ,#PB_Network_TCP , 10000 ,"127.0.0.1") : If Verbindung = 0 : BreakCode(#PB_Compiler_Line,"Konnte Netzwerk nicht öffnen") : EndIf

Define Event, Exit

Repeat
  
  Event = WindowEvent() 
  If Event  > 0  
    While Event > 0
      Select Event 
        Case #PB_Event_CloseWindow 
          Exit = 1 
      EndSelect
      Event = WindowEvent() 
    Wend
  EndIf
  
  Delay(1)
  
Until Exit = 1 

End
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Einfaches Projekt zum Runterladen?

Beitrag von Plenz »

Ja, PureBasic ist extrem gewöhnungsbedürftig und wird ganz bestimmt nicht meine Lieblingssprache, aber allmählich komme ich damit zurecht.
Antworten