Avatar billede js_delphi Nybegynder
30. juli 2010 - 07:53 Der er 8 kommentarer og
2 løsninger

Korrekt maade at saette Property internt in en klasse?

Hej,

Jeg har et generelt spoergsmaal angaaende Properties og Klasser.
Foelgende klasse (Form) som eksempel:

unit UnitTest;

interface

uses
  ...;

type
  TfrmTest = class(TForm)
    cbSource1: TComboBox;
    procedure cbSource1Change(Sender: TObject);
  private
    FSourceIndex: Integer;
    function GetSourceIndex: Integer;
    procedure SetSourceIndex(Value: Integer);
  public
    property SourceIndex: Integer read GetSourceIndex write SetSourceIndex;
  end;

var
  frmTest: TfrmTest;

implementation

function TfrmTest.GetSourceIndex: Integer;
begin
  Result := FSourceIndex;
end;

procedure TfrmTest.SetSourceIndex(Value: Integer);
begin
  FSourceIndex := Value;
  cbSource1.ItemIndex := Value;
end;

procedure TfrmTest.cbSource1Change(Sender: TObject);
begin
  //Hvad skal saettes her? FSourceIndex eller SourceIndex?
end;


Spoergsmaalet er, om man internt i en klasse skal saette de private variabler direkte, eller om man skal saette dem via Property?

Tak for evt. hjaelp paa forhaand!
Avatar billede mbsnet Nybegynder
30. juli 2010 - 08:16 #1
Du kan gøre begge dele.
Hvis din "write" rutine er en procedure kan du springe over rutinen ved at definere den primære variabel direkte...
Avatar billede js_delphi Nybegynder
30. juli 2010 - 08:37 #2
Jeg er klar over, at begge dele er mulige, men hvad anses for mest korrekt?

I foelgende tilfaelde saettes jo cbSource1.ItemIndex igen, naar SetSourceIndex kaldes via SourceIndex:

procedure TfrmTest.cbSource1Change(Sender: TObject);
begin
  SourceIndex := cbSource1.ItemIndex;
end;
Avatar billede mbsnet Nybegynder
30. juli 2010 - 09:24 #3
Brug altid den primære variabel hvis muligt... (internt i objektet.)

Property er blot reference til læsning/skrivning, og kan dermed validerere eksterne input, men også input fra objektet selv, hvis du kalder property'en.

Dermed kan property bruges så man er sikker på input bliver behandlet på en bestemt måde, før det gemmes i den egentlige variabel.

Så hvis du ønsker at køre din rutine så brug property'en,- eller hvis du vil "gennemtvinge" en bestemt værdi (uden om property'ens rutiner) så brug den oprindelige variabel...

Normalt angives de egentlige variabler under private/protected, og så kan man jo KUN se property'en udefra, og man er dermed sikke på alle input valideres af objektet...
Avatar billede js_delphi Nybegynder
30. juli 2010 - 12:11 #4
OK, tak i foerste omgang.
Jeg vil gerne hoere fra andre ogsaa, hvilken metode de bruger.
Avatar billede hrc Mester
30. juli 2010 - 12:40 #5
Bruger altid variablen - i alt fald i klassen selv.

Eks: property value: integer read fValue write SetValue

I SetValue sættes et flag om variablen er blevet ændret, så nogle gange vil man sætte dette flag, andre gange ikke (ved initialisering)

Jeg bruger aldrig (der er en enkelt undtagelse) propertien Value, men angiver eksplicit SetValue() eller fValue så man aldrig kommer i tvivl om hvad der sker

Så, tommelfingerreglen må være at tilgå variablen direkte.

Det ene sted hvor jeg bruger property'en internt er i mine famøse nedarvinger af TObjectList - og det sker af ren bekvemmelighed:

type
  TMyList = class(TObjectList)
  public
    property Items[const aIndex: integer]: TMyData read GetItems; default;
    procedure WriteData;
  end;

..

function TMyList.GetItems(const aIndex: integer): TMyData;
begin
  result := inherited Items[aIndex] as TMyData;
end;

procedure TMyList.WriteData;
var
  i: integer;
begin
  for i := 0 to Count - 1 do
    Items[i].WriteData; // TMyData indeh. også en WriteData
end;

Alternativet er at gøre det således:

procedure TMyList.WriteData;
var
  i: integer;
begin
  for i := 0 to Count - 1 do
    with inherited Items[i] as TMyData do
      WriteData;
end;

.. og det synes jeg er spild
Avatar billede mbsnet Nybegynder
30. juli 2010 - 12:48 #6
ja, det handler om at se formålet med "property" som er en smart ting i forbindelse med objekter. Også derfor man har en liste over dem i Object Inspector, hvis de angives under published. Brug property når input skal kontrolleres...
Avatar billede js_delphi Nybegynder
02. august 2010 - 11:14 #7
Tak for jeres synspunkter, laeg svar begge to :)
Avatar billede mbsnet Nybegynder
02. august 2010 - 12:21 #8
ok
Avatar billede hrc Mester
02. august 2010 - 13:21 #9
ok, ditto
Avatar billede js_delphi Nybegynder
03. august 2010 - 13:39 #10
Hvordan sorterer I i oevrigt funktioner og procedurer i en unit?
Alfabetisk, eller hvordan?
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