![]() |
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 |
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; |
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.
|
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:
Eventuell hilft's Dir ja weiter.
{ 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; |
AW: Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen
Zitat:
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. |
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. |
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 |
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 23:15 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