Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Html-code in memo ausgeben


lukas-a - Fr 12.12.08 17:23
Titel: Html-code in memo ausgeben
Hallo ,hab mich gerade hier angemeldet udn hoffe eure hilfe.
ich bin aus der übung ... bzw war nie besonders gut.
Hoffe es ist das richtige unterforum

Zu meinem Problem:
Ich möchte für einen Autohandel ein Programm schreiben das nach Eingabe der Parameter (Leistung,km,..) diese in ein html-code einfügt und dann als fertigen html-code ausgibt.
Klingt ja nicht schwer .

Habe dann folgendes gemacht.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
begin
    Memo4.Lines.Add('
<html>
<head>
</head>
<body>
<br>
<br>
<br>
<p></p>
<p class="MsoNormal"><font color="#333333"
 face="Arial" size="1"><span
 style="font-size: 9pt; font-family: Arial; color: rgb(51, 51, 51);">
<p> </p>
</span></font></p>
<p class="MsoNormal"><font color="#333333"
 face="Arial" size="1"><sp

doch dann kommen fehler dass das nicht geht . meine frage gibt es eine Möglichkeit den Html-code als memo oder ähnliches auszugeben?
und
Wie lasse ich die Parameter einfließen hatte eigentlich gedacht das es so geht

einfach im memotext/htmlcode
leistung:edit4.text

dann kommt aber ja nur edit4.text und nicht die eigentliche eingabe.Ich denke dies ist ein kleiner aber sehr dummer fehler.


Ich weiß echt nicht mehr wie es richtig geht ,hatte nur 1 jahr info in der schule un hab dann 1,5 jahren nichts mehr gemacht.


danke m vorraus

lukas

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Moderiert von user profile iconGausi: Topic aus Algorithmen, Optimierung und Assembler verschoben am Fr 12.12.2008 um 16:46


Delete - Fr 12.12.08 17:26

Versuch es mal so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo4.Lines.Add('<html>');
  Memo4.Lines.Add('<head>');
  Memo4.Lines.Add('</head>');
  Memo4.Lines.Add('<body> ');
  //usw.
end;


Im Quelltext darf bei Stringliteralen kein Zeilenumbruch stehen. Den kannst Du zur Not auch händisch mit sLinebreak einfügen.


Chrischuh - Fr 12.12.08 17:33


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 
procedure TForm1.Button1Click(Sender: TObject);
begin


with memo4.lines do
begin
clear;
add('<html>');
add('<head>');
//...
add('Leistung: '+edit4.text);
end;


end;


lukas-a - Fr 12.12.08 17:35

vielen dank für dei schnelle hilfe, aber es ist ein sehr langer htmlcode jedes einzelne wort immer wieder zusatzen dauert ja ewigkeiten. gibt es nicht noch eine andere ausgabe möglichkeit?


Delete - Fr 12.12.08 17:38

Du könntest den HTML-String als Konstante hinterlegen, wobei Du für die variablen Teile ein "%s" (ohne Anführungszeichen) einfügst. Mit dem Format-Befehl kannst Du dann die variablen Teile einfügen, wobei die Anzahl der Parameter genau der Anzahl der "%s" entsprechen muss.


jaenicke - Fr 12.12.08 17:41


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Memo4.Lines.Add('<html>'#13#10
    + '<head>'#13#10
    + '</head>'#13#10
    + '<body>'#13#10
    + ''#13#10
    + ''#13#10
    + ''#13#10
    ...

Besser wäre es aber vielleicht den Text als externe Datei oder in der Exe als Ressource mitzuliefern, sonst tippst du trotzdem lange.

Falls du ein neueres Delphi hast, kannst du auch per Makro die Änderung in den Zeilen machen.


lukas-a - Fr 12.12.08 17:45

das mit dem formatbefehl versteh ich net ganz

hab ich mir auch überlegt könnte ich das als editordatei ausgeben?bzw.schon bei der exe mitgeliefert.
wie mach ich dann das sich die parameter ändern?

bzw. wie lad/speicher ich dann die editordatei?


Delete - Fr 12.12.08 17:52

Was ich meinte:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
const sText = '<html>'+sLineBreak+'<head>'+
                      sLineBreak+'<title>%s</title>'+
                      sLineBreak+'</head>'+sLinebreak+'<body>'+
                      sLinebreak+'%s'+
                     '</body>'+sLinebreak+'</html>';
begin
  Memo1.Text := Format(sText,['Eine Seite','Hallo Welt']);
end;


jaenicke - Fr 12.12.08 17:57

user profile iconlukas-a hat folgendes geschrieben Zum zitierten Posting springen:
bzw.schon bei der exe mitgeliefert.
wie mach ich dann das sich die parameter ändern?

bzw. wie lad/speicher ich dann die editordatei?
Wie du dann Text einfügst hat user profile iconDeddyH ja gerade demonstriert.

Mitliefern würde ich es als Ressource. Diese lädst du dann mit einem TResourceStream, kopierst diesen in einen TStringStream und hast dann den Text in der Eigenschaft DataString des TStringStream stehen. Darauf wendest du dann den Formatbefehl an.


lukas-a - Fr 12.12.08 18:17

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
const sText = '<html>'+sLineBreak+'<head>'+
                      sLineBreak+'<title>%s</title>'+
                      sLineBreak+'</head>'+sLinebreak+'<body>'+
                      sLinebreak+'%s'+
                     '</body>'+sLinebreak+'</html>';
begin
  Memo1.Text := Format(sText,['Eine Seite','Hallo Welt']);
end;
wenn ich das so übernehme kommt es zum fehler bei slinebreak :undefinierter bezeichner

das ist ja ganz gut nur muss ich auch den ganzen code mühsam umschreiben.
wie bekomm ich es hin das anstatt z.b. eine seite der inhalt von z.b. edit2.text übernommen wird

sorry für die vielen fragen ^^

Moderiert von user profile iconNarses: Zitat repariert


jaenicke - Fr 12.12.08 18:27

user profile iconlukas-a hat folgendes geschrieben Zum zitierten Posting springen:
das ist ja ganz gut nur muss ich auch den ganzen code mühsam umschreiben.
Nicht wenn du es machst wie ich es gesagt habe und den Text aus einer Ressource lädst.


lukas-a - Fr 12.12.08 18:29

hab noch nie mit TResourceStream und den dingen gearbeit wie gesagt nur 1 jahr schulinfo,und aus der hilfe werd ich auch net schlau draus.


pesi - Fr 12.12.08 18:36
Titel: LoadFromFile
Warum so kompliziert? Mach eine "Textdatei" (wie auch immer die Endung heißen mag) mit Deinem HTML-Inhalt und speicher sie lokal in dem Verzeichnis wo auch die Anwendung liegt.
Dann im Programm einfach Memo.Lines.LoadFromFile('DeineDatei.txt');

Wenn Du dann Deine anderen Sachen dort eingefügt hast, dann kannst Du das Memo einfach abspeicher wie z.B.: Memo.Lines.SaveToFile('MeineHTMLDatei.HTML');

...und wenn´s dann auch noch angezeigt werden soll, dann schau Dir mal "shellexecute" an, damit kannst Du die soeben abgespeicherte HTML-Datei im Browserfenster aufrufen.

Gruß Peter


lukas-a - Fr 12.12.08 18:51

vielen dank

jetzt hab ich die html datei zumindestmal in meiner memobox aber wie bekomm ich jetzt noch meine parameter rein?


Delete - Fr 12.12.08 18:53

Memo.Lines.Insert(Zeilennummer,String)


jaenicke - Fr 12.12.08 18:56
Titel: Re: LoadFromFile
user profile iconpesi hat folgendes geschrieben Zum zitierten Posting springen:
Dann im Programm einfach Memo.Lines.LoadFromFile('DeineDatei.txt');
So ist es falsch und wird nicht immer funktionieren, nur zufällig und bei kleineren Programmen meistens.
http://www.delphi-library.de/viewtopic.php?p=499701

Wie es mit Ressourcen funktioniert:
Die Datei mit dem Code, z.B. MeineDatei.html, ins Unterverzeichnis Res.

Res\MeineRes.rc
1:
NameDerRessource  TEXT  MeineDatei.html                    


Res\MeineRes.bat
1:
brcc32 MeineRes.rc                    
Die Datei MeineRes.bat doppelklicken.

Im Code dann

Delphi-Quelltext
1:
{$R Res\MeineRes.res}                    

Und zum Benutzen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  ResStream: TResourceStream;
  StringStream: TStringStream;
begin
  ResStream := TResourceStream.Create(hInstance, 'NameDerRessource''TEXT');
  StringStream := TStringStream.Create('');
  StringStream.CopyFrom(ResStream, ResStream.Size);
  ResStream.Free;
  ShowMessage(StringStream.DataString);
  StringStream.Free;
end;
An der Stelle mit ShowMessage kannst du dann stattdessen die Parameter einfügen.


lukas-a - Fr 12.12.08 21:22

ich hab iwie immer noch probleme tortz der erklärungen

1 .
Zitat:
Memo.Lines.Insert(Zeilennummer,String)


ich möchte aus verschiedenen editx.text die inhalte an gewisse stellen im html-quelltext setzen . wie mach ich das ? ich denke damit kommt man nicht weit weil doch nirgends edit vorkommt.

der zweite post ist nach meinen vorstellungen nur mit zu viel arbeit.

2.
Zitat:
An der Stelle mit ShowMessage kannst du dann stattdessen die Parameter einfügen.


versteh ich ebenfalls nicht hab mehrere strings die ich an verschiedenen stellen im html code setzen möchte.

wie erstelle ich eine .rc datei bzw. eine solche .bat ?

hab mal bild angehangen so wie mein prog, aussieht .

gibt es noch ne andere ausgabevariante ? mit der man einfach den htmlcode einfügt und dann dort wo was hin soll edit1.text usw ersetzt?


Delete - Fr 12.12.08 21:27

Wie bereits gesagt, den gesamten HTML-Code mit "%s"-Platzhaltern irgendwo ablegen, sei es als Ressource, als Konstante oder was weiß ich. Und dann setz Dich mal mit dem Format-Befehl auseinander, ein Beispiel hab ich bereits gepostet.


jaenicke - Fr 12.12.08 22:03

user profile iconlukas-a hat folgendes geschrieben Zum zitierten Posting springen:
wie erstelle ich eine .rc datei bzw. eine solche .bat ?
Das sind normale Textdateien, wie ja der Inhalt wohl nahelegt... :roll:

Und in deiner HTML-Datei fügst du dann die Platzhalter ein.

Quelltext
1:
<title>%s</title>                    
Und dann benutzt du den Format-Befehl wie oben schon gezeigt wurde oder wie es im Internet in x Beispielen zu sehen ist.

Und wenn du damit nicht klar kommst, dann zeig doch wie weit du bist und wo du nicht weiter kommst.


lukas-a - Fr 12.12.08 23:41

http://www.file-upload.net/download-1312762/auto.rar.html viellt. kann mal jemand drüber sehn.

iwie gelingt es mir nicht die res datei zu erstellen. hab im quelltext die ersten edits zu %s geändert viellt. kann es ja mal einer angeben mit edit1.text oder so

dnake


jaenicke - Sa 13.12.08 00:18

Du solltest dein Windows ordentlich einrichten...
Windows Explorer --> Extras --> Ordneroptionen --> Ansicht --> Erweiterungen bei bekannten Dateitypen ausblenden
Das solltest du deaktivieren, wie es jeder etwas erfahrene Benutzer tut, dann würdest du auch sehen, dass du keine Datei auto.rc sondern eine Datei auto.rc.txt erstellt hast. ;-)

Dann hast du c:\ mit in deine Batchdatei geschrieben, die Dateien werden aber ja wohl nicht alle unter c:\ direkt liegen, oder? :shock:
Auch sonst solltest du an der Stelle (anders als in einem Programm selbst) absolute fest geschriebene Ordner vermeiden.
Du solltest die Dateien lieber in ein Unterverzeichnis legen, wie ich es geschrieben hatte, sonst kann es mit der Resourceneinbindung Probleme geben. Grund: Die Projektversion (in den Projektoptionen) sucht Delphi in der ersten eingebundenen .res Datei, und wenn das dann die falsche ist, kannst du diese Optionen nicht mehr verändern.

So, dann im Code fehlt noch die Zeile zur Einbindung:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Im Code dann

Delphi-Quelltext
1:
{$R Res\MeineRes.res}                    

Und deine Resource heißt nicht auto.res (das ist die Datei) sondern nur auto.

Delphi-Quelltext
1:
ResStream := TResourceStream.Create(hInstance, 'auto''TEXT');                    


Ich habe das mal korrigiert angehängt ;-). Mit Format geht das nicht, weil du viele % Zeichen verwendest, ich habe einfach mal %%%%EDIT1%%%% in den HTML-Quelltext geschrieben, dies wird im Beispiel durch den Inhalt von Edit1 ersetzt.

