Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Design - Parametrisierung mehrerer Objekte (https://www.delphipraxis.net/176970-design-parametrisierung-mehrerer-objekte.html)

CarlAshnikov 8. Okt 2013 07:36

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?

Der schöne Günther 8. Okt 2013 11:24

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:
TMeineKlasse = class(TBasisklasse, ...)
  public var
    nichtEinstellbar: Integer;

    [einstellbar]
    einstellbarerWert: Double;

end;
Die Basisklasse hat dann bsp. eine Methode "gibMirDeineWerte" welche bsp.
Code:
<meineInstanz>
  <einstellbar type="Double">123.45</einstellbar>
</meineInstanz>
zurückgibt.

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...

Lemmy 8. Okt 2013 11:31

AW: Design - Parametrisierung mehrerer Objekte
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1231176)

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...

nein, denn auch bei Delphi 5 gabs IMHO schon die TypInfo.pas die published deklarierte Properties bearbeiten konnte (alte RTTI). Mit 30-40 Zeilen Code lässt sich damit fast jedes Property auslesen und setzen.

CarlAshnikov 8. Okt 2013 12:26

AW: Design - Parametrisierung mehrerer Objekte
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1231176)
Falls ich es richtig verstanden habe ich habe es folgendermaßen gelöst:

Das sieht auf jeden Fall interessant aus. Bei mir sieht es momentan so aus, dass ich links keinen Baum habe sondern nur ein Liste. Ist dann ein Objekt ausgewählt, kann ich alle Parameter einstellen. Zusätzlich gibt es dann noch Zustandsanzeigen (z.B. verbunden bei Kommunikation o.ä.) und ein paar Buttons um Aktionen von Hand zu triggern die sonst automatisch ausgeführt werden (Ein/Ausschalten). Sowas brauchst du doch sicherlich auch. Wie und wo bildest du das ab?

Was ich machen möchte ist z.B. die Baudrate bei 2 Objekten gleichzeitig auf denselben Wert zu ändern, wenn beide angewählt sind.

Der schöne Günther 8. Okt 2013 12:54

AW: Design - Parametrisierung mehrerer Objekte
 
Zitat:

Zitat von CarlAshnikov (Beitrag 1231185)
und ein paar Buttons um Aktionen von Hand zu triggern die sonst automatisch ausgeführt werden (Ein/Ausschalten). Sowas brauchst du doch sicherlich auch. Wie und wo bildest du das ab?

Das etwas unglückliche Bild direkt vom Formulardesigner hat rechts zwei RadioButtons "ON" und "OFF". Das bekommt man, wenn man links einen Boolean anwählt (auf dem Bild passt das natürlich nicht). Wenn man einen Zahlenwert anwählt, wird der Teil durch ein Zahlen-Eingabefeld (SpinEdit oder so) ersetzt.

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.

Mikkey 8. Okt 2013 13:08

AW: Design - Parametrisierung mehrerer Objekte
 
Zitat:

Zitat von CarlAshnikov (Beitrag 1231135)
Hallo,

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?

...

Gibt es dazu eine elegante Lösung? Muss ich das grundsätzlich neu angehen?

Ich würde die Dinge von der anderen Seite aufzäumen und dem Benutzer überlasen, dass er sinnvolle Kombinationen zusammenklickt.

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).

CarlAshnikov 9. Okt 2013 07:46

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.

stahli 9. Okt 2013 07:59

AW: Design - Parametrisierung mehrerer Objekte
 
Willst Du quasi den Objektinspektor nachbauen?

Der schöne Günther 9. Okt 2013 08:04

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:
TMettwurst
- und
Delphi-Quellcode:
TPutenaufschnitt
-Objekt nur die Eigenschaften von der gemeinsamen Oberklasse
Delphi-Quellcode:
TWurst
und dem zufälligen gemeinsamen Interface
Delphi-Quellcode:
IEnthältPferd
"zusammenmerged".

stahli 9. Okt 2013 08:26

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 DevExpress ?) kann man das sicher auch selbst hinkriegen.

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 18:02 Uhr.
Seite 1 von 2  1 2      

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