Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zuweisung property Delphi 2010 (https://www.delphipraxis.net/149325-zuweisung-property-delphi-2010-a.html)

Thorben86 18. Mär 2010 23:00


Zuweisung property Delphi 2010
 
Hi, ich hab hier ein kleines Problem mit D2010 und einer Property.
Und zwar hab ich hier ne Komponente wo TDragObject aus der Controls-Unit verwendet wird.

DragObject.DragPos ist ein TPoint. Jetzt würde ich das gerne zuweisen, aber habe hier schon gelesen, dass das mit D2010 nicht mehr so geht. Nur wie kann ich dem jetzt was zuweisen? Kann ja schließlich nicht die vorgefertigten Units umschreiben..

Delphi-Quellcode:
procedure TCustomElTree.StartDragTransfer(Sender : TObject; var DragObject : TDragObject);
{ Transfers FView OnStartDrag event to the outside world. }
begin
{$IFDEF VCL_4_USED}
  if DragObject <> nil then
  with DragObject.DragPos do
 begin
    y := y + FView.Top;
    X := X + FView.Left;
  end;
...
Hoffe mir kann hier wer helfen?
Gibts eigentlich irgendwo en gutet Tutorial, was man bei den ganzen Änderungen in D2010 beachten/ändern muss?

Viele Grüße
Thorben

gmc616 18. Mär 2010 23:41

Re: Zuweisung property Delphi 2010
 
Ich wüsste jetzt spontan keinen Grund, wieso sich in D2010 eine Property nicht beschreiben lassen sollte, sein denn, die Property wäre ReadOnly. Das wäre aber kein "Problem" von D2010 sondern die "Eigenschaft" der Property, die sich auch mit z.B. D7 nicht beschreiben ließe.

Lasse mich aber gern eines Besseren belehren.
Sollte der Unterschied von D2009 zu D2010 doch so heftig sein?? Kann ich kaum glauben.

Wobei sich mir auch die Frage stellt, wieso man im DragStart die Start-Position ändern muss? :gruebel:
Aber du wirst bestimmt Gründe dafür haben ...

Was sagt denn der Compiler dazu?

himitsu 18. Mär 2010 23:47

Re: Zuweisung property Delphi 2010
 
Delphi 2010 meckert jetzt endlich mal, wenn man sowas versucht, denn früher war es zwar möglich, aber nicht wirklich.

Gab vor 'ner Weile auch einen Thread dazu.

.DragPos ließt wirklich das Property (TPoint) aus, aber X und Y würden nur innerhalb des ausgelesenen Wertes geändert und nicht innerhalb der Komponente

Delphi-Quellcode:
with DragObject.DragPos do
begin
  y := y + FView.Top;
  X := X + FView.Left;
end;
ergibt intern
Delphi-Quellcode:
with DragObject.GetDragPos do
begin
  y := y + FView.Top;
  X := X + FView.Left;
end;
Delphi-Quellcode:
temp := DragObject.GetDragPos;
temp.Y := temp.Y + FView.Top;
temp.X := temp.X + FView.Left;
Und nun fällt vielleicht auch auf, warum sowas nun nicht mehr zugelassen wird.

gmc616 18. Mär 2010 23:58

Re: Zuweisung property Delphi 2010
 
Aha. Kling sinnig. Gut zu wissen.

Wäre dann die Lösung width nicht zu verwenden?


Also so:
Delphi-Quellcode:
procedure TCustomElTree.StartDragTransfer(Sender : TObject; var DragObject : TDragObject);
{ Transfers FView OnStartDrag event to the outside world. }
begin
    DragObject.DragPos.y := DragObject.DragPos.y + FView.Top;
    DragObject.DragPos.X := DragObject.DragPos.X + FView.Left;

himitsu 19. Mär 2010 05:33

Re: Zuweisung property Delphi 2010
 
Zitat:

Zitat von gmc616
Wäre dann die Lösung width nicht zu verwenden?

genau

im Prinzip gibt es diese Möglichkeiten:
Delphi-Quellcode:
var V: TPoint;

V := DragObject.DragPos;
V.Y := V.Y + FView.Top;
V.X := V.X + FView.Left;
DragObject.DragPos := V;
Delphi-Quellcode:
var V: TPoint;

V := DragObject.DragPos;
DragObject.DragPos := Point(V.X + FView.Left, V.Y + FView.Top);
[delphi]DragObject.DragPos := Point(DragObject.DragPos.X + FView.Left,
DragObject.DragPos.Y + FView.Top);/delphi]

Medium 19. Mär 2010 07:01

Re: Zuweisung property Delphi 2010
 
Ein wenig aufpassen muss man hier allerdings, weil wenn hinter der Property kein Record (=Wertetyp) sondern eine Klasse (=Referenztyp) steht, DANN ginge was du zu Anfang gemacht hast sehr wohl. Bei Klassen wird nämlich keine Kopie der Werte, sondern eine Referenz auf exakt die anhängige Instanz zurückgegeben. Die Variante für Records tut dann zwar auch, ist aber an sich zu viel gemacht. Wenn man nicht weiss was sich hinter einer Property genau verbirgt, wäre das also erstmal der sichrere Weg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 Uhr.

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