Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi max Länge von TMemo.Text und String (https://www.delphipraxis.net/20625-max-laenge-von-tmemo-text-und-string.html)

F.W. 20. Apr 2004 18:53


max Länge von TMemo.Text und String
 
Hallo mal wieder!

Mein Prog schreibt aus einem TBitmap verschiedene Sachen in ein Memo, das ganze geschieht per Insert:
Delphi-Quellcode:
 Insert(Irgendwas, S, Length(S)+1);
Ich nehme erst noch einen String dazu, da Memo.Text nicht geht, weil: "[Fehler] ... Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden". Nachher findet sich also folgende Zeile:
Delphi-Quellcode:
 Memo.Text := S;

So, jetzt zu meiner Frage: Bei rund Length(Memo.Text) = 10000 hört er auf, egal, ob er mit dem Bild fertig ist, oder nicht.

Warum?

Bernhard Geyer 20. Apr 2004 19:02

Re: max Länge von TMemo.Text und String
 
1, Guckst Du hier bzw. kannst mal probieren MaxLength hochzusetzen. Aber vermutlich wirst Du auch (mit Tricks) nicht über 64k Zeichen hinauskommen

2, Falls Du ein Bitmap (welcher sinn hat dies) einem String und anschließend eine Win32-Control (und TMemo kapselt ein solches) zuweißt ist es problematisch wenn im String irgendwo #$00 steht (was ja evtl. bei dir vorkommen kann). #$00 ist für die Win32-API ein kennzeichner das ein String zu Ende ist (kommt von ANSI-C). Im gegensatz dazu wird bei Delphi die Länge eines Strings als Eintrag im Längenfeld gespeichert. Delphi-Strings können deshalb auch #$00 im String enthalten.

himitsu 20. Apr 2004 19:06

Re: max Länge von TMemo.Text und String
 
in einen String sollten bis zu 2 GB reingehn.


wenn MaxLength auf 0 ist, dann gibt es keine Größenbegrenzung

PS: ich hab gerade 100.000 Byte reinbekommen

Bernhard Geyer 20. Apr 2004 19:15

Re: max Länge von TMemo.Text und String
 
Zitat:

in einen String sollten bis zu 2 GB reingehn.
wenn MaxLength auf 0 ist, dann gibt es keine Größenbegrenzung
PS: ich hab gerade 100.000 Byte reinbekommen
OK. Dann ist evtl. NT - 2003 dieses Problem nicht mehr gegeben (oder hast Du den Test unter 95/98 gemacht?)

Probier mal folgenden Text (und das Problem mit #$00 zu sehen):
Code:
var
  S: String;
begin
  S := 'Test mit #$00 ' + #$00 + ' und weiterer Text';
  Memo1.Text := S;
  ShowMessage(Format('Länge S = %d, Länge Memo = %d', [Length(S), Length(Memo1.Text)]));

himitsu 20. Apr 2004 19:27

Re: max Länge von TMemo.Text und String
 
Nee, ich hatte keine #00 drin - stimmt, Memo arbeitet ja intern mit PChar und stoppt bei #00

@F.W. versuch es mal so

Delphi-Quellcode:
... := Length(S); // die Länge des Srings irgendwo anzeigen
Memo.Text := S;
... := memo1.Lines.Count; // und eventuell nochmal den Text im Memo, zum Vergleich

[edit]
ups, das hatte ja Bernhard Geyer schon gesagt -.-

F.W. 20. Apr 2004 20:25

Re: max Länge von TMemo.Text und String
 
So, die Länge betrug bei dem letzten Versuch 10148 im Memo und 201483. Die Zeilenzahl betrug 108, gezählt habe ich aber nur so um die 60/70 rum.

Das heißt das Memo zeigt nicht alles an. Das heißt ich muss nach diesem Zeichen #00 Ausschau haltn?!

Der Text des Memo setzt sich so zusammen:

Delphi-Quellcode:
 //folgenden 4 Zeilen sind in einer Schleife:
            St := '';
            Insert(Chr(Zahl), St, Length(St)+1);
            Insert(Chr(Zahl), St, Length(St)+1);
            Insert(Chr(Zahl), St, Length(St)+1);
            Insert(St, T, Length(T)+1);
Heißt das ich könnte theoretisch mit Pos(...) nach '#00' suchen?

himitsu 21. Apr 2004 05:33

Re: max Länge von TMemo.Text und String
 
Wäre 'ne Idee. (wobei die #00 mit größter Wahrscheinlichkeit der Grund ist)

Und seh ich das richtig und du hängst wirklich die gleiche Zahl 3-mal an?

Delphi-Quellcode:
St := '';
Insert(Chr(Zahl), St, Length(St)+1);
Insert(Chr(Zahl), St, Length(St)+1);
Insert(Chr(Zahl), St, Length(St)+1);

{ vvv }

St := Chr(Zahl) + Chr(Zahl) + Chr(Zahl);
Delphi-Quellcode:
St := Chr(Zahl) + Chr(Zahl) + Chr(Zahl);
Insert(St, T, Length(T)+1);

{ vvv }

Insert(Chr(Zahl) + Chr(Zahl) + Chr(Zahl), T, Length(T)+1);
Um die #00 zu umgehen kannst du ja auf Hexadezimal umstellen

Chr(Zahl) > IntToHex(Zahl, 2)


************************************************** *

Aber ich vermute mal du meinst es wohl eher so

Code:
Insert(Chr(Zahl[color=red]1[/color]) + Chr(Zahl[color=red]2[/color]) + Chr(Zahl[color=red]3[/color]), T, Length(T)+1);
{bzw}
Insert(Chr([color=red]R[/color]) + Chr([color=red]G[/color]) + Chr([color=red]B[/color]), T, Length(T)+1);
da kann man aber auch mit IntToHex gleich alle Farbwerte zusammen behandeln
Delphi-Quellcode:
Insert(IntToHex(Farbe{TColor}, 6), T, Length(T)+1);

F.W. 21. Apr 2004 14:56

Re: max Länge von TMemo.Text und String
 
Ja, ich hätte vielleicht dazuschreiben sollen, das die Zahlen unterschiedl. sind.

Ich würd gerne bei dieser Methode bleiben, nach welchem String muss ich denn suchen, wirklich nach #00?
Delphi-Quellcode:
 if Pos('#00', S) ...
^ So ^ ?

woki 21. Apr 2004 15:49

Re: max Länge von TMemo.Text und String
 
Hi,

ein 64k Größenbeschränkugsproblem gibt es IMHO nur bei Win95 (da mit Sicherheit), der Grund liegt bei Windows, ich meine bei Win98 sei das bereits nicht mehr da.

Grüsse
Woki


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 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