Seite 1 von 1

udres- was ist das?

Verfasst: 02.11.2006 21:56
von dysti
Hallo,
in zwei Beiträgen wird von UDRES-Lib und einer Funktion "UDRES_ADDFILEID" geschrieben.
Was ist das? Wie wird es erstellt? Was sind die Vorteile. Ist die DLL mit in der EXE?
Mit dem Beitrag von TS-SOFT konnte ich nichts anfangen., war mir zu kompliziert. Kann man das einem Anfänger mal verklickern.

Verfasst: 03.11.2006 05:18
von ts-soft
>> Mit dem Beitrag von TS-SOFT konnte ich nichts anfangen
Soso, es ist eine ausreichend beschreibende Hilfe bei. Es sind mehrere
Beispiele bei. Wo ist das Problem?

UDRes_AddFile fügt eine Datei hinzu, FileID wird durch anfängliches
UDRes_Create oder UDRes_Open ermittelt. Mit UDRes_Close wirds am Ende
geschlossen. Wenn Du jetzt noch in die PB Hilfe siehst, wirste sehen, das es
genauso funktioniert wie in der File Lib von PB

Die einzelnen Files (Resourcen) werden nicht mit einem Namen gespeichert,
sondern nummeriert. Hierfür darfste Nummern zwischen 1-32767 wählen,
aber alle einmalig.

// Nachtrag: Beispiel

Normal in PB:

Code: Alles auswählen

