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

Anfängerfragen zum Programmieren mit PureBasic.
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: 24.08.2024 18:20 Und ich denke, ich werde verzweifelt sein, zu sehen, wie weit ich von Euch allen noch entfernt bin.
Also wir haben jetzt keine Raketensteuerungscodes produziert, mein Beispiel hatte ich in etwa 10 Minuten zusammengebastelt und auch nur, weil ich Dir zeigen wollte, wie ich die Aufgabenstellung in eine GUI gepresst hätte.

Davon abgesehen solltest Du Dich davon nicht entmutigen lassen, wir sind ja schließlich auch schon "etwas" länger hier.

Aber das mit dem Schweizer und der Legasthenie habe ich nicht so ganz begriffen.
Wie ein Legastheniker sieht das nicht aus, ich dachte erst irgendeine schräge KI produziert diese merkwürdigen Sätze, oder ein Übersetzungstool.
Aber dann habe ich versucht mir vorzustellen, mit welcher Sprache man das Übersetzungstool füttern müsste, damit sowas bei rum kommt und hatte ehrlich gesagt keine Idee.

Das ist jetzt auch gar nicht despektierlich gemeint, aber Legastheniker erkenne ich normalerweise im Forum, Du bist aber, für mich zumindest, ein Mysterium.
Fühle Dich geehrt :mrgreen:
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,

Vielen Dank für Deinen Vorschlag zur GUI, ich habe mir bereits etliche Deiner Vorschläge angeschaut, welche im Forum bestehen.
Auch zu Deinem Designer, den ich mir dann doch auch nochmals genauer anschauen werde.

Die GUI in Deinem Vorschlag ist effektiver was Übersichtlichkeit angeht, da komme ich mit meinen ersten "Geh" - Versuchen nicht gerade weit.
Und ich freue mich, daran zu arbeiten, dass ich vielleicht auch etwas besser strukturierte Arbeiten abliefern kann.
"PN hast Du vielleicht beachtet."

[OFF TOPIC]
Na ja, Legasthenie, lässt sich auch gut kaschieren, mit nun rund 50 Jahren Lebenserfahrung und der guten Schreibkorrekturen in Foren.
Aber wenn ich dann die Texte im Ganzen anschaue, fällt es einem aussenstehenden dann auf, wie in meinen versuchen ersichtlich.

Schweizer, da ich Mundart denken, und die Schriftsprache eine Fremdsprache darstellt, ist die Legasthenie dann doppelt vorhanden,
ich versuche den Text so wie ich denke in geschriebenes umzusetzen.

:oops: Danke vielmals für das Mysterium, das ehrt mich wirklich. :oops:
[\OFF TOPIC]

Jetzt habe ich wieder ein paar Ansatzpunkte, welche ich bearbeiten kann.
Und vielleicht gelingt es mir in den nächsten Schritten eine etwas bessere und verständlichere Version zu präsentieren.
Auch im Hinblick auf das Zusammenfügen zwischen den beiden Prozeduren, welche ich noch zu implementieren habe.

Ich hoffe, meine Postings werden auch etwas besser verständlich in Zukunft, ich versuche mich daran....

Beste Wünsche für ein Wochenende, vielleicht auch mit etwas Sonne.
Grüsse aus Bern
Christian

HeX0R hat geschrieben: 24.08.2024 21:44
ChrigiGee hat geschrieben: 24.08.2024 18:20 Und ich denke, ich werde verzweifelt sein, zu sehen, wie weit ich von Euch allen noch entfernt bin.
Also wir haben jetzt keine Raketensteuerungscodes produziert, mein Beispiel hatte ich in etwa 10 Minuten zusammengebastelt und auch nur, weil ich Dir zeigen wollte, wie ich die Aufgabenstellung in eine GUI gepresst hätte.

Davon abgesehen solltest Du Dich davon nicht entmutigen lassen, wir sind ja schließlich auch schon "etwas" länger hier.

Aber das mit dem Schweizer und der Legasthenie habe ich nicht so ganz begriffen.
Wie ein Legastheniker sieht das nicht aus, ich dachte erst irgendeine schräge KI produziert diese merkwürdigen Sätze, oder ein Übersetzungstool.
Aber dann habe ich versucht mir vorzustellen, mit welcher Sprache man das Übersetzungstool füttern müsste, damit sowas bei rum kommt und hatte ehrlich gesagt keine Idee.

Das ist jetzt auch gar nicht despektierlich gemeint, aber Legastheniker erkenne ich normalerweise im Forum, Du bist aber, für mich zumindest, ein Mysterium.
Fühle Dich geehrt :mrgreen:
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 »

Hallo, ich möchte mich mal hier etwas einklinken, was PB intern betrifft.
Die Event-Schleife für GUIs in PB fand ich von jeher für Anfänger schon etwas verwirrend, da sie
auch noch verschachtelt ist. Damit hatte ich damals auch anfangs meine Probleme. Wenn man da
von anderen Sprachen, sei es nun VB-like oder Nischensprachen wie XProfan kommt, empfindet man
es zuerst als schwierig und die Lust zum Weitermachen sinkt. Das hätte meiner Meinung nach Fred von
Anfang an etwas einfacher machen sollen. Mittlerweile hat er ja diese Bind-Geschichten (BindEvent,
BindGadgetEVent usw.) etabliert, die die Sache schon erheblich vereinfacht, gerade was einfache GUIs
betrifft.

Deshalb empfehle ich jedem Anfänger, egal ob er er nun auf irgendeine Art eingeschränkt ist oder nicht,
dieses Binden von Events, Proceduren und Menus sich mal anzusehen. Da fällt einem so manches am
Anfang leichter.

PS: Und was den GUI - Designer betrifft, den habe ich noch nie benutzt. Bei so manchen kleinen Sprachen ist
erst gar keiner dabei. Deshalb bin ich gewohnt, meine GUIs von Hand zu erstellen. Außerdem braucht man nicht
unbedingt Vorgaben (EventSchleife erstellen lassen). Da gibt es ja verschiedene Möglichkeiten. Die einen machen
eine extra Main-Procedure, andere mögen es vielleicht nicht usw.

Ich habe dir mal ein Beispiel gemacht. So sieht das doch viel übersichtlicher aus :

Code: Alles auswählen

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 
    AddGadgetItem(1, -1, GetGadgetText(2))
  ElseIf EventGadget() = 3
    AddGadgetItem(1, -1, GetGadgetText(3))
  EndIf  
  SetGadgetState(1, CountGadgetItems(1) - 1)
