Newsgroup: it.comp.lang.pascal
Titolo: Rudimenti di object pascal

Allora, io ho questo codice:
#------------ File hello.pas -----------#
unit Hello;
{$mode objfpc}{$h+}
interface
uses
  Classes;
type THello = class
  public
    constructor Create;
    procedure Hello;
    destructor Destroy;
end;
implementation
  procedure THello.Hello;
  begin
    writeln('Hello World');
  end;
 
constructor THello.Create;
begin
  inherited Create;
end;
destructor THello.Destroy;
begin
  inherited Destroy;
end;
end.
#------------ File hello.pas -----------#
#----------- File objuser.pas ----------#
program objUser;
{$mode objfpc}{$h+}
uses
  Hello;
var
  h: THello;
begin
  h.Create;
  h.Hello;
  h.Destroy;
end.
#----------- File objuser.pas ----------#
E` ovvio che l'applicativo non e` altro che un modo un esempio di creazione
degli oggetti in Object Pascal (nella fattispecie, l'Object Pascal
implementato in FreePascal) e che il codice mostrato qui sopra compila alla
perfezione (eccetto un warning relativo alla dichiarazione del distruttore
della classe Hello, cosa che si risolve aggiungendovi un override alla fine
della riga). Il problema, pero`, nasce durante l'esecuzione di tale codice,
in quanto viene si mostrato il messaggio "Hello World", ma viene anche
sollevata un'eccezione in prossimita` della h.Destroy. Da cosa puo`
dipendere cio`?
Henryx

 Da cosa puo` dipendere cio`?
Di preciso non lo so ho provato a rifare il tuo programma { in Delphi 
pero' } è funziona alla grande. Una piccola nota, ovviamente i metodi 
Create e Destroy non vanno per forza ridefiniti. Io ti consiglerei di 
provare ad usare Free al posto di destroy e di usare override.
-- 
Il Razziatore,
The Only Good Windows is an uninstalled Windows
-----------------------------------------------
MSN   : 
IlRazz...@netscape.net
ICQ   : 67552596
Yhaoo : Razziatore82
-----------------------------------------------
Founder of MediaPlayer Project
http://mpp.iwebland.com

 dipendere cio`?
E' un'errore tipico.
I costruttore va chiamato in questo modo
h := THello.Create;
appena dichiarata la variabile h è solo un puntatore non inizializzato 
ad un'istanza di un oggetto THello, e non già un'istanza dell'oggetto in 
sè. Quando dichiari una variabile h: THello allochi solamente un 
puntatore ad un'oggetto, non l'intero oggetto. L'istanza dell'oggetto 
viene allocata ed inizializzata da una chiamata del costruttore, che va 
chiamato dalla classe THello. THello.Create alloca un puntatore ad 
un'istanza inizializzata dell'oggetto. Quindi in  genere i costruttori 
vanno chiamati in questo modo:
VariabileIstanza := TTipoClasse.NomeCostruttore;
Tu hai chiamato il costruttore dall'istanza h non assegnata, quando fai 
il destroy ovviamente ricevi un eccezione, non c'è nulla da distruggere.
Se conosci l'inglese leggiti questo capitolo sul modello ad oggetti di 
delphi (valido pari pari anche per Free Pascal).che è molto istruttivo:
http://www.oreilly.com/catalog/delphi/chapter/ch02.html
Ciao, Dean

 il destroy ovviamente ricevi un eccezione, non c'è nulla da distruggere.
dimenticavo, giusta anche la precedente osservazione:
per liberare l'oggetto va utilizzato il metodo Free non Destroy
Ciao, Dean

 il destroy ovviamente ricevi un eccezione, non c'č nulla da distruggere.
Pero` cosi` mi sorge un dubbio: perche` mi stampa "Hello World"?
Henryx

 Pero` cosi` mi sorge un dubbio: perche` mi stampa "Hello World"?
perche' il metodo non va a cercare nessun campo dell'istanza non 
inizializzata, che darebbe errore.  In Java ci sono i metodi static di 
classe - in oop non so' in effetti.  Pero' e' un po' come se chiamassi 
THello.Hello direi :)

 THello.Hello direi :)
Non precisamente :) I metodi statici sono privi del riferimento Self 
come parametro implicito. Anche il delphi esistono si dichiarano 
anteponendo un "class" alla dichiarazione:
TMyClass = class
    class procedure DoSomeOperation;
end;