Image = CatchImage(#PB_Any, ?Image)

If OpenWindow(0, #PB_Ignore, 0, 168, 35, "Include-Binary")
 CreateGadgetList(WindowID(0))
 ImageGadget(0, 0, 0, 168, 35, ImageID(Image))
 
 While WaitWindowEvent() <> 16 : Wend
EndIf

DataSection
  Image:
  IncludeBinary #PB_Compiler_Home + "Examples\Sources\Data\PureBasic.bmp"
EndDataSection
Sieht mit UDRes so aus:

Code: Alles auswählen

Import "Image.res" : EndImport ; Ersatz für Datasection

Image = UDRes_CatchImage(#PB_Any, 1)

If OpenWindow(0, #PB_Ignore, 0, 168, 35, "UDRes")
 CreateGadgetList(WindowID(0))
 ImageGadget(0, 0, 0, 168, 35, ImageID(Image))
 
 While WaitWindowEvent() <> 16 : Wend
EndIff
Der Source um die Res-Datei zu erstellen:

Code: Alles auswählen

File = UDRes_Create("Image.res")

If File
  UDRes_AddFile(File, #PB_Compiler_Home + "Examples\Sources\Data\PureBasic.bmp", 1)
  ; ... weitere Dateien
  
  UDRes_Close(File)
EndIf
Vorteil:
- halber Speicherverbrauch
- problemlos auch komprimiert
- kann auch mit DLLs umgehen

Nachteil:
- Windows only
- Resfile muß einmalig extra erstellt werden.

Verfasst: 03.11.2006 08:22
von dysti
Hallo TS-SOFT,

wenn ich das richtig verstanden habe ist der Sachstand folgender:

was man sonst in der Datasection eingefügt hat, macht man jetzt mit der *.RES-Datei = Resourcendatei. Außer Bilder kann man auch DLL-Dateien einfügen. Somit hat man bei der Weitergabe eines erstellten Programmes nicht eine Vielzahl an Dateien, sondern nur eine Datei, außer der EXE natürlich. Man kann zwar die DLL etc. auch in der Datasection aufnehmen, aber dadurch bläht sich die Exe-Datei auf und verbraucht mehr Speicherplatz. Durch die RES-Datei halbiert sich der Speicherbedarf.

Ich hoffe ich habe das richtig gerafft.

Verfasst: 03.11.2006 09:39
von ts-soft
Die Res-datei wird beim Importieren durch den Linker an die Exe
gehangen. Beim laden der Exe wird der Res-Teil nicht automatisch mit in
den RAM geladen, wie es bei Include-Binary der Fall ist. Erst wenn Du eine
Res verwendest, wird diese geladen, gecatched und freigegeben, so das
nur das gecatchte Bild im Speicher ist :wink:

Du brauchst also nur eine Datei weitergeben, die Exe, diese enthält die Resourcen.
Alles was Du mit IncludeBinary einbinden kannst, geht hiermit auch, also
jeder Dateityp, den Du nutzen kannst. Für Bilder und Sounds bietet es sich
natürlich an. Die Resourcen können auch durch Speicherung
wiederhergestellt werden (UDRes_Save)

Ausserdem können diese auch gepackt in der Res gespeichert werden, nur
entsprechend die Funktionen mit Pack im Namen verwenden.

Für DLLs ist in etwa dieselbe Funktionalität, wie in LoadDLLMemory-Lib
integriert, nur noch einfacher.

Gruß
Thomas

UDRes Manager

Verfasst: 03.11.2006 17:46
von H.Brill
Hallo,
kannst ja meinen UDRes - Manager verwenden. Den benutze
ich immer wieder, zur Erstellung meiner Resourcen. Ist so
vielleicht einfacher für dich.

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 Datei erstellen")
     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))
       PreferenceGroup(Str(lfnr))
       WritePreferenceString("Gepackt", Str(gepackt))
       WritePreferenceString("File", tempfile)      
   Next i
   ClosePreferences()
   MessageRequester("Info", "Datei : " + pfile + "  gespeichert !", #PB_MessageRequester_Ok)
EndIf  
EndProcedure

Procedure LoadProjekt(pfile.s)
Protected file.s, gepackt.s, stdwert.s, Gruppe.s
Protected k.l
k = 0
stdwert = " "
ClearGadgetItemList(#MyGadget) 
If ExaminePreferenceGroups() <> 0
    While NextPreferenceGroup() <> 0 
       Gruppe = PreferenceGroupName()
       gepackt = ReadPreferenceString("Gepackt", stdwert)
       file =    ReadPreferenceString("File", stdwert)
       item = "Gepackt" + #LF$ + Gruppe + #LF$ + file
       AddGadgetItem(#MyGadget, -1, item) 
       If gepackt = "1"
          SetGadgetItemState(#MyGadget, k, #PB_ListIcon_Checked) 
       EndIf
       k = k + 1
     Wend
EndIf
ClosePreferences()
EndProcedure


Verfasst: 03.11.2006 22:15
von dysti
Hallo H.Brill,
genau durch diesen Manager bin ich ja darauf aufmerksam geworden.
Hatte ich durch Zufall entdeckt und mich weiter informiert.

Ah ja, du warst das doch auch mit der listview.dll. War schon etwas länger her, habe es totzdem beantwortet. Im Listviewforum ist mir aufgefallen, das TS-SOFT zwar mit Linux arbeitet, offentsichtlich auch mit XP-HOME und Profan und auch die listview.dll benutzt. Aber das nur nebenbei.

Auf jeden Fall danke. Jetzt bin ich schlauer und weiß Bescheid. Es ist genau das, was ich gesucht habe. Toll von euch beiden was ihr das gemacht habt.

hmodule

Verfasst: 01.09.2007 14:18
von H.Brill
Hallo TS-Soft,
Ich benutze ja schon seit einiger Zeit die UDRes-Lib. Nun wollte
ich mal wissen, was genau mit dem optionalen Parameter
hmodule.l anzufangen ist.
Dazu folgender Hintergrund : Da meine Arbeitskollegen dauernd
ihre Datendateien (etliche Preislisten) versehentlich löschen, habe
ich sie als Resource mit eingepackt. Nun ist aber das Problem, daß
sich öfter Preise ändern. Da ich ja im laufenden Programm die
Resourcen nicht ändern darf, möchte ich dies mit einem zusätzl.
Programm machen, d. h. mein Preislistenprogramm beenden, das
Zusatzprogramm aufrufen, die Resourcen ändern und die .res wieder
mit meinem Preislistenprogramm verlinken.

Geht sowas oder ist das nur mit Neucompilerung durch PB möglich ?

PS: Du hast was ähnliches mit XDATA_LinkToExe() für XProfan gemacht.
Wenn das mit dem Reshacker auch für PB - Executables gilt, kann ich
ja die include als Vorlage nehmen.

Verfasst: 01.09.2007 20:37
von ts-soft
hModule erhälste als Ergebnis von LoadLibrary_()
Mit anderen Worten, fremde DLL oder Exe laden und Resourcen verwenden.

Ich hoffe das hilft Dir weiter

Gruß
Thomas

//Nachtrag:
Wenn Du eine Resourcen DLL erstellen möchtest, einfach die Res
importieren, Projectoptionen Shared DLL wählen und kompilieren :wink:

Verfasst: 02.09.2007 05:54
von H.Brill
Danke,
das hilft mir schon weiter.