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