AW: Design - Parametrisierung mehrerer Objekte
OK. Die Sache mit dem Aufsammeln der Properties wäre, wie gesagt, der nächste Schritt für mich.
Momentan habe ich, um mal bei dem schönen Beispiel zu bleiben, nur mehrere
Delphi-Quellcode:
von denen ich gleichzeitig z.B. den Fettgehalt ändern möchte. Also eine Art
TMettWurst
Delphi-Quellcode:
der mir nach außen alle Eigenschaften von
TBeutelVollMettWuerste
Delphi-Quellcode:
anbietet. Soll jetzt Zusätzlich die Art der Pelle änderbar sein, hätte ich gerne, dass mein
TMettWurst
Delphi-Quellcode:
das auch möglich macht.
TBeutelVollMettWuerste
Meine Frage war ob das automatisiert möglich ist oder ob ich immer wieder an 2 Stellen anpacken muss. Der generische Fall wäre dann z.B.
Delphi-Quellcode:
oder
TWurstBeutel<TMettWurst>
Delphi-Quellcode:
der mir dann die Properties der jeweiligen Wurstsorte abbildet.
TWurstBeutel<TPutenaufschnitt>
Wenn ich so recht drüber nachdenke müsste ich mir da irgendwie dynamisch eine Klasse zusammenbasteln. |
AW: Design - Parametrisierung mehrerer Objekte
Objektinspektoren gibt es auch von JEDI für umme, aber die Mehrfachselektion wird schwierig.
Wenn es einfache Key-Value-Paare sind ("Eigenschaft", "Wert"), hilf ein einfacher zweispaltiger Editor, im einfachsten Fall ein TStringGrid. Das gibts auch in D5, und auch dort gab es RTTI. Folgende -sehr einfache- Idee: Editiert werden Key-Value Paare bzw. eine Liste davon. Aus jedem Objekt kann ich die Eigenschaften per RTTI auslesen. Ich habe also eine Funktion 'GetPropertyList(anyObject : TObject) : TKeyValueList'. Die rufe ich für jedes markierte Objekt auf und bilde die Schnittmenge der Listen. Ich erhalte eine TKeyValueList, die ich mit einem Editor meiner Wahl (gepimptes TStringGrid z.B.) editieren kann. Nun benötige ich nur noch eine Methode 'SetProperties(anyObject : TObject; Values : TKeyValueList)' welches die Werte der einzelnen Keys (=Name der Property) in das Objekt zurückschreibt. Auch das geht total einfach mit RTTI. Nachteil: Eine Property 'Foo' kann in einem Objekt vom Type 'Bool' und im anderen vom Typ 'Integer' sein, das würde mit der einfachen Key-Value Methode untergehen. Abhilfe: Die Typinformation wird im KeyValue-Wert (das ja dann eigentlich ein Key-Type-Value Tripel ist) abgelegt und die Schnittmenge berücksichtigt auch die Typinformation. Ferner kann der Listeneditor auf den Typ eingehen und ggf. eine Checkbox o.ä. anbieten. Das kann man nun noch weiter spinnen, denn eine Property könne ja wieder ein Objekt sein. Dann bietet der Editor nur einen Button an, der dann einen weiteren Key-Type-Value-Editor aufruft und das spiel beginnt von neuem (natürlich mit nur einem Objekt).
Delphi-Quellcode:
Billig, einfach, erweiterbar. Sollte funzen.
Procedure EditProperties (objectList : TList);
Var PropertyList, CommonPropertyList : TKeyTypeValueList; Begin CommonPropertyList := TKeyTypeValueList.Create; For object in objectList do begin PropertyList := GetPropertyList(object); CommonProperties.IntersectWith(PropertyList); end; if EditKeyTypeValueList(CommonProperties) = mrOK then For object in objectList do SetProperties (object, CommonProperties); End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz