Newsgroup: it.comp.lang.delphi
Titolo: Classi:Aiuto!

Da principiante ho provato a fare una classe ma all'atto della compilazione
mi dice che non trova il Form!
Se provo a chiudere tutto e a ricaricare il progetto o la Unit in effetti
manca il form1!
Forse dichiaro la classe dove non dovrei?
A dire la verità la prima cosa che fa quando provo a compilare è il
messaggio "Undeclared identifier: Label1", ma proprio perché non esiste
neanche il Form. Se infatti tolgo la Label1 allora mi dice che manca il
form: quindi l'origine del problema è proprio il Form.
Stefano
(Vi allego qui sotto il codice dell'unica Unit del programma. Avrebbe
dovuto, nelle mie intenzioni, restituire il valore della temperatura nella
Label1. In seguito, se avesse funzionato, avrei provato a sviluppare la
classe con metodi che convertivano la temperatura in diverse scale, così,
tanto per fare un po' di pratica sulle classi)
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
type
  TForm1 = class(TForm)
    Label1: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
type
  Temperatura = class
private
  Temp : Integer;
public
  constructor CreateVal(Valore:Integer);
  procedure SetTemperatura(Valore:Integer);
  function GetTemp:Integer;
end;
constructor Temperatura.CreateVal(Valore:Integer);
begin
  inherited Create;
end;
procedure Temperatura.SetTemperatura(Valore:Integer);
  begin
    if Valore >= -273 then
    Temp := Valore;
  end;
function Temperatura.GetTemp:Integer;
  begin
    Result := Temp;
  end;
var
  Misura1 :Temperatura;
begin
  Misura1 := Temperatura.Create;
  Misura1.SetTemperatura(54);
  Misura1.GetTemp;
  Label1.Caption := IntToStr(Misura1.GetTemp);
end;
end.

form: quindi l'origine del problema è proprio il Form.
Label1 è un membro di TForm, devi fare
Form1.Label1.Caption := 'qualcosa';
se fai solo Label1 nello scope della classe Temperatura si intende
Temperatura.Label1 ... che appunto non esiste...
visto che ci sono, alcue cosette:
- io preferirei fare la classe in un unit separata (non assieme alla
form) solo per una questione di ordine
- metterei la definizione della classe nell'interface e
l'implementazione nell'implementation
- non accederei alla proprietà label in quel modo, ma lo lascerei fare
all'esterno, non all'interno di un metodo della classe temperatura
- alle classi va preceduto la T -> TTemperatura (è una convenzione)
e alle variabili private/protette una F -> FTemp
- meglio usare proprietà con getters e setters, come giustamente hai
fatto, pero' non usarli in modo diretto come hai fatto tu, così:
type
 TTemperatura = class
  private
   FTemp : Integer;
   procedure SetTemperatura(Valore:Integer);
   function GetTemp:Integer;
  public
   constructor CreateVal(Valore:Integer);
   property Temperatura: integer read GetTemp write SetTemp;
 end;
e poi Fai
Variabile := OggettoTemperatura.Temperatura; // che richiama gettemp
sicuro di averti rotto le palle, ;-)))
ti porgo ditinti saluti... sto scherzando
Ciao! ;-)
Alan Solo

 ti porgo ditinti saluti... sto scherzando
AVERMI ROTTO LE PALLE????  :-[]
Magari avessi sempre tutti questi consigli !!
Mi risparmierei ore e ore (anzi, diciamo pure giorni....) di colossali dubbi
e incertezze!
Faceendo tutto da soli, lo sappiamo, richiede molto più tempo che avendo
qualcuno esperto pronto a spiegarti quello che non va.
Semmai spero di non romperle io le palle  :-|
Ciao
Stefano