![]() |
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? |
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.
|
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] |
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.
|
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.
|
Re: TComponentEditor für eigene Actionlist
Eben darum gings. Den Editor habe ich auch schon fertig, es fehlen nur noch die Optionen:
|
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:
Multiselect von Actions im OI
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; 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:
Vielleicht helfen diese Infos ja dem einen oder anderen, der Komponenten entwickelt.
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; |
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:
Also, wie sage ich es dem OI, das er die eigenen Action anzeigen soll?
type
TSelectionList = IDesignerSelections; Vielen Dank für Tipps und Hilfe, sowie ein frohes Fest. Alter Mann |
Re: TComponentEditor für eigene Actionlist
Schau dich mal in der JVCL um. Ich glaube ich habe da was dazu gesehen.
|
Re: TComponentEditor für eigene Actionlist
Zitat:
Delphi-Quellcode:
Dazu gibt es auch ein Beispiel in
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; ![]() |
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