19. januar 2004 - 15:42Der er
3 kommentarer og 1 løsning
deklaration funktioner
hvis jeg i en klasse definere den således:
type Test = class private
public Point : TPoint; end;
kan jeg skrive til og fra Point ved at gøre således:
Test.Point.X := 1; Test.Point.Y := 2;
Men hvis jeg definere min TPoint via en property således:
type Test = class private FPoint : TPoint; procedure SetPoint(P : TPoint); public property Point : TPoint read FPoint write SetPoint; end;
kan jeg ikke længere skrive til Point's X og Y direkte!!!! Hvordan kan jeg gøre så jeg kan skrive til Point's X og Y direkte men via en procedure som i sidste eksempel. Jeg tror at jeg forstår hvorfor jeg ikke kan skrive direkte med gennem en property, men jeg har før set klasser der kan gøre det, jeg ved bare ikke helt hvordan de gør :) Håber i forstår hvad jeg mener!
Fordelen med properties er, at du kan begrænse adgangen til data hvis du ikke vil have en variabel læst, så fjerner du bare "write fPoint" delen. Ydermere kan du bruge funktioner i stedet for de direkte referencer til fPoint:
property Point : TPoint read fPoint
Du kan også lave en SetPoint proecdure i stedet for den direkte reference til fPoint, eksempelvis flytte en cursor samtidig med du sætter værdien. Bemærk dog, at det ikke må blive så intelligent at property'ens navn bliver misvisende: Hvis Point også laver et eller andet synligt (udenfor klassens scope), så er det et ulogisk navn.
procedure TTest.SetPoint(value : TPoint); begin fPoint.X := value.X; fPoint.Y := value.Y; // Do something here end;
Hvis andre objekter har adgang til og ændrer et objekts private dele, så kan det kun skyldes, at klassedefinitionerne ligger i samme unit.
Det er en af de få grimme og ulogiske ting som Delphi indeholder.
Ja, det virker bare lidt besynderligt at man skal oprette en hel ny selvstændig klasse for at gøre det! Men hvad! Så længe det virker er det vel acceptabelt! Der kommer dog nogle error message på nogle lidt besynderlige tidspunkter, men det må jeg jo se om jeg kan ændre! Jeg har dog en lille teori om at det kan lade sig gøre på en lidt anden måde, nemlig, via udefinerede pointers, men det bliver nok noget meget "beskidt" kode! Takker for dine fine besvarelser :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.