Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   CreateUndoableWriter D11 (https://www.delphipraxis.net/211176-createundoablewriter-d11.html)

win568 8. Aug 2022 16:23


CreateUndoableWriter D11
 
Hi

Mit dem Umstieg auf D11 haben sich einige Probleme mit der ToolsAPI ergeben. Wenn ich mit CreateUndoableWriter ein Interface zur Änderung des aktuellen Codes erstelle, die Änderungen ausführe und danach das Interface wieder freigebe, ist der Editor in der Delphi IDE nicht mehr bedienbar. Jedes Scrollen führt zu einer kaputten Darstellung (Zeilen der aktuellen Ansicht vermehren sich einfach mit dem Scrollen), ein Click auf einen anderen Tab führt zu einem weißen Editor.

Der entsprechende Code wurde seit DXE verwendet und hat bis einschließlich D10.4.2 einwandfrei funktioniert. Hat noch jemand ein Problem mit der ToolsAPI ?

Uwe Raabe 8. Aug 2022 16:31

AW: CreateUndoableWriter D11
 
Der MMX Code Explorer benutzt CreateUndoableWriter an verschiedenen Stellen zur Manipulation des Codes im Editor und läuft auch unter Delphi 11 ohne bekannte Probleme.

win568 10. Aug 2022 10:55

AW: CreateUndoableWriter D11
 
Hi Uwe

Wir verwenden den Writer zur Änderung von Code nach dem Compilieren. Unser Code ist in Packages aufgeteilt. Nach dem Erzeugen mit dem msbuild kommt es zu diesem Verhalten. Wenn ich das gleiche nach dem Erzeugen mit dem Standardcompiler macht funkt es. Der gleiche Code wurde von 10.4.2 abwärts (10.3, 10.2, 10.1) verwendet und dort funktioniert es ohne Probleme.

Uwe Raabe 10. Aug 2022 10:59

AW: CreateUndoableWriter D11
 
Dann könnte es an der Art und Weise liegen, wie ihr den Writer benutzt. Dazu müsste man aber den betreffenden Code sehen.

win568 10. Aug 2022 11:09

AW: CreateUndoableWriter D11
 
Anbei ein Teil davon. Ist leider etwas größer:

Code:

function TUsesCleanerObj.DoCleanUnit(Editor: IOTASourceEditor; Intf, Impl:
  TStrings): Boolean;
var
  SrcStream: TMemoryStream;
  Writer: IOTAEditWriter;
  Buffer: IOTAEditBuffer;
  Lex: TmwPasLex;
  Source: AnsiString;
begin
  Result := False;
  if not Assigned(Editor) then begin
    Exit;
  end;

  Buffer := (Editor as IOTAEditBuffer);
  if Assigned(Buffer) then begin
    if Buffer.IsReadOnly then begin
      Exit;
    end;

    try
      SrcStream := TMemoryStream.Create;
      EditFilerSaveFileToStream(Editor.FileName, SrcStream);
      // GxOtaSaveEditorToStream(Buffer, SrcStream, False, False);
      Lex := TmwPasLex.Create;
      Lex.Origin := PAnsiChar(SrcStream.Memory);

      Buffer.EditOptions.BeginUpdate;
      try
        Writer := Buffer.CreateUndoableWriter;
        try
          while not (Lex.TokenID in [tkImplementation, tkUses, tkNull]) do
            Lex.NextNoJunk;

          if (Intf.Count > 0) and (Lex.TokenID = tkUses) then
          begin
            Writer.CopyTo(Lex.TokenPos);
            Source := GetUsesSource(Intf);
            Writer.DeleteTo(Lex.TokenPos);
            if Source <> '' then
            begin
              Writer.Insert(PAnsiChar(ConvertToIDEEditorString(Source)));
            end;
          end;

          Lex.Next;

          if Impl.Count > 0 then
          begin
            while not (Lex.TokenID in [tkUses, tkNull]) do
              Lex.NextNoJunk;

            if Lex.TokenID = tkUses then
            begin
              Writer.CopyTo(Lex.TokenPos);
              Source := GetUsesSource(Impl);
              Writer.DeleteTo(Lex.TokenPos);
              if Source <> '' then
              begin
                Writer.Insert(PAnsiChar(ConvertToIDEEditorString(Source)));
              end;
            end;
          end;

          Result := True;
        finally
          FreeAndNil(Lex);
          FreeAndNil(SrcStream);
          Writer := nil;
        end;
      finally
        Buffer.EditOptions.EndUpdate;
      end;

    except
      ;
    end;
  end;
end;

Uwe Raabe 10. Aug 2022 11:32

AW: CreateUndoableWriter D11
 
Das sieht in der Tat etwas komplex aus. Bei MMX ist das in der Regel deutlich simpler. Der Writer wird immer nur für eine einzelne Aktion (Delete und/oder Insert) erzeugt und danach sofort wieder freigegeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz