Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TMemoryStream fehler (https://www.delphipraxis.net/136114-tmemorystream-fehler.html)

XXcD 23. Jun 2009 19:49


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:
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;
Damit soll aus Memo1 der Quelltext für die Website geladen werden.

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:
<!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>
Im Browser:
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

alzaimar 23. Jun 2009 19:57

Re: TMemoryStream fehler
 
Ein String (D2) ist ein String (D2007) ist keinString(D2009): Stichwort 'WideString'

himitsu 23. Jun 2009 20:13

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:
WriteBuffer(s[1], len * 2); // + WideString oder UnicodeString
oder es als string belassen und dann
Delphi-Quellcode:
WriteBuffer(s[1], len * SizeOf(Char));
bei WideString ist der Format im Stream dann immer in Unicode,
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 > Strings lesen und speichern (via Stream und Co.)

Aphton 23. Jun 2009 20:55

Re: TMemoryStream fehler
 
Zitat:

Zitat von XXcD
Hallo,
ich habe jetzt von Delphi 2006 auf Delphi 2009 geupdatet.
Nun ist mir folgender Fehler aufgefallen.

Ich habe folgenden Code:
Delphi-Quellcode:
type
  TStreamHelper = class helper for TStream
  public
    procedure WriteString (const s: string);
  end;

Was ist das für eine Syntax?
Kann mich bitte einer Aufklären.

Was geschieht hier genau:
Delphi-Quellcode:
TStreamHelper = class helper for TStream
MfG und danke im voraus

alzaimar 23. Jun 2009 21:00

Re: TMemoryStream fehler
 
Zitat:

Zitat von himitsu
PS: D2009 String = UnicodeString und nicht WideString :zwinker:

Argumentativ kein (8bit vs. 16bit) aber en detail ein gewaltiger Unterschied! Danke für die Korrektur.

Apollonius 23. Jun 2009 21:03

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.

mkinzler 23. Jun 2009 21:08

Re: TMemoryStream fehler
 
Und es könne so auch sealed classes "erweitert" werden

quendolineDD 23. Jun 2009 21:25

Re: TMemoryStream fehler
 
Zitat:

Zitat von mkinzler
Und es könne so auch sealed classes "erweitert" werden

Gibts diese überhaupt in Delphi? Klassen die nicht mehr erweitert werden können habe ich in Delphi noch nie gesehen. Kenne das nur aus C# und Java.

Die Muhkuh 23. Jun 2009 21:32

Re: TMemoryStream fehler
 
Seit 2006 (?) gibt es ein Schlüsselwort "sealed".

Ob es funktioniert, ist die andere Sache :?
Tut es :)

quendolineDD 23. Jun 2009 21:37

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 05:44 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz