Hallo und guten Abend @all,
Ich bin etwas am hin und her versuchen, komme jedoch über eine Error Meldung nicht hinweg.
Die in '@Callback()' angegebene Prozedur hat nicht das benötigte Argument bzw. den Rückgabetyp.[21:34:12] Das Programm wurde beendet.
Sie wird ausgelöst im Bereich:
Code: Alles auswählen
InitialPath3$ = "C:\Users\Documents\my Basic\PureBasic\my Patch\new\patch.csp" ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
Pattern$ = "executable (*.exe;*.dll)|*.exe;*.dll|Alle Dateien (*.*)|*.*"
Pattern = 0 ; wir verwenden den ersten von drei möglichen Pattern als Standard
File3$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath3$, Pattern$, Pattern)
If File3$
SetGadgetText(#Str_Patch_DIR, File3$)
DisableGadget(#Btn_Execute, #True) ;<--
BindGadgetEvent(1, @createpatch()) <==== @Callback Error
Else
MessageRequester("Information", "Der Requester wurde abgebrochen.", 0)
EndIf
EndSelect
Zuerst habe ich es ohne:
If EventGadget() = XYZ
Versucht, bekomme jedoch das Gleiche Problem mit und ohne.
Das so meine heutigen "misserfolge" was den Gesammt Source nun angeht.
Auf das Gleiche Resultat bin ich gekommen, wenn ich die Prozedure als InfludeFile geladewn habe.
Es hatte also keinen Einfluss ob es im Source Teil der GUI war oder asl separat vorhandene pbi Datei.
Ich versuche momentan meine Gedankefehler zu verstehen, resp. wo ich einen Fehler eingebaut hatte.
Prozedur alleine gibt keine Fehler aus.
GUI ohne direkten zugriff auf die Prozedur ergibt meines Erachten auch noch keine Fehler
Somit habe ich etwas missverstanden beim zusammenstellen dieser Elemente, GUI, Button und der Prozedur.
Schönen Abend und angenehmen ausklang des Wochenende
Christian
Code: Alles auswählen
;= GUI Test for the procedure createpatch.pbi and patchit.pbi
;- Top
; -----------------------------------------------------------------------------
; Name: myPatch app
; Description: GUI & patch maker + patcher
; Author: Christian & all of the PureBasic Forum
; Date: 2024-08-22
; Version: Alpha 6
; PB-Version: 6.11
; OS: WIN 11
; Credit:
; Forum:
; Created by: IceDesign
; -----------------------------------------------------------------------------
CompilerIf #PB_Compiler_IsMainFile
EnableExplicit
CompilerEndIf
;- Enumerations
Enumeration Window
#Window_0
EndEnumeration
;| == 1. Aufzählungen (Enummeration) von Controlls
;|
;| § 1.1 -- Aufliestung der benötigten Elemente der Buttons sowie vorhandener
;| Strings für die weiterführende GUI
Enumeration Gadgets
#Btn_Execute
#Btn_Source
#Btn_Target
#Str_Source_DIR
#Str_Target_DIR
#Str_Patch_DIR
EndEnumeration
;| == 2. Global Variablen
;|
;| § 2.1 -- Variablen welche Global zugewiesen werden und entsprechend auch
;| über eine Prozedure hinweg beansprucht werden kann.
;|
;| § 2.2 -- Zuweisen von Dateinamen und Verzeichnisnamen in der Variable
;- Global
Global Pattern$ ;- Auswahl welcher Dateien verwendet werden
Global File1$ ;- Source Datei für den Patch
Global File2$ ;- Target Datei für den Patch
Global File3$ ;- Patch Datei himself
Global InitialPath1$ ;- Welches verzeichnis für Source und Target
Global InitialPath2$ ;- Welches verzeichnis für Source und Target
Global InitialPath3$ ;- Welches Verzeichnis für den Patch himself
;| == 3. Define -
;|
;| § 3.1 -- Variablen welche den gleichen Wert zugewiesen wird.
;- Define
Define Pattern
;- Declare
Declare Resize_Window_0()
Declare Open_Window_0(X = 0, Y = 0, Width = 540, Height = 400)
;| == 4. Prozedure Patch Maker
;|
;| § 4.1 -- Unabhängiger Teil zur erstellung des Patch File in der Anwendung
Procedure createpatch(File1$,File2$,File3$)
Protected MemPoint.l = 0 , LenOfFile1.l , LenOfFile2.l
Protected ByteOld.b , ByteNew.b
Protected *Data1, *Data2, *Data3
UseMD5Fingerprint()
;Wenn file1 = file2, Prozedure verlassen
If FileFingerprint(File1$, #PB_Cipher_MD5) = FileFingerprint(File2$,#PB_Cipher_MD5)
ProcedureReturn #False
EndIf
; If EventGadget() = 3
ReadFile(0,File1$)
ReadFile(1,File2$)
LenOfFile1 = Lof(0)
LenOfFile2 = Lof(1)
*Data1 = AllocateMemory(LenOfFile1)
*Data2 = AllocateMemory(LenOfFile2)
*Data3 = AllocateMemory(LenOfFile2+33) ; '+33' für den MD5 Header
ReadData(0,*Data1,LenOfFile1)
ReadData(1,*Data2,LenOfFile2)
PokeS(*Data3,FileFingerprint(File1$,#PB_Cipher_MD5)) ; Speichert MD5Fingerprint
While MemPoint < LenOfFile2
If MemPoint < LenOfFile1
ByteOld = PeekB(*Data1+MemPoint)
Else
ByteOld = 0
EndIf
ByteNew = PeekB(*Data2+MemPoint)
If ByteOld = ByteNew
PokeB(*Data3+33+MemPoint,0) ;ja nicht den MD5 Header überschreiben
Else
PokeB(*Data3+33+MemPoint,ByteOld-ByteNew)
EndIf
MemPoint = MemPoint + 1
Wend
CreatePack(0,File3$ ,9)
AddPackMemory(0,*Data3,LenOfFile2+33,File2$)
ClosePack(0)
CloseFile(0) ;keine Ahnung wann man am besten file1 u. file2 closed
CloseFile(1)
FreeMemory(*Data1)
FreeMemory(*Data2)
FreeMemory(*Data3)
ProcedureReturn #True
; EndIf
EndProcedure
;| == 5. Prozedure Fenster
;|
;| § 5.1 -- Unabhängiger Teil zur Beschreibung des Fensters in der Anwendung
;| § 5.2 -- Fenster öffnen sowie zuweisen der verwendeten Elemente, Button, Grösse des Fenster
;| sowie Grösse und Ausrichtung der Button und der Anzeige für Dateien resp. Verzeichnisse.
;- Procedure Main Window
Procedure Resize_Window_0()
Protected Window_0_WidthIni = 540, Window_0_HeightIni = 400
Protected ScaleX.f, ScaleY.f
ScaleX = WindowWidth(#Window_0) / Window_0_WidthIni : ScaleY = WindowHeight(#Window_0) / Window_0_HeightIni
ResizeGadget(#Btn_Source, ScaleX * 40, ScaleY * 270, ScaleX * 100, ScaleY * 45)
ResizeGadget(#Btn_Target, ScaleX * 170, ScaleY * 270, ScaleX * 100, ScaleY * 45)
ResizeGadget(#Btn_Execute, ScaleX * 320, ScaleY * 270, ScaleX * 130, ScaleY * 45)
EndProcedure
;- Procedure Open Main Window
Procedure Open_Window_0(X = 0, Y = 0, Width = 540, Height = 400)
If OpenWindow(#Window_0, X, Y, Width, Height, "Patch my App", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
ButtonGadget(#Btn_Source, 40, 270, 100, 45, "Source Dir")
ButtonGadget(#Btn_Target, 170, 270, 100, 45, "Target Diir")
DisableGadget(#Btn_Target, #True)
ButtonGadget(#Btn_Execute, 320, 270, 130, 45, "Execute")
DisableGadget(#Btn_Execute, #True)
StringGadget(#Str_Source_DIR, 8, 80, 306, 20, File1$, #PB_String_ReadOnly) ;- Datei DIR
StringGadget(#Str_Target_DIR, 8, 100, 306, 20, File2$, #PB_String_ReadOnly) ;- Datei DIR
StringGadget(#Str_Patch_DIR, 8, 120, 306, 20, File3$, #PB_String_ReadOnly) ;- Datei DIR
BindEvent(#PB_Event_SizeWindow, @Resize_Window_0(), #Window_0)
PostEvent(#PB_Event_SizeWindow, #Window_0, 0)
ProcedureReturn #True
EndIf
EndProcedure
; XIncludeFile "createpatch.pbi"
;| == 6. Hauptanwendung
;|
;| § 6.1 -- Starrten der eigentlichen Anwendung
;| § 6.2 -- Anweden der benötigten Button mit zuweisen der Funktion
CompilerIf #PB_Compiler_IsMainFile
;- Main Program
If Open_Window_0()
;- Event Loop
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
;-> Event Gadget
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_Source ; DIR Source File
;| § 6.3 Mit dem nächsten String werden die Pattern (mit "|" als Trennzeichen) für anzuzeigende
;| Dateitypen festgelegt:
;|
;| § 6.3.0 Initial Path mit Datei Bezeichnung 'c:\old\source.txt'
;| § 6.3.1 Erster: "App's (*.exe)" als Name, ".exe" und ".dll" als erlaubte Dateiendungen
;| § 6.3.2 Zweiter: "Alle Dateien (*.*) als Name, "*.*" als erlaubte Dateiendung, gültig für alle Dateien
InitialPath1$ = "C:\Users\Documents\my Basic\PureBasic\source.txt" ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
Pattern$ = "executable (*.exe;*.dll)|*.exe;*.dll|Alle Dateien (*.*)|*.*"
Pattern = 0 ; wir verwenden den ersten von drei möglichen Pattern als Standard
File1$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath1$, Pattern$, Pattern)
If File1$
SetGadgetText(#Str_Source_DIR, File1$)
DisableGadget(#Btn_Source, #True) ;<-- disable ???
DisableGadget(#Btn_Target, #False) ;<--
Else
MessageRequester("Information", "Der Requester wurde abgebrochen.", 0)
EndIf
Case #Btn_Target ; DIR Target File
;| § 5.4 Mit dem nächsten String werden die Pattern (mit "|" als Trennzeichen) für anzuzeigende
;| Dateitypen festgelegt:
;|
;| § 5.4.0 Zuweisen Verzeichnis der aktuellen Datei 'C:\new\target.txt'
;| § 5.4.1 Erster: "App's (*.exe)" als Name, ".exe" und ".dll" als erlaubte Dateiendungen
;| § 5.4.2 Zweiter: "Alle Dateien (*.*) als Name, "*.*" als erlaubte Dateiendung, gültig für alle Dateien
InitialPath2$ = "C:\Users\Documents\my Basic\PureBasic\target.txt" ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
Pattern$ = "executable (*.exe;*.dll)|*.exe;*.dll|Alle Dateien (*.*)|*.*"
Pattern = 1 ; wir verwenden den ersten von drei möglichen Pattern als Standard
File2$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath2$, Pattern$, Pattern)
If File2$
SetGadgetText(#Str_Target_DIR, File2$)
DisableGadget(#Btn_Target, #True)
DisableGadget(#Btn_Execute, #False)
Else
MessageRequester("Information", "Der Requester wurde abgebrochen.", 0)
EndIf
Case #Btn_Execute ; Execute
;| § 5.5 Mit dem nächsten String werden die Pattern (mit "|" als Trennzeichen) für anzuzeigende
;| Dateitypen festgelegt:
;|
;| § 5.5.1 Zuweise des Verzeichnis sowie der Datei der den Patch selber beinhaltet. 'C:\patch\patch.ptc'
;| § 5.5.1 Erster: "App's (*.exe)" als Name, ".exe" und ".dll" als erlaubte Dateiendungen
;| § 5.5.2 Zweiter: "Alle Dateien (*.*) als Name, "*.*" als erlaubte Dateiendung, gültig für alle Dateien
InitialPath3$ = "C:\Users\Documents\my Basic\PureBasic\my Patch\new\patch.csp" ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
Pattern$ = "executable (*.exe;*.dll)|*.exe;*.dll|Alle Dateien (*.*)|*.*"
Pattern = 0 ; wir verwenden den ersten von drei möglichen Pattern als Standard
File3$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath3$, Pattern$, Pattern)
If File3$
SetGadgetText(#Str_Patch_DIR, File3$)
DisableGadget(#Btn_Execute, #True) ;<--
BindGadgetEvent(1, @createpatch())
Else
MessageRequester("Information", "Der Requester wurde abgebrochen.", 0)
EndIf
EndSelect
EndSelect
ForEver
EndIf
CompilerEndIf