Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - Access Violation
Forum - Delphi - Access Violation

Avatar
rep87 (Normal User)
Newbie


Messaggi: 17
Iscritto: 27/12/2010

Segnala al moderatore
Postato alle 13:00
Sabato, 28/05/2011
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:

Codice sorgente - presumibilmente Delphi

  1. procedure TForm8.Button1Click(Sender: TObject);
  2. begin
  3. form8.Close;
  4. RegisterClass(TLabel);
  5. RegisterClass(TEdit);
  6. Application.CreateForm(TForm9, Form9);
  7. form9.Show;
  8. end;



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

Codice sorgente - presumibilmente Delphi

  1. procedure TForm9.FormCreate(Sender: TObject);
  2. begin
  3. LabelCreateClick(sender);
  4. EditCreateClick(sender);
  5. end;



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

Codice sorgente - presumibilmente Delphi

  1. procedure TForm9.LabelCreateClick(Sender: TOBject);
  2. begin
  3. SetLength(LabelArray, StrToInt(form8.edit2.Text));
  4.   for i:= 0 to High(LabelArray) do
  5.     begin
  6.       LabelArray[i]:= TLabel.Create(Form9);
  7.       LabelArray[i].Parent:= Form9;
  8.  
  9.       // Parametri di ogni label
  10.       LabelArray[i].Top:= 100+30 * i;
  11.       LabelArray[i].Left:= 10;
  12.       LabelArray[i].Visible:= True;
  13.       LabelArray[i].Caption:='Funzione n. '+inttostr(i+1)+':';
  14.       LabelArray[i].Font.Name:='Comic Sans MS';
  15.       LabelArray[i].Font.Size:=15;
  16.    end;
  17. end;



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

Codice sorgente - presumibilmente Delphi

  1. procedure tForm10.FormActivate(Sender: TObject);
  2. var  q:integer;
  3. begin
  4.   SetLength(EditArray,strtoint(form8.Edit2.Text));
  5.   for q:=0 to High(EditArray) do
  6.     begin
  7.       Assi();
  8.       DynaParser.Expression := interpreta(TParser.RemoveBlanks(EditArray[i].Text));
  9.       PaintBox1.Canvas.Pen.Color:=random(25);
  10.       disegna();
  11.     end;
  12. end;



Dove la procedure Disegna() è

Codice sorgente - presumibilmente Delphi

  1. procedure tForm10.disegna();
  2.   var
  3.     I,x1,y1,x2,y2:Integer;
  4. begin
  5. with PaintBox1.Canvas do
  6.  begin
  7.    tacche:=strtoint(form10.Edit1.Text);
  8.    Unita:=PaintBox1.Height/(2*tacche);
  9.    for I:= -(PaintBox1.Width div 2) to (PaintBox1.Width div 2 - 1) do
  10.     begin
  11.      try
  12.      DynaParser.Variable['x'] := i/unita;
  13.      x1:= i +PaintBox1.Width div 2;
  14.      y1:=round(PaintBox1.Height/2 - DynaParser.Value * unita);
  15.      DynaParser.Variable['x'] := (i+1)/unita;
  16.      x2:= x1 +1;
  17.      y2:= round(PaintBox1.Height/2 - DynaParser.Value * unita);
  18.     segmento(x1,y1,x2,y2);
  19.      except
  20.       Continue;
  21.      end;
  22.    end;
  23.  end;
  24. 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..:(!

PM
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 19:34
Sabato, 28/05/2011
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.Text));
in quanto chiami editarray, ma "i" non esiste .... magari se scrivi "q", che è la variabile che hai usato per il ciclo for.

G.

Inutile dirti l'incazzatura nello scoprire che un problema così rognoso per me fosse in realtà una grande stupidata...comunque, con q il problema è risolto, peccato però non disegni niente...perchè? Grazie! - rep87 - 28/05/11 23:22


Ibis redibis non morieris in bello
PM
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 12:26
Lunedì, 30/05/2011
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
PM