Delphi-Programm mit Klassen!
Geizhals » Forum » Programmierung » Delphi-Programm mit Klassen! (17 Beiträge, 208 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
Delphi-Programm mit Klassen!
05.10.2007, 14:20:57
Hallo!

Wir haben jetzt in der Schule mit dem objektorientierten Programmieren begonnen (Klassenkonzept, ...., mit Delphi)! Nun hab ich meine erste Hausübung zu dem Thema bekommen, und ich hab mir auch schon eine Lösung für das gestellte Problem überlegt, nur will ich vorher fragen, ob das so funktionieren könnte:

Also, folgende Aufgabe:

Es gibt genau 1 Formular, auf diesem Formular kann eine neue Firma angelegt werden (Name, Telefon, Anschrift). Desweiteren müssen zu der neuen Firma Mitarbeiter hinzugefügt werden(das wird auf dem selben Formular gemacht). Es gibt dazu eine Listbox mit allen verfügbaren Mitarbeitern, aus diesen Mitarbeitern kann man auswählen, die ausgewählten MA werden dann in eine andere Listbox geschoben (Listbox: Ausgewählte Mitarbeiter)

Wenn man auf einen ausgewählten Mitarbeiter klickt, dann kommen 2 Textfelder, wo man den Namen und die Adresse des in der Listbox "Ausgewählte Mitarbeiter" Mitarbeiters eingeben kann.

Abschließend soll, nach Betätigen des Buttons "Speichern", die neue Firma +ausgewählte Mitarbeiter + Mitarbeiterdaten in eine Datenbank gespeichert werden.

Nun meine Lösung:

Eine Klasse Firma mit den Membervariablen Id,Name, Telefon, Anschrift, und einer Liste "Mitarbeiter" (in dieser Liste sollen dann alle Objekte vom Typ Mitarbeiter gespeichert werden)

Eine Klasse Mitarbeiter mit den Membervariablen Id, Name, Anschrift, FirmaId


Ist es nun möglich, dass ich nach betätigen des Speichern-Buttons ein neues Objekt vom Typ "Firma" anlege, und alle Firmendaten in die Membervariablen der Klasse speichere! Das selbe will ich dann mit den Mitarbeitern machen. Ist es überhaupt möglich, dass ich in eine Liste mehrere Objekte vom Typ "Mitarbeiter" speichere (diese Liste befindet sich in der Klasse Firma |denn eine Firma kann mehrere Mitarbeiter haben, darum ne Liste von Objekten), und wie soll ich das dann alles in die DB speichern, da muss ich theoretisch die ganze Liste von Mitarbeiterobjekten durchlaufen, oder?

Als nächstes soll dann eine bestehende Firma verändert werden können (z.B. neue Mitarbeiter hinzu, Mitarbeiter wegnehmen), wie kann ich da mit den Klassen drauf zugreifen


Ich hoffe ihr könnt mir helfen, sorry das ich soviel geschrieben habe, aber ich kenn mich mit dieser Thematik noch nicht so aus, und will nur wissen, ob mein Lösungsvorgang so halbwegs OK ist

Hier noch ein (Paint)-Bild meiner Form: http://bildupload.sro.at/a/images/Formular.JPG


danke







Antworten PM Übersicht Chronologisch
 
Melden nicht möglich
.
Re: Delphi-Programm mit Klassen!
05.10.2007, 18:36:11
Ich kann jetzt nicht konkret von Delphi reden, aber generell: Deine Lösung klingt plausibel.

Ist es nun möglich, dass ich nach betätigen des Speichern-Buttons ein neues
Objekt vom Typ "Firma" anlege, und alle Firmendaten in die Membervariablen der
Klasse speichere!

Ja, so würde man das machen.

Ist es überhaupt möglich, dass ich in eine Liste mehrere Objekte vom Typ
"Mitarbeiter" speichere

Idealerweise solltest du in deinem Programm eine Liste von Mitarbeiter Instanzen haben (alle).  Du würdest dann einfach nur eine Referenz auf einen Mitarbeiter speichern.
Sprich: Globale Liste enthält: MA1, MA2, MA3, MA4; MitarbeiterListe einer einzelnen Firma hat dann die Referenzen auf die Ibjekte MA2 und MA4 (z.b.). Sprich: Du legst also nicht für jede Firma mehrere Mitarbeiter an, sondern nutzt die bereits vorhandenen.

Vergiss weiters nicht, in deinem Programme eine Liste von Firmen zu führen. Du hättest dann also 2 Listen, einmal die Mitarbeiter und einmal die Firmen. Die Firmen selbst haben dann in einer Liste eine Referenz auf das jeweilige Mitarbeiter Objekt - so könntest du das auch dann schön persistieren (bspw. in einer DB).
Die würde dann wie folgt aussehen:
Table MA, Table Firma, Table MAinFirma.
MA: hat die Eigenschaften der einzelnen Mitarbeiter (ID, Name, ...); Firma hat die Eigenschaften der Firma (ID, Name, wasweiss ich,...) und MAinFirma hat dann nur die Beziehung Firma.ID mit MA.ID.
Um solche Beziehungen schön automatisch in eine DB überzuführen gibt es bereits fertige Frameworks, ich weiss jedoch nicht inwieweit ihr das selber machen sollt.


Als nächstes soll dann eine bestehende Firma verändert werden können (z.B.
neue Mitarbeiter hinzu, Mitarbeiter wegnehmen), wie kann ich da mit den
Klassen drauf zugreifen

Das ist das wenn ich oben schreibe dass du eine Liste von Firmen führen solltest. So kannst du im Prinzip deine Maske aufrufen, und beim Aufrufen übergibst du ihr im Konstruktor bereits das Objekt (eine Firma). Diese wird dann geändert und wenn die Maske geschlossen wird, kannst du das Objekt wieder aktualisieren. Du darfst nicht vergessen, dass du (wahrscheinlich auch in Delphi) eigentlich immer mit Referenzen arbeitest und nicht mit dauernd neuen Objekten. Sprich: Eine Änderung in der Maske wird sich auf das Objekt auswirken, das in der Liste der Firmen gespeichert ist.


(Ich hoffe das war einigermaßen verständlich).

life is not measured by the
number of breaths we take
but by the number of moments
that take our breath away

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
...
Re(3): Delphi-Programm mit Klassen!
06.10.2007, 18:11:34
wie du genau ein Firmenobjekt findest ist Delphi - spezifisch zu implementieren. Ich kann dir sagen wie ich sowas in C# machen würde.

Zu einer ListBox (in C#) kannst du Objekte vom Typ object hinzufügen. Das ist sozusagen die Basisklasse aller anderen Objekte. Sprich: Du kannst jedes beliebige Objekt hinzufügen. Um eine sinnvolle Anzeige zu erhalten, kennt die Klasse object die Methode ToString(). Diese liefert ohne dass sie für die Klasse überschrieben wurde einfach nur irgendeinen Hash Wert der das Objekt identifiziert. Nun kannst du für dein Objekt Firma jedoch diese Methode überschreiben. In C# würde das so aussehen:
public override string ToString() { return this.name; }
In dieser Methode kannst du natürlich auf sämtliche Membervariablen zugreifen (z.b. auf den Firmennamen (name). Die Methode ToStirng() liefert jetzt keinen Hash Wert mehr sondern eine aussagekräftigen Namen der Firma.
Wenn nun ein Benutzer das entsprechende Objekt auswählt, kannst du ja das ausgewählte Objekt abfragen. Dieses IST dann zwar ovm Typ object, kann aber in den Typ Firma gecastet werden - somit hast du genau das Objekt das du suchst.

Ein anderes Beispiel:
Das Control ListView in C# akzeptiert als Elemente Elemente vom Typ ListViewItem. ListViewItem bietet eine Property namens Tag, die ein Objekt vom Typ object aufnehmen kann. Weiters bietet das ListViewItem eine Eigenschaft namens Text. Diese eigenschaft würde dann z.b. die Bezeichnung aufnehmen. Der Rest würde analog wie oben funktionieren. Du würdest ein Objekt vom Typ ListViewItem als "ausgewählt" erkennen und dann anhang von der Tag Eigenschaft auf das Firmenobjekt zurückschliessen können.

Das ist jedoch in C# so, in Delphi wird es ähnliche Methoden geben, schau dir einfahc mal an was die Listbox denn so zur Verfügung stellt, vielleicht gibt es ähnliche Ansätze.

Und wie meinst du das mit der globalen Liste, wo soll ich die denn
anlegen/speichern, und wie kann ich in dieser Liste auf eine bestimmte Firma
zugreifen bzw. woher weiss ich, welches Objekt welche Firma ist?

Ähm, ich meinte damit nur eine Liste namens firmen, die eine Liste von Firma Objekten enthält. Die Listbox könntest du dann mit dieser Liste füttern, indem du die Liste durchiterierst.

Und wie lange bleiben denn diese Objekte bestehen, solange bis ich die Form
beende, oder bis ich das gesamte Programm beende.

Sobald es keine Referenz mehr auf ein Objekt gibt, wird es gelöscht. Wenn du also alle Firmen Objekte beim Starten aus der DB ausliest und sie dann in einer Liste speicherst, dann existieren sie solange es diese Liste gibt.
Es wäre nett, wenn du mir sagen/beschreiben könntest, welche Klassen du machen
würdest, und vorallem WIE du diese machen würdest!


Abgesehen von den graphischen Klassen hast du es eh schon mehr oder weniger beantwortet. Und wie diese Aussehen, bleibt dir überlassen :)

Übrigens: Es wäre eigentlich besser, wenn ich es irgendwie ohne
Objektorientierung lösen könnte, falls das überhaupt geht

Sorry, aber das Beispiel impliziert fast schon eine objektorientierte Lösung ... da jetzt zurück zum prozeduralen zu gehen wäre nicht wirklich sinnvoll :)

life is not measured by the
number of breaths we take
but by the number of moments
that take our breath away

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung