Discussion:
Memo zeichenweise füllen
(zu alt für eine Antwort)
Heiko Rompel
2013-06-22 06:17:33 UTC
Permalink
Moin,

mit Memo1.Lines.Append(chr(wort));
kann ich ja Zeichen in ein Memo schreiben, nur das jedes Zeichen in
einer neuen Zeile landet.

Gibt es keinen direkten weg, Zeichen direkt in ein Memo zu schreiben?
So wie es in einer Konsole Write und WriteLn gibt, so suche ich ein
"write" für ein Memo.
Oder sollte man wür solche Sachen ein anderes Objekt als Ziel nehmen?

Gruß Heiko
Heiko Rompel
2013-06-22 06:28:36 UTC
Permalink
Nachtrag:

ein Memo1.Text:= chr(wort);
bringt auch nichts - das Memo bleibt leer.

Gruß Heiko
Jens Köhler
2013-06-22 06:49:42 UTC
Permalink
Post by Heiko Rompel
Moin,
mit Memo1.Lines.Append(chr(wort));
kann ich ja Zeichen in ein Memo schreiben, nur das jedes Zeichen in
einer neuen Zeile landet.
Gruß Heiko
Hallo,

wie ist es mit
Memo1.Lines[0] := Memo1.Lines[0] + 'Hallo';

Jens
Heiko Rompel
2013-06-22 06:54:36 UTC
Permalink
Post by Jens Köhler
wie ist es mit
Memo1.Lines[0] := Memo1.Lines[0] + 'Hallo';
das ich ich jetzt auch gerade gefunden.
Nur muss ich dann wohl noch einen Zähler mit laufen lassen und für einen
Umbruch nach x-Zeichen sorgen, weil das sonst nicht lesbar wird.
Danke.

Gruß Heiko
Heiko Rompel
2013-06-22 07:21:22 UTC
Permalink
Hallo,

ich habe jetzt einmal versucht den "Zeilenvorschub" zu realisieren:

======= Code ========
Memo1.Lines[y] := Memo1.Lines[y] +IntToHex(wort,2)+' ';
inc(x);
if x>=30 then
begin
inc(y);
x:=0;
end;
caption:='X = '+IntToStr(x)+' Y = '+IntToStr(y);
======= Code ========

Das X und Y hoch gezählt werden kann man sehen, aber ab Y=1 werden keine
Inhalte mehr in Memo geschrieben.

Auch

======= Code ========
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines[Y] := 'Zeile : '+IntToStr(Y);
caption:= IntToStr(Y);
INC(Y);
end;
======= Code ========

funktioniert nur bis Y=1 (obwohl Y definitiv hochgezählt wird).
Warum?

Gruß HEiko
Jens Köhler
2013-06-22 07:29:16 UTC
Permalink
Post by Jens Köhler
Hallo,
funktioniert nur bis Y=1 (obwohl Y definitiv hochgezählt wird).
Warum?
Gruß HEiko
Hallo,

nicht probiert, aber ich denke mal, es müssen im Memo die Zeilen
vorhanden sein.

also etwa
while Memo.Lines.Count < y do
Memo.Lines.Add('');
Heiko Rompel
2013-06-22 07:41:56 UTC
Permalink
Post by Jens Köhler
also etwa
while Memo.Lines.Count < y do
Memo.Lines.Add('');
Jupp, das war es.

Danke.
Heiko
Thomas G. Liesner
2013-06-23 23:52:14 UTC
Permalink
Post by Heiko Rompel
Nur muss ich dann wohl noch einen Zähler mit laufen lassen und für einen
Umbruch nach x-Zeichen sorgen, weil das sonst nicht lesbar wird.
Eigenschaft WORDWRAP kann weswegen nicht genutzt werden?
Und benutzt du wirklich Festbreitenschrift?

So long,
Thomas G. Liesner

