![]() |
Design - Parametrisierung mehrerer Objekte
Hallo,
in unserer Software gibt es eine Liste die viele verschiedene Komponenten enthalten kann. Die dazugehörigen Verwaltungsframes befinden sich auf einem Pagecontrol. Wird eine Komponente der Liste ausgewählt, dann wird die Änderung allen Frames mitgeteilt und die können sich dann aktivieren/deaktivieren je nachdem ob sie für die aktuelle Komponente zuständig sind. Ich stelle also sicher, dass die immer ein Objekt im richtigen Typ zum Verwalten vorliegen haben. Jetzt sollen aber mehrere Objekte auswählbar sein und bei denen dann z.B. WertX angepasst werden wenn ich EditX ändere. Sicherlich könnte ich bei der Auswahl sicherstellen, dass nur Gleichartige ausgewählt werden und dann eine Liste an die Frames geben. Aber in jedem Ereignis über die Liste rödeln? Eine weitere Möglichkeit ist, zu jeder Komponente eine Art Listenklasse zu erzeugen. Diese würde dann alle zu verändernden Eigenschaften der jeweiligen Objekte an eine Liste von Objekten weitergeben. Aber dann muss ich bei jeder Änderung an 2 Klassen anfassen. Gibt es dazu eine elegante Lösung? Muss ich das grundsätzlich neu angehen? |
AW: Design - Parametrisierung mehrerer Objekte
Liste der Anhänge anzeigen (Anzahl: 1)
Falls ich es richtig verstanden habe, ich habe es folgendermaßen gelöst:
Die Basisklasse aller einstellbaren Klassen stellt eine Methode bereit, welche mir in einem Format wie XML mitteilt, was man an ihr einstellen kann. Das Wissen, welche Werte der Benutzer einstellen können soll kommt von Attributen:
Delphi-Quellcode:
Die Basisklasse hat dann bsp. eine Methode "gibMirDeineWerte" welche bsp.
TMeineKlasse = class(TBasisklasse, ...)
public var nichtEinstellbar: Integer; [einstellbar] einstellbarerWert: Double; end;
Code:
zurückgibt.
<meineInstanz>
<einstellbar type="Double">123.45</einstellbar> </meineInstanz> Der Dialog wertet dann so etwas aus, füllt eine Baumansicht (links) und lässt mich die links angeklickten Werte auf der rechten Seite ändern. Das ist zwar schon Aufwand, aber man macht es nur einmal. Wenn du in Zukunft mehr Dinge einstellbar machen willst baust du dir keine Oberfläche mehr dafür, sondern markierst die Instanzvariable einfach nur durch ein Attribut. // Ich sehe gerade: Delphi 5. Attribute gab es da wohl noch nicht, in dem Fall müsste man die "Gib mir deine einstellbaren Werte"-Funktion wohl für jede Unterklasse neu schreiben. Wenigstens käme man weiterhin um ein ständiges Neuanfassen der Oberfläche herum... |
AW: Design - Parametrisierung mehrerer Objekte
Zitat:
|
AW: Design - Parametrisierung mehrerer Objekte
Zitat:
Was ich machen möchte ist z.B. die Baudrate bei 2 Objekten gleichzeitig auf denselben Wert zu ändern, wenn beide angewählt sind. |
AW: Design - Parametrisierung mehrerer Objekte
Zitat:
Was ich noch machen muss ist links in der Baumansicht eine zweite Spalte einfügen dass man die Belegungen der Werte auf einen Blick hat und nicht erst alle anklicken muss. Die Oberfläche dafür ist eh nur ein Rohentwurf, die Technik dahinter steht aber und funktioniert bestens :-) Mehrere Dinge (vom gleichen Typ!) gleichzeitig ändern ginge natürlich auch. In meinem Fall habe ich das Fenster aber extra exklusiv für ein einziges Objekt. Und das Prüfen "Darf ich mit STRG das jetzt noch auch anklicken?" war mir auch zu aufwändig. Ich kann mir spontan auch garnicht vorstellen, wie das von der Oberfläche her aussehen sollte. Auch das Standard-Verhalten im Windows-Explorer wenn man mehrere Dateien markiert und F2 zum umbenennen drückt finde ich alles andere als intuitiv. |
AW: Design - Parametrisierung mehrerer Objekte
Zitat:
Wenn n Objekte ausgewählt sind, zeigst Du nur die Eigenschaften, die in allen Objekten vorkommen. Zu diesen zeigst Du ggfs. den Satz von enthaltenen Werten an und lässt sie gemeinsam ändern. Wenn keine gemeinsamen Properties vorkommen, zeigst Du halt eine leere Property-Seite (bzw. mit erklärendem Text). |
AW: Design - Parametrisierung mehrerer Objekte
Wie gesagt, die Idee mit den einzelnen Properties finde ich schon geil, aber kurzfristig kann ich das nicht umsetzen.
Status quo ist Folgender: Es gibt zu jeder Klassen von Objekten eine oder mehrere Verwaltungsseiten. Die sind nicht dynamisch. Also entweder angezeigt oder nicht. Momentan kann man auch einzelne Werte an einer Gruppe ausgewählter gleicher Objekte ändern. Schaut man sich an wie das umgesetzt ist, kriegt man allerdings das große :kotz:. Nach meine Refactoring geht das momentan nur für 1 Objekt. Für die Anwender/meine Kollegen gibt es ja äußerlich keine Veränderung, aber wenn die auf einmal 5 Werte ändern müssen anstatt wie früher alles zu markieren, dann hab ich keine guten Verkaufsargumente :stupid: Was ich mir erhofft hatte war etwas wie eine Fassade die einer Gruppe von Objekten gleichen Typs das gleiche Interface (zumindest was die Änderung von Parametern angeht) wie dem einzelnen Objekt anbietet und die ich nicht anpassen muss wenn ich dem Objekt einen weiteren solchen Parameter spendiere. Daher die Frage: Geht das so überhaupt? Gibts irgendwo ähnliche Ansätze wo ich mir mal was abschauen kann? Traumhaft wäre natürlich wenn das eine Art generisches Modul wäre, wo ich ein beliebiges meiner Objekte reinschmeiße und die Funktionalität erhalten bleibt. Mit Delphi 5 wahrscheinlich nicht machbar. |
AW: Design - Parametrisierung mehrerer Objekte
Willst Du quasi den Objektinspektor nachbauen?
|
AW: Design - Parametrisierung mehrerer Objekte
Ich glaube so könnte man es auch umschreiben.
Ich hätte ganz spontan technisch keinen Ansatz, wie man bei Selektion von einem
Delphi-Quellcode:
- und
TMettwurst
Delphi-Quellcode:
-Objekt nur die Eigenschaften von der gemeinsamen Oberklasse
TPutenaufschnitt
Delphi-Quellcode:
und dem zufälligen gemeinsamen Interface
TWurst
Delphi-Quellcode:
"zusammenmerged".
IEnthältPferd
|
AW: Design - Parametrisierung mehrerer Objekte
Ich würde es als Fleißaufgabe, weniger als Problem ansehen.
Wenn es keine fertige Komponente gibt (vielleicht hilft der VCL Object Inspector von ![]() Mit der neuen RTTI ginge das sicher einfacher, aber auch mit älteren Delphi´s kann man ja veröffentlichte Eigenschaften ermitteln. Dann die Propertynames (sowie Typ und Wert) quasi in einer Liste sammeln und die nicht in allen selektierten Objekten vorkommen wieder löschen. Dabei wäre es egal, ob die Objekte gemeinsame Vorfahren haben oder nicht. Man könnte dann z.B. den Durchmesser von Autolenkrad und Putenaufschnitt zusammen bearbeiten, wenn die Eigenschaft gleich heißt und vom selben Typ ist. Mit dem modernen Databinding kann man hier wohl nicht arbeiten, da ja ein Eintrag nicht zwangsläufig nur an ein Objekt gebunden werden kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:27 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 by Thomas Breitkreuz