Eigene Ressourcen in Delphi-Programmen nutzen
Ich gehe mal davon aus, das als Delphi-Benutzer der Borland-RessourceWorkshop benutzt wird, der ist zwar nicht schön, aber auf der Delphi-CD enthalten. Sollte ein anderes Tool verwendet werden, dann gilt das hier entsprechend gesagte sinngemaess.
Also gut, legen wir mal los...
Als erstes stellen wir mal sicher, das im Ressource Workshop unter den Voreinstellungen das 32bit-Format eingestellt ist, da der Delphi Linker Ressourcen im 32bit Format erwartet.
Der Einfachheit halber wollen wir mal zwei Datenbanken mitgeben, die dann beim Start des Programmes, so nicht vorhanden, aus der Ressource neu erstellt wird (geht natürlich auch mit Grafik-, Sound-, Binaer- oder was auch immer- Dateien).
Als erstes starten wir mal unseren Ressource Workshop und legen ein neues Projekt an und wählen als Projektformat das RES-Format. Anschliessend ueber "FILE- ADD TO PROJEKT" und mit dem Typ "USER DATA RESSOURCE" unsere erste Datenbankdatei hinzufuegen. Anschliessend will der Ressource Workshop noch wissen, was denn unsere Datei denn fuer einen Typ hat, wir legen uns dazu ueber "NEW TYP" einen neuen Typ namens "DATABASE" an, unter dem wir diese Datei dann hinzufuegen. Analog verfahren wir auch mit unserer zweiten Datenbank-Datei, wobei wir aber diesmal nicht noch einen neuen Typ kreieren, sondern unseren schon vorher erzeugten Typ "DATABASE" auswählen koennen.
Anschliessend können wir noch in der Liste der Ressourcen mit Rechtsklick - RENAME auf der Datenbankdatei, die bis dahin database_1 bzw. database_2 heissen, einen aussagekräftigen Namen verpassen (lasse ich hier mal der Übersichtlichkeit halber weg).
Wenn alles O.K. ist, dann speichern wir das Projekt unter einem sinnvollem Namen (z.B. MyDB.RES) zweckmaessigerweise im Verzeichnis mit unserem Delphi-Projekt.
hier nun der Delphi-Teil des Ganzen:
Unter dem Eintrag {$R *.dfm} in unserem Quellcode fuegen wir als naechste Zeile {$R MyDB.RES} ein (ich geh mal davon aus, das die RES-Datei bereits im Verzeichnis mit unserem Projekt liegt).
Als naechstes basteln wir uns eine Funktion, die eine Ressource in eine Datei schreibt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.WriteResToFile(sFrom, sTo:String); begin sRSStream:=TResourceStream.Create(hInstance, sFrom, 'DATABASE'); try sRSStream.SaveToFile(sTo); finally sRSStream.Free; end; end; |
Und aufgerufen wird das ganze dann folgendermassen( kann auch im Form.Create oder aehnlichem stehen):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button1Click(Sender: TObject); begin if not FileExists('Test1.db') WriteResToFile('DATABASE_1','Test1.db'); if not FileExists('Test2.db') WriteResToFile('DATABASE_2','Test2.db');
end; |
Zum Schluss noch ein paar Hinweise, wie man das alles statt mit der exe-Datei mit einer dll realisiert:
Eigentlich ist das Vorgehen analog, als erstes ein neues DLL-Projekt erstellen und irgendeine unit in mit uses einbinden (sonst wird die dll gar nicht erst erstellt. Anschliessend wie gehabt die Ressourcen erstellen und mit {R ....} einbinden.
In der Anwendung muessen wir dann nur unsere Funktion WriteResToFile anpassen, da wird dann nicht mit hInstance auf das Handle der Anwedung zugegriffen sondern wir besorgen uns das Handle ueber einen LoadLibrary-Aufruf, etwa so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.WriteResToFile(sFrom, sTo:String); var hRs:Handle; begin hRes:=LoadLibrary('blah.dll'); if hRs<>0 then begin sRSStream:=TResourceStream.Create(hRs, sFrom, 'DATABASE'); try sRSStream.SaveToFile(sTo); finally sRSStream.Free; end; end; |
So, war doch gar nicht so schwer...
Man koennte das alles dann noch mit Gimmicks wie Fehlerbehandluung bei nicht vorhandener Ressource, Abfrage nach Platz auf Ziellaufwerk usw. verzieren, für die Funktion ist das aber unerheblich.
Bei Fragen Mail an mich:
huebnerp@gmx.net
ciao....