Bereits beim Ersten Zugriff auf "NeueAktion", also beim Setzen von "Caption" kommt es zu einer Zugriffsverletzung und der grund dafür ist nicht so richtig ersichtlich.
Ich denke mal, das Setzen von Caption wird irgendeinen Event innerhalb der Actionlist abfeuern - die zu dem Zeitpunkt ja noch nicht gesetzt ist. (Wenn Du die Property "Caption" vor "Actionlist" setzt)
NeueAktion := SourceActionList.Actions[i].ClassType.Create;
Ich habe hier das Gefühl, dass hier nur der Konstruktor von TObject aufgerufen wird und nicht der Deiner ActionKlasse - das könnte eine der Ursachen sein, teste das doch mal.
Ich habe mal ein bischen getestet und folgender Code läuft bei mir (ich musste allerdings die TRVActionklassen durch TAction ersetzen, da die TRV's bei mir nicht vorhanden sind):
Code:
procedure ActionListDuplizieren(ZielActionList:TActionList; SourceActionList: TActionList);
var
i: integer;
Ta:TContainedActionClass;
NeueAktion, AlteAktion: TAction; // typ geändert (damit nicht ständig gecastet werden muss
begin
if assigned(ZielActionList) and assigned(SourceActionList) then begin
if SourceActionList.ActionCount > 0 then begin
for i := 0 to SourceActionList.ActionCount - 1 do begin
AlteAktion := TAction(SourceActionList.Actions[i]); // alte Aktion holen, damit wir nicht immer über den index gehen müssen
NeueAktion := TAction( AlteAktion.ClassType.Create );
if NeueAktion is TAction then begin
NeueAktion.ActionList := ZielActionList;
NeueAktion.Caption := 'hi';
NeueAktion.Hint := AlteAktion.Hint;
NeueAktion.ShortCut := AlteAktion.ShortCut;
NeueAktion.ImageIndex := 0;
end;
end;
end;
end;
end;