Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kleines Rekursiv-Problem (https://www.delphipraxis.net/91686-kleines-rekursiv-problem.html)

Neutral General 8. Mai 2007 17:28


Kleines Rekursiv-Problem
 
Hi,

Folgende function soll rekursiv einen x-Wert ausrechnen.. z.B wenn man nen Button auf nem Panel auf nem Panel auf nem Panel auf ner Form hat und dann die Bildschirmposition haben will dann würde man mit meiner Methode so vorgehn:

Delphi-Quellcode:
GlobalX := Button.Left + GetDX(0,PanelAufDemDerButtonIst);
oder

Delphi-Quellcode:
GlobalX := GetDX(Button.Left,PanelAufDemDerButtonIst);
Das klappt irgendwie.. aber irgendwie auch nicht... wenn ich das ganze mit Breakpoints verfolge dann arbeitet alles wunderbar aber dann ist WC = nil und Result wird gesetzt.. danach die nächste Station ist ja end; und danach wird eigentlich wieder in die Procedure gesprungen die GetDX aufgerufen hat. Komischerweise bleibt der Debugger aber 3 mal hintereinander bei end; stehn und auf einmal ist Result = 45243412 oder so -.-

Delphi-Quellcode:
function GetDX(Ax: Integer; WC: TWinControl): Integer;
begin
 if WC <> nil then
   GetDX(Ax+WC.Left,WC.Parent)
 else
  Result := AX;
end;
Gruß
Neutral General

SirThornberry 8. Mai 2007 17:32

Re: Kleines Rekursiv-Problem
 
verwende doch einfach ClientToScreen :-D

GimbaR 8. Mai 2007 17:35

Re: Kleines Rekursiv-Problem
 
An der Stelle, wo der Rekursionsabbruch erfüllt wird (WC = nil) ist Result ja nicht definiert. Deswegen bekommst du wohl so ne komische Zahl heraus.

[edit] Ich glaub, das war quatsch :pale: [/edit]

Udontknow 8. Mai 2007 17:36

Re: Kleines Rekursiv-Problem
 
Hallo!

Was soll denn dieses AX da? Entweder ClientToScreen, oder das hier:

Delphi-Quellcode:
function GetAbsoluteLeft(Control:TWinControl):Integer;
begin
  if Control.Parent<>NIL then
    Result:=Control.Left+GetAbsoluteLeft(Control.Parent)
  else
    Result:=Control.Left;
end;
Cu,
Udontknow

Neutral General 8. Mai 2007 17:38

Re: Kleines Rekursiv-Problem
 
Leute das problem ist: Funktioniert bei AndorraSprites nicht ;)
Mom mal grad... ich glaub ich muss da was zurücknehmen.. *Test*

Udontknow 8. Mai 2007 17:42

Re: Kleines Rekursiv-Problem
 
Zitat:

Zitat von GimbaR
An der Stelle, wo der Rekursionsabbruch erfüllt wird (WC = nil) ist Result ja nicht definiert. Deswegen bekommst du wohl so ne komische Zahl heraus.

[edit] Ich glaub, das war quatsch :pale: [/edit]

Denke ich aber nicht; Du hast schon recht. Der oberste (erste) Aufruf wird Result nicht setzen, da WC<>NIL. Die Rekursion wird aufgerufen, aber das Ergebnis nicht in Result gespeichert.

Cu,
Udontknow

Neutral General 8. Mai 2007 17:44

Re: Kleines Rekursiv-Problem
 
Hi,

Ja wie schon eben editiert: Ich kanns natürlich mit ClientToScreen machen:

Delphi-Quellcode:
D := TSpriteEngine(Parent).Surface.Parent.ClientToScreen(Point(0,0));
dann hab ich mein d.x und d.y :)

Danke für eure Hilfe ;)

Gruß
Neutral General


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