Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Delphi] TImage.Create genera un'eccezione

    Che cosa c'è di sbagliato in questo codice?
    codice:
    type
      Stati = (sBianco, sNero);  
    
      TElemento = class
        Immagine: TImage;
        Stato: Stati;
        procedure OnImageClick(Sender: TObject);
      end;
    
    const
      Max = 3;
     
    var
      Form1: TForm1;
      Elementi: array [1..Max,1..Max] of TElemento;
    
    implementation
    
    {$R *.dfm}
    
    procedure TElemento.OnImageClick(Sender: TObject);
    begin
     showmessage('');
    end;
    
    procedure DrawTheState(Elm: TElemento);
    begin
      //Elm.Immagine.Canvas.Brush.Color := Col;
      Elm.Immagine.Canvas.Ellipse(0,0,29,29);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      J: Integer;
    begin
    for J := 1 to MAX do
      for I := 1 to MAX do
      begin
        Elementi[I,J].Immagine:= TImage.Create(Self);  // ***QUI C'E' L'ERRORE***
        Elementi[I,J].Immagine.Parent := Self;
        Elementi[I,J].Immagine.Width := 30;
        Elementi[I,J].Immagine.Height := 30;
        Elementi[I,J].Immagine.Left := I*32+100;
        Elementi[I,J].Immagine.Top := J*32+100;
        Elementi[I,J].Immagine.OnClick := Elementi[I,J].OnImageClick;
        Elementi[I,J].Stato := sBianco;
        DrawTheState(Elementi[I,J]);   
      end;
    
    end;
    
    end.
    Come mai viene lanciata un'eccezione da TImage.Create alla riga segnalata? Che ho sbagliato?
    Il programma dovrebbe creare e mostrare a schermo 9 TElemento e mostrare a schermo, in posizioni 3x3, la relativa immagine.
    Aiutatemi per favore... non capisco...

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Qual è l'eccezione?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    EAccessViolation

    pare un errore generale tipo se accedo ad una variabile il cui valore è nil... però nel mio caso non ci sono... boh

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Il problema non è nella chiamata al metodo Create di TImage, ma nell'uso del campo Immagine del tuo tipo di dato TElemento.

    Essendo TElemento di tipo class, quindi è una classe, il tuo vettore Elementi può contenere una matrice di riferimenti ad oggetti di questo tipo...ma hai dimenticato di crearli.

    Se non crei un'istanza di TElemento e non ne assegni un riferimento al singolo elemento del tuo array bidimensionale, non potrai accedere al campo Immagine, e qualsiasi tentativo si traduce in una Access Violation in quanto gli elementi della matrice hanno valore nil.

    Per semplificare ed evitare di dover creare istanze per ciascun elemento, sarebbe sufficiente trasformare TElemento in un record piuttosto che adoperare una classe (i record sono allocati sullo stack nel momento in cui le variabili di questo tipo devono essere utilizzati).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.