AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen

Ein Thema von delphilui · begonnen am 13. Jun 2013 · letzter Beitrag vom 1. Jul 2013
Antwort Antwort
delphilui

Registriert seit: 13. Jun 2013
6 Beiträge
 
#1

Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen

  Alt 13. Jun 2013, 11:07
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
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 13. Jun 2013, 11:36
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;
  Mit Zitat antworten Zitat
delphilui

Registriert seit: 13. Jun 2013
6 Beiträge
 
#3

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

  Alt 13. Jun 2013, 11:42
Ich hatte diesen Code vorher schon einmal gesehen aber wohl nicht ganz verstanden. Ich versuchs mal mit deiner Lösung. Vielen Dank schonmal.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

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

  Alt 13. Jun 2013, 12:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 13. Jun 2013, 12:58
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.
fork me on Github
  Mit Zitat antworten Zitat
delphilui

Registriert seit: 13. Jun 2013
6 Beiträge
 
#6

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

  Alt 13. Jun 2013, 13:46
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.
  Mit Zitat antworten Zitat
delphilui

Registriert seit: 13. Jun 2013
6 Beiträge
 
#7

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

  Alt 14. Jun 2013, 15:39
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
  Mit Zitat antworten Zitat
delphilui

Registriert seit: 13. Jun 2013
6 Beiträge
 
#8

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

  Alt 1. Jul 2013, 09:58
Die obigen Lösungen haben perfekt geholfen. Und meine Autovervollständigung ist somit fertig Vielen Dank
  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 10:42 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