PBData und UDRes

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

H.Brill hat geschrieben: Kannst du vielleicht (wenn machbar) was einbauen, womit man
Dateien in der Resource auch löschen kann ?
UDRes_DeleteFile(FileID, filename.s oder Nr.)
Löschen ist nicht möglich, müßte eine Resource Bytegenau entfernen, die
anderen nachfolgen lassen und die Gesamtlänge wieder korrigieren. Da ist
es einfacher und schneller neu zu erstellen :wink:
H.Brill hat geschrieben: weiterhin hilfreich wären :
- anzahl.l = UDRes_CountFiles(FileID)
- filename.s = UDRes_GetFileName(FileID, Nr)

Du kannst ja mal schauen, was machbar ist.

Anzahl läßt sich vielleicht machen, aber Dateinamen, die nicht gespeichert
sind, kann ich nicht herzauern. Da müßte für jede Resource eine zweite mit
Namen angelegt werden, weil die Resourcen ansonsten nicht mehr dem
Dateiformat entsprechen. Nur die gepackten, die entsprechen sowieso
keinem Standard, enthalten aber mir einen 8 Byte Header von mir
(ungepackte Länge sowie CRC32-Fingerprint), aber die mit nem Namen zu
versehen, würde den Packerfolg beeinträchtigen. Eventuell kann ich es
noch integrieren, das die Resourcen statt Nummern, Namen erhalten,
wobei die Resourcen Structure dann wieder dynamisch ist, und das ist dann
schon mit mehr Aufwand verbunden.

Ich denke mal, mit nummerisch, wobei man sich am besten Enumerationen
speichert, damit kann man erstmal leben. (Spätestens, wenn von PB
dynamische Strukturen unterstützt werden, gibts auch Namen und eigene
Resource-Typen)
:mrgreen:


Freut mich aber, das evtl. doch jemand anders, ausser mir damit Arbeitet. :D
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

wie sollen bitte dynamische strukturen aussehen :). Der Header der Res
Dateien ist einfach scheiße von MS ausgearbeitet worden -_-.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Der Header der Res Dateien ist einfach scheiße von MS ausgearbeitet worden -_-
Dafür aber abwärtskompatibel zu Win 3.0 :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Beitrag von H.Brill »

Hallo ts-soft,
Danke für deine Ausführungen. Was nicht geht, geht halt nicht.
Aber ich denke, daß man das mit den Nummern und Namen auch
in einer sogen. Projektdatei (Preference) realisieren kann. Es geht
ja hauptsächlich darum, daß man nach einiger Zeit noch weiß, was
und an welcher Stelle (Nr) in der Resource steht. Dann kan man ja,
wie du schon geschrieben hast, eine neue Res-datei anlegen und das
Gewünschte austauschen.

PS:
Für was ist denn UDRes_AddMem() genau gut ?

Kann man da z. B. Text (*Zeiger auf Text) aus einem Editorgadget
einfügen ? Oder geht das auch im laufenden Prozeß (meine .EXE mit
Resource) ?

Sowas wäre auch nett. Suche schon länger eine Mögichkeit, aus einem
laufenden Prog. in die eigene Resource zu schreiben. Hintergrund war
der, daß der User keine Datenbank als extra Datei hat und somit nicht
rumfingern kann. Ein fester Bereich von ca. 10 KB würde mir da schon
reichen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> PS: Für was ist denn UDRes_AddMem() genau gut ?

Die Daten, welche sich unter dieser MemoryID im Speicher befinden,
werden in der größe MemorySize(MemoryID) gespeichert.

Code: Alles auswählen

text.s = "Hallo Welt"
UDRes_AddMem(FileID, @text, 1)


Mem = AllocateMemory(100)
If Mem
  UDRes_AddMem(FileID, Mem, 2)
  FreeMemory(Mem)
EndIf
Das mit in die eigene Exe zu schreiben (wenn diese gerade läuft)
ermöglicht auch diese Lib nicht, da hat Windows einen Riegel vorgeschoben
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@H.Brill

Wegen Count weiß ich im Moment nicht, wie ich es sinnvoll in die Lib baue,
hab Dir mal ein Snippet geschrieben, das Du dann nach Deinen Wünschen
anpassen kannst!
Aus der nackten *.res kann ich es nicht so einfach ermitteln.

Code: Alles auswählen

#IMPORT = #False

CompilerIf #IMPORT
  ; entweder importieren:
  Import "waponez.res" : EndImport
