Einfaches Projekt zum Runterladen?
Einfaches Projekt zum Runterladen?
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?
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?
Examples Ordner waere auch vorhanden
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Re: Einfaches Projekt zum Runerladen?
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 ...
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Einfaches Projekt zum Runterladen?
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?
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?
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
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Einfaches Projekt zum Runterladen?
Danke für diese Hinweise, aber zuerst verwirrt mich noch der grundsätzliche Aufbau eines Programms.
Der Form.Desingner erzeugt Prozeduren:
aber in den Beispielen ist alles in riesige IF-Blöcke gepackt:
Gibt es irgendwelche Gründe für oder gegen eine dieser Versionen?
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
Code: Alles auswählen
If OpenWindow(0, 100, 100, 500, 300, "PureBasic - Image")
If CreateImage(0, 255, 255)
....
Endif
....
Endif
Re: Einfaches Projekt zum Runterladen?
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)
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Einfaches Projekt zum Runterladen?
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.
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
- 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?
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.
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.
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
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
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
Re: Einfaches Projekt zum Runterladen?
Ja, PureBasic ist extrem gewöhnungsbedürftig und wird ganz bestimmt nicht meine Lieblingssprache, aber allmählich komme ich damit zurecht.