Reinhard -> VB Resourcen

Hallo Reinhard,

ich hab mal nen neues Thema aufgemacht, weil der alte damit weniger zu tun hatte.

Aber nun zum Thema

Du kannst das so verstehen. Du erstellst eine Resourcen Datei *.res. Diese kannst du unter VB einbinden. Somit wird sie mit in das Programm eincompiliert. Sicher stellt sich nun die Frage. Wozu das ganze?

Nehmen wir folgende Bsp.
Du willst deine Anwendung in mehreren Sprachen entwickeln
Du willst je nach OS eine andere DLL verwalten
Du willst verschiedene Graphiken in ein und der selben PictureBox anzeigen

Ich koennte noch soviel dazu aufzaehlen :s

Diese Daten stehen dir aber je nach Ladeanweisung nicht direkt zur Verfügung. Diese musst du zur Laufzeit aus dem File herausholen. Dabei gibt es wiederrum auch verschiedene Dinge zu beachten :confused:

Auch musst du schauen, um was es sich handelt.

Ist es ein Bild
Ist eine Zeichenfolge
Ist es eine Datei
etc.

Das defnierst du beim erstellen der Datei. Sie muss den Namen *.rc tragen. Mit dem Resourcen Compilier der mit Vb ausgeliefert wird, kannst du dann das *.RES File erzeugen, was du einbinden kannst :smile:

Noch einmal schnell zum Thema, ob die Daten gleich zur Verfügung stehen. Dazu hast du ja die Ladeoptionen. Und je nachdem musst du sie extrahieren oder nicht :wink:

Ladeoptionen

PRELOAD-Ignoriert. Unter 16-Bit Windows wird die Ressource mit der Anwendungsdatei geladen

LOADONCALL-Ignoriert, Unter 16-Bit Windows wird die Ressource geladen, wenn sie aufgerufen wird

Desweiteren kannst du auch Speicherattribute angeben.

Speicherattribute:

FIXED-Ignoriert. Unter 16-Bit Windows bleibt die Ressource an einer bestimmten Speicherposition

MOVEABLE-Ignoriert. Unter 16-Bit Windows kann die Ressource verschoben werden, um den Speicher zusammenzufassen

DISCARDABLE-Die Ressource kann geleert werden, wenn sie nicht mehr länger gebraucht wird.

PURE-Ignoriert. Erwartet für die Kompatibilität mit existierenden Ressourcenscripts

IMPURE-Ignoriert. Erwartet für die Kompatibilität mit existierenden Ressourcenscripts

Wobei hier für Daten vom Typ Cursor, Icons und Schriftartenressourcen
DISCARDABLE voreingestellt ist!

Willst du ein Menu aus einer Resource laden so hast du noch optionale Parameter, die du angeben kannst.

optionale parameter:
CHARACTERISTICS-dWord-Benutzerdefinierte Information über eine Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben
LANGUAGE-lang., sublang.-Gibt die Sprache für die Ressource an. Die Parameter sind Konstanten aus WINNLS.H
VERSION-dWord-Benutzerdefinierte Versionsnummer der Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben

Somit haetten wir glaube fast alles. Eines sollte man noch wissen.
Wenn du eine Benutzerdefinierte Resource erstellst, so musst du die Rohdaten angeben!

Rohdaten
Gibt Rohdaten an, die aus einer oder mehreren Ganzzahlen oder Texten aus Zeichen besteht. Ganzzahlen (Integers) können in Dezimal-, Oktal-, oder Hexadezimalformat angegeben werden. Der Ressourcen-Compiler fügt einem String nicht automatisch ein abschliessendes Nullchar hinzu. Der String ist eine Folge von ANSI (Byte) Zeichen, Strings in allen Ressourcen ausser RCDATA und benutzerdefinierten Ressourcen sind Unicode-Strings. Es ist die Aufgabe des Programmierers, die Daten optimal auf die Architektur des Zielcomputers anzupassen.

Somit sollten wir eigentlich das wichtigste haben.
Wie du nun siehst, kannst du in einer Resource so ziemlich alles packen, was du möchtest :wink: Sie ist flexibel und eigentlich ganz simple.

Nun noch einmal ein paar Bsp. wie eine Resourcen Datei ausschauen koennte!

Icon:

desk1 ICON desk.ico
11 ICON DISCARDABLE custom.ico

Menu:

menuID MENU [load-mem] [optional-statements]
BEGIN
 item-definitions
 ...
END

Sprich:

sample MENU
BEGIN
 MENUITEM "&Soup", 100
 MENUITEM "S&alad", 101
 POPUP "&Entree"
 BEGIN
 MENUITEM "&Fish", 200
 MENUITEM "&Chicken", 201, CHECKED
 POPUP "&Beef"
 BEGIN
 MENUITEM "&Steak", 301
 MENUITEM "&amp:stuck\_out\_tongue\_winking\_eye:rime Rib", 302
 END
 END
 MENUITEM "&Dessert", 103
END

Zeichenfolge:

STRINGTABLE [load-mem]
[optional-statements]
BEGIN
 stringID string
 ...
END

Sprich:

#define IDS\_HALLO 1
#define IDS\_CIAO 2

STRINGTABLE
BEGIN
 IDS\_HALLO, "Hallo"
 IDS\_CIAO, "Ciao"
END

Benutzerdefnierte Resource:

nameID typeID [load-mem]
BEGIN
 daten
END

Sprich:

array MYRES data.res
14 300 custom.res
18 MYRES2BEGIN
 "Here is a data string\0", /\* A string, null-terminated \*/
 1024, /\* int \*/
 0x029a, /\* hex int \*/
 0o733, /\* octal int \*/
 "\07" /\* octal byte \*/
END

Cursor:

nameID CURSOR [load-mem] filename

Sprich:

cursor1 CURSOR bullseye.cur
2 CURSOR "d:\\cursor\\arrow.cur"

Bitmap:

nameID BITMAP [load-mem] filename

Sprich:

disk1 BITMAP disk.bmp
12 BITMAP PRELOAD diskette.bmp

So, soviel erst einmal zum Aufbau eines Resourcen Files.
Natuerlich stehen ja nun die Daten nicht zur Verfügung :s
Um nun an die Daten zu kommen, gehen wir wiefolgt vor.

Nehmen wir einmal an. Du hast die Resource und darin Strings

ID String

1 Hallo
2 Ciao
3 Wie geht es Dir?
4 Woher kommst du
101 Hello
102 Bye
103 How are you?
104 Where do you come from

Dein Program startet und du fragst dem Anwender, welche Sprache er möchte und er wählt eine aus. Sagen wir mal für deutsch ist es die 0 und Englisch die 1. dann koenntest du via

dim ID as long
dim Sprache as Integer
 Sprache=1 ' Englisch
 ID=sprache\*100+1

die ID ermitteln. Je nachdem ob er deutsch oder englisch möchte bekommst du die 101 oder die 1 :smile:

Und nun endlich der spannenste Teil. Wie kommt man nun an die Resource. Das ist ganz einfach :smile:

Zeichenfolge:

LoadResString(Index)
Bsp:
Label1.caption=LoadResString(ID)

Bilder:
LoadResPicture(Index, Format)

wobei für Format folgendes gilt:

vbResBitmap-0-Bitmap-Ressource
vbResIcon -1-Symbolressource
vbResCursor-2-Cursor-Ressource

Bsp:

Picture1.Picture=LoadResPicture(ID,0)

Benutzerdefiniertes Format:

LoadResData(Index, Format)

wobei Format für folgendes steht

Bitmap-Bitmap-Grafiken aller Farbtiefen, keine JPEGs, GIFs etc.
Cursor-Cursor-Dateien
Icon-Icon-Dateien
String Table-Texttabellen
Custom-Benutzerdefinierte Datentypen z.B. "CUSTOM" oder "WAVE"

Bsp:

Dim vRet as String
vRet=LoadresData(ID,"CUSTOM")

In vRet waere nun der Inhalt der Benutzerdefinierten Resource. Wenn es 
ein File waere, so koennte man nun den Inhalt auf die HD schreiben und das File öffnen :wink:

So, ich hoffe ich habe ein wenig Licht ins Dunkel gebracht :smile:

MfG Alex

Hallo Alex,

danke dir für die sehr ausführliche Erklärungen:smile:

Also ist das etwas was es in VBA nicht gibt *Beruhigt bin* *gg*

Frohes Fest
Reinhard