CompilerElse
  ; oder Exe bzw. DLL laden
  hModule = LoadLibrary_("Waponez II.exe")
CompilerEndIf

Global Count

Procedure EnumResType(hModule.l, lpszType.l, lParam.l)
  If lParam > 0
    Count + 1
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf 
EndProcedure

Procedure UDRes_Count(ResType.s, hModule.l = 0)
  EnumResourceNames_(hModule, @ResType, @EnumResType(), 0)
EndProcedure

UDRes_Count("PBDATA", hModule)
Debug Count
Siehste auch gleich, wofür hModul da ist :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Beitrag von H.Brill »

>> PS: Für was ist denn UDRes_AddMem() genau gut ?

Die Daten, welche sich unter dieser MemoryID im Speicher befinden,
werden in der größe MemorySize(MemoryID) gespeichert.

Code:
text.s = "Hallo Welt"
UDRes_AddMem(FileID, @text, 1)


Mem = AllocateMemory(100)
If Mem
UDRes_AddMem(FileID, Mem, 2)
FreeMemory(Mem)
EndIf
Ist das sowas ähnliches wie STRINGTABLE , bloß halt mit nem
ganzen Bereich (Memory) ?

Werde mich morgen früh mal eingehender damit beschäftigen.
Heut abend ist erstmal Fußball angesagt.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Bevor ich Daten schreiben kann, muß ich sie laden (in den Speicher), zum
Beispiel von einer Datei. Falls diese sich aber bereits im Speicher befindet,
kann man sie gleich aus diesem Speichern. Nützlich auch, um diese vor dem
Speichern noch schnell zu verschlüsseln oder ähnlichem. Beim laden wirste
die Daten ja auch meist aus dem Speicher nutzen, zum Beispiel per Catch...
oder mit Peek usw.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Beitrag von H.Brill »

Hallo,
Hab mal nen kleinen Resourcen - Manager angefangen.
Wenn man mehrere Resourcendateien verwalten möchte,
weiß man ja später nicht mehr, was in den einzelnen .res -
Dateien gespeichert ist, es sei denn man sichtet jedesmal
die Quellcodes der dazugehörigen Programme. Sinnvollerweise
sollte die Projektdatei den gleichen Namen (halt nur mit .prj)
haben, wie die .res - Datei.

Eines fehlt mir noch : Wie kann ich am besten den Status der
Checkboxen in der Preferencedatei zusätzlich speichern bzw.
laden ?

Hier mal den Source für die, die es brauchen können oder
erweitern wollen.

Code: Alles auswählen

Global pfile.s, rfile.s, dfile.s, daten.s, item.s
Global nr.l, count.l, erfolg.l, Quit.l

Declare CompileRes(fname.s)
Declare SaveProjekt(pfile.s)
Declare LoadProjekt(pfile.s)

