![]() |
Komponente ableiten
Hallo,
ich habe eine Komponente
Delphi-Quellcode:
erstellt, die von
"TPerson"
Delphi-Quellcode:
abgeleitet ist. Sie besitzt eine Eigenschaft
TCustomControl
Delphi-Quellcode:
vom Typ
"Markiert"
Delphi-Quellcode:
. Desweiteren habe ich eine Komponente
Boolean
Delphi-Quellcode:
erstellt, die ebenfalls von
"TStammbaum"
Delphi-Quellcode:
abgeleitet ist. Innehalb dieser habe ich 15 "TPerson"'s erstellt und platziert. Damit ich über den Quelltext eine einzelne
TCustomControl
Delphi-Quellcode:
ansprechen kann, habe ich zusätzlich noch eine
"TPerson"
Delphi-Quellcode:
innerhalb von
TObjectList "Personen"
Delphi-Quellcode:
erstellt. Nun möchte ich, dass wenn der Nutzer eine
"TStammbaum"
Delphi-Quellcode:
klickt, diese den Status markiert (True) erhält und alle anderen den Status False erhalten. Wenn ich die Komponenten via Quelltext über die Objektliste anspreche funktioniert das auch wunderbar. Sobald ich aber die OnClick Procedure von TStammbaum überschreiben möchte in etwa so
"TPerson"
Delphi-Quellcode:
weigert sich Delphi zu kompilieren, weil er mit dem Sender nichts anfangen kann. Verwende ich nur
procedure TStammbaum.Click(Sender: TObject);
Delphi-Quellcode:
funktioniert zwar das Programm aber sobald ich auf eine TPerson klicke, tut sich gar nichts. Aber nur über TSender könnte ich die anderen Komponenten (TPerson) die sich auf TStammbaum befinden mit einer Klick-procedure ansprechen. Hat mich jmd. verstanden und kann mir bitte nen Tipp geben?
procedure TStammbaum.Click; override;
Vielen Dank hansklok |
AW: Komponente ableiten
In diesem Fall drafst du nicht Überschreiben, sondern Überladen
Delphi-Quellcode:
procedure TStammbaum.Click(Sender: TObject); overload;
|
AW: Komponente ableiten
@mkinzler: Danke erstmal, und wie muss ich das Deklarieren?
|
AW: Komponente ableiten
Moin,
abgesehen davon, wäre es nicht sinnvoller zu speichern, welches markiert ist? Dann musst du nicht alle durchgucken um herauszufinden, welches markiert ist. MfG Fabian |
AW: Komponente ableiten
Das Click-Ereignis tritt doch erst einmal bei den Personen ein, oder habe ich Dich falsch verstanden? Dann könntest Du doch ein Event OnPersonClick in TStammbaum einführen. Die TPersonen leiten Klicks dann an dieses Event weiter. Das ist leider etwas unelegant, weil die Personen dann den Stammbaum kennen müssen, aber mit etwas Überlegung lässt sich das bestimmt auch noch umgehen.
|
AW: Komponente ableiten
@xZise: ...ich speicher den Tag der markierten TPerson in einer Integer-Variable innerhalb von TStammbaum, jedoch muss ich ja dennoch alle anderen TPersons durchlaufen lassen, um deren Markiert auf False zu setzen, oder?
@DaddyH: Wie würde so etwas aussehen? Das erscheint mir logisch. @mkinzler: Nun löst aber das Click Ereignis überhaupt nicht mehr aus. |
AW: Komponente ableiten
Hier läuft was schief. Im Ansatz schon.
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Vorschlag: Du erklärst mal genauer, was du vor hast. Und zwar wirklich was und nicht wie. Dann machen wir uns mal gemeinsam Gedanken darüber, wie man das besser machen könnte... mfg Christian |
AW: Komponente ableiten
Liste der Anhänge anzeigen (Anzahl: 1)
Im Grunde genommen geht es um die Erstellung eines Programms zur Speicherung Genealogischer Inhalte (Familienforschung). Im Control sollen je nach Auswahl des Users 2 bis 4 Generationen angezeigt werden.
Es gibt eine Klasse, die Personendatensätze. Eine Person können Eltern, Geschwister, Partner hinzugefügt werden. Die jeweils ausgewählte Person soll als Proband (1. Generation) im Stammbaum erscheinen, dahinter Vater und Mutter (2. Generation), dann Großvater und Großmutter (väterlicherseits) und umgekehrt (mütterlicherseits) (3. Generation) usw. Wird z.B. auf den Vater geklickt, so soll dieser Markiert werden und ein Editiermodus starten. Wird er doppelt geklickt, so soll er zum Probanden werden, also an die Position 1 (1. Generation) rutschen, dem entsprechend ändern sich auch die anderen Namen in der 2. bis 4. Generation in der Stammbaumansicht. Gruß hansklok |
AW: Komponente ableiten
OK, da haben wir doch schonmal was. Folgender Ansatz:
- Personen haben Referenzen auf Eltern und Partner, so entsteht der Stammbaum - Eine Klasse TFamilyTree übernimmt die Darstellung. Der eigentliche Stammbaum ist aber das Objektgeflecht - TFamilyTree hat ne Referenz auf die markierte Person - TFamilyTree hat Operationen um den Stammbaum zu erweitern. AddFather() z.B. diese Methode ruft AddFather() der markierten Person auf. Die Person selbst weiß, wie sie einen Vater kriegt, nicht der Stammbaum! Die OOP sagt: "Do it myself!" - TFamilyTree hat eine Referenz auf die Wurzel des Stammbaums. Das reicht, um am Ende alle freigeben zu können. Außerdem kannst du so wieder an den Anfang zurückspringen. - Zusätzlich kannst du, wenn du willst, noch ne ObjectList mit allen Personen halten. Das macht das Freigeben später einfacher (OwnsObjects macht das für dich), dafür musst du aber die Liste pflegen. Dazu würdest du beispielsweise AddFather() einen Rückgabewert verpassen und den dann auswerten. Eigentlich brauchst du das aber nicht. Stattdessen kannst du am Ende rekursiv eine Liste aufstellen. Das ist einfacher. Du kannst auch versuchen direkt rekursiv freizugeben. Da solltest du aber aufpassen. Ansonsten kann es in gewissen Fällen (Inzest) zu Zugriffsverletzungen kommen. - TFamilyTree hat ne Referenz auf den Probanden und ne Methode makeProband(TPerson), die die übergebene Person zum Probanden macht. - TPerson muss TFamilyTree mitteilen können, wann es doppelgeklickt wurde, damit makeProband() aufgerufen wird. Da gibt jetzt mehrere Möglichkeiten: a) ![]() b) ein zusätzliches public, aber nicht published Event (zusätzlich zu onDblClick) das den Doppelklick an das TFamilyTree-Objekt meldet. Noch einigermaßen saubere Lösung. c) TPerson hat ne Referenz auf TFamilyTree und ruft selbst makeProband(Self) auf. Das ist nicht so schön, weil es die Kopplung erhöht. - makeProband(), macht zuerst die bisher angezeigten Personen invisible, setzt dann die Referenz auf den neuen Probanden, setzt die Positionen der anzuzeigenden Probanden und macht diese Visible. Weiteres: - Du könntest überlegen, ob du getrennte Klassen für Darstellung und Logik machst. Also TPerson von TPersistent ableiten und TGraphicPerson von TGraphicControl ableiten und eine TPerson komponieren. Das wäre sauberer, ist aber etwas schwieriger. Mach das nur, wenn du sicher bist, dass du es verstehst. Fragen: - du schreibst was von Geschwistern. Wie hast du dir das vorgestellt? - so richtig verstanden, warum du nur max. 15 Personen anzeigen willst, hab ich immer noch nicht. mfg Christian |
AW: Komponente ableiten
Lieber Christian,
danke für die tollen Hinweise. Ich habe bereits daran gedacht, den Doppelklick der TPerson an den Stammbaum weiterzuleiten, leider habe ich überhaupt keine Idee, wie ich das anstellen soll. Warum nur 15 Personen dargestellt werden sollen? Das hängt mit den 4 Generationen zusammen, die ich darstellen möchte: 1. Generation: Proband (1 Person in der Ansicht) 2. Generation: Vater, Mutter (2 Personen in der Ansicht) 3. Generation: Großväter, Großmütter (4 Personen in der Ansicht) 4. Generation: Urgroßväter, Urgroßmütter (8 Personen in der Ansicht) das ergibt insgesamt 15 Personen. Sollte eine Person Geschwister haben, so werden diese erstmal nicht in der Ansicht dargestellt, es sei denn sie werden über eine Auswahlliste (z.B. TListBox) ausgewählt, dann sind sie der neue Proband des Stammbaums. Ich hoffe das bringt etwas Licht ins dunkle. Gruß hansklok |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 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-2025 by Thomas Breitkreuz