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.