Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Von welcher Klasse ableiten? (https://www.delphipraxis.net/41923-von-welcher-klasse-ableiten.html)

Pseudemys Nelsoni 10. Mär 2005 19:17


Von welcher Klasse ableiten?
 
Moin,

ich brauche soetwas wie TClientSocket, ABER die properties/Events dürfen noch nicht published sein, hat jemand ne Idee von wo ich da am besten ableiten sollte? bei "TCustomSocket" ist dies zwar der Fall, aber am ende braucht diese die Property "Active" und das will ich halt nicht.

Bernhard Geyer 10. Mär 2005 21:16

Re: Von welcher Klasse ableiten?
 
Leite ein eigene Klasse von TComponent ab und erzeuge als Member-Variable ein TClientSocket-Instanz.
Dann kannst Du wunderbar nur das freigeben was Du willst.

Alternativ kannst Du eine Komponente erstellen, welche sich mit einer TClientSocket-Komponente verbinden kann (ähnliche z.B. TDatabase-TTable-TDataset-TDBGrid bei Verwendung der BDE).

Dax 10. Mär 2005 21:17

Re: Von welcher Klasse ableiten?
 
Oder leite dir einfach eine Komponente von TCostumSocket ab und verändere die Sichtbarkeit der Properties von published nach public.

Pseudemys Nelsoni 10. Mär 2005 21:24

Re: Von welcher Klasse ableiten?
 
Hallo Bernhard, ich werds dann so machen, danke für die Idee ;)

@Dax: man kann die Sichtbarkeit nur erhöhren, aber nie verringern.

Dax 10. Mär 2005 21:26

Re: Von welcher Klasse ableiten?
 
Dann weiß ich nicht, was bei mir los ist.. ich hab's mit meinem Delphi6 hinbekommen, eine published-Property protected zu kriegen.

Pseudemys Nelsoni 10. Mär 2005 21:37

Re: Von welcher Klasse ableiten?
 
moin,

in der Delphi 6 hilfe steht aber genau das gleiche :)

Zitat:

Sie können die Sichtbarkeit eines Elements in einer untergeordneten Klasse durch Redeklarieren erhöhen, jedoch nicht verringern. So kann beispielsweise eine protected-Eigenschaft in einer abgeleiteten Klasse als public deklariert werden, nicht aber als private. Außerdem können published-Elemente nicht zu public-Elementen gemacht werden. Weitere Informationen hierzu finden Sie im Abschnitt Eigenschaften überschreiben und neu deklarieren.

Dax 10. Mär 2005 21:40

Re: Von welcher Klasse ableiten?
 
Dann probier mal das aus.. Bei mir funktionierts. :gruebel:

Delphi-Quellcode:
type
  TBase = class(TCollectionItem)
  private
    fString: string;
  published
    property AString: string read fString write fString;
  end;

  TDescendant = class(TBase)
  protected
    property AString;
  end;

Pseudemys Nelsoni 10. Mär 2005 21:45

Re: Von welcher Klasse ableiten?
 
Moin Dax,

dies scheint aber keine Wirkung zu haben, denn wenn ich folgendes habe:

Delphi-Quellcode:
type
  TBase = class(TCollectionItem)
  private
    fString: string;
  published
    property AString: string read fString write fString;
  end;

  TDescendant = class(TBase)
  private
    property AString;
  end;
und eine instanz von TDescendant erzeuge, kann ich immernoch auf "AString" zugreifen obwohls ja im private ist

Dax 10. Mär 2005 21:49

Re: Von welcher Klasse ableiten?
 
Ich verstehe die Welt, bzw. Delphi 6 nicht mehr.

Aber wenn du den Code in die selbe Unit einfügst ist das ja klar, denn im selben Namespace definierte Klassen können sich ja gegenseitig lesen und schreiben wie ihnen lieb ist. Sobald das aber in einer anderen Unit steht, ist TDescendant.AString garantiert private!

PS: Hab's grade selbst ausprobiert, also bitte ^^

bttb930 10. Mär 2005 21:50

Re: Von welcher Klasse ableiten?
 
wenn du innerhalb der gleichen unit darauf zugreifst, dann ist das klar. kannst du aus einer anderen unit auch darauf zugteifen?

Pseudemys Nelsoni 10. Mär 2005 22:15

Re: Von welcher Klasse ableiten?
 
Liste der Anhänge anzeigen (Anzahl: 1)
ihr liegt falsch, ich hatte es natürlich in einer seperaten unit (unit1), die klassen selbst lagen in "pbirc".

Und siehe anhang...

IngoD7 10. Mär 2005 23:00

Re: Von welcher Klasse ableiten?
 
Ihr habt doch beide Recht. :???:

Ihr habt in TBase eine Eigenschaft AString. Diese ist public (oder published). Diese Sichtbarkeit von TBase kann nicht verringert werden! Wenn also in TDescendant ein AString als private steht, so hat das auf die Public-Sichtbarkeit von TBase.Astring keinen Einfluß. Das Astring, auf welches in Pseudemys Nelsonis Code zugegriffen wird, ist das von TBase. Das ist zu sehen, wenn man mit der Maus im Code auf AString geht ("prop TBase.AString: String - Unit2.pas ...").

In diesem Konstrukt und aus Unit1 heraus greift man also mittels TDescendant.AString in Wirklichkeit auf TBase.AString zu - ganz so, als wäre AString in TDescendant überhaupt nicht deklariert (also einfach nur geerbt) worden.

AString ist aber sehr wohl in TDescendant private, jedoch hat der Nachfahre TDescendant damit nicht die Sichtbarkeit von TBase.AString verschlechtert.

Pseudemys Nelsoni 10. Mär 2005 23:03

Re: Von welcher Klasse ableiten?
 
Das meinte ich ja mit:

Zitat:

dies scheint aber keine Wirkung zu haben,
^^

MfG

IngoD7 10. Mär 2005 23:07

Re: Von welcher Klasse ableiten?
 
Zitat:

Zitat von Pseudemys Nelsoni
Das meinte ich ja [...]

Ich sagte ja auch: Ihr habt beide Recht. :)
Siehe dazu auch noch meine Ergänzung im vorherigen Posting (hat sich mit deinem eben überschnitten).


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