Peter
2013-06-22 08:06:45 UTC
Permalink
Post by Heiko Rompel
Moin,
mit Memo1.Lines.Append(chr(wort));
kann ich ja Zeichen in ein Memo schreiben, nur das jedes Zeichen in
einer neuen Zeile landet.
Gibt es keinen direkten weg, Zeichen direkt in ein Memo zu schreiben?
Doch, sicher.

memo1.SelStart := memo1.gettextlen; // setzt caret an's ende
memo1.seltext := Chr(...); // geht auch mit einen String

Hier den Umweg über die Lines-Eigenschaft zu gehen ist massiv
ineffizient.
--
Peter Below
Hans-Peter Diettrich
2013-06-22 14:18:30 UTC
Permalink
Post by Heiko Rompel
Moin,
mit Memo1.Lines.Append(chr(wort));
kann ich ja Zeichen in ein Memo schreiben, nur das jedes Zeichen in
einer neuen Zeile landet.
Gibt es keinen direkten weg, Zeichen direkt in ein Memo zu schreiben?
So wie es in einer Konsole Write und WriteLn gibt, so suche ich ein
"write" für ein Memo.
Siehe Antwort von Peter Below :-)
Post by Heiko Rompel
Oder sollte man wür solche Sachen ein anderes Objekt als Ziel nehmen?
Kommt drauf an was Du möchtest. Ein Memo verwaltet einen kompletten Text
und fügt Zeilenumbrüche nach Bedarf ein. Das bedeutet, daß für jeden
Zugriff über Memo.Lines der Text in Zeilen aufgeteilt wird, und nach der
Änderung daraus wieder der neue Text konstruiert wird - seeeehr aufwendig!

Fürs Einfügen (Write) brauchst Du die Position im Text, an der eingefügt
werden soll (Memo.Selstart), und wieviel Text überschrieben werden soll
(Memo.SelLength, darf 0 sein). Gleichzeitig gibt SelStart/Length vor,
was als ausgewählt *dargestellt* werden soll. Für's Anhängen hat Peter
ja schon den Code gepostet, das geht ganz fix.

Wenn Du lieber zeilenweise arbeiten möchtest, ohne Zeilenumbruch, dann
kannst Du auch eine ListBox verwenden, die arbeitet schon intern mit
einzelnen Zeilen. Für Write gibt es einen Ersatz Str(...), der einen
entsprechenden String liefert. Für mehrere Writes kannst Du diese
Strings aneinanderhängen und erst bei WriteLn an die ListBox anhängen.
Oder Du hängst die einzelnen Write-Strings an die letzte Zeile der
ListBox an, und bei WriteLn eine leere Zeile. Aber das geht mit einem
Memo eigentlich viel eleganter. Bei Problemen mit dem Zeilenumbruch
(wenn die Enden verschwinden) die Memo Properties prüfen (WordWrap...).

DoDi
Gerd-Ulrich Meyer
2013-06-22 15:19:05 UTC
Permalink
Hallo,
Post by Heiko Rompel
Moin,
mit Memo1.Lines.Append(chr(wort));
kann ich ja Zeichen in ein Memo schreiben, nur das jedes Zeichen in
einer neuen Zeile landet.
Gibt es keinen direkten weg, Zeichen direkt in ein Memo zu schreiben?
So wie es in einer Konsole Write und WriteLn gibt, so suche ich ein
"write" für ein Memo.
Evtl. langsam (und umständlich), aber wie wäre es mit (ungetestet):

procedure WriteCharToMemo(NewChar : char);
var TempText : string;
begin
TempText:=Memo1.Text;
TempText:=TempText+NewChar;
Memo1.Text:=TempText;
end;

Für's Einfügen brauchts dann einen entsprechenden Zähler und
Insert(NewChar, TempText, EinfZaehler);
Post by Heiko Rompel
Gruß Heiko
Gruss

Gerd-Ulrich Meyer
Loading...