Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TComponentEditor für eigene Actionlist (https://www.delphipraxis.net/71983-tcomponenteditor-fuer-eigene-actionlist.html)

Union 23. Jun 2006 09:12


TComponentEditor für eigene Actionlist
 
Hallo,

ich habe eine eigene Actionlist-Komponente entwickelt. Jetzt muss ich dafür noch einen Komponenten-Editor bereitstellen. Gibt es eine Möglichkeit, den Delphi-Internen Actionlist-Editor aufzurufen und diesem mitzuteilen, dass er doch jetzt z.B. die Klasse TMyAction für die Actions verwenden soll anstelle von TAction?

Oder muss ich die komplette Funktionalität des Komponenteneditors neu programmieren?

SirThornberry 23. Jun 2006 10:21

Re: TComponentEditor für eigene Actionlist
 
Wenn du von der normalen Actionlist abgeleitet hast sollte automatisch der Componenteditor der normalen Actionlist auf deine abgeleitete Version angewendet werden.

Union 23. Jun 2006 10:35

Re: TComponentEditor für eigene Actionlist
 
Nein, das geht nicht. Ich erhalte beim Anclicken (Aufruf des Editors in der IDE) dann "Invalid Typecast".
[edit]Fehler, Fehler, Emanuela!!! Ich Trottel hatte von TCustomActionlist abgeleitet. :wall: Danke für's Augenöffnen. Naja, jetzt hatte ich den Editor schon fertig.[/edit]

Union 23. Jun 2006 11:09

Re: TComponentEditor für eigene Actionlist
 
Nein, es geht doch nicht. Der Actionlist-Editor wird zwar aufgerufen und ich kann die bestehenden Actions bearbeiten, aber bei der Neuanlage werden wieder normale TAction-Objekte erzeugt.

SirThornberry 23. Jun 2006 12:06

Re: TComponentEditor für eigene Actionlist
 
das ist klar. denn der normale Actionlisteditor kennt deinen neuen Typ ja nicht und weiß auch nicht was er da zusätzlich machen muss. In dem Fall kommst du dann wohl nicht drum herum dir deinen eigenen Editor zu schreiben.

Union 23. Jun 2006 12:09

Re: TComponentEditor für eigene Actionlist
 
Eben darum gings. Den Editor habe ich auch schon fertig, es fehlen nur noch die Optionen:
  • Standardaktion hinzufügen - wo bekomme ich die her?
  • Multiselect von Actions - wie sag ichs dem Objektinspektor...

Union 25. Jun 2006 19:01

Re: TComponentEditor für eigene Actionlist
 
Hallo,

ich hab es jetzt selber herausgefunden. Für alle Interessierten hier die Lösungen:

Standardactions
In Delphi sind die Standardactions als eigene Klassen implementiert. Eine Liste aller definierten Standardactions kann man über ActnRes.TStandardActions.ActionsList1 erhalten.

Da ich in dem speziellen Fall erweiterte Actions verwende, benutze ich die Standardactions nicht, denn sonst müsste ich nur dafür jede einzelne Standardactions-Klasse erneut ableiten. Das ist mir aber zu viel Aufwand; es handelt sich um 50 Klassen.

Hier trotzdem mal die Vorgehensweise (Habe mir aber nicht die Mühe eines Treeview gemacht):
Delphi-Quellcode:
procedure TSecActionsEditor.SelectStdAction;
var
   Frm : TForm;
   dmSa : TStandardActions;
   LbSa : TListBox;
   i : integer;
   ASecAction : TSecAction;
begin

   Frm := TForm.Create(Self);
   with Frm do begin
      Caption := 'Standard Actions';

      LbSa := TListBox.Create(frm);
      with LbSa do
      begin
         Parent     := Frm;
         Top        := 4;
         Left       := 4;
         Width      := frm.ClientWidth-8;
         Height     := frm.Clientheight-24-8;
         Anchors    := [aktop, akleft, akright, akbottom];
      end;

      with TButton.Create(frm) do
      begin
         Parent     := frm;
         Top        := frm.ClientHeight-28;
         Left       := 4;
         Anchors    := [akLeft, akBottom];
         Caption    := '&Ok';
         ModalResult := mrOk;
      end;

      with TButton.Create(frm) do
      begin
         Parent     := frm;
         Top        := frm.ClientHeight-28;
         Left       := 80;
         Anchors    := [akLeft, akBottom];
         Caption    := '&Cancel';
         ModalResult := mrCancel;
      end;

      dmSa := TStandardActions.Create(frm);
      for i := 0 to dmSa.ActionList1.ActionCount-1 do
      begin
         LbSa.Items.AddObject(TAction(dmSa.ActionList1.Actions[i]).Caption, dmSa.ActionList1.Actions[i]);
      end;

      ShowModal;
      if modalresult = mrOk then
      begin
         ASecAction := TSecAction(TheDesigner.CreateComponent(TSecAction,nil,0,0,0,0));
         ASecAction.ActionList := FSecActionList;
         ASecAction.Category  := SNoCategory;
         ASecAction.Assign(TBasicAction(LbSa.Items.Objects[LbSa.ItemIndex]));

         lbActions.Items.Add(ASecAction.Caption);
         lbActions.ItemIndex := FSecActionList.ActionCount-1;
         RefreshActionsList;
         TheDesigner.SelectComponent(ASecAction);
         TheDesigner.Modified;
      end;
      Free;
   end;
end;
Multiselect von Actions im OI
Das Funktioniert über die Designer-Methode SetSelections - man braucht dafür eine SelectionListe. Bei Multiselect erscheint dann im OI die Anzahl der ausgewählten Elemente, die änderbaren Properties "schrumpfen".
Delphi-Quellcode:
type
   TSelectionList = IDesignerSelections;
...
procedure TSecActionsEditor.lbActionsClick(Sender: TObject);
var
   ASelectionList : TSelectionList;
   i :integer;
begin
   if lbActions.SelCount = 1 then
   begin
      // Ein Elemet gewählt
      if lbActions.ItemIndex >=0 then
         TheDesigner.SelectComponent(FSecActionList.Actions[lbActions.ItemIndex]);
   end
   else
   begin
      // Mehrere Elemente gewählt
      ASelectionList := CreateSelectionList;
      for i := 0 to lbActions.SelCount-1 do
      begin
         ASelectionList.Add(FSecActionList.Actions[i]);
      end;
      TheDesigner.SetSelections(ASelectionList);
   end;
   UpdateSpeedBar;
end;
Vielleicht helfen diese Infos ja dem einen oder anderen, der Komponenten entwickelt.

Alter Mann 22. Dez 2006 13:22

Re: TComponentEditor für eigene Actionlist
 
Hallo Union,

habe den Beitrag mit Intresse gelesen. Eine Frage nur: Wie spreche ich den OI an,
um die Properties der eignen Actions zu bearbeiten? Genauer intressiert mich dieser Part:
Delphi-Quellcode:
type
   TSelectionList = IDesignerSelections;
Also, wie sage ich es dem OI, das er die eigenen Action anzeigen soll?

Vielen Dank für Tipps und Hilfe,
sowie ein frohes Fest.

Alter Mann

Robert Marquardt 22. Dez 2006 13:44

Re: TComponentEditor für eigene Actionlist
 
Schau dich mal in der JVCL um. Ich glaube ich habe da was dazu gesehen.

Union 22. Dez 2006 14:12

Re: TComponentEditor für eigene Actionlist
 
Zitat:

Zitat von Alter Mann
Delphi-Quellcode:
type
   TSelectionList = IDesignerSelections;
Also, wie sage ich es dem OI, das er die eigenen Action anzeigen soll?

Wenn ich Dich richtig verstehe, willst Du wissen, woher der OI mitbekommt, dass er für die Editierung nicht den Standard-Actionlisteditor sondern den selbst erstellten verwenden soll. Das teilt man mit der Callback ExecuteVerb mit (Die gültigen "Verbs" definiert man über GetVerb und deren Anzahl mit GetVerbCount):
Delphi-Quellcode:
function TSecActionListEditor.GetVerbCount : integer;
begin
   // Wieviele Menüeinträge dürfen es denn sein im Kontextmenü der Komponente
   result := 1;
end;

function TSecActionListEditor.GetVerb(Index : integer): string;
begin
   case Index of
      // Rückgabe Menüeintrag
      0 : result := 'Software Union Security Editor';
   end;
end;

procedure TSecActionListEditor.ExecuteVerb(Index : integer);
begin
   case Index of
      // Menüauswahl auswerten
      0 : ShowSecActionListEditor(Designer, TSecActionList(Component));
   end;
end;
Dazu gibt es auch ein Beispiel in Delphi-Referenz durchsuchenExecuteVerb


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