Oprettet fre. d. 30. juli 2010 kl. 07:53:45

js_delphi
js_delphi (11.661 point. Point ude: 120)

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!

Skrevet fre. d. 30. juli 2010 kl. 08:16:53| #1

mbsnet
mbsnet (13.783 point)
www.mortenbs.com/
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...

Skrevet fre. d. 30. juli 2010 kl. 08:37:34| #2

js_delphi
js_delphi (11.661 point)
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;

Skrevet fre. d. 30. juli 2010 kl. 09:24:10| #3

mbsnet
mbsnet (13.783 point)
www.mortenbs.com/
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...

Skrevet fre. d. 30. juli 2010 kl. 12:11:56| #4

js_delphi
js_delphi (11.661 point)
OK, tak i foerste omgang.
Jeg vil gerne hoere fra andre ogsaa, hvilken metode de bruger.

Skrevet fre. d. 30. juli 2010 kl. 12:40:43| #5

hrc
hrc (32.737 point)
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

Skrevet fre. d. 30. juli 2010 kl. 12:48:48| #6

mbsnet
mbsnet (13.783 point)
www.mortenbs.com/
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...

Skrevet man. d. 02. august 2010 kl. 11:14:11| #7

js_delphi
js_delphi (11.661 point)
Tak for jeres synspunkter, laeg svar begge to :)

Skrevet man. d. 02. august 2010 kl. 12:21:42| #8


Skrevet man. d. 02. august 2010 kl. 13:21:24| #9

hrc
hrc (32.737 point)
ok, ditto

Skrevet tir. d. 03. august 2010 kl. 13:39:26| #10

js_delphi
js_delphi (11.661 point)
Hvordan sorterer I i oevrigt funktioner og procedurer i en unit?
Alfabetisk, eller hvordan?

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Irriterende timeout i Delphi 7 på en win7 64 bits platform

Oprettet den 2. februar 2012 kl. 12.17
nca giver 60 point for svar | Giv et svar »

Manglende danske tegn

Oprettet den 24. januar 2012 kl. 16.12
hugopedersen giver 60 point for svar | Giv et svar »

Sikre mig at form er færdigoprettet

Oprettet den 24. januar 2012 kl. 10.01
hugopedersen giver 100 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger