[PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von ChrigiGee »

Hallo und guten Abend @all

Ich habe mal die Source adaptiert von H. Bill für mich.
Ich hoffe, dass ich im Allgemeinen nichts übersehen habe, solange ich die Prozedur nicht ansprechen möchte, klappt so weit alles denke ich.

Aber sobald die Prozedur ins Spiel kommt, gibt es folgende Error Meldung:
[19:48:02] [COMPILER] Zeile 6: Eine Prozedur kann nicht innerhalb von If, Repeat, While oder For deklariert werden.
Dies habe ich als Effekt, auch wenn ich über die vorgeschlagene Version von Axolotl gehe.
Ich bin da unsicher, ob ich etwas Falsch mache oder ob diese Auslegung korrekt ist.

Resp. Ob diese Error Meldung in früheren Version PB nicht war.

Andernfalls bin ich immer noch am Anfang meiner Bemühungen.

Herzliche Grüsse & hoffentlich sind alle Gut in die Woche gestartet
Christian

Adaption aus der Vorlage von H. Bill:

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-27
;        Version: Alpha 9
;     PB-Version: 6.11
;             OS: WIN 11
;         Credit:
;          Forum:
;     Created by: H. Bill & Axolotl & HeX0R 
; -----------------------------------------------------------------------------

Enumeration Gadgets
  #Str_Source_DIR
  #Str_Target_DIR
  #Str_Patch_DIR
EndEnumeration

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

;- Define 
Define Pattern

Procedure ButtonHandler()
  ;Debug "Button click event on gadget #" + EventGadget()
  ; wenn man hier den EventGadget mit EventGadget() ermittelt und mit If... abfragt,
  ; hat man eine Universal-Procedure für alle anfallenden Button-Gadgets
  If EventGadget() = 2 
  
            InitialPath1$ = "C:\Users\cschaer\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)
            
            SetGadgetText(#Str_Source_DIR, File1$) 
            

  ElseIf EventGadget() = 3

             InitialPath2$ = "C:\Users\cschaer\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 = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
            File2$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath2$, Pattern$, Pattern)
            
            SetGadgetText(#Str_Target_DIR, File2$) 
            DisableGadget(4, #False) ;<-- 

  ElseIf EventGadget() = 4
  
             InitialPath3$ = "C:\Users\cschaer\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 = 1    ; wir verwenden den ersten von drei möglichen Pattern als Standard
            File3$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath3$, Pattern$, Pattern)
            
            SetGadgetText(#Str_Patch_DIR, File3$) 
            IncludeFile "createpatch.pbi"
;            DisableGadget(#Btn_Execute, #True) ;<-- 
    
  EndIf  
;  SetGadgetState(2, CountGadgetItems(2))
EndProcedure
  
  OpenWindow(0, 100, 100, 500, 400, "Click test", #PB_Window_SystemMenu)
  
    StringGadget(#Str_Source_DIR, 8,  30, 306, 20, File1$, #PB_String_ReadOnly)   ;- Datei DIR
    StringGadget(#Str_Target_DIR, 8,  50, 306, 20, File2$, #PB_String_ReadOnly)  ;- Datei DIR
    StringGadget(#Str_Patch_DIR, 8,  80, 306, 20, File3$, #PB_String_ReadOnly)   ;- Datei DIR
    
  DisableGadget(4, #True) ;<-- 
  
  ButtonGadget(2, 10, 200, 180, 30, "Source-File") 
  BindGadgetEvent(2, @ButtonHandler())
  
  ButtonGadget(3, 10, 250, 180, 30, "Target File") 
  BindGadgetEvent(3, @ButtonHandler())
  
   ButtonGadget(4, 10, 300, 180, 30, "Patch File")
  BindGadgetEvent(4, @ButtonHandler())
  
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
  
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von HeX0R »

ChrigiGee hat geschrieben: 27.08.2024 20:01 Resp. Ob diese Error Meldung in früheren Version PB nicht war.
Die Fehlermeldung gab es schon immer, Dein IncludeFile ist völlig deplatziert.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von ChrigiGee »

Hallo HeX0R,

Danke für die schnelle Antwort, dann mache ich mich mal ran, am Suchen wie ich das Lösen kann.
Dann habe ich einen kolossalen Überlegungfehler.

Einen schönen Abend und beste Grüsse aus Bern
Christian

HeX0R hat geschrieben: 27.08.2024 22:19
ChrigiGee hat geschrieben: 27.08.2024 20:01 Resp. Ob diese Error Meldung in früheren Version PB nicht war.
Die Fehlermeldung gab es schon immer, Dein IncludeFile ist völlig deplatziert.
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von H.Brill »

1. Wie Hexor schon schrieb

Code: Alles auswählen

IncludeFile "createpatch.pbi"
Passiert in einem IF- Statement und in der .pbi wird mit Bestimmtheit auch noch eine Procedure deklariert.
Solche Includedatei, wie .pbi oder .inc lade ich immer schon am Anfang meines Hauptquelltextes, spätestens dann,
wenn es evtl. eine Compiler-Direktive erfordert.

2. DisableGadget(4, #True) ;<--
Du kannst kein Gadget aktiv oder inaktiv machen, bevor du es überhaupt erzeugt hast. Das machst du ja erst
5 Zeilen weiter. Halt ein ganz banaler Fehler, der uns allen ab und an passiert. Also setze

Code: Alles auswählen

DisableGadget(4, #True) ;<--
vor die Repeat-Schleife.
PB 6.10
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von Kiffi »

des weiteren solltest Du die Enumerierung der Gadgets fortführen. Damit versiehst Du Du alle Gadgets mit aussagekräftigen Namen und musst später nicht rätseln, welche Funktion beispielsweise das Gadget mit der Nummer 4 hat.

Code: Alles auswählen

Enumeration Gadgets
  
  #Str_Source_DIR
  #Str_Target_DIR
  #Str_Patch_DIR
  
  #Button_Select_Source_DIR
  #Button_Select_Target_DIR
  #Button_Patch
   
EndEnumeration

[...]

ButtonGadget(#Button_Select_Source_DIR, 10, 200, 180, 30, "Source-File") 
BindGadgetEvent(#Button_Select_Source_DIR, @ButtonHandler())

ButtonGadget(#Button_Select_Target_DIR, 10, 250, 180, 30, "Target File") 
BindGadgetEvent(#Button_Select_Target_DIR, @ButtonHandler())

ButtonGadget(#Button_Patch, 10, 300, 180, 30, "Patch File")
BindGadgetEvent(#Button_Patch, @ButtonHandler())

DisableGadget(#Button_Patch, #True)
und die Zahlen in ButtonHandler() entsprechend auch durch die Konstanten ersetzen:

Code: Alles auswählen

Procedure ButtonHandler()
  
  If EventGadget() = #Button_Select_Source_DIR
    [...]
  ElseIf EventGadget() = #Button_Select_Target_DIR
    [...]
  ElseIf EventGadget() = #Button_Patch
    [...]
  EndIf  
  
EndProcedure
a²+b²=mc²
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von Axolotl »

Hallo ChrigiGee,

vielleicht wäre es ganz gut, wenn Du Dir mal die folgenden Grundlagen-Dokumente anschaust. Dann kannst Du unsere Hilfestellungen besser einordnen und anwenden.

Quellen:
1. Die PB-Hilfe ist sehr umfangreich und passt zur verwendeten PB-IDE (Compiler).
Hier gibt es zu vielen Befehlen ein ausführbares Beispiel.
2. Documentation
3. PureBasicBuch Aber: Stand ist 2011, Ausführung der Beispiele kann dann zu Compiler-Fehlern führen.
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von H.Brill »

Nunja, mit den älteren Quellcodes bekommt er ja nur noch mehr Fehler. Da ist PB halt nicht sehr abwärtskompatibel.
Das hatte ich immer bei XProfan geliebt, daß RGH die älteren Befehle / Funktionen immer noch einige Zeit drinnen gelassen
hatte. Hier hilft halt das sorgfältige Lesen der Hilfe und das Schärfen der Logik. Hauptsächlich Letzteres trägt mit der Zeit
und Übung zur Fehlerfindung bei. Das war bei mir nicht anders. Erst, wenn man eine gewisse Routine darin hat, fängt es an,
Spaß zu machen und sogar bei anderen, wie hier jetzt, bei der Fehlersuche zu helfen. Mir hat auch oft eine Zigaretten - oder
Kaffeepause geholfen. Nach dieser fiel es mir wie Schuppen von den Augen.
Also genaues Lesen von solchen PB-Fehlermeldungen bringt schon was. Wenn der Compiler meint, eine deklarierte Procedure
in einer IF-Anweisung oder einer Schleife gefunden zu haben, ist es doch erst mal logisch, auch die Includedatei(en) bzw. .pbi
zu durchforsten, wenn halt welche eingebunden sind. Dem Compiler ist es egal, der nimmt beides als einziges ganzes Stück
Quelltext.
Also nicht verzagen, das wird mit der Zeit immer besser. Bis dahin helfen wir ja gerne.
PB 6.10
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von ChrigiGee »

Hallo Axolotl,

Vielen Dank für Deine zusätzlichen hilfreichen Informationen.
Ich werde mich diesen gerne zusätzlich widmen.

Das PDF habe ich bereits mal heruntergeladen.

Werde wohl um etwas vertiefte Grundlagen Studuim nicht herum kommen.

Herzliche Grüsse aus Bern
Christian
Axolotl hat geschrieben: 28.08.2024 12:40 Hallo ChrigiGee,

vielleicht wäre es ganz gut, wenn Du Dir mal die folgenden Grundlagen-Dokumente anschaust. Dann kannst Du unsere Hilfestellungen besser einordnen und anwenden.

Quellen:
1. Die PB-Hilfe ist sehr umfangreich und passt zur verwendeten PB-IDE (Compiler).
Hier gibt es zu vielen Befehlen ein ausführbares Beispiel.
2. Documentation
3. PureBasicBuch Aber: Stand ist 2011, Ausführung der Beispiele kann dann zu Compiler-Fehlern führen.
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von ChrigiGee »

Hallo H. Brill,

Und, ja, ich glaube eine Brille bis zur Brille hätte ich die letzten Post's wohl gebrauchen können.
Das "R" ist mir nicht aufgefallen. Na ja, lieber spät als NIE.

Bei meinem skurrilen Hintergrund, 1 Nacht, 2 Liter Café und 1 Stange Zigaretten später und der Knopf löst sich.
Aber manchmal bin ich dann schon dankbar, dass jemand mir einen auf den Kopf haut und meint, so nicht möglich.

Die letzten Tage sind jedenfalls recht viele Cafés in meiner Tasse gelandet.

Die Problematik aus "alt macht neu" habe ich mit PB unterdessen gelernt.
Leider gibt es für die aktuelle Version wohl keine Möglichkeit alten Source hochzustufen auf die 6.11er.

Es gab mal ein Tool, habe ich gefunden für 3er-Version zu 4er-Version.
Wird aber wohl nicht aktiv gepflegt momentan.

Mann könnte die PlugIn Datei sicherlich anpassen, aber auch das wäre ein sehr grosser aufwand,
zusätzlich zu dem, was ich momentan am Machen bin.

Zumal es dafür keinen geeigneten Editor gibt, der eine gewisse Arbeit abnehmen würde für die Aktualisierung der PlugIn Datei.

Aber vielleicht widme ich mich diesem auch mal noch....
Somit widme ich mich wieder meinen Projekt-Teilen, die ich habe.


Herzliche Grüsse aus Bern
Christian
H.Brill hat geschrieben: 28.08.2024 13:51 Nunja, mit den älteren Quellcodes bekommt er ja nur noch mehr Fehler. Da ist PB halt nicht sehr abwärtskompatibel.
Das hatte ich immer bei XProfan geliebt, daß RGH die älteren Befehle / Funktionen immer noch einige Zeit drinnen gelassen
hatte. Hier hilft halt das sorgfältige Lesen der Hilfe und das Schärfen der Logik. Hauptsächlich Letzteres trägt mit der Zeit
und Übung zur Fehlerfindung bei. Das war bei mir nicht anders. Erst, wenn man eine gewisse Routine darin hat, fängt es an,
Spaß zu machen und sogar bei anderen, wie hier jetzt, bei der Fehlersuche zu helfen. Mir hat auch oft eine Zigaretten - oder
Kaffeepause geholfen. Nach dieser fiel es mir wie Schuppen von den Augen.
Also genaues Lesen von solchen PB-Fehlermeldungen bringt schon was. Wenn der Compiler meint, eine deklarierte Procedure
in einer IF-Anweisung oder einer Schleife gefunden zu haben, ist es doch erst mal logisch, auch die Includedatei(en) bzw. .pbi
zu durchforsten, wenn halt welche eingebunden sind. Dem Compiler ist es egal, der nimmt beides als einziges ganzes Stück
Quelltext.
Also nicht verzagen, das wird mit der Zeit immer besser. Bis dahin helfen wir ja gerne.
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von ChrigiGee »

Hallo @all und guten Abend,

Die Kernproblematik, welche sich mir stellt:

Ich habe zwei Prozeduren (Zeit 3er-Version oder 4er-Version PureBasic)
Meine Überlegung wäre, dass ich diese beiden Prozeduren als pbi verwende und ich eigentlich nur noch eine GUI
dazu benötige.

Die Prozeduren selber: Erstellen eines Patch und verarbeiten der Patch Datei.

Eine Problematik, die sich ergibt, die beiden Prozeduren benötigen 3 Dateien resp. 2 Dateien.
Diese sind in der Prozedur noch nicht existent oder bekannt.

Über die GUI würde ich die entsprechenden Dateien versuchen, der Prozedur zu übergeben.

Die GUI wäre also die Lösung, aber da die GUI und den Button zur Suche der erforderlichen Dateien
über eine Schlaufen, "if, then else" abgearbeitet werden ergibt sich daraus die nächste bestehende Problemstellung.

Die Prozedur kann nicht aus einer Schlaufe angesprochen werden.
Vielleicht war "meine" Fragestellung zu unpräzise oder schlicht falsch formuliert.

Ich war wohl auch bei den verschiedenen Lösungs Vorgehensweisen nicht immer korrekt vorgegangen.
Unwissenheit schützt einem nicht.

Bis jetzt habe ich noch nicht aufgegeben und habe eine weitere Möglichkeit welche zumindest noch keinen Error
verursacht, aber auch noch keinen Patch erstellt.

nachdem ich so viele Vorschläge bekommen habe und es u.U. wieder jemand versuchen möchte,
werde ich die weiteren Ausbauschritte sehr gerne hier dokumentieren und hier natürlich diese Vorstellen.

Herzlichen Dank undeinen schönen Abend
Christian


GUI Versuch für das einbinden der patchmaker Prozedur, makepatch.pbi

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-28
;        Version: Alpha 9c
;     PB-Version: 6.11
;             OS: WIN 11
;         Credit:
;          Forum:
;     Created by: IceDesign
; -----------------------------------------------------------------------------

Enumeration Gadgets
  #Str_Source_DIR
  #Str_Target_DIR
  #Str_Patch_DIR
EndEnumeration

;| == 2. Global Variablen 

;- 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 -  

;- Define 
Define Pattern


Procedure ButtonHandler()
  ;Debug "Button click event on gadget #" + EventGadget()
  ; wenn man hier den EventGadget mit EventGadget() ermittelt und mit If... abfragt,
  ; hat man eine Universal-Procedure für alle anfallenden Button-Gadgets
  If EventGadget() = 3 
  
            InitialPath1$ = "C:\Users\cschaer\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)
            SetGadgetText(#Str_Source_DIR, File1$)
            

  ElseIf EventGadget() = 4
  
        InitialPath2$ = "C:\Users\cschaer\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 = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
            File2$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath2$, Pattern$, Pattern)
            SetGadgetText(#Str_Target_DIR, File2$) 
            
  ElseIf EventGadget() = 5          
  
            InitialPath3$ = "C:\Users\cschaer\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 = 1    ; wir verwenden den ersten von drei möglichen Pattern als Standard
            File3$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath3$, Pattern$, Pattern)
            SetGadgetText(#Str_Patch_DIR, File3$) 
  
  EndIf  

EndProcedure

IncludeFile "createpatch.pbi"

;- Main Program
OpenWindow(0,100, 100, 500, 400, "Patch my App", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)


    StringGadget(#Str_Source_DIR, 8,  30, 306, 20, File1$, #PB_String_ReadOnly)   ;- Datei DIR
    StringGadget(#Str_Target_DIR, 8,  60, 306, 20, File2$, #PB_String_ReadOnly)  ;- Datei DIR
    StringGadget(#Str_Patch_DIR, 8,  90, 306, 20, File3$, #PB_String_ReadOnly)   ;- Datei DIR
    

  ButtonGadget(3, 10, 200, 180, 30, "Source File")
  BindGadgetEvent(3, @ButtonHandler())
  
  ButtonGadget(4, 10, 250, 180, 30, "Target File")
  BindGadgetEvent(4, @ButtonHandler())
  
  ButtonGadget(5, 10, 300, 180, 30, "Patch File")
  BindGadgetEvent(5, @ButtonHandler())
  


   Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
über die Versuche mit einer GUI ein wenig angepasst worden.
Die beiden alten Prozeduren:

patchmaker:

Code: Alles auswählen

;createpatch(file1.s,file2.s,patchpath.s)
;file1 = Pfad zur alten Version einer Datei
;file2 = Pfad zur neuen Version einer Datei
;Patchpath = Speicherpfad des Patches 

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
  
  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
EndProcedure
Diese Prozedur ist noch in der Urversion vorhanden ohne Änderungen
patch it Prozedur:

Code: Alles auswählen

;patchit(file1.s,pak.s)
;file1 = Pfad zur alten Version einer Datei
;pak = Pfad zum Patch

Procedure patchit(file1.s,pak.s)
  Protected ByteOld.b , ByteDiff.b
  Protected PakMD5.s
  Protected PakSize.l, i.l
  Protected *Patch, *DataFile
  
  OpenPack(0,pak)
  *Patch = NextPackEntry(0)
  PakSize = PackEntrySize(0)
  PakMD5 =  PeekS(*Patch,32)
  
  If FileFingerprint(file1, #PB_Cipher_MD5) <> PakMD5  ;MD5 überprüfen
    ProcedureReturn #False
  EndIf
  
  CopyFile(file1,file1+".backup") ;Backup erstellen
  OpenFile(0,file1)
  
  For i = 33 To PakSize ;Nachdem MD5Header weiterlesen
    FileSeek(0,i-33)
    ByteOld = ReadByte(0)
    ByteDiff = PeekB(*Patch+i)
    FileSeek(0,i-33)
    WriteByte(0,ByteOld-ByteDiff)
  Next i
  
  If (PakSize-33) < Lof(0)  ;Wenn Original-Datei > Update Datei, dann....
    FileSeek(0,0)
    *DataFile = AllocateMemory(PakSize-33)
    ReadData(0,*DataFile,PakSize-33)
    CloseFile(0)
    DeleteFile(file1)
    CreateFile(0,file1)
    WriteData(0,*DataFile,PakSize-33)
  EndIf
  
  CloseFile(0)
  ClosePack(0)
  FreeMemory(*Patch)
  FreeMemory(*DataFile)
  ProcedureReturn #True
EndProcedure
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Antworten