Autor Beitrag
king-soft
Hält's aus hier
Beiträge: 11

Win98,2000,XP
Delphi6Pro
BeitragVerfasst: Di 19.06.07 22:11 
Hallo Leute,

ich habe eine Frage zu Methodenaufrufen.

Ich habe in meinem Projekt viele vererbte Formulare:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    TfrmStdVor = class(Tform);                // = gemeinsamer Vorfahr
        Function Korr_Pos(....);
 
    TfrmVorAuf = class(TfrmStdVor)        // Nachfahr von TfrmStdVor
         Function Korr_Pos(....);
    TfrmVorArg = class(TfrmStdVor)        // Nachfahr von TfrmStdVor
         Function Korr_Pos(....);                
    TfrmVorLS = class(TfrmStdVor)...etc.pp...


Diese Formulare haben gemeinsame Funktionen/Methoden die normalerweise vom Nachfahr per inherited von "Oben" nach "Unten" aufgerufen werden.
Aber wie kann in aus der Klasse TfrmStdVor die Funktion Korr_Pos(...) aus der Child-Klasse TfrmVorAuf aufrufen?

gibt es ein: Child.Koor_Pos(...) bzw. (der aktullen Instanz einer Klasse sin Nachfahr).Korr_pos(...) oder sowas ähnliches?

Ich weiß nicht mehr weiter; danke für eure Hilfe
Gruß Bernd

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 19.06.07 22:15 
Öhm. Wenn Du das tun musst, hast Du irgendwas falsch gemacht. Zeig mal, was Du versuchst, zu machen ;)

Wenn Du sowas willst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var
  frmStdVor : frmStdVor;
begin
  frmStdVor := TTfrmVorArg.Create(..);
  frmStdVor.Korr_Pos(....); /Ruft die Methode von **TTfrmVorArg** auf


Dann musst Du die Methode in TfrmStdVor als "virtual" deklarieren und in den Nachfahren mit "override" überschreiben.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Di 19.06.07 22:19 
Wenn ich dich richtig verstehe, willst du von einem Object eine Methode aufrufen, die eine Unterklasse dieses Objectes hat.

Das geht nicht!!!

Vererbung funktioniert nur von oben nach unten d.h. Unterklassen besitzen (mit Einschränkungen) die Methoden der jeweiligen Oberklasse, deine Klasse TfrmStdVor hat/kennt die Methode Korr_Pos(...) einfach nicht.

Was du aber machen kannst ist in einer einer Variablen deiner Oberklasse

ausblenden Delphi-Quelltext
1:
form:TfrmStdVor;					


durch

ausblenden Delphi-Quelltext
1:
form:=TfrmVorAuf.create;					


ein Object der Unterklasse zu erzeugen, dieses würde dann die Methode Korr_Pos(...) kennen.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 19.06.07 23:20 
Also ich würde die Methode in der Basisklasse als 'Virtual' deklarieren. Die Kindklassen überschreiben (override) die Methode.
Wenn Du dann in der Basisklasse die Methode aufrufst, wird automatisch die richtige Methode der Kindklasse aufgerufen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
Type
  TBasisklasse = Class
    Procedure Foo; Virtual;
    Procedure Bar;
  End;

  TKindKlasse = Class (TBasisklasse)
    Procedure Foo; Override;
  End;

  TNeAndereKindKlasse = Class (TBasisklasse)
    Procedure Foo; Override;
  End;

Procedure TBasisKlasse.Foo;
Begin
  ... 
End;

Procedure TBasisKlasse.Bar;
Begin
  Foo; // Ruft die richtige Methode auf, je nachdem von welchem konkreten Basistyp die Klasse ist
End;

_________________
Na denn, dann. Bis dann, denn.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 20.06.07 02:25 
Erkläre mal, wie das konkret realisiert wird :

user profile iconking-soft hat folgendes geschrieben:
Hallo Leute,
Ich habe in meinem Projekt viele vererbte Formulare:
...
Diese Formulare haben gemeinsame Funktionen/Methoden die normalerweise vom Nachfahr per inherited von "Oben" nach "Unten" aufgerufen werden.
Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Zeige mal die PAS und vor allem auch die zugehörige DFM. Letztere ist wichtig ! Weitere Frage : ist die Objektablage/Reopsitory ein Begriff oder wird alles von Hand erledigt (bzw. das versucht) ?

