AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CreateUndoableWriter D11

Ein Thema von win568 · begonnen am 8. Aug 2022 · letzter Beitrag vom 10. Aug 2022
Antwort Antwort
win568

Registriert seit: 8. Sep 2008
121 Beiträge
 
#1

CreateUndoableWriter D11

  Alt 8. Aug 2022, 16:23
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.005 Beiträge
 
Delphi 12 Athens
 
#2

AW: CreateUndoableWriter D11

  Alt 8. Aug 2022, 16:31
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
win568

Registriert seit: 8. Sep 2008
121 Beiträge
 
#3

AW: CreateUndoableWriter D11

  Alt 10. Aug 2022, 10:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.005 Beiträge
 
Delphi 12 Athens
 
#4

AW: CreateUndoableWriter D11

  Alt 10. Aug 2022, 10:59
Dann könnte es an der Art und Weise liegen, wie ihr den Writer benutzt. Dazu müsste man aber den betreffenden Code sehen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
win568

Registriert seit: 8. Sep 2008
121 Beiträge
 
#5

AW: CreateUndoableWriter D11

  Alt 10. Aug 2022, 11:09
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.005 Beiträge
 
Delphi 12 Athens
 
#6

AW: CreateUndoableWriter D11

  Alt 10. Aug 2022, 11:32
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 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