Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Ändern der Klassenhierarchie (https://www.delphipraxis.net/9449-aendern-der-klassenhierarchie.html)

sabbelstein 21. Nov 2004 23:10

Re: Ändern der Klassenhierarchie
 
:duck:

mmh sorry hab ich überlesen is wohl schon spät ;)

gibts irgendwie eine andere möglichkeit jeder componente ein attribut hinzuzufügen ohne die sourcen zu ändern?

sakura 22. Nov 2004 08:42

Re: Ändern der Klassenhierarchie
 
Wenn Du auf .NET (und Delphi.NET) umsteigst, dann ja. Da wurde das von vornherein mit ins Konzept aufgenommen. Prominentestes Beispiel ist die ToolTip Komponente. In Delphi für Win32 leider: nein.

...:cat:...

Shaman 18. Feb 2005 14:42

Re: Ändern der Klassenhierarchie
 
Hallo zusammen

Was ist mit dem is-Operator? Der bekommt die Änderung anscheinend nicht mit und funktioniert nicht mehr.

Ich will in einem Message-Handler folgendes realisieren:

Delphi-Quellcode:
begin
  if Self is TWinControl then
    with TWinControl(Self) do
    begin
       {...}
    end;
end;
Dabei ersetze ich den Vorfahren von TWinControl.

Gruss
Shaman

alcaeus 18. Feb 2005 14:47

Re: Ändern der Klassenhierarchie
 
Zitat:

Zitat von Shaman
...Der bekommt die Änderung anscheinend nicht mit und funktioniert nicht mehr.

Ich will in einem Message-Handler folgendes realisieren:

Kannst du bitte mal sagen WAS nicht funktioniert und WIE sich das aeussert? Ausserdem, auf welcher Delphi-Version testest du das? Bei mir funktioniert is einwandfrei

Greetz
alcaeus

Shaman 18. Feb 2005 14:54

Re: Ändern der Klassenhierarchie
 
Also, ich ersetze den Vorfahren von TWinControl (TControl) mit:

Delphi-Quellcode:
type
  TControlEx = class(TControl)
  private
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure WMSetText(var Msg: TWMSetText); message WM_SETTEXT;
  end;
In den Prozeduren möchte ich nun prüfen, ob Self ein TWinControl ist. Doch bei der is-Abfrage bringt er mir inkompatible Typen. Aber hab grad gemerkt, mit InheritsFrom scheints zu klappen...

Gruss
Shaman

Robert_G 18. Feb 2005 15:09

Re: Ändern der Klassenhierarchie
 
Zitat:

Zitat von Shaman
In den Prozeduren möchte ich nun prüfen, ob Self ein TWinControl ist. Doch bei der is-Abfrage bringt er mir inkompatible Typen. Aber hab grad gemerkt, mit InheritsFrom scheints zu klappen...

Der IS Operator kann ja auch nicht wissen was du da zur Laufzeit machst. ;)

Shaman 18. Feb 2005 15:12

Re: Ändern der Klassenhierarchie
 
Stimmt ja :wall:

Merci

maximov 18. Feb 2005 15:13

Re: Ändern der Klassenhierarchie
 
Zitat:

Zitat von Robert_G
...
Der IS Operator kann ja auch nicht wissen was du da zur Laufzeit machst. ;)

wieso nicht ? Der Is-operator ist doch der laufzeit-klassenprüf-operator.

Delphi-Quellcode:
function _IsClass(Child: TObject; Parent: TClass): Boolean;
begin
  Result := (Child <> nil) and Child.InheritsFrom(Parent);
end;

Robert_G 18. Feb 2005 15:14

Re: Ändern der Klassenhierarchie
 
Zitat:

Zitat von maximov
Zitat:

Zitat von Robert_G
...
Der IS Operator kann ja auch nicht wissen was du da zur Laufzeit machst. ;)

wieso nicht ? Der Is-operator ist doch der laufzeit-klassenprüf-operator.

Sicher. Trotzdem kann es beim Kompilieren knallen wenn es für den Compiler absolut unmöglich erscheint, dass A von B abgeleitet ist. ;)

Nachtrag:
Bevor die nächste Frage kommt. Einfach selbst testen ;)
Delphi-Quellcode:
type
   TBase = class
   end;

     T1stDescendant = class(TBase)
   end;

   T2ndDescendant = class(TBase)
   end;
   TComparedType = class(T2ndDescendant)
   end;

var
  X : TComparedType;
begin
   if X is TBase then
      Writeln('ist TBase'); // geht

   if X is T1stDescendant then
      Writeln('ist T1stDescendant'); // knallt
end.

maximov 18. Feb 2005 16:51

Re: Ändern der Klassenhierarchie
 
Zitat:

Zitat von Robert_G
Zitat:

Zitat von maximov
Zitat:

Zitat von Robert_G
...
Der IS Operator kann ja auch nicht wissen was du da zur Laufzeit machst. ;)

wieso nicht ? Der Is-operator ist doch der laufzeit-klassenprüf-operator.

Sicher. Trotzdem kann es beim Kompilieren knallen wenn es für den Compiler absolut unmöglich erscheint, dass A von B abgeleitet ist. ;)

Nachtrag:
Bevor die nächste Frage kommt. Einfach selbst testen ;)
...

Da is der kompiler natürlich ein bisschen übereifrig - aber recht hatta ja. Wenn man es wirkt wissen will, dann muss man ihn halt täuschen:
Delphi-Quellcode:
...
var
  X : TComparedType;
begin
   if X is TBase then
      Writeln('ist TBase'); // geht

   if TObject(X) is T1stDescendant then
      Writeln('ist T1stDescendant'); // knallt
end.
Aber das führt zu nix, da man, wie schon gesagt wurde, gleich InheritsFrom benutzen kann. Gut das wir das geklärt haben :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.
Seite 2 von 3     12 3      

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