2016-05-16 12 views
1

Ich habe ein DBMemo mit Name = dbmemSummary Und eine Methode ReplaceLineBreaks, die zusätzliche Zeilenumbrüche aus DB Memo entfernt. Ich habe ein Problem mit der Cursorposition.Wie man die Cursorposition in Delphi nach dem Ersetzen von Zeilenumbrüchen erhält

Das ist Methode Schnipsel -

procedure ReplaceLineBreaks; 
var 
    Save_Cursor: TCursor; 
    aOldTextList: TStringList; 
    aNewTextList: TStringList; 
    i, : Integer; 
begin 
    inherited; 
    aOldTextList := TStringList.Create; 
    aNewTextList := TStringList.Create; 
    try 
    Save_Cursor := Screen.Cursor; 
    aOldTextList.text := dbmemDisciplineSummary.text; 
    for i := 0 to aOldTextList.Count - 1 do begin 
     if (i = 0) and(Trim(aOldTextList[i]) <> '') then 
     aNewTextList.Add(aOldCN_TextList[i]) 
     else if not ((i<>0) and (Trim(aOldTextList[i - 1]) = '') and (Trim(aOldTextList[i]) = '')) then 
     aNewTextList.Add(aOldTextList[i]); 
    end; 
    cdsPTClinicalNotesCNTEXT.AsString := aNewTextList.Text; 
    finally 
    Screen.Cursor := Save_Cursor; 
    FreeAndNil(aOldTextList); 
    FreeAndNil(aNewTextList); 
    end; 
end; 

Aber seine nicht Cursor wieder auf gleiche Position einstellen ... Kann jemand bitte helfen?

+1

TCursor ist der Mauszeiger nicht das Memo caret, die einige Leute einen Cursor nennen. Sie sollten in die Eigenschaft MemStart für die Caret-Position schauen. Sie müssen dies beim Entfernen von Zeilen verfolgen. Persönlich würde ich den Memotext links und rechts von der selstart-Position aufteilen und Linien separat mit StringReplace entfernen. – MikeD

Antwort

0

Sie müssen die Memo des SelStart und SelLength Eigenschaften verwenden, nicht die Screen.Cursor Eigenschaft:

procedure ReplaceLineBreaks; 
var 
    Save_SelStart, Save_SelLength: Integer; 
    aOldTextList: TStringList; 
    aNewTextList: TStringList; 
    i, : Integer; 
begin 
    inherited; 
    aOldTextList := TStringList.Create; 
    try 
    aNewTextList := TStringList.Create; 
    try 
     aOldTextList.Text := dbmemDisciplineSummary.Text; 
     for i := 0 to aOldTextList.Count - 1 do begin 
     if (i = 0) and(Trim(aOldTextList[i]) <> '') then 
      aNewTextList.Add(aOldCN_TextList[i]) 
     else if not ((i<>0) and (Trim(aOldTextList[i - 1]) = '') and (Trim(aOldTextList[i]) = '')) then 
      aNewTextList.Add(aOldTextList[i]); 
     end; 
     Save_SelStart := dbmemDisciplineSummary.SelStart; 
     Save_SelLength := dbmemDisciplineSummary.SelLength; 
     try 
     cdsPTClinicalNotesCNTEXT.AsString := aNewTextList.Text; 
     finally 
     dbmemDisciplineSummary.SelStart := Save_SelStart; 
     dbmemDisciplineSummary.SelLength := Save_SelLength; 
     end; 
    finally 
     FreeAndNil(aNewTextList); 
    end; 
    finally 
    FreeAndNil(aOldTextList); 
    end; 
end; 
+0

Es berücksichtigt nicht die Anzahl der Zeilen, die entfernt wurde. Buchen Sie die Ausführung, wenn wir dort zusätzliche Leerzeichen haben. Es wird entfernt, aber der Cursor wird nicht auf dieselbe Position zeigen, wo der Benutzer den Text bearbeitet hat. Stattdessen wird die genaue Position des Cursors erfasst und an derselben Stelle platziert, ohne dass zusätzliche Zeilen entfernt werden müssen. –