Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003

    [Delphi] Settare valori di un frame da form.oncreate

    Dopo esser riuscito a creare la struttura a pagine, sto affrontando un altro problema.
    Una delle pagine contiene dei campi edit. Volevo, all'avvio del main form, mettere dei valori in quei campi (prendendoli ad esempio da un file .ini)
    Pare che non posso accedere direttamente ai componenti quindi ho pensato di aggiungere una procedura pubblica alla classe che lo facesse
    codice:
    type
    
      TConfigPageFrame = class(TCustomPageFrame)
        Panel1: TPanel;
        GroupBox1: TGroupBox;
        Label1: TLabel;
        Edit_IP: TEdit;
        Label2: TLabel;
        Edit_Port: TEdit;
        CB_Connect: TCheckBox;
        CheckBox1: TCheckBox;
        Button1: TButton;
      protected
        function GetTitle: string; override;
      public
        procedure SetIP(value: string);
      end;
    La funzione non fa altro che assegnare un valore al Text dell'Edit_IP. Ma ovviamente mi da errore di access violation. E' possibile accedervi o si deve settare direttamente dalla classe quando viene istanziata? E se si, come accedo all'evento della creazione della classe?

  2. #2
    Utente di HTML.it L'avatar di smt
    Registrato dal
    Jul 2002
    Messaggi
    167
    se ho capito bene puoi usare l'evento onCreate della form, ma forse lo saprai già... comunque l'access violation deve essere dovuto a qualcosa d'altro.
    tieni presente che una acces violation aviene quando tenti di accedere ad un oggetto che in quel momento è nil. esegui passo passo il programma, metti un break poin sull'istruzione che genera errore, e con l'inspector verifica quale oggetto non è + presente...
    Reality is that which, when you stop believing in it, doesn't go away

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Mi unisco alla discussione per aggiungere altre informazioni a quanto è stato detto.

    Se stai utilizzando una "logica a pagine", battezziamola così, occorre tenere presente che qualsiasi implementazione specifica delle classi che discendono dalla pagina generica non è visibile al livello di MainForm se tu usi un riferimento che appartiene al tipo della pagina generica: devi fare un cast.

    In ogni caso, devi assicurarti che la pagina venga creata, cioè il Frame venga istanziato, prima di poterne richiamare i metodi.

    La parte di codice che hai postato, in questo caso, mi sembra ok. Devi verificare cosa accade e qual è la situazione nel momento in cui invochi il metodo.

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

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

  4. #4
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Ero certo del fatto che non potevo accedere alle proprietà di un frame se questo non era stato ancora creato, per questo chiamo la funzione di assegnazione dopo l'istanziamento del frame.

    Nella unit del Frame la funzione è questa:
    codice:
    procedure TConfigPageFrame.SetIP(value: string);
    begin
     Edit_IP.Text := value;
    end;
    Mentre nel mainform il codice dell'evento oncreate è questo:
    codice:
    procedure TMain.FormCreate(Sender: TObject);
    begin
     LoadPage(TConfigPageFrame);
     ConfigPageFrame.SetIP('172.23.2.7');
    end;
    Però in fase di esecuzione mi da errore sull'istruzione di assegnazione del valore all'Edit_IP (che dovrebbe essere stato già creato, o no?)

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Dove viene valorizzata la variabile ConfigPageFrame?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Originariamente inviato da alka
    Dove viene valorizzata la variabile ConfigPageFrame?


    Hai ragione. Allora come faccio ad accedere alla proprietà del frame una volta caricato nel TPanel?

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da VaLvOnAuTa
    Hai ragione. Allora come faccio ad accedere alla proprietà del frame una volta caricato nel TPanel?
    Quando "carichi" il Frame, cioé ne crei un'istanza, dovrai pur memorizzare il riferimento all'oggetto creato in qualche variabile, no?

    Attraverso quel riferimento, puoi chiamare il tuo metodo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  8. #8
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Originariamente inviato da alka
    Quando "carichi" il Frame, cioé ne crei un'istanza, dovrai pur memorizzare il riferimento all'oggetto creato in qualche variabile, no?

    Attraverso quel riferimento, puoi chiamare il tuo metodo.
    Grazie, sei stato illuminante.
    codice:
     TConfigPageFrame(FCurrentPage).Edit_IP.Text := '172.23.2.7';

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Se la porzione di codice che "carica pagine" è valida anche per altri tipi di Frame che discendono dalla classe base rappresentante la pagina generica, e devi eseguire inizializzazioni in base al tipo specifico di pagina che crei, usa eventualmente l'operatore is per verificare che la classe della pagina selezionata per il caricamento sia quella corretta, prima di procedere con un "casting" forzato.

    In alternativa, potresti prevedere l'introduzione di un metodo nella classe base, tipo InitializeControls o qualcosa del genere, che faccia l'inizializzazione dei controlli della pagina caricata, da richiamare ogni volta che crei l'istanza di un Frame relativo ad una pagina.

    Ciascuna pagina può ridefinire questo metodo con override per "personalizzare" le inizializzazioni da compiere.

    Questo è un chiaro esempio dei vantaggi della OOP applicati in un ambito specifico che è quello dell'interfaccia utente, e rivela tutta la sua potenza e manutenibilità.

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

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

  10. #10
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Correggimi se sbaglio, in alternativa al controllo che mi hai suggerito (onde evitare un casting errato) si può usare anche
    codice:
    (FCurrentPage as TConfigPageFrame).Edit_IP.Text := '172.23.2.7';
    . Giusto?

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.