Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: panfra - Aprile 23, 2021, 10:17:38 am

Titolo: creare un oggetto
Inserito da: panfra - Aprile 23, 2021, 10:17:38 am
ho una classe es linea e la voglio utilizzare...come posso creare un oggetto? Capisco che la domanda è stupida, ma ho cercato nel forum e fuori e non ho le idee chiare... grazie. :D
Titolo: Re:creare un oggetto
Inserito da: nomorelogic - Aprile 23, 2021, 10:45:38 am
dal menù File->Nuovo crei una nuova unit

ti metti sotto interface e scrivi:
Codice: [Seleziona]
type
  TLinea = class(TObject)
  end;

classe vuota che eredita da TObject creata :)
Titolo: Re:creare un oggetto
Inserito da: panfra - Aprile 24, 2021, 08:27:23 am
No la classe l'ho fatta, vorrei sapere come dichiarol'oggetto.. :o
Grazie.
Titolo: Re:creare un oggetto
Inserito da: DragoRosso - Aprile 24, 2021, 09:16:59 am
L'oggetto viene creato con un costruttore, cioè un metodo che alloca le risorse, inizializza i dati , ......

Tutte le classi hanno un costruttore automatico derivato da TObject, molte hanno un costruttore porprietario (in overload o override rispetto a TObject).

Un classe definita, si dichiara come varibile e la si istanzia:

Codice: [Seleziona]
//Definizione
type
  TLinea = class(TObject)
  end;

//Dichiarazione
var
   Linea: TLinea;

// Creazione istanza deve essere eseguita 1 sola volta tuo codice, normalmente nel FormCreate (ma non obbligatorio ovviamente farlo li)

Linea := TLinea.Create;

//Ora la puoi usare

Quando si crea un "qualcosa" ci dovrebbe essere una buona abitudine di distruggerlo alla fine dell'uso (che potrebbe essere alla fine della procedura, alla fine del programma, o in altre condizioni.

Normalmente un oggetto si "distrugge" con il metodo FREE, attenzione che questo dovrebbe essere fatto se
l'oggetto è già stato creato:

Codice: [Seleziona]
//Controlla che la variabile sia stata istanziata
if Assigned(Linea)
  Linea.Free;                 //Distrugge l'istanza liberando le risorse

I costruttori degli oggetti possono essere anche personalizzati così come i distruttori.
Si fà così ad esempio:

Codice: [Seleziona]
type
   TLinea: Class
       private
           fParent: TComponent;
           fLunghezza: cardinal;
       public
          constructor Create(AOwner: TComponent);  overload  //Esempio  di costruttore
          destructor Destroy; override;  //Esempio di distruttore

Var
   Linea: TLinea

Implementation

constructor TLinea.Create(AOwner: TComponent);
begin
  //Chiama il metodo originale per la creazione (deve essere la prima riga)
  inherited Create;

  //Mantiene in memoria il componente padre
  fParent := AOwner;
  //Inizializza i dati
  fLunghezza := 0;
end;

destructor TLinea.Destroy;
begin
  //QUi il codice eventuale

  ....................
  ....................

  //Chiama la procedura originale (deve essere l'ultima riga)
  inherited;
end;

//Uso:

Linea := TLinea.Create(self);

//oppure

Linea := TLinea.Create(nil);


*****EDIT

Anche se si dichiara un metodo di "distruzione",  il componente si disistanzia normalmente sempre con il FREE sopra citato (il metodo FREE poi chiamerà automaticamente il distruttore).