Entwickler-Ecke

Dateizugriff - HTMLs in einer EXE...


TheUnknown - Mi 02.04.03 21:56
Titel: HTMLs in einer EXE...
Hallo,

bitte schreibt mir doch ma' bitte einer, wie ich das machen muss, dass ich HTML-Datei in die EXE miteinkompilieren kann. Die Datei soll dann später nämlich durch einen Klick auf den HILFE des Programmes im Standard-Browser angezeigt werden... Wie geht das?? Ich such mir im Web schon die Finger und Augen wund... :?


Delete - Mi 02.04.03 21:59

Pack die Datei in die Ressourcen rein und dann, wenn du sie brauchst, schreibst du sie auf die Platte und rufst sie mit Shellexecute auf.


TheUnknown - Mi 02.04.03 23:57

Hi Luckie,

ja wie denn...!? ;-) ich krieg das nicht auf die Kette....


inselberg - Do 03.04.03 01:34

oder einfach in ein verstecktes memo schreiben ...

dann memo1.lines.savetofile > shellexecute ... (*)

oder twebbrowser zum internen anzeigen benutzen

(*) aber ebenso kannst du die html datei gleich mitliefern


Delete - Do 03.04.03 01:46

Ressource-Skript:

Quelltext
1:
HTMLFILE BINRES test.html                    

Mit brcc32 zu test.res kompilieren. (test.html muß im gleichen Verzeichnis líegen.)

Funktion zum Entpacken und auf Festplatte schreiben:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function putbinrestohdd(binresname, path: String): Boolean;
var
  hi, hg, ResSize,
  SizeWritten, hFile : cardinal;
begin
  result := false;
  hi := FindResource(hInstance, @binresname[1], 'BINRES');
  if hi <> 0 then
  begin
    hg := LoadResource(hInstance, hi);
    if hg <> 0 then
    begin
      ResSize := SizeofResource(hInstance, hi);
      hFile := CreateFile(@path[1], GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS,
        FILE_ATTRIBUTE_ARCHIVE, 0);
      if hFile <> INVALID_HANDLE_VALUE then
      try
        result := (WriteFile(hFile, LockResource(HG)^, ResSize,
          SizeWritten, nil) and (SizeWritten = ResSize));
      finally
        CloseHandle(hFile);
      end;
    end;
  end;
end;


Aufruf der Funktion und anzeigen der Datei:

Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
  putbinrestohdd('HTMLFILE', 'c:\test.html');
  Shellexecute(Handle, 'open', 'c:\test.html', nil, nil, SW_SHOW);
end;


Das funktioniert auch mit gifs, jpgs, bmps, exes, dlls also so ziemlich allem. Sollte man sich mal merken. :wink:


Popov - Do 03.04.03 07:03

Der Tip von inselberg ist besser als eine Lösung über Ressource. Das Problem mit der HTML in einer R. ist, daß man für jede kleine Änderung gleich neue Ressource erstellen muß.

Wenn ich sowas habe (jetzt nicht unbedingt HTML) dann mache ich es über eine extra Unit:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
unit uTextInfo;

interface

uses classes;

  procedure TextInfo(sl: TStringList);
  procedure SaveText(FileName: String);

implementation

procedure TextInfo(sl: TStringList);
begin
  sl.Add('<html>');
  sl.Add('<head><title>Titel</title></head>');
  sl.Add('<body>');
  sl.Add('...');
  sl.Add('</body>');
  sl.Add('</html>');
end;

procedure SaveText(FileName: String);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    TextInfo(sl);
    sl.SaveToFile(FileName);
  finally
    sl.Free;
  end;
end;

end.


Hier habe ich zwei Möglichkeiten - entweder lade ich den Text in eine Memo oder ich speichere es gleich auf der Platte.


Delete - Do 03.04.03 10:37

Popov hat folgendes geschrieben:
Der Tip von inselberg ist besser als eine Lösung über Ressource.

Das ist ja wohl Ansichtssache oder? :roll:
Zitat:

Das Problem mit der HTML in einer R. ist, daß man für jede kleine Änderung gleich neue Ressource erstellen muß.

Es reicht die Ressource und die Anwendung neu zu kompilieren. Aber irgendwann sollte man das Stadium erreicht haben, wo die Datei "steht".

Mach du aber jetzt mal komplexere Änderungen an deiner HTML-Datei. Dürfte nicht so einfach sein. Vorallem ausprobieren, wie es aussieht dürfte schwer werden. :wink:

Desweitern halte ich meine Lösung für eleganter. :wink:


Motzi - Do 03.04.03 10:37

Also die Lösung mit dem Memo ist mehr als unprofessionell! Warum is das mit Resourcen so viel komplizierter? Ich mach das immer so:
ich erstell mir am Anfang das Resource-Skript
ich erstell mir eine Batch-Datei zum kompilieren des ResSkript
ich importier die Res-Datei in meinem Projekt.

Sofern ich jetzt eine Datei ändere die über das Resource-Skript in meine Res-Datei wandern soll brauch ich einfach nur einmal die Batch-Datei aufrufen und das Projekt neu kompilieren! Das wars! Und neue Resourcen hinzufügen geht auch ganz einfach! Einfach das Res-Skript entsprechend ändern, einmal die Batch-Datei aufrufen und das Prog neu kompilieren...


Delete - Do 03.04.03 12:08

@Motzi: So macht das jeder vernünftige Entwickler. :wink:

@Luckie: Popov hat den Pferdefuß an der von ihm empfohlenen Lösung sicher nur übersehen. Logisch, wenn man die HTML-Datei ändert, dann muss man natürlich die Ressource neu kompilieren. Andererseits muss man in seinem Fall natürlich auch den HTML-Code in dem Memo anpassen. Und da denke ich dann genau wie du: das ist aufwändiger!

Aber elegant ist die Ressourcenlösung totzdem nicht zwangsläufig. Ich kenne das ja nun schon aus ein paar von deinen Programmen, die z.B. auf die Art ihre Konfiguration "entpacken". Aber da liefere ich die Konfig-Datei dann doch lieber separat mit, bzw. ich speichere die Grundeinstellungen fest im Programm. Neu kompilieren muss ich es ja so oder so ...

Aber, wie du selbst schriebst:
Zitat:
Das ist ja wohl Ansichtssache oder?


inselberg - Do 03.04.03 12:14

zur memo lösung:

natürlich ist es aufwändiger und kaum wartbar, wenn man es mit memo.lines.add macht.

ich meinte auch er soll es im editor machen, so braucht man nur den html code zu ändern mehr nicht.

achja das "mehr als unprof." hat mich sehr verletzt ;)


Delete - Do 03.04.03 12:17

MathiasSimmack hat folgendes geschrieben:
Ich kenne das ja nun schon aus ein paar von deinen Programmen, die z.B. auf die Art ihre Konfiguration "entpacken".

Konfigurationen? DLL's oder die Währungstabelle vom Euro-Umrechner wird mitgeliefert. Aber Konfigurationsdateien? Na ja die Datei vom Euroumrechner könnte man so bezeichnen. Aber so kann ich nicht vergessen sie mit zugeben. Ist mir schon ein paar mal passiert.


Delete - Do 03.04.03 13:21

Das Vergessen sollte normalerweise keine Rolle spielen. Bei der Nutzung von INI-Dateien gibt es Default-Werte, die man im Programm angeben kann/sollte/muss.

Und bei eigenen Konfig-Formaten (binär) sollte das Programm ebenfalls eine Grundkonfiguration beinhalten. Es könnte ja auch mal passieren, dass der User die Datei kurzerhand löscht. Das Programm sollte in so einem Fall dann auch ohne Konfiguration benutzt werden können.

Aber, wie gesagt!, das ist meine persönliche Meinung.


Delete - Do 03.04.03 13:39

Also sowas mache ich nun wirklich nicht.


TheUnknown - Do 03.04.03 13:53

@inselberg: sicherlich, so habe ich mir das auch überlegt, ist aber suuuuper unpraktisch... Wenn ich nämlich was ändern will, muss ich die Strings erst wieder und her kopieren... Ausserdem ist's "unsauberer" Programmierstil! ;-)

@Luckie: VIELEN DANK!!!!! Du hast mir sehr geholfen - genauso wollte ich es haben! Im übrigen halte auch ich diesen Weg für professioneller und eleganter... :-)

@Popov: Auch Dir vielen Dank, dass Du Dir "die Mühe" gemacht, mir helfen zu wollen - aber Luckie's Ansatz finde ich besser, vorallem, weil die HTML-Datei echt schon so gut wie steht!

@Motzi: Das mit der Batch habe ich mir auch sofort angelegt... Zwei Doofe, ein Gedanke! :-)


Motzi - Do 03.04.03 14:30

inselberg hat folgendes geschrieben:
achja das "mehr als unprof." hat mich sehr verletzt ;)

Wenn das so ist, dann möchte ich mich hiermit entschuldigen..! :roll: ;)

Also Standardeinstellungen sind bei mir immer hardgecodet und wenn er die gespeicherten Einstellungen nicht findet, dann nimmt er die Standard-Einstellungen und zeigt den Einstellungen-Dialog an (damit der Benutzer wieder die Möglichkeit hat seine persönlichen Einstellungen vorzunehmen).
Resourcen verwend ich eigentlich nur wenn ich Datein hab die ich irgendwann/irgendwo auf die Festplatte spielen will/muss oder für Bilder o. andere Daten die ich zur Laufzeit lade und in irgendeiner Form benutze...


MSCH - Do 03.04.03 16:16

au weia,
mein Tip: ich verfahre immer so, dass ich das ganze mittels xml/xsl verbrate. Sprich, meine Anwendung spuckt eine definierte XML-Datei aus, mit den Daten die ich haben will.
In einer XSL-Datei, die zur Anwendung mit ausgeliefert wird, lege ich das Aussehen der HTML-Datei fest.
Meine Anwendungen verrödeln dann nur noch das Stylesheet mit der XML-Datei und zeigen das fertige (Html-)Ergebnis im browser an.
Hat den Vorteil, dass man für Layoutsänderungen nicht das Programm sondern lediglich ein neues Stylesheet ausliefern/anpassen muss.
Ist auch Resourcenschonender. Wer will kann ja aus welchen Gründen auch immer, die Stylessheets verschlüsseln, damit der Enduser diese nicht woandern verwerten kann.

grez
MSch


Popov - Do 03.04.03 16:31

@Motzi: wo siehst du da eine Memo-Lösung?

Ich gebe zu, daß ich geschrieben habe, daß man es auch in eine Memo laden kann, das ist nur eine Möglichkeit wenn man es in ener Memo braucht. Das ganze ist eine StringList Lösung. Dar Tip ist allgemein für Texte anzuwenden. Will man es in eine Memo landen, dann läd man es in eine Memo. Will man es speichern, dann läd man es nicht in eine Momo, sondern speichert es auf einem Datenträger.

Also komm mir bitte jetzt nicht damit, daß ich einem empfohlen habe Text in einem unsichtbaren Memo zu halten. So eine Unterstellung müßte ich eigentlich schon richtig übel nehmen.

Apropos Text unsichtbar lagern. Da ist mir gerade eine Idee zu einer kleinen Komponente gekommen.


@TheUnknow

Das war keine Mühe. Ich hab ein Programm in dem ich eine kleine Html-Datei benötige. Sie wird zwar noch gefüllt (deshalb sind in der Datei einige %s plaziert) aber das Prinzip ist das gleiche. Ich hab also nur die Unit kopiert und paar Zeilen entfernt.


Motzi - Do 03.04.03 18:25

Popov hat folgendes geschrieben:
@Motzi: wo siehst du da eine Memo-Lösung?

Ich hab mich da auf inselberg bezogen:
inselberg hat folgendes geschrieben:
oder einfach in ein verstecktes memo schreiben ...

War also keineswegs auf dich bezogen...

Popov hat folgendes geschrieben:
Also komm mir bitte jetzt nicht damit, daß ich einem empfohlen habe Text in einem unsichtbaren Memo zu halten. So eine Unterstellung müßte ich eigentlich schon richtig übel nehmen.

Wieso reagierst du eigentlich immer etwas säuerlich wenn ich irgendwo etwas poste das möglicherweise irgendwie (oder wie in diesem Fall auch nicht) mit deinen Posts zusammenhängt..? :roll: ;)