Seite 4 von 13

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 28.08.2024 20:45
von H.Brill
Was hindert dich denn daran,

Code: Alles auswählen

IncludeFile "createpatch.pbi"
ganz an den Anfang deines Sourcecodes zu schreiben ? Also noch vor der Procedure ButtonHandler().

Du kannst aber auch mal das Include weglassen und die 2 kleinen Proceduren der .pbi ganz an den Anfang setzen.
Die sind ja nicht so groß.
Und in der Procedure ButtonHandler() fütterst du deine 2 Procedureduren mit file1$ + file2$ und file3$, halt so, wie du
es vorgesehen hast. Da die Buttons dir jas nur die Dateien bereitstellen, mußt du nach dem EndIf und vor dem EndProcedure
im ButtonHandler dein

createpatch(file1$, file2$)
und
patchit(file1, file3)
aufrufen. Um von vorneherein schon Fehler zu vermeiden, würde ich vor dem createpatch und patchit die Inhalte der
drei variablen file1$, file2$ und file3$ auf Inhalt überprüpfen. Wenn der spätere Anwender ein OpenfileRequester()
abbricht, hast du Leerstrings statt Pfad + Datei in deinen Variablen. Dann kanst du immer noch mit einem MessageRequester
reagieren.

Vielleicht kommst du so besser weiter.

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 29.08.2024 09:22
von ChrigiGee
Hallo und guten Morgen, H. Brill
Hallo und guten Morgen @all

Vielen Dank für Deine Idee, ich werde es versuchen zu lösen wie ich Deinen Ansatzpunkt
verstehe.

Gerne werde ich meine Lösung auch hier wieder mit Euch teilen.
In der Zwischenzeit, Café und genügend Schlaf, haben auch Ihr Wunder gewirkt.
Ich bin noch über etwas gestossen, wo ich bis jetzt nicht gesehen hatte und das wahrlich wegen meiner Scheuklappen.

Zum momentanen Zeitpunkt, beide, die von Dir vorgeschlagene H. Brill und dem von mir gefundenen Schnipsel
kann ich noch nicht sagen wie die Lösung ausschaut, aber ich glaube, ich kommen immer näher an die Lösung
als dass ich mich wie zuvor entferne. Das auch durch meine "Blindheit" zu erkennen.

Ich wünsche Euch allen einen mega schönen Tag so kurz vor einem Wochenende....
Christian

Code: Alles auswählen

Beispiel: Aufrufen einer Funktion anhand ihres Namens

   Prototype Function()

  Runtime Procedure Function1()
      Debug "I call Function1 by its name"
  EndProcedure

  Procedure LaunchProcedure(Name.s)
      Protected ProcedureName.Function = GetRuntimeInteger(Name + "()")
      ProcedureName()
  EndProcedure

  LaunchProcedure("Function1") ; Display "I call Function1 by its name"


H.Brill hat geschrieben: 28.08.2024 20:45 Was hindert dich denn daran,

Code: Alles auswählen

IncludeFile "createpatch.pbi"
ganz an den Anfang deines Sourcecodes zu schreiben ? Also noch vor der Procedure ButtonHandler().

Du kannst aber auch mal das Include weglassen und die 2 kleinen Proceduren der .pbi ganz an den Anfang setzen.
Die sind ja nicht so groß.
Und in der Procedure ButtonHandler() fütterst du deine 2 Procedureduren mit file1$ + file2$ und file3$, halt so, wie du
es vorgesehen hast. Da die Buttons dir jas nur die Dateien bereitstellen, mußt du nach dem EndIf und vor dem EndProcedure
im ButtonHandler dein

createpatch(file1$, file2$)
und
patchit(file1, file3)
aufrufen. Um von vorneherein schon Fehler zu vermeiden, würde ich vor dem createpatch und patchit die Inhalte der
drei variablen file1$, file2$ und file3$ auf Inhalt überprüpfen. Wenn der spätere Anwender ein OpenfileRequester()
abbricht, hast du Leerstrings statt Pfad + Datei in deinen Variablen. Dann kanst du immer noch mit einem MessageRequester
reagieren.

Vielleicht kommst du so besser weiter.

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 29.08.2024 10:43
von H.Brill
Hallo, ich habe mir erlaubt, deinen obigen Code mal etwas zu verbessern.
Was mir noch auffiel, war die Enumeration : Bei den StringGadgets hast du sie gemacht,
aber bei den Buttons nicht. Wenn die Enumeration mal größer wird, kann es dann Konflikte
wegen gleichen Nummern geben. Entweder enummerierst du alle oder keine oder vergibst sie
selber.
Bei meinem Code braucht dur nur noch die .pbi am Anfang auskommentieren und im ButtonHandler()
deine Funktionen beim Button Patch-It reinschreiben.

Vergiß auch bitte erstmal die RUNTIME-Library. Die ist eher für Fortgeschrittene gedacht und irritiert hier nur,
bzw. wirft noch mehr Fragen auf.

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

;IncludeFile "createpatch.pbi"

Enumeration 1 Step 1 ; beginnt bei 1, da bei Openwindow schon 0 vergeben wird.
  #btn_Source_DIR
  #btn_Target_DIR
  #btn_Patch_DIR
  #btn_Patch_IT
  #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() = #btn_Source_DIR
  
            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() = #btn_Target_DIR

            InitialPath2$ = "C:\Users\cschaer\Documents\my Basic\PureBasic\target.txt"   ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
            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(#btn_Patch_IT, #False) 
            
  ElseIf EventGadget() = #btn_Patch_DIR
  
            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 = 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$)   
            
  ElseIf EventGadget() = #btn_Patch_IT
    If (File1$ <> "") And (File2$ <> "") And (File3$ <> "" )
      MessageRequester("Es geht los", "Info", 0)
      ; hier rufst du deine Proceduren in der .pbi auf
      
    Else
      MessageRequester("Datei(en) fehlt", "Info", 0)
    EndIf  
            
  EndIf  
EndProcedure
  
  OpenWindow(0, 100, 100, 600, 400, "Click test", #PB_Window_SystemMenu)
  
  ;DisableGadget(4, #True) ;<-- 
  
  ButtonGadget(#btn_Source_DIR, 10, 10, 180, 30, "Source-File") 
  StringGadget(#Str_Source_DIR, 200,  10, 306, 25, File1$, #PB_String_ReadOnly)   ;- Datei DIR
  BindGadgetEvent(#btn_Source_DIR, @ButtonHandler())
  
  ButtonGadget(#btn_Target_DIR, 10, 60, 180, 30, "Target File") 
  StringGadget(#Str_Target_DIR, 200,  60, 306, 25, File2$, #PB_String_ReadOnly)  ;- Datei DIR
  BindGadgetEvent(#btn_Target_DIR, @ButtonHandler())
  
  ButtonGadget(#btn_Patch_DIR, 10, 110, 180, 30, "Patch File")
  StringGadget(#Str_Patch_DIR, 200,  110, 306, 25, File3$, #PB_String_ReadOnly)   ;- Datei DIR
  BindGadgetEvent(#btn_Patch_DIR, @ButtonHandler())
  
  ButtonGadget(#btn_Patch_IT, 10, 200, 180, 30, "PATCH-IT")
  BindGadgetEvent(#btn_Patch_IT, @ButtonHandler())
  
  
  DisableGadget(#btn_Patch_IT, #True) ;<--
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
  

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 29.08.2024 10:59
von ChrigiGee
Lieber H. Brill,
Hallo @all,

Der Ansatz von H. Brill, ist genialer als zuerst gesehen.
Ich habe beim Testen festgestellt, dass die Prozedur createpatch bereits ein Problem bekommen mit dem Auswählen meiner ersten richtigen Datei.
Dummerweise existieren alle drei Dateien eigentlich nicht. (MessageRequester bereits mit der ersten Datei, da die zweite nicht existiert)

Somit verursache ich für die Prozedur bereits einen Fehler.
Entweder ich hinterlege fix im Source 2 Dateien, welche "immer" vorhanden sind.
Was auch wieder etwas dumm wäre oder ich erweitere die GUI Source mit der Möglichkeit die Path und Dateinamen der beiden ersten Dateien
in einer INI- / Preferences- Datei zu speicher.

Was mir für spätere Möglichkeiten lieber wäre, denn eine fix hinterlegte Datei kann aus was für Gründen immer verschwinden.
Das so zurzeit der Stand meiner letzten Bemühungen / Stunden.

Liebe Grüsse
Christian

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 29.08.2024 13:41
von H.Brill
Ich habe jetzt noch nicht deine Patch-Proceduren angesehen.
Schreibst du target + Patch in neue Dateien ?
Da wäre es richtiger, den Target und den Patch mit SaveFileReuqester() abzufragen.
Während OpenfileRequester() nur vorhandene Dateien auflistet, kannst du im
SaveFileRequester() eine noch nicht existente Datei unten angeben, ähnlich halt
wie das bekannte 'Speichern unter'. Du willst ja wahrscheinlich NICHT die Orriginaldatei
überschreieben. Kommt dann darauf an, wie du es handhaben möchtest. Jedenfalls würde ich das,
was neu zu speichern ist mit SaveFileRequester() erfragen. Ich vermute es mal so :
file1$ (die zu patchende, vorhandene Datei) - mit OpenfileRequester() erfragt
file2$ ist das Target, das neu geschrieben wird und mit SaveFileRequester erfragt wird.
Es weiß ja vorher keiner, wie der User seine gepatchte Datei nennen will.
file3$ ist der Patch selber. Fallls der immer das gleiche ist, würde ich den fest verankern
bzw. zum Programm mitgeben und bei Installation mit auspacken. Auch IncludeBinary ist
da eine Option.

Man muß wissen :
OpenfileRequester() verhält sich so, wie ein kleiner Mini-Explorer, der dir vorhanden Dateien
anzeigt, während SaveFileRequester() in den vorgegebenen Pfad springt und die unten
vom User eingetippte Datei dann an den Pfad dranhängt. Dann muß halt mit CreateFile()
oder anderen Funktionen erst eine erstellt werden.

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 29.08.2024 15:16
von Axolotl
Moin,

ein kleiner Tipp/Empfehlung.
Ich füge am Anfang immer

Code: Alles auswählen

EnableExplicit 
ein.
Warum?
Damit der Compiler sicherstellt das jede benutzte Variable auch definiert ist und ich nicht aus versehen durch Schreibfehler neue Variablen erzeuge.......
So haben im Beispiel von H. Brill

Code: Alles auswählen

Define Pattern 
und die verwendete Variable in

Code: Alles auswählen

Procedure ButtonHandler()
zwar den gleichen Namen aber nicht den selben Wert. Durch EnableExplicit wird der 'Fehler' sichtbar.

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 29.08.2024 15:41
von Axolotl
Okay ChrigiGee,

jetzt hast Du ein weiteres Beispiel wie das Event-Handling funktionieren kann.
Ich hatte ja bereits mein Beispiel zur Verfügung gestellt.

Ich habe Dir auch schon Hinweise zu
createPatch() und patchIt() geschrieben.

Aus meiner Sicht sind die Proceduren fehlerhaft und nicht "vernünftig" einsetzbar.
Wo sind die denn her?

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 29.08.2024 18:22
von ChrigiGee
Hallo H. Brill,

Der Teil der GUI befasst sich ausschliesslich mit dem Ermitteln der Dateien,
Verzeichnis und Name der Datei, welche über die Prozedur createpatch resp. patchit
bearbeitet werden.

Eigentlich ausschliesslich zum Suchen der Datei gedacht.
Die Prozedur selber ermittelt die Verzeichnisse oder Dateien selber nicht, sondern bearbeitet
ausschliesslich die Daten.

So habe ich nur das suchen und weiterreichen der Informationen in der GUI selbst.
der Rest übernimmt die "externe" Prozedur.

Sobald ich diesen Bereich habe, werde ich mich auch intensiver mit der Thematik
der eigentlichen Prozedur auseinandersetzen.

Aber, sicherlich ist es empfehlenswert sich auch mit der Thematik
in der vorhandenen Prozedur etwas verstärkt zu befassen.

Beste Sommer Grüsse aus Bern
Christian
H.Brill hat geschrieben: 29.08.2024 13:41 Ich habe jetzt noch nicht deine Patch-Proceduren angesehen.
Schreibst du target + Patch in neue Dateien ?
Da wäre es richtiger, den Target und den Patch mit SaveFileReuqester() abzufragen.
Während OpenfileRequester() nur vorhandene Dateien auflistet, kannst du im
SaveFileRequester() eine noch nicht existente Datei unten angeben, ähnlich halt
wie das bekannte 'Speichern unter'. Du willst ja wahrscheinlich NICHT die Orriginaldatei
überschreieben. Kommt dann darauf an, wie du es handhaben möchtest. Jedenfalls würde ich das,
was neu zu speichern ist mit SaveFileRequester() erfragen. Ich vermute es mal so :
file1$ (die zu patchende, vorhandene Datei) - mit OpenfileRequester() erfragt
file2$ ist das Target, das neu geschrieben wird und mit SaveFileRequester erfragt wird.
Es weiß ja vorher keiner, wie der User seine gepatchte Datei nennen will.
file3$ ist der Patch selber. Fallls der immer das gleiche ist, würde ich den fest verankern
bzw. zum Programm mitgeben und bei Installation mit auspacken. Auch IncludeBinary ist
da eine Option.

Man muß wissen :
OpenfileRequester() verhält sich so, wie ein kleiner Mini-Explorer, der dir vorhanden Dateien
anzeigt, während SaveFileRequester() in den vorgegebenen Pfad springt und die unten
vom User eingetippte Datei dann an den Pfad dranhängt. Dann muß halt mit CreateFile()
oder anderen Funktionen erst eine erstellt werden.

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 29.08.2024 19:08
von ChrigiGee
Hallo Axolotl,

Danke auch für Deine Beispiele, ich komme dem Gerüst immer näher.
Die beiden Prozeduren, "creatpatch und patcher" stammen sogar hier aus dem Forum.

Wie so vieles bei meinen Gedanken etwas wiederverwenden zu wollen.
sorry, ich musste wirklich wieder suchen, welcher Post das war.

https://www.purebasic.fr/german/viewtop ... 8&start=10

Es war der Post ungefähr in der Mitte von cyan der verschiedenen Einwände
zu einem ganzen zusammen genommen hatte.

Ich konnte natürlich daraus resultieren noch nicht viel sagen wie effektiv oder
geeignet für PB 6 sein könnte als, dass ich schaute, gibt es eine Error Meldung.

Danach war natürlich die Überlegung der GUI um diese beiden Prozeduren herum zu bauen,
ich dachte, ich wäre schneller als wenn ich das ganze nochmals von vorne angefangen hätte.

Na ja, auch da lernt man immer wieder etwas.
Verhält sich der Source von damals (September 2006) also rund 20 Jahre seitdem, würde es
für den Source sprechen und es wäre wert IHN wieder mal nach vorne geholt zu haben und
auf die aktuelle Version gebracht zu werden.

Wenn es heute bessere Möglichkeiten gibt, werde ich vielleicht auch da mit den begonnen
Schritten bereits den einen oder anderen Punkt verstanden haben und darauf nun aufbauen
können, damit ich eine Version eines "Patchers" hinbekomme für das weitere Arbeiten an meinem
anderen Projekt.

Der 20-Jährige Code wäre für mich eine Erleichterung am Aufwand bei der Arbeit gewesen, dachte ich.

Und wegen des Patcher Source den Du mir kommentiert hast, leider nicht aufbauend auf meinen Kenntnissen.
Dokumentation patcher resp patchcrator müsste ich natürlich dann bei eingehender Prüfung auch
verbessern, da er von mir (beide) noch nicht grösser bearbeitet wurde, fehlt wohl da auch etliches.

Bei meinem, "GUI" Source versuche ich nach und nach diese Lücke mit dem Dokumentieren zu schliessen.
Da ich immer wieder neue Schritte teste, um weiterzukommen, gehen die einen oder anderen Punkte
noch etwas mit Stiefmütterlichem verhalten vorwärts.

Das eine oder andere muss ich dann mich auch noch etwas besser einlesen, um es zu verstehen, und entsprechende
Dokumentation im Source zu ermöglichen.

Ich habe auch begriffen, für mich gelernt, ohne zu wissen, was ich im Source ändere, begreife ich manchmal nach nur
einer Woche nicht mehr, weshalb so oder so abgeändert.

Beste Grüsse aus dem Sonnigen Bern
Christian
Axolotl hat geschrieben: 29.08.2024 15:41 Okay ChrigiGee,

jetzt hast Du ein weiteres Beispiel wie das Event-Handling funktionieren kann.
Ich hatte ja bereits mein Beispiel zur Verfügung gestellt.

Ich habe Dir auch schon Hinweise zu
createPatch() und patchIt() geschrieben.

Aus meiner Sicht sind die Proceduren fehlerhaft und nicht "vernünftig" einsetzbar.
Wo sind die denn her?

Re: Prozedure mit variabler Abhängigkeit ?

Verfasst: 30.08.2024 12:07
von Axolotl
Hallo ChrigiGee,

vielen Dank für den Link. Jetzt habe ich das ursprüngliche Ziel der beiden Proceduren verstanden.

Was tun die Proceduren? (Kurze Erklärung, für Interessierte.)
Mit den beiden Proceduren kann man einzelne Dateien ersetzen. Dabei wird in der "CreatePatch()" der MD5 Wert der Original Datei zusammen mit der neuen Datei in einer Archiv-Datei (Pack) gespeichert.
In der "PatchIt()" wird der MD5 Wert mit der vorhandenen Datei verglichen und bei Gleichheit wird eine "<datnam>.backup" erstellt und die Original-Datei mit der gespeicherten überschrieben (Korrekterweise: Alte Datei gelöscht und Neue Datei erstellt).

Mein FAZIT: So richtig erschließt sich mir der Sinn der Sache (Diskussion im Ursprungsgespräch) nicht. Ich denke ein Update ist eine Verbesserung und die sollte nicht davon abhängig sein, ob die "alten Dateien" noch unverändert sind.

Unabhängig von meiner Meinung werde ich Dir natürlich weiterhelfen Dein gestecktes Ziel zu erreichen.