Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118

    [DELPHI]Difficoltà a lavorare con gli oggetti

    Vi mostro questo sorgente di Unit in cui come esempio ho creato un programma con una casella di testa.Cliccando sulla finestra, il testo dalla casella di testo dovrebbe essere trasferito all'interno di una variabile stringa contenuta in una classe da me creata.
    Questa operazione però porta ad un errore dei indirizzamento della memoria da parte del compilatore: a quanto pare, è come se l'oggetto non fosse in grado di indirizzare la variabile contenuta all'interno di esso.


    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

    type
    TForm1 = class(TForm)
    Casella: TEdit;
    procedure Form1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    type
    nuovaclasse = class
    public
    stringa: string;
    procedure Smod(str: string);
    end;

    var
    Form1: TForm1;
    obj: nuovaclasse;

    implementation

    {$R *.dfm}

    procedure nuovaclasse.Smod(str: string);

    begin
    self.stringa:= str;

    end;

    procedure TForm1.Form1Click(Sender: TObject);

    begin
    obj.stringa:= Casella.Text; //Questa istruzione causa un errore di indirizzamento

    obj.Smod(Casella.Text); //Anche quest'altra causa un simile errore

    end;



    end.

  2. #2
    Ti da errore, perchè stai utilizzando una classe senza averla creata, che quindi NON punta a nessun indirizzo della memoria.

    Per risolvere, ricordati di inserire PRIMA di utilizzare qualsiasi classe il metodo Create.

    Nel tuo caso, prima di fare
    codice:
    obj.stringa:= Casella.Text; //Questa istruzione causa un errore di indirizzamento
    devi inserire:
    codice:
    obj := nuovaclasse.Create;
    obj.stringa:= Casella.Text; //Questa istruzione causa non causa più un errore di indirizzamento

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Originariamente inviato da gygabyte017
    Ti da errore, perchè stai utilizzando una classe senza averla creata, che quindi NON punta a nessun indirizzo della memoria.

    Per risolvere, ricordati di inserire PRIMA di utilizzare qualsiasi classe il metodo Create.

    Nel tuo caso, prima di fare
    codice:
    obj.stringa:= Casella.Text; //Questa istruzione causa un errore di indirizzamento
    devi inserire:
    codice:
    obj := nuovaclasse.Create;
    obj.stringa:= Casella.Text; //Questa istruzione causa non causa più un errore di indirizzamento
    Quindi le classi hanno bisogno di essere inizializzate. Ti ringrazio.

    Chi ha detto che l'oject pascal è un liguaggio semplice?

    Pur sempre meraviglioso nella sua complessità. Fino a ieri imprecavo contro David Intersimone.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Object Pascal è senz'altro uno dei più semplici ed eleganti, il problema è - come per tutti gli altri linguaggi - saperlo utilizzare, in quanto la "creazione di oggetti", cioè di istanze di una determinata classe, è un'operazione che si compie in qualsiasi linguaggio che supporti la programmazione orientata agli oggetti, così come avviene nel linguaggio Delphi (se usi Delphi, questo è il nome del linguaggio, non più Object Pascal).

    Aggiungo una "postilla" a quanto ti è stato già detto: oltre a dover creare istanze di classi, quindi oggetti materiali su cui lavorare, è tua cura e responsabilità procedere alla loro "distruzione" quando non ti servono più, per non generare memory leak cioè memoria allocata che non è più possibile recuperare.

    Nel tuo caso, quindi, a seconda dell'ambito di utilizzo dell'oggetto a cui fai riferimento, ci deve essere da qualche parte una chiamata a
    codice:
    MyObject.Free;
    per rilasciare la memoria allocata per l'oggetto quando questa non serve più.

    Negli ambiti in cui l'uso di un oggetto è limitato ad una routine specifica, ad esempio, si utilizza preferibilmente anche il costrutto try...finally per garantire che questa distruzione avvenga anche in caso di errore; ad esempio, si usa questa tecnica nella visualizzazione di form modali dopo averli creati:
    codice:
    // Creo un'istanza del form
    MyForm := TMyForm.Create(nil);
    try
      // Visualizzo il form e attendo la chiusura
      MyForm.ShowModal;
    finally
      // Distruggo l'istanza del form
      MyForm.Free;
    end;
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Grazie Alka, ma mi hai sollevato un dubbio.
    Gli oggetti creati in Delphi, vengono allogati nello Stack o nell'Heap?

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da cshark
    Gli oggetti creati in Delphi, vengono allogati nello Stack o nell'Heap?
    Gli oggetti vengono allocati nell'heap.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Originariamente inviato da alka
    Gli oggetti vengono allocati nell'heap.
    Io forse ho fatto troppe analogie con il classico C++ in cui gli oggetti al momemento della dichiarazione sono già inizializzati. A proposito di heap .Ho scoperto che l'editor di Delphi riconosce gli operatori new e delete . Forse mi sbaglio, ma se fosse vero...complimenti a David I!

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da cshark
    Io forse ho fatto troppe analogie con il classico C++ in cui gli oggetti al momemento della dichiarazione sono già inizializzati.
    Da quanto mi risulta, gli oggetti vanno creati anche in C++.

    Originariamente inviato da cshark
    Ho scoperto che l'editor di Delphi riconosce gli operatori new e delete.
    Non sono operatori, ma procedure statiche, retaggio del Turbo Pascal su cui il linguaggio Delphi poggia le proprie basi.

    Originariamente inviato da cshark
    Forse mi sbaglio, ma se fosse vero...complimenti a David I!
    Cosa c'entra David I??
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Originariamente inviato da alka
    Da quanto mi risulta, gli oggetti vanno creati anche in C++.


    Non sono operatori, ma procedure statiche, retaggio del Turbo Pascal su cui il linguaggio Delphi poggia le proprie basi.


    Cosa c'entra David I??
    Io gli oggetti li dichiaro soltanto: vabbè che ho studiato il C++ su testi del 1986

    Allora, new e delete , allocano in heap?


    Da quanto mi risulta, David I è sempre stato a capo dei progetti riguardanti Delphi. So chè è uno dei padri di Delphi.

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da cshark
    Io gli oggetti li dichiaro soltanto: vabbè che ho studiato il C++ su testi del 1986
    Indipendentemente dalla data del testo studiato, il linguaggio C++ non ha subito mutamenti così radicali.

    Fino a prova contraria (attendo esempi), dichiarare un oggetto significa allocare la memoria per poter contenerne un riferimento, e non creare l'oggetto stesso, operazione che si fa con un'istruzione esplicita.

    E mi sembra anche una cosa lecita, visto che la dichiarazione di una variabile che corrisponde ad una determinata classe non implica necessariamente che si voglia creare un'istanza di tale classe; infatti, si potrebbe fare uso di una variabile per contenere temporaneamente un riferimento ad un oggetto esistente.

    Originariamente inviato da cshark
    Allora, new e delete , allocano in heap?
    Che importanza ha? Si tratta di funzioni e procedure che, almeno in Delphi, risultano obsolete, o meglio non ha più senso utilizzarle.

    Originariamente inviato da cshark
    Da quanto mi risulta, David I è sempre stato a capo dei progetti riguardanti Delphi. So chè è uno dei padri di Delphi.
    David I è curatore dei rapporti con gli sviluppatori, un "evangelist" (per usare il termine che indica solitamente la professione specifica), ma il lavoro su Delphi è frutto di un intero (e corposo) team di sviluppo.
    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 © 2024 vBulletin Solutions, Inc. All rights reserved.