Thema: Delphi Delphi IDE, Explorer

Einzelnen Beitrag anzeigen

Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#4

Re: Delphi IDE, Explorer

  Alt 15. Apr 2004, 18:33
Ich hab mich mal daran gesetzt einen Wizard zu schreiben über den man auch Toolbuttons einfügen kann.. leider bisher nicht sonderlich erfolgreich.

Auf Basis von INTAServices greife ich auf die ActionList der IDE zu und füge eine neue TAction hinzu, soweit scheinbar kein Problem.

Nach dem Installieren des Package kann ich dann wie gewünscht über Rechtsklick auf die Cool-/Toolbar -> Anpassen unter den Anweisungen meine neue Aktion auswählen und einfügen, der damit erzeugte Toolbutton funktioniert dann einwandfrei..bis man Delphi beendet und neu startet.

Der Toolbutton taucht dann zwar wieder auf, allerdings ohne Bitmap und ohne Funktion.
Demnach fehlt also der ActionLink zu der Aktion, was entweder dadurch hervorgerufen werden kann das die Aktion garnicht gespeichert wurde und beim Erzeugen des Buttons noch nicht existiert (d.h. das mein Wizard erst nach dem laden der Toolbar erzeugt wird),
oder das die Toolbar zwar den Button, aber nicht dessen AktionLink abspeichert.

Vielleicht mache ich ja etwas grundlegend falsch beim dynamischen Erstellen der Aktion, wodurch die beteiligeten Komponenten dann nicht in der Lage sind die Veränderung korrekt abzuspeichern.
Da ich bisher nichts mit TActions zu tun hatte fehlt mir die Erfahrung.

Hier mal das Prinzip wie ich vorgehe:
Delphi-Quellcode:
type
  TDSActionWizard = class(TNotifierObject, IOTAWizard)
  private
    FAction: TAction;
  (..)
  end;

implementation

constructor TDSActionWizard.Create;
var
  Service: INTAServices;
begin
  inherited Create;
  FAction := TAction.Create(nil);
  // Zuweisen diverser Eigenschaften über abstrakte, d.h. zu überschreibende Funktionen
  FAction.Caption := GetCaption;
  FAction.Category := GetCategory;
  FAction.Hint := GetHint;
  // Zuweisung des Events, ActionExecute führt die abstrakte Methode 'Execute' aus.
  FAction.OnExecute := ActionExecute;
  (.. Bitmap aus Resource laden etc ..)
  if Supports(BorlandIDEServices, INTAServices, Service) then
  begin
    FAction.ActionList := Service.ActionList;
    Service.ActionList.InsertComponent(FAction);
  end;
end;
Eigentlich recht simpel: Ich erzeuge die TAction, ermittle die ActionList der IDE, weise diese der Action zu und übergebe die Verantwortug für die Freigabe der Action ebenfalls an die ActionList.

Ein Beispiel für die Anwendung sieht dann so aus:
Delphi-Quellcode:
type
  TExplorePathWizard = class(TDSActionWizard)
  protected
    function GetPath: string; virtual; abstract;
  public
    function GetCategory: string; override;
    procedure Execute; override;
  end;

  TExploreEditorFileWizard = class(TExplorePathWizard)
  protected
    function GetPath: string; override;
  public
    function GetCaption: string; override;
  end;

implementation

{ TExplorePathWizard }

procedure TExplorePathWizard.Execute;
begin
  ShellExecute(0, 'open', PChar(GetPath), nil, nil,
    SW_SHOWDEFAULT);
end;

function TExplorePathWizard.GetCategory: string;
begin
  Result := 'Verzeichnisse';
end;

{ TExploreEditorFileWizard }

function TExploreEditorFileWizard.GetCaption: string;
begin
  Result := 'Verzeichnis der Editordatei';
end;

function TExploreEditorFileWizard.GetPath: string;
var
  Service: IOTAModuleServices;
begin
  Result := '';
  if Supports(BorlandIDEServices, IOTAModuleServices, Service) then
    if Assigned(Service.CurrentModule) then
      Result := '"' + ExtractFilePath(Service.CurrentModule.FileName) + '"';
end;
Vielleicht eine Idee in welchem Ansatz hier der Denkfehler sitzt ?

MfG,
Tryer
  Mit Zitat antworten Zitat