2017-10-14 4 views
1

Je souhaite récupérer la chaîne de caractères entière (UTF8) et effectuer l'opération sur la chaîne de ligne. J'ai essayé le code suivant. mais si nous avons des caractères multi-octets, je ne peux pas le faire.Comment obtenir la chaîne de ligne spécifique (UTF8) ou la longueur de chaîne de ligne spécifique dans l'éditeur de source à l'aide de OpenToolsAPI

J:=1; 
    CurrentRowStr :=''; 
    while True do 
    begin 
    //detect end of line 
    Buffer.EditPosition.Move(Changes[I].FLine,J); 
    CurrentRowStr := CurrentRowStr + Buffer.EditPosition.Character ; 
    J := J+1; 
    end; 
    CurrentRowStr := Buffer.EditPosition.Read(J-1); 

Si quelqu'un peut m'aider à obtenir une chaîne de caractères particulière en utilisant OpenToolsAPI, ce serait une aide précieuse.

Répondre

2

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; 
+0

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. –

+1

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. –

+0

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. –