_________________
Gruß
Hansa
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Mi 20.06.07 04:07 
alzaimar hat recht.
Wenn Du ein Object vom Typ B erstelltst, welches eine Methode seines Vorfahren überschreibt, kann auch im Code des Vorfahren diese Methode aufgerufen werden und der Code des Nachfahren wird ausgeführt, da auf dem VMT (Virtual Method table) die Methode des Nachfahren ganz oben liegt. Bei virtuellen methoden wird immer über den VMT auf eine Methode zugegriffen.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
king-soft Threadstarter
Hält's aus hier
Beiträge: 11

Win98,2000,XP
Delphi6Pro
BeitragVerfasst: Mo 25.06.07 18:40 
Titel: Danke
Hallo Leute,

vielen Dank erstmal für eure Antworten.

Ich kann bestätigen dass alzaimar recht hat !

Wenn man in vererbten Strukturen/Formularen in der Basisklasse die benötigten Methoden als 'Virtual' deklariert, und in der Kindklassen diese Methode mit override deklariert wird aus einer Methode der Basisklasse automatisch die richtige Methode der Kindklasse aufgerufen. Delphi ist genial (Ihr natürlich auch).

Also danke nochmal, funzt.

Gruß Bernd

PS. Ich konnte übrigens solange nicht Antworten weil ich normalerweise mit Firefox arbeite, und der mich einfach nicht einloggen lässt. Zufälligerweise mal mit IE ausbprobiert, und wie man sieht klapps auch mit dem Nachbarn.
Die Mailadresse an die man sich dann wenden kann klappt auch nicht:
----- The following addresses had permanent fatal errors -----
<info@entwickler-ecke.de>
(reason: 550 host entwickler-ecke.de [81.169.132.68] said: 550 <info@entwickler-ecke.de>: User unknown in virtual alias table)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 25.06.07 18:50 
Titel: Re: Danke
user profile iconking-soft hat folgendes geschrieben:
Ich kann bestätigen dass alzaimar recht hat !
Pff, keiner hat mein Posting gelesen :cry:

user profile iconking-soft hat folgendes geschrieben:
Ich konnte übrigens solange nicht Antworten weil ich normalerweise mit Firefox arbeite, und der mich einfach nicht einloggen lässt.
Cookies löschen, ansonsten bitte in "Wünsche, Anregungen und Kritik" posten, das passt hier nicht so ganz hin ;-)

user profile iconking-soft hat folgendes geschrieben:
Die Mailadresse an die man sich dann wenden kann klappt auch nicht:
----- The following addresses had permanent fatal errors -----
<info@entwickler-ecke.de>
(reason: 550 host entwickler-ecke.de [81.169.132.68] said: 550 <info@entwickler-ecke.de>: User unknown in virtual alias table)
grmpf, ist die immer noch nicht eingerichtet? :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 25.06.07 18:57 
Titel: Re: Danke
user profile iconChristian S. hat folgendes geschrieben:
user profile iconking-soft hat folgendes geschrieben:
Ich kann bestätigen dass alzaimar recht hat !
Pff, keiner hat mein Posting gelesen :cry:

Doch, aber (K)einer hats verstanden.

_________________
Na denn, dann. Bis dann, denn.
king-soft Threadstarter
Hält's aus hier
Beiträge: 11

Win98,2000,XP
Delphi6Pro
BeitragVerfasst: Mo 25.06.07 19:06 
Titel: Re: Danke
Hallo Christian,

Asche auf mein Haupt. Jetzt wo du es sagt lese ich es in DEINER Antwort. (und dann noch innerhalb von 4 Minuten!!!)
Sorry, du warst tatsächlich der Erste mit der richtigen Antwort. Da in der zwischenzeit schon soviele Antworten da waren, muß ich deinen letzten Satz übersehen haben.

Ich gelobe Besserung.

Danke nochmals.
Gruß Bernd
king-soft Threadstarter
Hält's aus hier
Beiträge: 11

Win98,2000,XP
Delphi6Pro
BeitragVerfasst: Mo 25.06.07 19:09 
Titel: Re: Danke
Hallo Christian,

Asche auf mein Haupt. Jetzt wo du es sagt lese ich es in DEINER Antwort. (und dann noch innerhalb von 4 Minuten!!!)
Sorry, du warst tatsächlich der Erste mit der richtigen Antwort. Da in der zwischenzeit schon soviele Antworten da waren, muß ich deinen letzten Satz übersehen haben.

Ich gelobe Besserung.

Danke nochmals.
Gruß Bernd