Avatar billede zerohero Nybegynder
19. januar 2004 - 15:42 Der 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!
Avatar billede hrc Mester
19. januar 2004 - 18:23 #1
type
  TTest = class
  private
    fPoint : TPoint;
  public
    property Point : TPoint read fPoint write fPoint;
  end;

var
  Test : TTest;
  p : TPoint;
begin
  p.X := 300;
  p.Y := 100;

  Test := TTest.Create;
  try
    Test.Point.X := 5;
    Test.Point.Y := 200;
 
    // Use test here ...

    Test.Point := p;
  finally
    Test.Free;
  end; // try
end.

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.
Avatar billede hrc Mester
19. januar 2004 - 18:30 #2
unit USameFile;

interface

type
  TTest1 = class
  private
    fPoint : TPoint;
  public
    property Point : TPoint read fPoint write fPoint;
  end;

  TTest2 = class
  private
    fEndnuEnPointer : TTest1;
  public
    constructor Create;
    destructor Destroy; override;
    procedure ModifyTest1(value : TPoint);
  end;

implementation

{ Test2 }

constructor TTest2.Create;
begin
  fEndnuEnPointer := Test1.Create;
end;

destructor Test2.Destroy;
begin
  try
    fEndnuEnPointer.Free;
  finally
    inherited;
  end; // try
end;

procedure Test2.ModifyTest1(value : TPoint);
begin

  (* Her starter det grimme!!! *)
  (* Kun muligt fordi de er defineret i samme unit-fil *)

  fEndnuEnPointer.fPoint.X := value.X;
end;

end.
Avatar billede hrc Mester
25. januar 2004 - 00:52 #3
Har det hjulpet???
Avatar billede zerohero Nybegynder
25. januar 2004 - 18:17 #4
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 :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester