2016-05-16 11 views
1

DBMemoにName = dbmemSummaryがあります。また、DB Memoから余分な改行を削除するReplaceLineBreaksメソッドがあります。カーソル位置の設定に問題があります。改行を置き換えた後にDelphiのカーソル位置を維持する方法

これは、メソッドの抜粋です -

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; 

しかし、そのバックと同じ位置にカーソルを設定されていません...いくつかのいずれかが助けてくださいことはできますか?あなたがメモのSelStartSelLengthプロパティではなく、Screen.Cursorプロパティを使用する必要が

+1

TCursorは、マウスポインタではなく、一部の人々は、カーソルを呼び出すメモキャレット、です。あなたはキャレット位置のためのメモのSelStartプロパティを調べたいでしょう。行を削除するときにそれを追跡する必要があります。個人的には、メモのテキストをセルの開始位置の左右に分割し、StringReplaceを使って別々に行を削除します。 – MikeD

答えて

0

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

削除された行の数を考慮していません。そこに余分な空白行スペースがあれば、これを実行してください。削除されますが、カーソルは、ユーザーがテキストを編集したのと同じ位置を指していません。その代わりに、カーソルの正確な位置を捕捉し、余分な線の除去を考慮せずに同じ場所に置いています。 –

関連する問題