AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Memo lines insert

Ein Thema von EarlyBird · begonnen am 29. Aug 2014 · letzter Beitrag vom 30. Aug 2014
Antwort Antwort
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#1

Memo lines insert

  Alt 29. Aug 2014, 20:41
Delphi-Version: 5
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???
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Memo lines insert

  Alt 29. Aug 2014, 20:53
Was mache ich denn da falsch???
Du schaust einfach nicht in die Dokumentation: Delphi-Referenz durchsuchenTStrings

Delphi-Referenz durchsuchenTStrings.Insert
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Memo lines insert

  Alt 29. Aug 2014, 21:01
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;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#4

AW: Memo lines insert

  Alt 30. Aug 2014, 08:13
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?)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Memo lines insert

  Alt 30. Aug 2014, 09:18
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....
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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