Newsgroup: it.comp.lang.delphi
Titolo: Proprietà di un oggetto

Ciao a tutti,
nonostante abbia provato e riprovato non riesco a venire alla soluzione di 
un problema abbastanza banale, e cioč settare una proprietą di un oggetto.
Supponendo di avere:
Type TX = Class (TObject)
         Private
           XAzione: Integer;
           XAzione: Integer;
         Public
           Property Azione: Integer Read XAzione Write YAzione;
       End;
Non ho problemi a impostare Azione e far leggere i valori XAzione, YAzione 
all'interno dell'oggetto.
Il problema mi nasce nel momento in cui voglio assegnare ad Azione un valore 
di default e gestire la lettura e scrittura sulla proprietą mediante i 
relativi metodi.
In altre parole, ad esempio:
a) Azione <-- default deve contenere il valore 3;
b) Modifica valore di Azione tramite metodo SetAzione
c) Lettura valore di Azione tramite metodo GetAzione
Qualcuno puņ illustrarmi il codice di esempio cosi da prenderlo come 
riferimento?
Grazie in anticipo,
Cooper.
 

Ciao a tutti,
nonostante abbia provato e riprovato non riesco a venire alla soluzione di
un problema abbastanza banale, e cioč settare una proprietą di un oggetto.
Supponendo di avere:
 Type TX = Class (TObject)
         Private
           XAzione: Integer;
           YAzione: Integer;


 [...]
Prova a dare un'occhiata al codice che segue, l'ho scritto di getto ma 
senza verificarlo.
interface
type
TMyClass = class
private
   FMyValue: Integer;
   procedure SetMyValue(Value: Integer);
public
   constructor Create;
   property MyValue: Integer read FMyValue write SetMyValue;
end;
// ...
implementation
constructor TMyClass.Create;
begin
   inherited Create;
   FMyValue := 3;
end;
procedure TMyClass.SetMyValue(Value: Integer);
begin
   if Value <> FMyValue then
   begin
     FMyValue := Value;
     // Do something...
   end;
end;
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 riferimento?
http://www.google.it/search?hl=it&q=Delphi+property+default&btnG=Cerca+con+Google&meta=


Ringrazio intanto entrambi per la risposta, e... basandomi sull'esempio 
fatto, ho scritto:
  Type TX = Class (TObject)
         Private
             PassMinLen: Byte;
             Function SetPassMinLength: Byte;
         Public
             Constructor Create;
             Property PassMinLength : Byte Read PassMinLen Write 
SetPassMinLength;
       End;
  Constructor TX.Create;
    Begin
      Inherited Create;
      PassMinLen := 3;
    End;
  Function TX.SetPassMinLength: Byte;
    Begin
      If PassMinLen < 3 Then Result := 3;
    End;
Mi viene restituito questo errore:
[Pascal Error] work.dpr(86): E2008 Incompatible types
Ho dato una lettura al significato dell'errore dalla guida... tuttavia pur 
avendone compreso il concetto dell'errore non ho capito perchè si verifica. 
Come dovrei quindi risolvere il problema?
Grazie ancora,
Cooper.

             Function SetPassMinLength: Byte;
...Ahò, ma ci fai o ci sei ? Ma la documentazione la leggi ? gli
esempi li guardi ? il tuo codice, in caso di errore, lo confronti con
quello corretto o no ?
Scusa, ma qui non c'entra più la competenza su Delphi, subentra la tua
intelligenza.  Ma possibile che non ti rendi conto da solo di dove
sbagli ?


Se per te una cosa č ovvia, banale, non implica necessariamente che per 
altri sia altrettanto ovvia, banale.
Se sono qui a chiedere č perchč evidentemente mi sfugge dove sbaglio; se mi 
vuoi rispondere ti pregherei di farlo rimanendo in tema con quanto chiesto, 
altrimenti, se non ti va proprio di rispondere, anzichč alterarti, ti invito 
a non rispondermi lasciando spazio agli altri di farlo con piu cortesia.
Cooper.
PS: Alle tue domande rispondo in modo affermativo; le uniche modifiche che 
ho fatto riguardavano i parametri sul metodo, che negli esempi ci sono e qui 
no e l'index su property che leggendo dal sito di delphibasic mi sembra di 
comprendere sia legato ai parametri della procedura/funzione.
Ma nel mio caso specifico se non ho parametri da passare che ci metto? un 
sassolino? 