Dann noch zwei Tipps:
1. Bezeichne deine Komponenten ordentlich. Was Edit1, Edit2, Memo1, etc. ist kannst du dir nie auswendig merken und musst jedesmal nachschauen. Wenn du es zum Beispiel edtTitle nennst, dann weißt du vom Namen her, dass es das Editfeld für den Titel ist.
2. MS Word 2002 (?) ist kein geeigneter HTML-Editor. Der Quelltext, den es erzeugt, ist grauslich. Eine kostenlose Alternative ist dieser: http://www.nvu-composer.de/
Die Qualität des erzeugten Quelltextes kenne ich nicht so genau, aber besser ist er vermutlich auf jeden Fall.

Ich selbst nutze das nicht kostenlose MS Expression Web [http://www.microsoft.com/germany/expression/products/overview.aspx?key=web], aber der ist für deine Zwecke sicher überdimensioniert. Der erzeugte Code ist aber sehr gut.


lukas-a - Sa 13.12.08 14:03

vielen dank so ist es jetzt perfekt.
hab auch selbst jetzt großteilmäßig verstanden.


lukas-a - Mi 17.12.08 19:46

hab wiederrum ein kleines problem hab jetzt alles soweit und hab auch die res aktualisiert aber es wird nur memo3.text geändert der rest bleibt bei %%%%Edit1.text%%%%

kann mir jemand sagen wieso ?

Delphi-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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
var
  ResStream: TResourceStream;
  StringStream: TStringStream;
begin

  ResStream := TResourceStream.Create(hInstance, 'auto''TEXT');
  StringStream := TStringStream.Create('');
  StringStream.CopyFrom(ResStream, ResStream.Size);
  ResStream.Free;

  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT1%%%%',
    Edit1.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT2%%%%',
    Edit2.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT3%%%%',
    Edit3.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT4%%%%',
    Edit4.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT5%%%%',
    Edit5.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT6%%%%',
    Edit6.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT7%%%%',
    Edit7.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT8%%%%',
    Edit8.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT9%%%%',
    Edit9.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT10%%%%',
    Edit10.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT11%%%%',
    Edit11.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT12%%%%',
    Edit12.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT13%%%%',
    Edit13.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT14%%%%',
    Edit14.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT15%%%%',
    Edit15.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT16%%%%',
    Edit16.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT17%%%%',
    Edit17.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT18%%%%',
    Edit18.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT19%%%%',
    Edit19.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT20%%%%',
    Edit20.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT21%%%%',
    Edit21.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT22%%%%',
    Edit22.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT23%%%%',
    Memo1.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT24%%%%',
    Memo2.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT25%%%%',
    Memo3.Text, [rfReplaceAll]);
  StringStream.Free;

end;


könnte es auch sein das es am htmlcode liegt ?
es wird immer nur die letzte änderung in diesem fall %%%%edit25%%%% geändert angezeigt


jaenicke - Mi 17.12.08 22:33

user profile iconlukas-a hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  ResStream: TResourceStream;
  StringStream: TStringStream;
begin

  ResStream := TResourceStream.Create(hInstance, 'auto''TEXT');
  StringStream := TStringStream.Create('');
  StringStream.CopyFrom(ResStream, ResStream.Size);
  ResStream.Free;

  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT1%%%%',
    Edit1.Text, [rfReplaceAll]);

  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT2%%%%',
    Edit2.Text, [rfReplaceAll]);
Edit1 bis Edit25, das tut weh... :autsch: :autsch: :autsch: :autsch: :autsch:

Naja, deine Sache, zum Problem, schau dir mal an was du machst:
Du weist Memo4.Text den Inhalt von StringStream.DataString zu, wobei du %%%%EDIT1%%%% ersetzt. Und danach? Du weist Memo4.Text den Inhalt von StringStream.DataString zu, wobei du %%%%EDIT1%%%% ersetzt. usw.
Der Inhalt von StringStream.DataString ändert sich aber nicht... Was du willst ist doch in dem ersetzten Text weiter zu ersetzen. Der steht aber nicht in StringStream.DataString sondern in Memo4.Text nach der ersten Ersetzung... ;-)


Boldar - Mi 17.12.08 22:35

lads doch hier als anhang hoch...


lukas-a - Do 18.12.08 00:14

sorry verstehs net ganz...

wie beheb ich den fehler?


jaenicke - Do 18.12.08 00:19

user profile iconlukas-a hat folgendes geschrieben Zum zitierten Posting springen:
wie beheb ich den fehler?
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Der Inhalt von StringStream.DataString ändert sich aber nicht... Was du willst ist doch in dem ersetzten Text weiter zu ersetzen. Der steht aber nicht in StringStream.DataString sondern in Memo4.Text nach der ersten Ersetzung...

Delphi-Quelltext
1:
2:
3:
4:
  Memo4.Text := StringReplace(StringStream.DataString, '%%%%EDIT1%%%%',
    Edit1.Text, [rfReplaceAll]);
  Memo4.Text := StringReplace(Memo4.Text'%%%%EDIT2%%%%',
    Edit2.Text, [rfReplaceAll]);


ssb-blume - Do 18.12.08 10:58

Hallo,
es gibt auch noch eine andere Möglichkeit: ein Template!

Schreib Deinen Text in HTML und die Stellen, die mit
Werten gefüllt werden sollen als z.B. <$ii>, wobei
ii eine Zahl ist, die dann auf ein Textfeld zeigt, aus
dem dann der Text entnommen wird und diesen Eintrag ersetzt.
Ist genau wie bei Serienbriefen etc.


jaenicke - Do 18.12.08 13:53

Wo ist der Unterschied (außer in der Bezeichnung der Ersetzung)? :gruebel: