Autor Beitrag
snyder
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 05.01.11 12:23 
hi zusammen,

in meinem aktuellen projekt arbeite ich mit der komponente reportbuilder um verschiedene reports zu erstellen. (nicht erschrecken, meine frage bezieht sich eher auf vererbung als auf die komponente)

ich habe eine klasse, in die eine reportkomponente gebunden ist. durch das einbinden dieses reports werden der Unit neben der komponente selbst auch automatisch zahlreiche "subkomponenten" hinzugefügt.

etwa so
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  TFrm_X = class(TForm)
    ppReport: TppReport; // die reportkomponente
    ppLabel_A : TppLabel; //subkomponenten im report
    ppLabel_B : TppLabel;

von dieser form X will ich nun eine kindklasse ableiten. diese kindklasse Z soll viele funktionen der klasse X nutzen und einige wenige davon überschreiben. zudem soll in diese kindklasse ein eigenständiger report eingebunden werden. auch dieser report ist dem report aus klasse X sehr ähnlich und unterscheidet sich nur in details. deshalb bot es sich an, den report aus X einfach etwas anzupassen und in kind unit Z einzubinden. wie erwähnt trägt der report durch das einbinden seine gesamten komponenten in die unit ein. also habe ich in der kindunit stehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  TFrm_Z = class(TFrm_X)
    ppReport: TppReport;
    ppLabel_A : TppLabel; 
    ppLabel_B : TppLabel;

ihr seht sicher schon worauf das hinausläuft. der compiler meldet beim create der unit zur laufzeit, dass die komponente ppreport schon existiert. benenne ich sie um, dann besagt die meldung, dass ppLabel_A schon existiert etc.

gibt es eine möglichkeit, das trotzdem so zu realisieren wie ich mir das gedacht habe? sowas wie einen namespace oder so?

will ungern alle komponenten umbenennen, zumal ich dann auch die gesamte vererbte logik anpassen müsste (was dann ja nicht wirklich dem prinzip der vererbung entspricht).

ich nutze delphi 5 (arbeitsplatzbedingt).

ich hoffe jemand kann mir helfen.

vielen dank schonmal!

gruß

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 05.01.11 17:24 
Frage: Die Komponenten existieren ja nun wirklich mit dem Namen in der Parent-Klasse TFormX. Warum musst Du denn in der Client-Klasse TFormZ die gleichen Namen wieder verwenden. Eigentlich könntest Du die m.E. doch in der Client-Klasse TFormz ersatzlos streichen, weil ja durch Vererbung die Komponenten, soweit sie nicht in der Private-Sektion definiert ist, in die Klientklasse übernommen werden.

Du kannst dann über
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  Form_X : TFrm_X;
  Form_Z : TFrm_Z;

// Code-Abschnitt, der nicht ohne Anpassung funktioniert: (Zur Verdeutlichung dessen, was ich meine

  Form_X.ppReport.Eigenschaft := Value; // die Eigenschaft der Komponente ppReport der Form_X ändern und mit
  Form_Z.ppReport.Eigenschaft := Value; // die Eigenschaft der Komponente ppReport der Form_Z ändern.


Auch in TppReport definierte Prozeduren, Funktionen und Properties kannst Du entsprechend nutzen. Sehe ich das etwa falsch?

Wie gesagt, alle doppelt definierten Variablen würde ich in der Client-Klasse löschen.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.