EndProcedure
  
  OpenWindow(0, 100, 100, 500, 200, "Click test", #PB_Window_SystemMenu)
  ListViewGadget(1, 200, 10, 200, 100)
  
  ButtonGadget(2, 10, 10, 180, 30, "Click that")
  BindGadgetEvent(2, @ButtonHandler())
  
  ButtonGadget(3, 10, 50, 180, 30, "Click this")
  BindGadgetEvent(3, @ButtonHandler())
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
  
Beim Beispiel in der Hilfe sollte man sich nicht wundern, daß der Klick nur einmal funktioniert.
Das hängt einfach an dem Debug-Befehl. Da wäre ein funktionierender Code hilfreicher, als daß
man sich die Zähne daran ausbeißt. Ein einfaches MessageRequester() wäre da besser gewesen.
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 und guten Abend H. Bill,

Meine Verwirrungen bauen auf den recht alten Beispielen natürlich mit auf.
Da zum Teile aus Zeiten von PB 3 resp. PB 4 stammen.

Ich versuche zum Teile diese auf meine PB 6.11 Version zu heben, was mit den beschränkten Kenntnissen
auch nicht immer sehr einfach ist.

Dann und wann gerate ich dann in ein hick - hack aus altem Source und neuen Funktionen mit einem noch
beschränkten Kenntnisstand.

So kam ich dann ursprünglich auf den Gedanken, dass ich eine GUI für die Procedure erstellen müsste um nicht erledigte Variablen
abarbeiten zu können.

Ich hoffe, dass ich Dein Code Beispiel jetzt nicht falsch interpretiere, aber das würde bedeuten, dass wenn ich Button XYZ drücke
durch den EventHandler die Erforderliche Procedure ausgeführt werden könnte...

Liebe Grüsse aus Bern
Christian


EDIT: Elemente welche sich erübrigten entfernt und ergänzt mit der Frage zum Beispiel Code.
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 »

zum Auswählen kannst du ja auch die Funktion PathRequester() nehmen oder du machst es fix mit den FileSystem Pfaden
(z.b. GetCurrentDirectory()). Jedenfalls bei path$ = PathRequester(...) gibt dir diese Funktion einen ausgewählten Pfad
des Users zurück. Wenn paht$ <> "" hat er was ausgewählt. Wenn nichts drinsteht hat er halt nichts ausgewählt. Es verhält sich
halt genauso, wie OpenfileRequester(), halt nur ohne Dateinamen. Da kannst du ja abhängig davon abfragen :

Code: Alles auswählen

 
If path1$ <> "" 
  If path2$ <> ""
    DoPatch(path1$, path2$) ; deine Patch-Procedure
  EndIf
EndIf
Geht auch genauso gut mit einer AND Verknüpfung, womit dur dir ein If...Endif einsparen kannst. Damit kannst du dann sicherstellen,
daß auch 2 Pfade ausgewählt wurden, bevor du deine Patch-Procedure darauf loslässt.
Da gibt es ja noch mehr siehe ExamineDirectory, IsDirectory usw.
Also sowas bekommt man schon kugelsicher hin.

Und wenn deine zu patchende Datei eine ganz bestimmte sein soll, kannst du das ja auch wieder rausfiltern :

Code: Alles auswählen

path1$ = UCase(OpenFileREquester(....))
If GetFilePart(path1$) = UCase("spiel.exe")
    ; dann erst patchen
EndIf    
Somit hast du den Pfad vasriabel und die zu patchende Datei fest. Das UCase kannst du nehmen, um Groß/Kleinschreibung besser
zu handhaben. Ob nun "Spiel.exe" oder "spiel.exe". UCase() gibt dir halt SPIEL.EXE zurück. Somit ist es eindeutiog.
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 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
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.
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: Prozedure mit variabler Abhängigkeit ?

Beitrag von Axolotl »

Du musst bei BindGadgetEvent() eine procedure übergeben, die keine Parameter hat.
Schau das Beispiel in der Hilfe an.
Der erste Parameter sollte die GadgetNummer enthalten und nicht eine 1. So hast du zufällig #btnSource verbunden.
Ich verweise auf ein Beispiel welches ich weiter oben geschickt habe, zwar ohne BindGadgetEvent aber funktional.
Sorry, kann das Beispiel nicht noch einmal senden, bin gerade nicht am Computer.
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 »

Wozu auch Parameter für die Callback-Prozedur ? Da auch in der Procedure das EventGadget() verfügbar ist,
hast du jederzeit deine Button-ID. Sehe es mal so :
Es ist genau das gleiche, als wenn der Code deiner Callback-Procedur in der Eventschleife stünde.
Halt dort, wo du auch das EventGadget() abfragen würdest, um den gedrückten Button raus zu bekommen.
Die BindEventGadget()-Funktion macht es halt nur etwas leichter und vor allem übersichtlicher. Deshalb hatte
ich dir ja in meinem obigen Code gezeigt, wie man das als Universal-Procedure für sämtliche Buttons machen kann.

Das gleiche gilt auch für BindMenuEvent und BindEvent. Man könnte sogar verknüpfen, wenn man zusätzlich noch
ein Menu hat. Daß z.B. bei Ende (Button) und bei Ende (Menu) die gleiche Wirkung erzielt wird, indem man in der Callback noch
zusätzlich EventMenu() abfragt.
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,

Kein Problem, ich hatte dem entsprechen nur die Hälfte angewendet.
Super schlau von meiner Seite.

Danke für den Hinweis.

Liebe Grüsse aus Bern
Christian
Axolotl hat geschrieben: 27.08.2024 01:36 Du musst bei BindGadgetEvent() eine procedure übergeben, die keine Parameter hat.
Schau das Beispiel in der Hilfe an.
Der erste Parameter sollte die GadgetNummer enthalten und nicht eine 1. So hast du zufällig #btnSource verbunden.
Ich verweise auf ein Beispiel welches ich weiter oben geschickt habe, zwar ohne BindGadgetEvent aber funktional.
Sorry, kann das Beispiel nicht noch einmal senden, bin gerade nicht am Computer.
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. Bill,

Ich glaube, dass ich gestern Abend auch Deinen Vorschlag daneben hatte, um es zu versuche.
Irgendwann habe ich wohl die falschen Passagen gelöscht und wieder einfügen wollen.

Es hätte wohl viel mehr gebracht zu warten, bis ich auch wieder etwas frischer ans Werk gegangen wäre und nicht im Halbschlaf.

Ich mache mich, sobald wieder ans Werk und suche, wo ich den Mist begangen habe.

Liebe Grüsse aus Bern
Christian
H.Brill hat geschrieben: 27.08.2024 08:19 Wozu auch Parameter für die Callback-Prozedur ? Da auch in der Procedure das EventGadget() verfügbar ist,
hast du jederzeit deine Button-ID. Sehe es mal so :
Es ist genau das gleiche, als wenn der Code deiner Callback-Procedur in der Eventschleife stünde.
Halt dort, wo du auch das EventGadget() abfragen würdest, um den gedrückten Button raus zu bekommen.
Die BindEventGadget()-Funktion macht es halt nur etwas leichter und vor allem übersichtlicher. Deshalb hatte
ich dir ja in meinem obigen Code gezeigt, wie man das als Universal-Procedure für sämtliche Buttons machen kann.

Das gleiche gilt auch für BindMenuEvent und BindEvent. Man könnte sogar verknüpfen, wenn man zusätzlich noch
ein Menu hat. Daß z.B. bei Ende (Button) und bei Ende (Menu) die gleiche Wirkung erzielt wird, indem man in der Callback noch
zusätzlich EventMenu() abfragt.
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