Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kind as Opa innerhalb der Deklerartion (https://www.delphipraxis.net/139971-kind-opa-innerhalb-der-deklerartion.html)

dmdjt 9. Sep 2009 14:40

Re: Kind as Opa innerhalb der Deklerartion
 
Habs getestet mit

Delphi-Quellcode:
TOpa = class
public
  alter : integer;
  procedure tuwas;
end;


procedure TOpa.tuwas;
begin
  showmessage('Großvater '+inttostr(self.alter));
end;
Opa, Vater und Kind haben ein Unterschiedliches Alter. Wenn Alter eine Konstante ist geht es. Wenn nicht, dann ist Alter = 0. Das ist mir klar. Und natürlich die Limitation an dem ganzen. Wird ja nirgendwo zugewiesen. Und wenn dann würde es auch nix bringen, weil man ja auf die KLasse und nicht auf das Objekt zugreift. Hab ich das richtig verstanden?

PS: Bin mal für einige Zeit weg...

sirius 9. Sep 2009 14:44

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von NamenLozer
Löscht call automatisch die Register, oder wie? :gruebel:

Nein, aber vor dem Call kann ja noch etwas stehen. Wenn nicht, dann passiert auch nix. Aber schon allein das Nutzen von dynamischen (Interface, String, dyn. Array) Variablen verändert ne Menge Register bevor deine Methode richtig anfängt.
Edit: Ein mov eax,self dürfte allerindg schon reichen. Das sind aber reichlich Verrenkungen.

Hawkeye219 9. Sep 2009 14:45

Re: Kind as Opa innerhalb der Deklerartion
 
Hallo,

abgesehen von möglichen Designfehlern in der Klassenhierarchie - wäre es nicht am einfachsten, dem fleißigen Opa eine weitere, nicht-virtuelle Methode zu spendieren?

Delphi-Quellcode:
type
  TOpa = class
    procedure TuWas; virtual;
    procedure OpaTutWas;
  end;

procedure TOpa.TuWas;
begin
  OpaTutWas;
end;

procedure TOpa.OpaTutWas;
begin
  // die eigentlichen Aktionen
end;

[...]

procedure TKind.TuWas;
begin
  OpaTutWas;
end;
Die neue Methode kann in allen abgeleiteten Klassen direkt aufgerufen werden.

Gruß Hawkeye

olee 9. Sep 2009 15:41

Re: Kind as Opa innerhalb der Deklerartion
 
Die Methode von Hawkeye219 funktioniert zwar,

aber wenn jetzt TOpa eine Klasse aus Delphi wie TMemo u.a. wäre, könnte man nicht
einfach die Source ändern :wink: .

Aber ich bin auch darauf gespannt, ob so was mit asm möglich ist.

ALso so inetwa wie das hier:

Delphi-Quellcode:
asm
  mov eax, self;
  call TOpa.MeinName;
end;

sirius 9. Sep 2009 15:44

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von olee
Aber ich bin auch darauf gespannt, ob so was mit asm möglich ist.

:gruebel: List hier eigentlich noch jemand ALLE bisherigen Kommentare?

Aphton 9. Sep 2009 15:45

Re: Kind as Opa innerhalb der Deklerartion
 
Delphi-Quellcode:
procedure TKind.MeinName;
var i:Integer;
begin
  asm
    pushad
  end;
  for i:=0 to 0 do showmessage('Damit es nicht durch Zufall doch klappt');
  asm
    popad
    call TOpa.MeinName
  end;
  ShowMessage( '(Kind:) a gugugugu' );
end;
:P

olee 9. Sep 2009 15:46

Re: Kind as Opa innerhalb der Deklerartion
 
Ich hab alles gelesen meine Frage war, ob durch dieses MOV danach auch die
Varaible self in TOpa.TuWas zu gebrauchen ist.

:?

Namenloser 9. Sep 2009 15:58

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von olee
Ich hab alles gelesen meine Frage war, ob durch dieses MOV danach auch die
Varaible self in TOpa.TuWas zu gebrauchen ist.

:?

Muss eigentlich. Allerdings steht self höchstwahrscheinlich nicht in EAX, denn EAX ist für den Funktionsrückgabewert reserviert.

sirius 9. Sep 2009 15:59

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von olee
Ich hab alles gelesen meine Frage war, ob durch dieses MOV danach auch die
Varaible self in TOpa.TuWas zu gebrauchen ist.

:?

Ja, ist es, siehe Beitrag #22
Edit: Sorry, den hatte ich editiert.... :pale:


@Aphton:
Delphi-Quellcode:
procedure TKind.MeinName;
var i:Integer;
    s:string;
begin
  asm
    pushad
  end;
  s:='test';
  for i:=0 to 0 do showmessage('Damit es nicht durch Zufall doch klappt');
  asm
    popad
    call TOpa.MeinName
  end;
  ShowMessage( '(Kind:) a gugugugu' +s);
end;
Aber mach doch, wie ich schon schrieb, ein mov eax,self direkt vor den Aufruf.

fajac 10. Sep 2009 08:38

Re: Kind as Opa innerhalb der Deklerartion
 
Etwas gekünstelt könnte man es so machen:

Delphi-Quellcode:
interface

type
  TOpa = class (TObject)
  public
    procedure SachWas (ARecurse : Integer = 0); virtual;
  end;

  TVater = class (TOpa)
  public
    procedure SachWas (ARecurse : Integer = 0); override;
  end;

  TSohn = class (TVater)
  public
    procedure SachWas (ARecurse : Integer = 0); override;
  end;

implementation

{ TOpa }

procedure TOpa.SachWas (ARecurse: Integer = 0);
begin
  ShowMessage ('Hallo Jungs!')
end;

{ TVater }

procedure TVater.SachWas (ARecurse: Integer = 0);
begin
  if ARecurse > 0 then
    inherited SachWas (ARecurse - 1)
  else
    ShowMessage ('Hallo Bub!')
end;

{ TSohn }

procedure TSohn.SachWas (ARecurse: Integer = 0);
begin
  if ARecurse > 0 then
    inherited SachWas (ARecurse - 1)
  else
    ShowMessage ('GuGu!')
end;

procedure AlleSagenWas(Sender: TObject);
var
  kind : TSohn;
begin
  kind := TSohn.Create;
  try
    kind.SachWas;
    kind.SachWas(1);
    kind.SachWas(2);
  finally
    kind.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 Uhr.
Seite 3 von 4     123 4      

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