Oppure

Loading
28/05/11 11:00
rep87
Buongiorno ragazzi...
Vi chiedo aiuto per risolvere un Access Violation che non riesco ad evitare...
Allora, nel mio form8 ho una label con caption "Quante funzioni vuoi disegnare?"
e sotto un'edit per far scrivere il numero desiderato.
Un bottone ha poi questo codice:

procedure TForm8.Button1Click(Sender: TObject);
begin
form8.Close;
RegisterClass(TLabel);
RegisterClass(TEdit);
Application.CreateForm(TForm9, Form9);
form9.Show;
end;


All'apertura del Form9, l'applicazione esegue questo codice:

procedure TForm9.FormCreate(Sender: TObject);
begin
LabelCreateClick(sender);
EditCreateClick(sender);
end;


Le procedure LabelCreatClick e EditCreateClick sono praticamente uguali, perciò ve ne mostro una come esempio:

procedure TForm9.LabelCreateClick(Sender: TOBject);
begin
SetLength(LabelArray, StrToInt(form8.edit2.Text));
  for i:= 0 to High(LabelArray) do
    begin
      LabelArray[i]:= TLabel.Create(Form9);
      LabelArray[i].Parent:= Form9;

      // Parametri di ogni label
      LabelArray[i].Top:= 100+30 * i;
      LabelArray[i].Left:= 10;
      LabelArray[i].Visible:= True;
      LabelArray[i].Caption:='Funzione n. '+inttostr(i+1)+':';
      LabelArray[i].Font.Name:='Comic Sans MS';
      LabelArray[i].Font.Size:=15;
   end;
end;


Quando, attraverso un bottone, vado a disegnare le funzione che l'utente ha inserito nelle varie Edit, il programma esegue questo codice:

procedure tForm10.FormActivate(Sender: TObject);
var  q:integer;
begin
  SetLength(EditArray,strtoint(form8.Edit2.Text));
  for q:=0 to High(EditArray) do
    begin
      Assi();
      DynaParser.Expression := interpreta(TParser.RemoveBlanks(EditArray[i].Text));
      PaintBox1.Canvas.Pen.Color:=random(25);
      disegna();
    end;
end;


Dove la procedure Disegna() è

procedure tForm10.disegna();
  var
    I,x1,y1,x2,y2:Integer;
begin
with PaintBox1.Canvas do
 begin
   tacche:=strtoint(form10.Edit1.Text);
   Unita:=PaintBox1.Height/(2*tacche);
   for I:= -(PaintBox1.Width div 2) to (PaintBox1.Width div 2 - 1) do
    begin
     try
     DynaParser.Variable['x'] := i/unita;
     x1:= i +PaintBox1.Width div 2;
     y1:=round(PaintBox1.Height/2 - DynaParser.Value * unita);
     DynaParser.Variable['x'] := (i+1)/unita;
     x2:= x1 +1;
     y2:= round(PaintBox1.Height/2 - DynaParser.Value * unita);
    segmento(x1,y1,x2,y2);
     except
      Continue;
     end;
   end;
 end;
end;


Il problema nasce quando, dopo aver scritto le funzioni, si dà il via al disegno...
Il programma restituisce infatti un numero di Access Violation pari al numero di funzioni disegnate...
Come risolvere questo problema?!

Aiuto...pleaseeee!! :-o..:(!
aaa
28/05/11 17:34
Goblin
hai provato con il debug a vedere la linea dove accade l'AV ? la classe DynaParser e la procedura segmento non sono documentate... può essere una di queste due, nel resto del sorgente che hai postato non mi sembra di vedere chiamate che possono portare ad AV.

Un altra possibilità potrebbe essere la riga:
DynaParser.Expression := interpreta(TParser.RemoveBlanks(EditArray[i].Text));
in quanto chiami editarray[i], ma "i" non esiste .... magari se scrivi "q", che è la variabile che hai usato per il ciclo for.

G.
Ibis redibis non morieris in bello
30/05/11 10:26
Goblin
Dal codice che hai postato vedo solo un PaintBox1.Canvas.Pen.Color:=random(25);
nessun altro comando che possa disegnare, a meno che il tutto non sia rinchiuso nella procedure segmento.
procedi con debug passo passo della procedura disegna e poi dentro la procedura segmento per vedere i valori e se veramente li disegna, se non vuoi farti il debug passo passo scrivi i valori in una stringlist e alla fine salva il contenuto su file, lo rileggi e controlli se i dati sono giusti.
G.
Ibis redibis non morieris in bello