Newsgroup: it.comp.lang.delphi
Titolo: problemino con le classi

Salve a tutti,
ho un problema, forse banale, con la gestione di un metodo di una classe da
me creata... in pratica quando "riempo" una variabile mi viene fuori un bel
access violation e ovviamente il codice non viene completato nelle sue
funzioni...
posto il codice con il quale stavo provando a capire:
"
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  prova = class
    testo: string;
    numero: integer;
    procedure msg;
    function somma(a:integer;b:integer):integer;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure prova.msg;
begin
  showmessage ('messaggio');
end;
function prova.somma(a:integer;b:integer):integer;
begin
  somma:=a+b;
end;
procedure TForm1.Button1Click(Sender: TObject);
var bho:array [1..20] of prova;
begin
  bho[3].msg;                                            //questo è ok!
  bho[1].testo:='ciao';                                //questo mi da
l'access violation (indirizzo 00000008)
  showmessage(bho[1].testo);
end;
end.
"
non capisco perchè non posso farlo... mi potete aiutare?
Grazie mille
a presto.


Ti converrebbe, se rispetti Delphi, che, prima di usarli, creassi tutti gli
oggetti. E dato che li userai solo dentro quella procedura, per gli stessi
sacri motivi di prima, li distruggessi alla fine. :-)
For A:= 1 to 20 do Bho[A]:= Prova.Create;
...
For A:= 1 to 20 do Bho[a].free;
La prima istruzione, quella che non ti dà errore, lo fa solo perché fino ad
ora non hai usato variabili interne all'oggetto. Prova a metterci, invece di
"'messaggio'", la variabile "Testo", e guarda come ti si ferma anche in
quella.
Ciao

in delphi non esistono i costruttori impliciti come mi pare in java. Ovvero,
se dihciari:
var
  p: TQualocosa;
non basta.
 devi anhce:
p := TQualcosa.Create;
try
  p.FaiQuesto;
finally
  p.free;
end;
end;
--
Per rispondere non usare il reply ma scrivere al seguente indirizzo:
alsalvati(at)
supereva.it

Grazie mille a tutti e due,
ora (ovviamente) funziona benone :)
Credo che metterò un for alla creazione del form (prova.create) e uno in
chiusura del prog stesso (bho[a].free) e renderò la variabile globale (visto
che dovrò manipolare i dati in varie parti).
Saluti :)

...

E' contro i principi della programmazione OO fare delle variabili
globali, già che ci sei fatti delle proprietà e metodi tipo GetElem o
SetElem e' piu' pulito
Massimo

 SetElem e' piu' pulito
"Sogno un poco ignoranto" in tal senso... diciamo pure che non ne conosco
l'esistenza di GetElem e SetElem... mi puoi spiegare come si usano?
Grazie mille

 Grazie mille
Allora: se tu fai una classe, prova a scrivere sotto public o
published
property <NomeProprieta>: <tipo>; (es property miapro: string;)
poi premi CTRL+ALT+C e.... sorpresa delphi crea per te le impostazioni
In generale devi tenere "nascosto" la variabile che deve essere
accesibile solo tramite proprietą
se vuoi che sia a sola lettura puoi togliere la parte di scrittura....
Massimo