#MyWindow = 0
#MyGadget = 100
 If OpenWindow(#MyWindow,100,100,800,400,"Resourcen - Manager",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
   If CreateGadgetList(WindowID(#MyWindow))
     ButtonGadget(1, 450, 10, 100, 25, "Ende")
     ButtonGadget(2, 10,  10, 100, 25, "Speichere Projekt")
     ButtonGadget(3, 10,  40, 100, 25, "Lade Projekt")
     ButtonGadget(4, 150, 10, 100, 25, "Datei einfügen")
     ButtonGadget(5, 150, 40, 100, 25, ".Res Compilieren")
     ButtonGadget(6, 290, 10, 100, 25, "Liste löschen")
      
     ListIconGadget(#MyGadget,5, 100, 700, 280,"Pack",80,#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_CheckBoxes)
     AddGadgetColumn(#MyGadget, 1, "Nummer", 60)
     AddGadgetColumn(#MyGadget,2,"Dateiname",520)
     
     Quit = 0
     Repeat
       EventID = WaitWindowEvent()
       Select EventID
          Case #PB_Event_Gadget
            Select EventGadget()
                Case 1
                   Quit = 1
                Case 2
                  ; Neues Projekt speichern
                   Pattern$ = "Resource - Dateien (*.prj)|*.prj"
                   Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
                   pfile = SaveFileRequester("Bitte Datei zum Laden auswählen", "C:\", Pattern$, Pattern)
                   If pfile
                      erfolg = CreatePreferences(pfile)
                      If erfolg = 0
                         MessageRequester("Projekt", "Datei : " + pfile + " konnte nicht erstellt werden !", #PB_MessageRequester_Ok)
                      Else
                         SaveProjekt(pfile)   
                      EndIf   
                   EndIf   
                Case 3  
                  ; Lade Projekt
                    Pattern$ = "Resource - Dateien (*.prj)|*.prj"
                    Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
                    pfile = OpenFileRequester("Bitte Datei zum Laden auswählen", "C:\", Pattern$, Pattern)
                   If pfile
                      erfolg = OpenPreferences(pfile)
                      If erfolg <> 0
                         LoadProjekt(pfile)
                      Else
                         MessageRequester("Projekt", "Datei : " + pfile + " konnte nicht gefunden werden !", #PB_MessageRequester_Ok)   
                      EndIf   
                   EndIf   
                Case 4
                  ; Datei einfügen  
                   Pattern$ = "Alle Dateien (*.*)|*.*"
                   Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
                   dfile = OpenFileRequester("Bitte Datei zum Laden auswählen", "C:\", Pattern$, Pattern)
                   If dfile
                       count = CountGadgetItems(#MyGadget)
                       item = "Gepackt" + Chr(10) + Str(count + 1) + Chr(10) + dfile
                       AddGadgetItem(#MyGadget, -1, item)
                   EndIf 
                Case 5
                  ; Res - Datei kompileren
                  Pattern$ = "Resource - Dateien (*.res)|*.res"
                   Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
                   rfile = SaveFileRequester("Bitte Datei zum Laden auswählen", "C:\", Pattern$, Pattern)
                   If rfile
                      CompileRes(rfile)
                   EndIf 
                Case 6
                  ; Liste löschen
                  ClearGadgetItemList(#MyGadget)          
                Case 100 ; ListIcon - Gadget
                   ; wenn ein Eintrag gewählt wurde, werden die Eingabefelder
                   ; entsprechend gefüllt.
            EndSelect
       EndSelect     
     Until Quit = 1 Or EventID = #PB_Event_CloseWindow
   EndIf
 EndIf
 CloseWindow(#MyWindow)
 
End

Procedure CompileRes(fname.s)
Protected i.l, gepackt.l, check.l, FileID.l, lfnr.l
Protected tempfile.s

count = CountGadgetItems(#MyGadget)
If count > 0
   If fname <> ""
      FileID = UDRes_Create(fname)
      If FileID
         For i = 0 To count - 1
             gepackt = 0
             check = GetGadgetItemState(#MyGadget, i)
             If check & #PB_ListIcon_Checked
                gepackt = 1
             Else
                gepackt = 0   
             EndIf
             tempfile = GetGadgetItemText(#MyGadget, i, 2)
             lfnr = Val(GetGadgetItemText(#MyGadget, i, 1))
             Select gepackt
                Case 0
                  UDRes_AddFile(FileID, tempfile, lfnr)
                Case 1
                  UDRes_AddPackFile(FileID, tempfile, lfnr)  
             EndSelect   
         Next i
         UDRes_Close(FileID)
         MessageRequester("Packen...", "Datei : " + fname + " compiliert !", #PB_MessageRequester_Ok)
      EndIf    
   EndIf
Else
   MessageRequester("Packen...", "Keine Einträge vorhanden !", #PB_MessageRequester_Ok) 
EndIf    
EndProcedure

Procedure SaveProjekt(pfile.s)
Protected i.l, gepackt.l, check.l, FileID.l, lfnr.l
Protected tempfile.s
count = CountGadgetItems(#MyGadget)
If count > 0
   For i = 0 To count - 1
       gepackt = 0
       check = GetGadgetItemState(#MyGadget, i)
       If check & #PB_ListIcon_Checked
          gepackt = 1
       Else
          gepackt = 0   
       EndIf
       tempfile = GetGadgetItemText(#MyGadget, i, 2)
       lfnr = Val(GetGadgetItemText(#MyGadget, i, 1))
       WritePreferenceString(Str(lfnr), tempfile)      
   Next i
   ClosePreferences()
   MessageRequester("Info", "Datei : " + pfile + "  gespeichert !", #PB_MessageRequester_Ok)
EndIf  
EndProcedure

Procedure LoadProjekt(pfile.s)
ClearGadgetItemList(#MyGadget) 
If ExaminePreferenceKeys() <> 0
    Repeat 
       item = "Gepackt" + Chr(10) + PreferenceKeyName() + Chr(10) + PreferenceKeyValue()
       AddGadgetItem(#MyGadget, -1, item) 
    Until NextPreferenceKey() = 0
EndIf
ClosePreferences()
EndProcedure

Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten