![]() |
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 ? |
AW: CreateUndoableWriter D11
Der
![]() |
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. |
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.
|
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; |
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 10:45 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