![]() |
Delphi-Version: 5
Memo lines insert
Hallo,
mit folgendem Code möchte ich nach der Eingabe von 10 Zeichen automatisch eine neue Zeile nach der aktuellen Zeile einfügen.
Delphi-Quellcode:
Es werden aber immer zwei Zeilen eingefügt.
procedure TForm2.mmo1Change(Sender: TObject);
var caretLine : Integer; begin mmo1.OnChange := nil; caretLine := mmo1.CaretPos.Y; if Length(mmo1.Lines[caretLine]) >= 10 then mmo1.Lines.Insert(caretLine +1, ''); mmo1.OnChange := mmo1Change; end; Füge ich die Zeile mit mmo1.Lines.Insert(caretLine, ''); ein wird die Zeile vor der aktuellen Zeile eingefügt. Füge ich die Zeile mit mmo1.Lines.Insert(caretLine + 1, 'A'); ein wird die Zeile richtig eingefügt. In der Zeile steht dann aber das A ich hätte aber gern eine Leere Zeile. Was mache ich denn da falsch??? |
AW: Memo lines insert
Zitat:
![]() ![]() |
AW: Memo lines insert
wie wärs mit nem simplen Zeilenumbruch?
Delphi-Quellcode:
procedure TForm2.Memo1Change(Sender: TObject);
var caretLine : Integer; S_caretLine: String; begin Memo1.OnChange := nil; caretLine := Memo1.CaretPos.Y; S_caretLine := Memo1.Lines[caretLine]; If Length(S_caretLine) >= 10 then Memo1.Lines[caretLine] := S_caretLine + sLineBreak; Memo1.OnChange := Memo1Change; end; |
AW: Memo lines insert
Danke Helmi,
so habe ich es schon gelöst. Mich wundert nur das Verhalten von insert(5,'') also das insert mit einem leeren String. Warum werden dann 2 Zeilenumbrüche eingefügt? (steht das in der Doku?) |
AW: Memo lines insert
wenn man die VCL debuggt, dann kommt man bei einem Insert im Memo bei dieser Procedure raus:
(ich hoff es gibt keine Probleme, wenn man eine Procedure der VCL hier zeigt)
Delphi-Quellcode:
Und wenn S leer ist, dann wird einfach ein Zeilenumbruch eingefügt.
procedure TMemoStrings.Insert(Index: Integer; const S: string);
var SelStart, LineLen: Integer; Line: string; begin if Index >= 0 then begin SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index, 0); if SelStart >= 0 then Line := S + #13#10 else begin SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index - 1, 0); if SelStart < 0 then Exit; LineLen := SendMessage(Memo.Handle, EM_LINELENGTH, SelStart, 0); if LineLen = 0 then Exit; Inc(SelStart, LineLen); Line := #13#10 + s; if s = '' then Line := Line + #13#10; end; SendMessage(Memo.Handle, EM_SETSEL, SelStart, SelStart); SendTextMessage(Memo.Handle, EM_REPLACESEL, 0, Line); end; end; eine sehr dreckige Lösung wäre folgende:
Delphi-Quellcode:
Dadurch wird eine neue Zeile mit einem Leerzeichen eingefügt (du hattest ein A eingefügt).
procedure TForm2.Memo1Change(Sender: TObject);
var caretLine : Integer; S_caretLine: String; begin Memo1.OnChange := nil; caretLine := Memo1.CaretPos.Y; S_caretLine := Memo1.Lines[caretLine]; If Length(S_caretLine) >= 10 then begin Memo1.Lines.Insert(caretLine + 1, #32); Memo1.Lines[caretLine + 1] := trim(Memo1.Lines[caretLine + 1]); end; Memo1.OnChange := Memo1Change; end; In der neuen Zeile werden dann alle Steuer- und Leerzeichen wieder gelöscht (trim) Schön ist aber was anderes.... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 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 by Thomas Breitkreuz