Seite 1 von 3
Einfaches Projekt zum Runterladen?
Verfasst: 05.05.2021 01:34
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?
Re: Einfaches Projekt zum Runerladen?
Verfasst: 05.05.2021 06:36
von DrShrek
Examples Ordner waere auch vorhanden

Re: Einfaches Projekt zum Runerladen?
Verfasst: 05.05.2021 09:12
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 ...
Re: Einfaches Projekt zum Runterladen?
Verfasst: 05.05.2021 15:13
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?
Re: Einfaches Projekt zum Runterladen?
Verfasst: 05.05.2021 19:15
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
Re: Einfaches Projekt zum Runterladen?
Verfasst: 05.05.2021 22:22
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?
Re: Einfaches Projekt zum Runterladen?
Verfasst: 06.05.2021 09:00
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)
Re: Einfaches Projekt zum Runterladen?
Verfasst: 06.05.2021 14:41
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.
Re: Einfaches Projekt zum Runterladen?
Verfasst: 06.05.2021 17:47
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
Re: Einfaches Projekt zum Runterladen?
Verfasst: 06.05.2021 17:48
von Plenz
Ja, PureBasic ist extrem gewöhnungsbedürftig und wird ganz bestimmt nicht meine Lieblingssprache, aber allmählich komme ich damit zurecht.