Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen (https://www.delphipraxis.net/175333-tools-api-delphi-2007-kompletten-source-des-aktuellen-editors-auslesen.html)

delphilui 13. Jun 2013 10:07

Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
 
Hallo Leute,

da wir in der Firma ein sehr großes Projekt haben funktioniert die Delphi Autovervollständigung so gut wie überhaupt nicht. Fazit: Abgeschaltet. Allerdings möchte ich nicht darauf verzichten. Daher habe ich mir eine eigene Autovervollständigung mit Hilfe des CastaliaParsers gebaut die soweit in meinen Tests auch funktioniert hat.

Der Einbau in die IDE ist bereits fertig allerdings benötige ich jetzt Zugriff auf 2 Dinge:

1. Text vor der aktuellen Cursor-Position bis zum 1. Leerzeichen
2. Completten Source im aktuellen Fenster

Ich habe jetzt schon einiges gegoogelt aber leider nichts dazu gefunden wie ich das bewerkstellige.
Meistens findet man nur Erklärungen die einen markierten Bereich auslesen, das ist für mich allerdings nutzlos.

Hoffe mir kann jemand helfen.
Grüße
delphilui

CCRDude 13. Jun 2013 10:36

AW: Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
 
Zu Punkt zwei kann ich Dir helfen. Ich hab mir vor Ewigkeiten mal einen Helper geschrieben, der mir u.a. nen Header über jede Seite packt. Der Code ist auch nur irgendwo im Netz gefunden und angepasst, vielleicht hilft Dir das ja schon als Ansatz:

Delphi-Quellcode:
type
   TCodeBeautifierWizard = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
      // IOTAWizard
      function GetIDString: string;
      function GetName: string;
      function GetState: TWizardState;
      procedure Execute; virtual;
      // IOTAMenuWizard
      function GetMenuText: string;
   end;
// ...

function GetReaderTextSize(fReader: IOTAEditReader): LongInt;
var
   iHigh, iLow, iMiddle: LongInt;
   c: Char;
begin
   Result := 0;
   if (fReader <> nil) then begin
      iHigh := high(LongInt);
      iLow := 0;
      while iLow <= iHigh do begin
         iMiddle := (iHigh + iLow) div 2;
         if fReader.GetText(iMiddle, @c, 1) = 1 then begin
            iLow := iMiddle + 1;
         end else begin
            iHigh := iMiddle - 1;
         end;
      end;
      Result := iLow;
   end;
end;
// ...
procedure TCodeBeautifierWizard.Execute;
var
   ModuleServices: IOTAModuleServices;
   Module: IOTAModule;
   Intf: IOTAEditor;
   Editor: IOTASourceEditor;
   View: IOTAEditView;
   i: Integer;
   pf: TPascalFile;
   Reader: IOTAEditReader;
   Writer: IOTAEditWriter;
   s: AnsiString;
   c: cardinal;

begin
   ModuleServices := BorlandIDEServices as IOTAModuleServices;
   // Get the module interface for the current file.
   Module := ModuleServices.CurrentModule;
   // If no file is open, Module is nil.
   if Module = nil then begin
      Messagedlg('No source file selected, Code Beautifier works on the current file only!', mtError, [mbOK], 0);
      Exit;
   end;
   // Get the interface to the source editor.
   for i := 0 to Module.GetModuleFileCount - 1 do begin
      Intf := Module.GetModuleFileEditor(i);
      if Intf.QueryInterface(IOTASourceEditor, Editor) = S_OK then Break;
   end;
   // If the file is not a source file, Editor is nil.
   if Editor = nil then begin
      Messagedlg('No source shown, Code Beautifier works in source view only!', mtError, [mbOK], 0);
      Exit;
   end;
   // The expert cannot tell which view is active, so force
   // the user to have only one view at a time.
   if Editor.EditViewCount > 1 then raise Exception.Create(sCloseViews);

   View := Editor.EditViews[0];
   pf := TPascalFile.Create;
   Reader := Editor.CreateReader;
   try
      pf.Filename := Editor.Filename;
      c := GetReaderTextSize(Reader);
      SetLength(s, c);
      Reader.GetText(0, PAnsiChar(s), c);
      pf.Text := s;
      if ShowCodeBeautifierDialog(pf) then begin
         Writer := Editor.CreateUndoableWriter;
         try
            Writer.DeleteTo( high(LongInt));
            Writer.Insert(PAnsiChar(AnsiString(pf.Text)));
         finally
            Writer := nil;
         end;
      end;
      Editor.Show;
   finally
      pf.Free;
      Reader := nil;
   end;
end;

delphilui 13. Jun 2013 10:42

AW: Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
 
Ich hatte diesen Code vorher schon einmal gesehen aber wohl nicht ganz verstanden. Ich versuchs mal mit deiner Lösung. Vielen Dank schonmal.

nahpets 13. Jun 2013 11:01

AW: Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
 
Hallo,

unter Delphi 7 bekommt man den markierten Text oder den Text ab Cursorposition bis zum ersten Zeichen, welches kein Buchstabe ist, hiermit:
Delphi-Quellcode:
{ Text von der aktuellen Position im Editor holen.
~result Text an der Cursorposition }
function TWebSearchMenu.GetTopBufferText : String;
Var
          sText   : String;
          ch      : Char;
          bOk     : Boolean;
          i       : Integer;
begin
  // markierten Text aus dem Editor holen.
  sText := EditorServices.TopBuffer.EditBlock.Text;
  // Ist kein Text markiert?
  If sText = '' Then Begin
    with EditorServices.TopBuffer.EditPosition do begin
      Repeat
        // Ein Zeichen nach links gehen
        bOk := Move(Row, Column - 1);
        // Hat das funktioniert?
        If bOk then begin
          // Zeichen lesen
          ch := Read(1)[1];
          // Ist es ein Buchstabe?
          Case ch Of
            'A'..'Z','a'..'z','.' : ; // bOk := True;
          else
            // Nein, dann Schalter für Schleifenabbruch setzen.
            bOk := false;
          End;
        end;
      Until not bOk;
      // Mit dem Cursor ein Zeichen nach rechts,
      // wenns kein Buchstabe oder Punkt ist
      Case Read(1)[1] Of
        'A'..'Z','a'..'z','.' :;
      else
        Move(Row, Column + 1);
      end;
      // und dann die nächsten 100 Zeichen
      sText := Trim(Read(100));
      i := 1;
      bOK := False;
      // Das erste Zeichen suchen, das kein Buchstabe ist bzw. kein Punkt.
      Repeat
        Case sText[i] Of
          'A'..'Z','a'..'z','.' :;
        else
          bOk := True;
        end;
        Inc(i);
      Until (i >= Length(sText)) Or bOk;
      // Das wird unser Suchbegriff
      sText := Copy(sText,1,i - 2);
    end;
    // Ein eventuell vorhandenes Semikolon wird entfernt.
    sText := AnsiReplaceText(sText,';',' ');
    sText := Trim(sText);
    i := Pos(' ',sText);
    If i > 0 Then sText := Copy(sText,1,i - 1);
  end;
  Result := sText;
end;
Eventuell hilft's Dir ja weiter.

sx2008 13. Jun 2013 11:58

AW: Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
 
Zitat:

Zitat von delphilui (Beitrag 1218452)
da wir in der Firma ein sehr großes Projekt haben funktioniert die Delphi Autovervollständigung so gut wie überhaupt nicht. Fazit: Abgeschaltet

Habt ihr denn alle konventionellen Möglichkeiten ausgeschöpft?
  • aktuelle Hardware mit ausreichend RAM (>= 4GB)
  • Sourcecode nur auf lokalen Platten öffnen/bearbeiten
  • SSD-Festplatten
  • Entfernung aller unbenützten Units aus den Uses-Klauseln (dazu gibt es das Tool Icarus)
Nach meinen Erfahrungen machen viele Firmen immer den gleichen Fehler.
Sie sind zu geizig ihre Entwickler mit korrekter Hardware auszustatten mit der Folge dass hochbezahlte Entwickler tage- und wochenlang nach anderen Lösungen suchen. :?
Firmen die z.B. nicht jedem Entwickler ein SSD-Laufwerk und 2 Monitore (>=24 Zoll) geben verschenkt bares Geld.

delphilui 13. Jun 2013 12:46

AW: Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
 
Unsere Rechner/Notebooks sind sehr gut ausgestattet und es liegt eher daran, dass unser Projekt über 5 Mio Zeilen Code umfasst. Daher auch die selbstgebaute Methode.

Danke für die bisherigen Antworten. Ich werde es morgen mal alles Testen, heute habe ich leider noch zu viele Bugfixes zu erledigen.

delphilui 14. Jun 2013 14:39

AW: Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
 
Ich habe eure Antworten ausprobiert und meinen Wünschen entsprechend angewendet.

Dementsprechend habe ich jetzt eine "kleine" Autovervollständigung fertig.

Einziges manko ist jetzt noch, das ich das Auswahlfenster gerne an der Position des Cursors anzeigen würde. Wie kann ich diese ermitteln?

Grüße
Delphilui

delphilui 1. Jul 2013 08:58

AW: Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
 
Die obigen Lösungen haben perfekt geholfen. Und meine Autovervollständigung ist somit fertig :) Vielen Dank


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 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