Gestione dei Frame

di il
8 risposte

Gestione dei Frame

Buongiorno. Avrei bisogno di sapere se è possibile individuare a runtime tutti gli oggetti tframe che sono aperti all'interno di una form. in merito vi faccio questo tipo di esempio
in una toolbar ho tre button che mi creano e mi lanciano 3 frame diversi (fr1; fr2; fr3). Effettuando la prima scelta creo la fr1 la lancio (attenzione questo lo posso fare anche con fr2 oppure fr3). A questo punto senza chiudere la frame aperta dalla scelta della toolbar vado a lanciare una frame diversa. A questo punto a runtime, io devo individuare quale è l'oggetto frame precedentemente aperto e chiuderlo oppure renderlo invisibile.
Spero di essere stato chiaro
Grazie

8 Risposte

  • Re: Gestione dei Frame

    @Antonio ha scritto:


    Avrei bisogno di sapere se è possibile individuare a runtime tutti gli oggetti tframe che sono aperti all'interno di una form.
    Una precisazione iniziale: i TFrame non sono finestre, pertanto non si "aprono". Il massimo che puoi fare è creare una istanza di un Frame, a runtime o anche a designtime, e posizionarlo all'interno di un Form, o di un controllo che sta nel Form e che può agire da contenitore.

    E' senz'altro possibile risalire a qualsiasi Frame presente in un Form: essendo che il Form è probabilmente l'Owner del componente TFrame inserito al suo interno, usando la collection dei Components assieme alla proprietà ComponentCount, è possibile enumerare tutti i componenti presenti nel Form di riferimento e verificare l'appartenenza alla classe TFrame, o al discendente da questa inserito nel progetto (si veda come spunto).

    @Antonio ha scritto:


    in una toolbar ho tre button che mi creano e mi lanciano 3 frame diversi (fr1; fr2; fr3).
    Anche qui, bisognerebbe definire con precisione cosa si intende con il termine "lanciare".

    @Antonio ha scritto:


    Effettuando la prima scelta creo la fr1 la lancio (attenzione questo lo posso fare anche con fr2 oppure fr3). A questo punto senza chiudere la frame aperta dalla scelta della toolbar vado a lanciare una frame diversa. A questo punto a runtime, io devo individuare quale è l'oggetto frame precedentemente aperto e chiuderlo oppure renderlo invisibile.
    Se si vuole ripristinare un Frame precedentemente aperto, sarebbe sufficiente memorizzarne il riferimento all'interno di una variabile. Se si tratta di più Frame, sarebbe sufficiente usare una lista o un'altra struttura equivalente per mantenere più riferimenti.

    Ho usato (e spiegato in dettaglio) una architettura simile in una live che ho fatto qualche tempo fa (puoi trovare la replica in due parti qui e qui).

    Ciao!
  • Re: Gestione dei Frame

    Grazie. Scusate per il modo in cui mi sono espresso, sono autodidatta e ho sempre considerato i frame come dei form, diversi da gestire, ma form.
    P.S. per lanciare intendevo dire ‘eseguire’
  • Re: Gestione dei Frame

    @Antonio ha scritto:


    Scusate per il modo in cui mi sono espresso, sono autodidatta [...]
    Tranquillo, non hai mica offeso qualcuno.
    Segnalavo il problema di usare termini impropri perché, non chiarendo esattamente a cosa si riferiscono, questo rende anche difficile capire cosa sta accadendo e proporre poi di conseguenza soluzioni efficaci.

    @Antonio ha scritto:


    e ho sempre considerato i frame come dei form, diversi da gestire, ma form.
    Questo è più che corretto invece, tant'è che i Frame sono stati progettati appositamente per essere del tutto simili ai Form, al netto delle ovvie differenze di utilizzo, quindi la tua considerazione è valida e opportuna.

    @Antonio ha scritto:


    P.S. per lanciare intendevo dire ‘eseguire’
    Qui torniamo al caso di prima, ossia dell'imprecisione: i Frame sono classi, che nella pratica rappresentano controlli visuali personalizzati, pertanto "non si eseguono" ma tutt'al più si possono creare, visualizzare, nascondere, distruggere.

    Do per scontato che "eseguire" stia per creare e visualizzare, ma ci sono N modi di farlo.

    Magari uno spezzone di codice a titolo esemplificativo potrebbe essere utile per chiarire la situazione attuale e gli obiettivi da perseguire.

    Ciao!
  • Re: Gestione dei Frame

    Buongiorno Marco e grazie per i suggerimenti. Allora, la bozza di programma è molto semplice nel senso che sto iniziando ad utilizzare i frame in sostituzione dei form per gestire delle base dati. Dunque quello che faccio è questo:
    Nel Form (che io chiamo FrmMenu)
    USES
    Clienti; Fornitori ....
    Nella dichiarazione della variabili PUBLIC
    FraClienti : TFrame1
    FraFornitori : TFrame2
    In base alla scelta fatta dall'utente
    - Eseguo la procedura che verifica se ci sono dei frame creati e li distruggo a runtime, cosi come mi hai spiegato nell'esempio che mi hai gentilmente consigliato
    var
    I: Integer;
    Temp: TComponent;
    begin
    for I := ComponentCount - 1 downto 0 do
    begin
    Temp := Components[I];
    if (Temp is TFrame) then
    RemoveComponent(Temp);
    end;
    end;
    - creo la classe TFrame
    FraClienti:=TFraClienti.Create(FrmMenu);
    FraClienti.Adapter(FrmMenu);
    FraClienti.Visible:=True;
  • Re: Gestione dei Frame

    P.S.
    La riga di comandi FraClienti.Adapter(FrmMenu) è errata.
    Quella giusta è (credo)
    FraClienti. Parent;
    FraClienti.visible := True
  • Re: Gestione dei Frame

    Domanda forse stupida ma...
    perche crei e distruggi i frame?
    se non ho capito male tu hai due bottoni, uno per visualizzare il frame clienti e l altro per visualizzare il frame fornitori.

    Non puoi semplicemente nascondere e visualizzare i frame in base al bottone schiacciato piuttosto che distruggerli e ricrearli?
  • Re: Gestione dei Frame

    Perché ho 10/15 frame (uno per ogni tipo di esigenza) dunque mi dovrei impazzire per ricordarmi quali frame ho aperto. Tieni presente che all’interno di ogni frame non c’è un pulsante che consente all’utente di chiudere il frame e che il menù per la scelta delle varie procedure rimane sempre attivo perciò quando l’utenze fa la scelta della procedura, a runtime distruggo il frame che è aperto (se c’è ne) e apro o meglio creo o ricreo il frame per l’opzione scelta
  • Re: Gestione dei Frame

    ziobacco ha scritto:


    Non puoi semplicemente nascondere e visualizzare i frame in base al bottone schiacciato piuttosto che distruggerli e ricrearli?
    Il suggerimento può essere valido, nel senso che non è sbagliato né nasconderli e ripristinarli, né distruggerli e ricrearli: tutto dipende dall'uso che viene fatto dei suddetti Frame.

    Ad esempio, se ve ne sono tanti da gestire, tenerli tutti in memoria potrebbe essere deleterio; tuttavia, distruggerli e ricrearli potrebbe richiedere tempo maggiore rispetto al nasconderli e renderli nuovamente visibili.

    Uno scenario del tutto simile è quello in cui si deve stabilire quali Form mettere in creazione automatica all'avvio dell'applicazione (AutoCreate) e quali invece è meglio creare quando serve, "on demand", scegliendo poi di conservarle in memoria una volta create (e nascondendole) oppure distruggendole e ricreandole.

    Delphi supporta tutti gli scenari possibili: quello migliore è scelta dello sviluppatore in base alle esigenze che deve soddisfare.

    Ciao!
Devi accedere o registrarti per scrivere nel forum
8 risposte