Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Memo lines insert (https://www.delphipraxis.net/181625-memo-lines-insert.html)

EarlyBird 29. Aug 2014 20:41

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:
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;
Es werden aber immer zwei Zeilen eingefügt.

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???

Sir Rufo 29. Aug 2014 20:53

AW: Memo lines insert
 
Zitat:

Zitat von EarlyBird (Beitrag 1270279)
Was mache ich denn da falsch???

Du schaust einfach nicht in die Dokumentation: Delphi-Referenz durchsuchenTStrings

Delphi-Referenz durchsuchenTStrings.Insert

Helmi 29. Aug 2014 21:01

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;

EarlyBird 30. Aug 2014 08:13

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?)

Helmi 30. Aug 2014 09:18

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:
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;
Und wenn S leer ist, dann wird einfach ein Zeilenumbruch eingefügt.
eine sehr dreckige Lösung wäre folgende:
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
    begin
      Memo1.Lines.Insert(caretLine + 1, #32);
      Memo1.Lines[caretLine + 1] := trim(Memo1.Lines[caretLine + 1]);
    end;

   Memo1.OnChange := Memo1Change;
end;
Dadurch wird eine neue Zeile mit einem Leerzeichen eingefügt (du hattest ein A eingefügt).
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:07 Uhr.

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