![]() |
TMemoryStream fehler
Hallo,
ich habe jetzt von Delphi 2006 auf Delphi 2009 geupdatet. Nun ist mir folgender Fehler aufgefallen. Ich habe folgenden Code:
Delphi-Quellcode:
Damit soll aus Memo1 der Quelltext für die Website geladen werden.
type
TStreamHelper = class helper for TStream public procedure WriteString (const s: string); end; procedure TStreamHelper.WriteString (const s: string); var len : Integer; begin len := Length(s); WriteBuffer(len, SizeOf(len)); if (len > 0) then WriteBuffer(s[1], len); end; ... statestream:= TMemoryStream.Create; statestream.WriteString(Memo1.Lines.Text); AResponseInfo.ContentStream := statestream; In Memo1 ist noch alles in Ordnung der Quelltext ist einwandfrei. Im Browser sieht das dann nicht mehr so gut aus, da kommt nur noch mist raus. Merkwürdigerweise wenn ich eine Datei per TFilestream lade und anzeige ist alles in Ordnung. Wo kann denn da der Fehler liegen? Auch das aussehen des Quelltextes ist komisch. In Memo1:
Code:
Im Browser:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>INDEX</title> <style type="text/css"> <!-- body { margin-left: 0px; margin-top: 2px; margin-right: 0px; margin-bottom: 2px; background-color: #000000; } body,td,th { color: #CCCCCC; font-family: Arial, Helvetica, sans-serif; } a:link { color: #CCCCCC; text-decoration: none; } a:visited { color: #CCCCCC; text-decoration: none; } a:hover { color: #CCCCCC; text-decoration: underline; } a:active { color: #CCCCCC; text-decoration: none; } --> </style> </head> <body oncontextmenu="return false"> <script language="javascript" type="text/javascript"> <!-- function reload() { location.reload(); } //--> </SCRIPT> <div style="float: left;">[b][url="javascript:reload()"]Refresh[/url][/b]</div> <div style="float: right;">[b][url="./action?logout"]Logout[/url][/b]</div> <div align="center"> [b]<u>Status</u>|[url="settings.html"]Einstellungen[/url][/b]</div> <hr /> </body> </html>
Code:
Š < ! D O C T Y P E h t m l P U B L I C " - / / W 3 C / / D T D X H T M L 1 . 0 T r a n s i t i o n a l / / E N " " h t t p : / / w w w . w 3 . o r g / T R / x h t m l 1 / D T D / x h t m l 1 - t r a n s i t i o n a l . d t d " >
< h t m l x m l n s = " h t t p : / / w w w . w 3 . o r g / 1 9 9 9 / x h t m l " > < h e a d > < m e t a h t t p - e q u i v = " C o n t e n t - T y p e " c o n t e n t = " t e x t / h t m l ; c h a r s e t = i s o - 8 8 5 9 - 1 " / > < t i t l e > I N D E X < / t i t l e > < s t y l e t y p e = " t e x t / c s s " > < ! - - b o d y { m a r g i n - l e f t : 0 p x ; m a r g i n - t o p : 2 p x ; m a r g i n - r i g h t : 0 p x ; m a r g i n - b o t t o m : 2 p x ; b a c k g r o u n d - c o l o r : # 0 0 0 0 0 0 ; } b o d y , t d , t h { c o l o r : # C C C C C C ; f o n t - f a m i l y : A r i a l , H e l v e t i c a , s a n s - s e r i f ; } a : l i n k { c o l o r : # C C C C C C ; t e x t - d e c o r a t i o n : n o n e ; } a : v i s i t e d { c o l o r : # C C C C C C ; t e x t - d e c o r a t i o n : n o n e ; } a : h o v e r { c o l o r : # C C C C C C ; t e x t - d e c o r a t i o n : u n d e r l i n e ; } a : a c t i v e { c o l o r : # C C C C |
Re: TMemoryStream fehler
Ein String (D2) ist ein String (D2007) ist keinString(D2009): Stichwort 'WideString'
|
Re: TMemoryStream fehler
ersetze einfach überall string durch AnsiString und es läuft wieder (allerdings dann natürlich nicht als Unicode)
PS: D2009 String = UnicodeString und nicht WideString :zwinker: Wenn es Unicode werden soll dann entweder alles auf UnicodeString ändern oder WideString, wenn der Code weiterhin kompatibel zu älteren Delphi-Versionen bleiben soll und natürlich
Delphi-Quellcode:
oder es als string belassen und dann
WriteBuffer(s[1], len * 2); // + WideString oder UnicodeString
Delphi-Quellcode:
bei WideString ist der Format im Stream dann immer in Unicode,
WriteBuffer(s[1], len * SizeOf(Char));
bei AnsiString dann immer ANSI und bei String abhängig vom Compiler PSS: ist auh ganz frisch und akuell in Zeile 3 zu finden :mrgreen: Forum: Tutorials und Kurse > ![]() |
Re: TMemoryStream fehler
Zitat:
Kann mich bitte einer Aufklären. Was geschieht hier genau:
Delphi-Quellcode:
MfG und danke im voraus
TStreamHelper = class helper for TStream
|
Re: TMemoryStream fehler
Zitat:
|
Re: TMemoryStream fehler
@Aphton: Ein Delphi-Feature ab Delphi 2006: Class helpers. Diese Deklaration ermöglicht, bei einem beliebigen Stream str.WriteString('Wuppdi') zu schreiben, ohne dass dafür die Deklaration von TStream angepasst werden müsste.
|
Re: TMemoryStream fehler
Und es könne so auch sealed classes "erweitert" werden
|
Re: TMemoryStream fehler
Zitat:
|
Re: TMemoryStream fehler
Seit 2006 (?) gibt es ein Schlüsselwort "sealed".
Ob es funktioniert, ist die andere Sache :? Tut es :) |
Re: TMemoryStream fehler
Delphi 2006 TDE kennt das Schlüsselwort sealed. Oh weh, das ist mir bisher total entgangen. Aber so spezielle Typen habe ich bisher nicht gebraucht, das ich diese mit sealed versehen musste.
Tut mir leid für OT. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz