Esecuzione di un Frame

di il
29 risposte

Esecuzione di un Frame

Buonasera a tutti

sto creando un picollo programma con 2 frame (mai utilizzate) volevo un'aiutino da qualcuno che magari lo ha già utilizzato in qualche applicazione. Veniamo al problema, il FRAME non ha gli eventi on create e onshow e di conseguenza non riesco a fargli fare qualcosa prima di entrare. Avevo pensato di creare una procedure Init lanciata dal Menu Principale ma ho un'errore che riesco a capire cosa fare. Esempio:


var
 FormMenu: TFormMenu;
implementation
{$R *.dfm}
uses Unit2; // questo è il nome della Unit Frame
procedure TFormMenu.actArticoliExecute(Sender: TObject);
//var
//    Frame2 : TFrame;
begin
   if Frame2 = nil then begin
      Frame2 := TFrameArticoli.Create(Self);
      Frame2.Parent := FormMenu;
      Frame2.Align := alClient;
      Frame2.Init;  // Errore Undeclared identifier 'Init'
   end;
   Frame2.Show;
end;

frame Articoli
--------------
unit Unit2;
interface
uses
 private
   { Private declarations }
 public
   procedure Init;
   { Public declarations }
 end;
implementation
{$R *.dfm}
uses Comune, Globale;
procedure TFrameArticoli.Init;
begin
  //
end;

Scusate dove dovrei definire la ‘Init’ perche non mi dia errore.

Grazie mille a tutti

29 Risposte

  • Re: Esecuzione di un Frame

    Che messaggio di errore hai?

  • Re: Esecuzione di un Frame

    24/09/2024 - marianzo ha scritto:


    Scusate dove dovrei definire la ‘Init’ perche non mi dia errore.

    Il codice della Unit2 è corretto?

    Mi riferisco ad esempio a questa parte:

    unit Unit2;
    interface
    uses
     private
       { Private declarations }
     public
       procedure Init;
       { Public declarations }
     end;
    implementation

    E' letteralmente così? Oppure hai rimosso arbitrariamente qualche riga di codice?

    Lo chiedo perché quel codice non ha assolutamente senso scritto così: devi studiare come è fatta una tipica Unit di Delphi, descritta anche nella documentazione ufficiale; il Frame in sé non può essere dichiarato così: manca il nome della classe e altre cose… se ne crei uno da zero vedi subito la differenza (ma questa deve saltare all'occhio studiando la programmazione a oggetti con Delphi).

  • Re: Esecuzione di un Frame

    24/09/2024 - marianzo ha scritto:


    Frame2.Init; // Errore Undeclared identifier 'Init'

    Buonasera

    questa la riga con l'errore:    Frame2.Init;  // Errore Undeclared identifier 'Init'

    Grazie a tutti

  • Re: Esecuzione di un Frame

    24/09/2024 - Alka ha scritto:


    24/09/2024 - marianzo ha scritto:


    Scusate dove dovrei definire la ‘Init’ perche non mi dia errore.

    Il codice della Unit2 è corretto?

    Mi riferisco ad esempio a questa parte:

    unit Unit2;
    interface
    uses
     private
       { Private declarations }
     public
       procedure Init;
       { Public declarations }
     end;
    implementation

    E' letteralmente così? Oppure hai rimosso arbitrariamente qualche riga di codice?

    Lo chiedo perché quel codice non ha assolutamente senso scritto così: devi studiare come è fatta una tipica Unit di Delphi, descritta anche nella documentazione ufficiale; il Frame in sé non può essere dichiarato così: manca il nome della classe e altre cose… se ne crei uno da zero vedi subito la differenza (ma questa deve saltare all'occhio studiando la programmazione a oggetti con Delphi).

    Ciao Marco

    forse ho tolto qualcosa in più. Vedi questo

    unit Articoli;
    interface
    uses
     Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
     Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, dxBarBuiltInMenu,
     cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxPC,
     AdvToolBtn, Vcl.ExtCtrls, JvExExtCtrls, JvExtComponent, JvSpacer, Vcl.ToolWin,
     Vcl.ComCtrls, JvExComCtrls, JvToolBar, RzPanel, RzButton, System.ImageList,
     Vcl.ImgList, cxContainer, cxEdit, Vcl.Menus, cxStyles, cxCustomData, cxFilter,
     cxData, cxDataStorage, cxNavigator, dxDateRanges, dxScrollbarAnnotations,
     Data.DB, cxDBData, cxDBLookupComboBox, cxGridLevel, cxGridCustomTableView,
     cxGridTableView, cxGridDBTableView, cxClasses, cxGridCustomView, cxGrid,
     cxDropDownEdit, cxLookupEdit, cxDBLookupEdit, cxGroupBox, cxRadioGroup,
     cxDBEdit, Vcl.StdCtrls, cxButtons, cxTextEdit, cxMaskEdit, cxBlobEdit,
     Vcl.DBCtrls, RzDBCmbo, Vcl.Mask, RzEdit, RzDBEdit, RzRadChk, RzDBChk,
     RzRadGrp, RzLabel, RzTabs, cxCheckBox, cxCurrencyEdit, Vcl.Buttons,
     AdvGlassButton, JvComponentBase, JvFormAutoSize, FireDAC.Stan.Param;
    type
     TFrameArticoli = class(TFrame)
       RzToolbar1: TRzToolbar;
       btnInserisci: TRzToolButton;
       RzSpacer2: TRzSpacer;
       btnModifica: TRzToolButton;
       RzSpacer1: TRzSpacer;
       btnElimina: TRzToolButton;
       RzSpacer3: TRzSpacer;
       btnSalva: TRzToolButton;
       RzSpacer4: TRzSpacer;
    ……
    
        procedure PgArticoliEnter(Sender: TObject);
       procedure ComboBoxTipoArtEnter(Sender: TObject);
       procedure ComboBoxTipoArtExit(Sender: TObject);
       procedure rzPnlArticoliEnter(Sender: TObject);
       procedure FrameEnter(Sender: TObject);
       procedure FrameResize(Sender: TObject);
       procedure grdElencoArticoliDBTableView1DblClick(Sender: TObject);
     private
       { Private declarations }
     public
       procedure Init;
       { Public declarations }
     end;
    implementation
    {$R *.dfm}
    uses Comune, Globale;
    procedure TFrameArticoli.Init;
    begin
      //
    end;
    
  • Re: Esecuzione di un Frame

    Scusami se ho mancato qualcosa

    Grazie mille per l'aiuto

    perdonami ho cambiato Unit2 in Articoli

  • Re: Esecuzione di un Frame

    Implementation

    {$R *.dfm}

    uses Comune, Globale;

    procedure TFrameArticoli.Init;

    begin

      //

    end;

    Perché l'hai messo qui?

    24/09/2024 - marianzo ha scritto:


    if Frame2 = nil then begin Frame2 := TFrameArticoli.Create(Self); Frame2.Parent := FormMenu; Frame2.Align := alClient; Frame2.Init; // Errore Undeclared identifier 'Init' end; Frame2.Show; end;

    Perché prima esegui la procedura e poi mostri il form?

    Prova a scrivere tutto quello che vorresti nella init su un pulsante nascosto e dopo show lanci la procedura click del pulsante vedi se migliora.

  • Re: Esecuzione di un Frame

    24/09/2024 - marianzo ha scritto:


    questa la riga con l'errore:    Frame2.Init;  // Errore Undeclared identifier 'Init'

    La variabile Frame2 di che tipo è? dove si trova? dov'è/com'è dichiarata?

    Rilancio comunque il suggerimento di studiare le basi di Delphi, prima di affrontare le “altezze”.

  • Re: Esecuzione di un Frame

    25/09/2024 - Alka ha scritto:


    La variabile Frame2 di che tipo è? dove si trova? dov'è/com'è dichiarata?

    È la procedura, scritta in modo errato e nel posto errato della unit2

    Manca il riferimento alla unit e in ogni caso ha dichiarato la procedura in modo errato.

    Marianzo, ti rinnovo il consiglio di inserire un pulsante mettere il codice che vorresti all'apertura del frame e lanciare unit2.pulsante.click(self)

    Dopo che hai lanciato il frame.

    Poi traduci in una procedura tutta tua (se preferisci), basta vedere dove viene dichiarata la procedura su unit2.

  • Re: Esecuzione di un Frame

    25/09/2024 - sihsandrea ha scritto:


    È la procedura, scritta in modo errato e nel posto errato della unit2

    La unit “Articoli”, ex “Unit2”, almeno nella sua ultima versione, sembra avere una struttura corretta.

    25/09/2024 - sihsandrea ha scritto:


    Marianzo, ti rinnovo il consiglio di inserire un pulsante mettere il codice che vorresti all'apertura del frame e lanciare unit2.pulsante.click(self)

    Dopo che hai lanciato il frame.

    Poi traduci in una procedura tutta tua (se preferisci), basta vedere dove viene dichiarata la procedura su unit2.

    Non capisco a che serve tutto questo: stiamo al momento cercando di capire l'errore “Undeclared identifier”, a meno che non mi sia perso qualcosa per strada.

    La TFrameArticoli.Init mi sembra corretta.

  • Re: Esecuzione di un Frame

    https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://m.youtube.com/watch%3Fv%3Do9ydZPNYSys&ved=2ahUKEwiq8Pnx2t2IAxUKyLsIHXquHTsQwqsBegQIDxAG&usg=AOvVaw3OL7L1lvYogUcz3hoELEJu

  • Re: Esecuzione di un Frame

    25/09/2024 - sihsandrea ha scritto:


    https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://m.youtube.com/watch%3Fv%3Do9ydZPNYSys&ved=2ahUKEwiq8Pnx2t2IAxUKyLsIHXquHTsQwqsBegQIDxAG&usg=AOvVaw3OL7L1lvYogUcz3hoELEJu

    Al netto che postare filmati YouTube non sarebbe corretto per le regole del forum, non capisco la risposta.

    Come si creano e si utilizzano i Frame lo so: lavoro con Delphi dal 1997 e lo porto regolarmente in live su Twitch ogni settimana, oltre a usarlo quotidianamente per lavoro. Non ho bisogno di spiegazioni in tal senso, o almeno non credo. :)

    Detto questo, torno “in topic” rilanciando all'OP la domanda che ho già fatto:

    25/09/2024 - Alka ha scritto:


    La variabile Frame2 di che tipo è? dove si trova? dov'è/com'è dichiarata?

    L'OP della discussione sta usando correttamente le azioni per istanziare un Frame e visualizzarlo, ma non riesce ad accedere al metodo Init() che sembra aver dichiarato correttamente: questa è la problematica e il tema su cui mi sto attualmente concentrando.

  • Re: Esecuzione di un Frame

    Buongiorno

    parte mainmenu

        procedure FormCreate(Sender: TObject);
       procedure grpMenuItems0Click(Sender: TObject);
       procedure actArticoliExecute(Sender: TObject);
     private
       { Private declarations }
     public
       FrameArticoli : TFrame;
       { Public declarations }
     end;
    var
     FormMenu: TFormMenu;
    implementation
    {$R *.dfm}
    uses Articoli, Comune, Globale;
    procedure TFormMenu.actArticoliExecute(Sender: TObject);
    //var
    //    Frame2 : TFrame;
    begin
       if FrameArticoli = nil then begin
          FrameArticoli := TFrameArticoli.Create(Self);
          FrameArticoli.Parent := FormMenu;
          FrameArticoli.Align := alClient;
    //       FrameArticoli.Init;
       end;
       FrameArticoli.Show;
    end;

    Grazie mille a tutti

  • Re: Esecuzione di un Frame

    25/09/2024 - marianzo ha scritto:


    public FrameArticoli : TFrame;

    Questa è l'origine del tuo problema: se dichiari un campo FrameArticoli di tipo TFrame, che è il tipo generico da cui derivano tutti i frame compreso il tuo TFrameArticoli, come puoi aspettarti di chiamare il metodo Init()?

    Una variabile di tipo TFrame può contenere un riferimento a qualsiasi tipo di frame, non necessariamente un TFrameArticoli, quindi se la dichiari di questo tipo allora non potrai accedere (salvo cast) a un metodo specifico di una classe discendente, ma solo ai metodi che sono presenti nella classe base TFrame, e che quindi sono posseduti da qualsiasi frame (in quanto ereditano da essa).

    Si tratta dei principi cardine della programmazione a oggetti (OOP), in questo caso quello dell'ereditarietà.

    Devi studiare la OOP e applicarla correttamente alle classi dei Frame e alle relative variabili.

  • Re: Esecuzione di un Frame

    Scusa Marco

    ho provato a mettere Frame ma il risultato non cambiare aiutami fattivamente quello che devo fare

    Grazie mille

Devi accedere o registrarti per scrivere nel forum
29 risposte