So, ich habe meinen Code jetzt nochmal ein bisschen verfeinert. Resultat: Auch diese nachher nochmal kurz erwähnten minimalen Undo-Probs sind verschwunden (wo es vor der Wiederherstellung des AusgangsStrings immer nochmal einen kleinen einen-UndoKlick-langen Caret-Ausflug ans
Unit-Ende oder an den
Unit-Anfang gab).
Hatte meinen Code ursprünglich von einem anderen Code abgeleitet, der immer den gesamten Quellcode ausgetauscht hatte. Und zwar per StringList, in der ich dann vorher einen bestimmten String speziell zu bearbeiten hatte. Das klappte auch ganz gut, brachte jedoch auch diese besagten kleine Undo-Probs mit sich.
Mein aktueller Code geht jetzt etwas in diese Richtung
hier (und dort nach "CreateUndoableWriter" suchen) und tauscht nun auch nur noch mehr den tatsächlich zu ersetzenden Teilstring aus. Effekt: Alle Undo-Probs komplett verschwunden!
Delphi-Quellcode:
procedure TIDENotifier.replaceComment_Execution;
var
I,BlankGap : integer;
OTAModuleServices: IOTAModuleServices;
Module: IOTAModule;
sourceEditor: IOTASourceEditor;
writer : IOTAEditWriter;
CharPos1,CharPos2 : TOTACharPos;
copyPos1, copyPos2 : longInt;
function unicodeCounts (aCaretPos : integer): integer;
var I : integer;
begin
result := 0;
for I := 1 to aCaretPos do
if QuellCodeAnsiStrList.Strings[last_CharLine-1][I] <> QuellCodeStrList.Strings[last_CharLine-1][I+result] then inc(result);
end;
begin
// Rückschreiben des geänderten QuellCodes mittels CreateUndoableWriter
BorlandIDEServices.GetService(IOTAModuleServices, OTAModuleServices);
Module := OTAModuleServices.CurrentModule;
for I := 0 to Module.ModuleFileCount - 1 do
If Module.GetModuleFileEditor(i).QueryInterface(IOTASourceEditor, sourceEditor) = S_OK
then begin
Writer := sourceEditor.CreateUndoableWriter;
try
if Length(QuellCodeAnsiStrList.Strings[last_CharLine-1])+1 >= last_CharCol // existiert noch eine Blank-Gap zwischen dem Zeilenende und der Position an der der neue Comment einzubauen ist?
then begin // wenn nein
BlankGap := 0;
charPos1.CharIndex := last_CharCol-1 +unicodeCounts(last_CharCol-1); // +unicodeCounts() kann auch weggelassen werden, wenn man sicher ist, dass da keine UnicodeChars drin sind
end
else begin // wenn ja (es existiert noch eine Blank-Gap)
BlankGap := last_CharCol - (Length(QuellCodeAnsiStrList.Strings[last_CharLine-1])+1);
charPos1.CharIndex := Length(QuellCodeStrList.Strings[last_CharLine-1]) ; // +unicodeCounts() kann auch weggelassen werden, wenn man sicher ist, dass da keine UnicodeChars drin sind
end;
charPos1.Line := last_CharLine;
copyPos1 := sourceEditor.EditViews[0].CharPosToPos(CharPos1);
Writer.CopyTo(copyPos1);
charPos2.CharIndex := Length(QuellCodeStrList.Strings[last_CharLine-1]); // bis inklusiv zum Zeilenende
charPos2.Line := last_CharLine;
copyPos2 := sourceEditor.EditViews[0].CharPosToPos(CharPos2);
Writer.DeleteTo(copyPos2);
Writer.Insert(PAnsiChar(AnsiString( utf8encode((StringOfChar(' ', BlankGap) + replaceCommentString)) )));
finally
Writer := nil;
end;
end;
end;