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
134 Beiträge
 
#1

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.730 Beiträge
 
Delphi 12 Athens
 
#2

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 07:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz