Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   C# "Verbindung" zwischen Datenstruktur und GUI (https://www.delphipraxis.net/155942-verbindung-zwischen-datenstruktur-und-gui.html)

SebE 14. Nov 2010 11:20

"Verbindung" zwischen Datenstruktur und GUI
 
Hallo Freunde der Software-Entwicklung.

Ich steh vor einem Design-Problem.
Wie verbindet man Business-Objekte mit der Oberfläche?

Man kann sich vorstellen, dass ich zwei Schichten habe:
1. Intern, besteht aus Datenstrukturen.
2. Extern, stellt die interne Schicht grafisch dar.

Genauer:
Ich habe intern einen Baum, welcher meine Daten enthält und möchte diesen nach außen zugänglich machen (mittels TreeView).

Ich kann den Baum traversieren und jedes Element in das TreeView anhängen - kein Problem.
Aber: wenn der Nutzer mit dem TreeView interagiert (Auswahl eines Eintrags), sollte die Anwendung wissen, welches Objekt hinter dem Eintrag steht.

Wie bau ich diese Verbindung vom TreeView zu meinen Baumknoten auf?

Die schlimme Lösung wäre, ich durchlaufe meinen Baum und zähle bis ich beim richtigen Eintrag bin.

Mir wäre eine 1-zu-1-Verbindung lieb.

Ich hab zwar angegeben, dass das Problem in C# besteht, aber es kann auch in Delphi "gelöst" werden.

Mein Anliegen ist nicht dieses Problem zu lösen, sondern herauszufinden, wie man die Klasse solcher Probleme löst (Interne Schicht <--> GUI)

Gibt es dazu Hilfsmittel, wie Designpattern?

Wichtig ist mir:
- wartbares und sauberes Design
- keine Workarounds (die Tag-Eigenschaft zu einem Objekt-Zeiger umzufunktionieren)

Ich danke für Anregungen, Lösungsvorschläge oder einfach nur Begriffe, die mir weiter helfen könnten.

Viele Grüße
Sebastian

jfheins 14. Nov 2010 11:32

AW: "Verbindung" zwischen Datenstruktur und GUI
 
Ich nehme mal an, du benutzt WinForms?
Wenn du die Tag Eigenschaft nicht verwenden möchtest, kämen z.B. noch folgende Sachen infrage:

1. Eine Verbindungsklasse, die bspw. aus der Datenstruktur ein TreeView bevölkert und dabei ein Dictonary<TreeNode,DataClass> befüllt. Damit kannst du sofort* zu einem TreeNode das passende Datenobjekt finden. Diese Zwischenschicht kann sich dann an die Delegates der TreeNodes hängen und das passende Datenobjekt verändern oder benachrichtigen.

2. Du benutzt DataBinding. Im Grunde wie 1. aber mit weniger programmieren und mehr nachgucken und rumprobieren wie man ein Treeview mit Databinding befüllt und auf Änderungen reagiert. Wahrscheinlich weniger Codeintensiv und übersichtlicher. Wenn der Funktionsumfang ausreicht, ist dies die empfohlene Variante ;)

3. Du benutzt WPF.

Das wären erstmal meine Ideen...


* = Laufzeit O(1)

SebE 14. Nov 2010 12:30

AW: "Verbindung" zwischen Datenstruktur und GUI
 
Ok, da hab ich doch schon ein paar Punkt, an denen ich mich orientieren kann - ich danke dir dafür!

Bis ich mir fehlendes Wissen angeeignet und mich für eine Variante entschlossen habe, darf fleißig weiter mit Begriffen geworfen werden.

Wie entwerft ihr euer Design?
Internas von einem großen Objekt (Wrapper) verwalten lassen, welches die GUI dann verwendet (nur noch delegieren) - gut austauschbar.
Oder alle GUI-Objekte punkt-zu-punkt mit dem dazugehörigen internen Business-Objekt verbinden?

SebE 14. Nov 2010 17:55

AW: "Verbindung" zwischen Datenstruktur und GUI
 
Das mit den Dicionaries klingt ganz gut, ist mir aber im Moment zu viel "Magic" :-)
Das braucht noch ein wenig Zeit.

Das Problem tritt bei mir zweimal auf - TreeView und ComboBox.
Für zweiteres gibt's eine Lösung:

Code:
Class A: object {
  objectReference;

  A(objectRef) {
    this.objectReference = objectRef;
    }

  override ToString() {
    return objectReference.getName();
    }

  objectReference getObjectRef() {
    return this.objectReference;
    }
  }

[...]

myComboBox.Items.Add(new A(myObject));
Durch das Überschreiben von ToString() wird der gewünschte Text angezeigt.

Code:
(myComboBox.SelectedItem as A).getObjectRef.do();
Mit einem TreeView funktioniert das ganze nicht!
Ich finde keine Möglichkeit, einem TV ein Objekt hinzuzufügen.

Code:
myTV.Items.Add(new A(myObject)); // mag er nicht!
Also probieren wir's mit ableiten - von TreeViewItem:

Code:
class B: TreeViewItem {
  objectReference;

  B(objectRef) {
    this.objectReference = objectRef;
    }

  override ToString() {
    return objectReference.getName();
    }

  objectReference getObjectRef() {
    return this.objectReference;
    }

  }
Problem:
Das TreeView bleibt leer.
ToString() wird anscheinend nicht aufgerufen (wie es bei der ComboBox der Fall ist).

Jetzt bin ich ratlos - kennt sich jemand mit TreeView(Item)s unter .NET (2.0) aus?

SebE 14. Nov 2010 18:08

AW: "Verbindung" zwischen Datenstruktur und GUI
 
Für das TreeView gibt's eine Lösung (ist gar nicht so schwer - muss man nur drauf kommen):

im Konstruktor von B (siehe oben) das Attribut "Text" setzen - dieses und nicht ToString() wird angezeigt.

Damit wär ich erst einmal ruhig gestellt ;-)

Aber die Nachfrage an Ideen zur Umsetzung des allgemeinen Problems (Datenstruktur <--> GUI) besteht weiterhin.

Besten Dank und viele Grüße
Sebatsian

Phoenix 14. Nov 2010 19:32

AW: "Verbindung" zwischen Datenstruktur und GUI
 
Dafür gibt es Databinding.

In Windows Forms kannst Du damit Objekte und deren Eigenschaften direkt an Controls binden. Mittels entsprechender Klassen (BindingList) und Interfaces (INotifyPropertyChanged) bekommt das GUI von Änderungen an den Objekten mittels Events mit und kann darauf reagieren. Die Objekte werden direkt vom GUI geändert und Du kannst mittels Property Getter- und Settern reagieren.

In WPF ist das noch einfacher, dort brauchst Du diese Interfaces nicht. Damit Du eine noch sauberere Trennung hast und das GUI nicht unmittelbar auf den Objekten herumturnt gibt es dort noch das MVVM-Pattern (Model-View - ViewModel), welches noch eine Zwischenschicht einzieht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 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