Zwar ist das Problem gelöst, aber nun möchte ich einen Property-Editor für die Komponentenliste schreiben.
Sobald die Edit-Prozedur aufgerufen wird, kommt aber eine Fehlermeldung, eine erneute Zugriffsverletzung:
Delphi-Quellcode:
FUNCTION tCompListProperty.GetAttributes: TPropertyAttributes;
BEGIN
GetAttributes := [paDialog, paRevertable];
END;
PROCEDURE tCompListProperty.Edit;
var Stream: TMemoryStream;
ol: tComponentList;
Dlg: TCompListDialog;
begin
inherited;
Stream:=TMemoryStream.Create;
//Stream:=TMemoryStream(GetValue);
//Stream.ReadComponentRes(ol);
showMessage('');
Dlg:=TCompListDialog.Create(Application);
try
showMessage('');
Dlg.World:=tWorld(GetComponent(0));
showMessage('');
Dlg.ShowModal;
finally
showMessage('');
If Dlg.Res=false
then Revert;
showMessage('');
Dlg.Release;
end;
Stream.Clear;
//Stream.WriteComponentRes(ol.Name, ol);
//SetStrValue(String(Stream));
Stream.Free;
modified;
END;
FUNCTION tCompListProperty.GetValue: String;
BEGIN
result:=GetStrValue;
END;
PROCEDURE tCompListProperty.SetValue(const Value: String);
BEGIN
SetStrValue(Value);
END;
Zur Erklärung:
Der Stream soll später den Wert der als Eigenschaftswert für die CompList in der Welt gespeichert ist lesen und per ReadComponentRes in die Komponente umwandeln und umgekehrt mittels WriteComponentRes. Die showMessages dienen der Abgrenzung der einzelnen Anweisungen, damit der Fehler lokalisiert werden kann. Der liegt momentan beim Erschaffen des Dialogs. Es kommt die übliche Zugriffsverletzung. Ich vermute, dass es an dem Application liegt, wüsste aber keinen Ersatz, da ja ein Owner angegeben werden muss.
Falls ich mit meiner Dialog-Idee auf dem Holzweg sein sollte, bitte ich euch mich zu korrigieren, weil es das erste Mal ist, dass ich einen Property-Editor für ein dynamisches Array of TComponent schreibe und ich leider hierzu auch keine Tutorials gefunden habe.
Ich hoffe, dass ihr mir helfen könnt und ich danke euch für eure bisherige (und hoffentlich auch zukünftige) Hilfe.
Liebe Grüße
Sora