Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Frage zu Inherited (https://www.delphipraxis.net/133897-frage-zu-inherited.html)

BAMatze 11. Mai 2009 21:45


Frage zu Inherited
 
Hallo und Guten Abend an alle DP´ler,

Ich hab da mal eine Frage zu inherited. Und zwar schreibe ich mir gerade auf, was ich bis jetzt so über Komponentenerstellung kennen gelernt habe und habe einen Quellcode geschrieben der wie folgt aussieht:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if (Key in [#0..#7, #9..#15, #17..#26, #28..#47, #58..#255]) then key := #0
  else inherited;
end;

end.
Ich weiß ist nichts wirklich weltbewegendes, aber eins ist mir dabei aufgefallen: Die von mir eigentlich unbeabsichtigte Verwendung von inherited. Eigentlich kenne ich das nur bei der Erstellung von Komponenten, damit die ursprüngliche, vererbte Methode in der überschriebenen aufgerufen werden kann. Die Procedure, so wie sie dort steht macht anscheinend genau was ich möchte. Leider habe ich in der Hilfe zu inherited nur Erklärungen gefunden, die auf die Vererbung von Methoden zurückführen, was ich (glaube ich) zumindest ja eigentlich nicht mache oder wenn dann völlig ohne meines Wissens.

Wie ist die anscheinend richtige Verwendung des Begriffes inherited aber ohne Vererbung zu veerstehen? Kann mir das vieleicht mal jemand erklären?

Vielen Dank
BAMatze

[quote]

mkinzler 11. Mai 2009 21:49

Re: Frage zu Inherited
 
inherited ruft einfach die Methode der Superklasse auf

BAMatze 11. Mai 2009 21:56

Re: Frage zu Inherited
 
Zitat:

Zitat von mkinzler
inherited ruft einfach die Methode der Superklasse auf

Also könnte man salopp inherited mit "tue das übliche" übersetzen?

mkinzler 11. Mai 2009 21:58

Re: Frage zu Inherited
 
Wenn du mit "üblich" das ererbt Verhalten meinst, ja.

BAMatze 11. Mai 2009 22:11

Re: Frage zu Inherited
 
Zitat:

Zitat von mkinzler
Wenn du mit "üblich" das ererbt Verhalten meinst, ja.

danke das war es schon

Satty67 11. Mai 2009 22:21

Re: Frage zu Inherited
 
Wobei die meisten Propertys für die Ereignisbehandlung bei VCL Komponenten wohl sowieso undefiniert sind?!

jaenicke 11. Mai 2009 22:26

Re: Frage zu Inherited
 
In dem Fall passiert bei inherited schlicht gar nichts, denn es gibt keine entsprechende Methode im Vorfahren. In dem Fall gibt es keinen Fehler, denn das könnte ja später hinzugefügt werden.

Damit das etwas bewirkt muss in der Oberklasse (was hier TForm wäre) eine genau gleichnamige virtuelle Methode vorhanden sein, die du überschrieben hast.

Hier hast du die aber neu eingeführt und als Ereignisbehandlungsroutine zugewiesen, eine Methode "Edit1KeyPress" gibt es in TForm nicht. Fazit: Entferne einfach das else mit dem inherited, es wird keinen Unterschied machen. ;-)
Denn die weitere Behandlung der Tastatureingabe passiert nach der Benachrichtigung an dich via Edit1KeyPress sowieso. Nur dass du bei unerwünschten Tasten die Nulltaste (also nix) aus der Eingabe gemacht hast. Also kommt nix mehr an.

mjustin 12. Mai 2009 07:56

Re: Frage zu Inherited
 
Zitat:

Zitat von jaenicke
In dem Fall passiert bei inherited schlicht gar nichts, denn es gibt keine entsprechende Methode im Vorfahren. In dem Fall gibt es keinen Fehler, denn das könnte ja später hinzugefügt werden.

Die IDE ist hier schlauer als der Compiler:

wenn man einen Button-Eventhandler schreibt, der nur inherited enthält,

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  inherited;
end;
wird er beim Kompilieren komplett gelöscht, die IDE scheint zu merken, dass der Code 'nichts' macht.

Der Compiler jedoch gibt keinen Hinweis, wenn ein inherited ins Leere geht.


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