AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"Verbindung" zwischen Datenstruktur und GUI

Ein Thema von SebE · begonnen am 14. Nov 2010 · letzter Beitrag vom 14. Nov 2010
Antwort Antwort
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#1

"Verbindung" zwischen Datenstruktur und GUI

  Alt 14. Nov 2010, 11:20
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
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: "Verbindung" zwischen Datenstruktur und GUI

  Alt 14. Nov 2010, 11:32
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)

Geändert von jfheins (14. Nov 2010 um 11:34 Uhr)
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#3

AW: "Verbindung" zwischen Datenstruktur und GUI

  Alt 14. Nov 2010, 12:30
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?
Sebastian
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#4

AW: "Verbindung" zwischen Datenstruktur und GUI

  Alt 14. Nov 2010, 17:55
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?
Sebastian
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#5

AW: "Verbindung" zwischen Datenstruktur und GUI

  Alt 14. Nov 2010, 18:08
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
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.608 Beiträge
 
#6

AW: "Verbindung" zwischen Datenstruktur und GUI

  Alt 14. Nov 2010, 19:32
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 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