Vous pouvez utiliser un IOTAEditReader
pour obtenir des lignes entières. Le code suivant provient de mon Conversion Helper Package. La plupart de cela tourne autour de la fonction GetCurrentLineParams
:
function GetEditor: IOTASourceEditor;
var
ModuleServices: IOTAModuleServices;
Module: IOTAModule;
I: Integer;
begin
ModuleServices := BorlandIDEServices as IOTAModuleServices;
Module := ModuleServices.CurrentModule;
for I := 0 to Module.GetModuleFileCount - 1 do
if Supports(Module.GetModuleFileEditor(I), IOTASourceEditor, Result) then
Break;
end;
function GetLineAtCharPos(const Editor: IOTASourceEditor;
const EditView: IOTAEditView; CharPos: TOTACharPos): string;
var
EditReader: IOTAEditReader;
Start, Len: Integer;
Res: AnsiString;
begin
CharPos.CharIndex := 0;
Start := EditView.CharPosToPos(CharPos);
Inc(CharPos.Line);
Len := EditView.CharPosToPos(CharPos) - Start;
if Len > 0 then
begin
SetLength(Res, Len);
EditReader := Editor.CreateReader;
EditReader.GetText(Start, PAnsiChar(Res), Len);
Result := string(PAnsiChar(Res));
end;
end;
function GetCurrentLine(const Editor: IOTASourceEditor;
var BufferStart, Index: LongInt): string;
var
BufferLength: LongInt;
EditReader: IOTAEditReader;
Res: AnsiString;
begin
GetCurrentLineParams(Editor, BufferStart, BufferLength, Index);
SetLength(Res, BufferLength);
EditReader := Editor.CreateReader;
EditReader.GetText(BufferStart, PAnsiChar(Res), BufferLength);
Result := string(PAnsiChar(Res)); // just to be sure.
end;
function GetCurrentCharPos(const Editor: IOTASourceEditor; out EditView:
IOTAEditView): TOTACharPos;
var
CursorPos: TOTAEditPos;
begin
EditView := Editor.GetEditView(0);
CursorPos := EditView.CursorPos;
EditView.ConvertPos(True, CursorPos, Result);
end;
procedure GetCurrentLineParams(const Editor: IOTASourceEditor;
var Start, Length, Index: Integer);
var
EditView: IOTAEditView;
CharPos: TOTACharPos;
begin
CharPos := GetCurrentCharPos(Editor, EditView);
Index := CharPos.CharIndex + 1;
CharPos.CharIndex := 0;
Start := EditView.CharPosToPos(CharPos);
Inc(CharPos.Line);
Length := EditView.CharPosToPos(CharPos) - Start;
end;
function GetCurrentLineStart(const Editor: IOTASourceEditor): Integer;
var
L, I: Integer;
begin
GetCurrentLineParams(Editor, Result, L, I);
end;
function GetCurrentLineLength(const Editor: IOTASourceEditor): Integer;
var
S, I: Integer;
begin
GetCurrentLineParams(Editor, S, Result, I);
end;
Je peux obtenir la chaîne maintenant. mon problème est maintenant je ne suis pas capable de décoder correctement les caractères multi-octets par exemple TC est caractères japonais. comment puis-je le décoder en UTF8 String, j'ai essayé la méthode UTF8Encode mais ce n'est pas capable de décoder la chaîne aussi bien. –
Je ne peux pas tester cela maintenant, mais les caractères doivent déjà être multi-octets. Attribuez-le simplement à un UTF8String au lieu d'un AnsiString. –
Cela fonctionne bien. mais je reçois la popup suivante maintenant. L'heure et la date de myfile sur le disque ont changé. Des modifications en mémoire de ce module ont également été détectées. Le rechargement du module à partir du disque écrase ces modifications. Recharger? est-il un moyen que nous pouvons surmonter ce problème. –