Oppure

Loading
20/04/11 4:01
camaleonteplus
Nel chiedere il Form2 sulla X mi da questo errore:
"Access Violation"
il codice per aprire la Form2 è:
procedure TForm1.Button1Click(Sender: TObject);
Var Form2 : TForm2;
begin
 Form2 := TForm2.Create(TForm2);
 Form2.Show;
 end;

Come posso procedere? -Thanks :idea:
aaa
20/04/11 10:16
lorenzo
il problema secondo me è la variabile locale.
Quando il form2 si apre, la variabile Form2 viene allocata nello spazio di memoria della funzione Click come variabile locale.
Una volta terminata la funzione la variabile viene eliminata con la sua memoria e, quando il form2 viene chiuso, non trova più la memoria correttamente associata e tenta di pulire lo spazio appartenente a qualcun altro. Da qui il messaggio di errore.

Per risolvere o dichiari Form2 come globale(inteso come variabile membro di Form1 che è la classe principale del progetto) oppure la crei come finestra Modale: in quest'ultimo caso Form2 deve essere chiuso PRIMA di uscire dalla funzione click e quindi il problema della memoria non si pone.
aaa
20/04/11 12:44
a_butta
procedure TForm1.Button1Click(Sender: TObject);
Var Form2 : TForm2;
begin
 Form2 := TForm2.Create(Application);
 Form2.Show;
 end;


Il problema non è la variabile locale! Hai creato un'altra form ma allocandola all'interno di se stessa!
aaa
20/04/11 13:01
lorenzo
Postato originariamente da a_butta:

procedure TForm1.Button1Click(Sender: TObject);
Var Form2 : TForm2;
begin
 Form2 := TForm2.Create(Application);
 Form2.Show;
 end;


Il problema non è la variabile locale! Hai creato un'altra form ma allocandola all'interno di se stessa!


eh? che vuol dire?
aaa
20/04/11 13:17
Goblin
Postato originariamente da lorenzo:

Postato originariamente da a_butta:

procedure TForm1.Button1Click(Sender: TObject);
Var Form2 : TForm2;
begin
 Form2 := TForm2.Create(Application);
 Form2.Show;
 end;


Il problema non è la variabile locale! Hai creato un'altra form ma allocandola all'interno di se stessa!


eh? che vuol dire?


Guarda la leggera differenza nel codice che hai postato tu e il codice di a_butta, nel tuo codice metti come owner della classe TForm se stesso, e già questo errore non dovrebbe farti compilare in quanto la procedura create del TForm vuole un Tcomponent come owner e tu gli passi una class reference, invece a_butta mette come owner della della classe TForm l'applicazione stessa, in questo modo si para le chiappe da possibili memory leak nel caso in cui l'applicazione viene chiusa dal main, ma qui andiamo OT.
Riassumendo:
Se vuoi fare il semplice show di una form che hai creato visualmente, se non l'hai tolta dall'autocreate ti basta fare una uses e uno show, altrimenti la devi creare, ma la variabile l'hai gia includendo la form nelle uses.
G
Ibis redibis non morieris in bello
21/04/11 3:23
camaleonteplus
Continua a dare lo steso errore di memoria.
aaa
21/04/11 7:02
lorenzo
ma hai fatto quello che ti ho suggerito?
aaa
21/04/11 7:22
Goblin
Postato originariamente da camaleonteplus:

Continua a dare lo steso errore di memoria.


Qualche informazione aggiuntiva, per esempio cosa fai in form2?

il semplice codice :
var Form2: TForm2;
begin
Form2 := TForm2.Create(Self);
Form2.Show;
end;
non fa altro che aprire un istanza a Form2 e visualizzarla, la distruzione è delegata all Form2, hai qualche riferimento incrociato ?
di più nin so :-|
G.
Ibis redibis non morieris in bello