sassolino? 
Se stai scrivendo un metodo "setter" è ovvio che hai bisogno di un
parametro, come cacchio lo imposti il valore al field, sennò ?
*LEGGI IL MANUALE*.

 fatto, ho scritto [...]
Nel mio esempio, il metodo usato per l'operazione di scrittura della 
proprietà (write) ha un parametro che tu hai omesso. :-)



Ok, ho scritto in questo modo:
  Type TX = Class (TObject)
         Private
             PassMinLen: Byte;
             Procedure SetPassMinLength (X: Byte);
         Public
             Constructor Create;
             Property PassMinLength : Byte Read PassMinLen Write 
SetPassMinLength;
       End;
  Constructor TX.Create;
    Begin
      Inherited Create;
      PassMinLen := 3;
    End;
  Procedure TX.SetPassMinLength (X: Byte);
    Begin
      If PassMinLen < 3 Then PassMinLen := 3;
    End;
Ho risolto l'errore, mi rimane il fatto che non imposta il nuovo valore, 
ovvero se passo a "PassMinLength" un valore inferiore a 3 deve restituirmi 3 
altrimenti deve restituire il valore passato.
Visualizza soltanto il valore di cui al constructor.
Come risolvo?
Grazie ancora,
Cooper. 


Si, l'avevo omesso perchè nel mio caso ritenevo non fosse necessario ma a 
quanto pare invece è obbligatorio. Ho risolto tuttavia adesso non mi 
effettua la modifica del valore che passo alla proprietà :(
Cooper. 

 End;
Il parametro è necessario poiché è a tale parametro che viene passato il 
valore da utilizzare per impostarlo nella proprietà; nel tuo codice, non 
si fa alcun uso del valore di X: semplicemente, ti limiti ad impostare 
il campo "PassMinLen" da cui viene prelevato il valore per la proprietà 
a 3 se tale campo contiene un valore minore di 3, una condizione che non 
si verificherà mai in quanto il metodo "SetPassMinLength" è responsabile 
dell'assegnazione del valore alla proprietà, ma tale metodo contiene il 
codice che hai scritto e che da nessuna parte effettua l'assegnazione 
del valore alla proprietà, valore che viene passato appunto al parametro 
che hai chiamato "X".
Secondo me, hai troppo spesso l'abitudine di chiedere suggerimenti ed 
escludere dalle spiegazioni teoriche e dagli esempi pratici ciò che, a 
tuo parere, non ritieni necessario pur non avendo compreso il meccanismo 
che le spiegazioni e gli esempi stessi cercano di illustrarti, seguendo 
uno schema logico del tutto personale.
Se c'è qualcosa che non comprendi, chiedi di spiegartelo; se ti vengono 
forniti esempi e tu non li segui o li modifichi non avendo ben chiaro 
quello che fai, non puoi stupirti in seguito degli errori di 
compilazione che ottieni o degli effetti indesiderati, no? ;-)
Ciao,
   Marco.



Hai perfettamente ragione, ero convinto che quel "PassMinLen" venisse 
letto/scritto sulla relativa variabile dichiarata nell'oggetto.
Grazie mille, la tua spiegazione č stata abbastanza esauriente :) Credo di 
aver risolto tutto :)
Cooper. 

 letto/scritto sulla relativa variabile dichiarata nell'oggetto.
Ciò avviene se specifichi il nome del campo privato nella clausola 
*write*; se invece indichi un metodo, allora significa che vuoi 
utilizzare, appunto, un metodo per assegnare il valore al campo, ad 
esempio per poter effettuarci sopra dei controlli di validità, oppure 
per assegnare semplicemente tale valore ma, all'occorrenza, svolgere 
altre operazioni (effetti collaterali).
Per esemplificare, in molti controlli visuali l'assegnazione delle 
proprietà che fanno esplicito riferimento a parametri che influiscono 
sull'aspetto del controllo stesso avvengono attraverso metodi di 
assegnazione (setter) come quello che hai scritto tu; molto spesso, non 
si fa altro che aggiornare il campo privato con il valore passato quando 
questo è diverso dal precedente e, in seguito, si richiama il metodo 
responsabile della segnalazione a Windows che è necessario ridisegnare 
il controllo.
L'esempio che ti ho proposto io ricalcava proprio questo principio.


 ha scritto nel messaggio 
news:4439aa4c$1...@newsgate.x-privat.org...

Chiarissimo, grazie mille ancora :) Era proprio quel fatto che mi ha indotto 
in errore; cmq adesso è tutto chiaro :)
Grazie ancora,
Cooper.