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
Gausi: Delphi-Tags hinzugefügtModeriert von
Gausi: 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> '); 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
lukas-a hat folgendes geschrieben : |
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
DeddyH 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
DeddyH hat folgendes geschrieben : |
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
Narses: Zitat repariert
jaenicke - Fr 12.12.08 18:27
lukas-a hat folgendes geschrieben : |
| 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
pesi hat folgendes geschrieben : |
| 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 |
Die Datei MeineRes.bat doppelklicken.
Im Code dann
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
lukas-a hat folgendes geschrieben : |
| 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.
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:
jaenicke hat folgendes geschrieben : |
| Im Code dann |
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
lukas-a hat folgendes geschrieben : |
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?
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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!