[Solved] Modifica Menu form padre da form figlio

di il
9 risposte

[Solved] Modifica Menu form padre da form figlio

Ciao a tutti, attualmente ho un form padre che al click su una voce del menu mi apre un form (figlio) e prima di aprirlo mi disattiva una voce del menu. Avrei bisogno che alla chiusura del form figlio il menu venisse riattivato. Non riesco proprio a farcela o a capire come fare . Potete aiutarmi?
Grazie.

9 Risposte

  • Re: [Solved] Modifica Menu form padre da form figlio

    Hai più strade a disposizione, non sapendo come hai organizzato la tua applicazione ti posso dare alcune informazioni base,
    se la form figlia è modale dopo la chiamata showmodal riattivi la voce di menù nella form padre, oppure nella close della form figlia riattivi il menù nella form padre. Oppure potresti implementare un observer che abilita e disabiltà il menu... con le poche info che ha dato di più non saprei cosa dire.
    NIck
  • Re: [Solved] Modifica Menu form padre da form figlio

    Vediamo se riesco a spiegarmi meglio. Ho un form padre (fsMDIForm) dal quale menù, tramite questo codice:
    procedure TMDIMain_Form.Calcolopercassonetti1Click(Sender: TObject);
    begin
        if not Assigned(frmCalcoloCassonetti) then
      begin
        Impostazioni1.Items[0].Enabled:=False;
        frmCalcoloCassonetti := TfrmCalcoloCassonetti.Create(Application);
        frmCalcoloCassonetti.Show;
      end
      else
        frmCalcoloCassonetti.WindowState := wsMaximized;
    end;
    
    apro un form figlio (fsMDIChild).
    Tramite l'istruzione:
    Impostazioni1.Items[0].Enabled:=False;
    disattivo uno dei menu del form padre. Vorrei che quando si chiude il form figlio, con questo codice:
    procedure TfrmCalcoloCassonetti.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
      Release;
      frmCalcoloCassonetti := nil;
    end;
    si riattivasse il menu sul form principale. Non riesco a capire quale è l'istruzione per poterlo fare.
    Non so se sono stato più chiaro.
    Grazie per un eventuale aiuto.
  • Re: [Solved] Modifica Menu form padre da form figlio

    Se ho capito bene Impostazioni1.Items[0].Enabled è la voce di un menu?

    quando apri il menu, fai un controllo
    [CODE] Impostazioni1.Items[0].Enabled := (frmCalcoloCassonetti = nil) ricordando di inizializzare la variabile del form.
  • Re: [Solved] Modifica Menu form padre da form figlio

    dobby ha scritto:


    Se ho capito bene Impostazioni1.Items[0].Enabled è la voce di un menu?

    quando apri il menu, fai un controllo
    [CODE] Impostazioni1.Items[0].Enabled := (frmCalcoloCassonetti = nil) ricordando di inizializzare la variabile del form.
    Non capisco che cosa devo fare
  • Re: [Solved] Modifica Menu form padre da form figlio

    Pcfactory ha scritto:


    Non capisco che cosa devo fare
    In parole molto povere direi
    // quando crei la form
    Impostazioni1.Items[0].Enabled := False;
    // quando distruggi la form
    Impostazioni1.Items[0].Enabled := True;

    Potresti usere una lista qualcosa del tipo observer "fatto in casa"
    
      foListForm: TObjectList<TForm>;
    ... 
      // nel metodo OnNotify della lista controlli se abilitare/disabilitare il menu in base se add o delete
      Impostazioni1.Items[0].Enabled := Action = cnRemoved;
    ...  
      // in fase di creazione della form fai un add alla lista
       foListForm.add(Child);
    ...
      // in fase di distruzione della form fai un delete della form
       foListForm.Delete(0); 
       
    
    Ovviamente se hai più form da gestire devi scrivere qualche linea di codice in più

    Nick
  • Re: [Solved] Modifica Menu form padre da form figlio

    Per sapere se una form è stata creata, di solito uso una variabile globale boolean che viene aggiornata ogni volta che creo/chiudo la form, oppure, se ho più form, controllo la loro creazione con una semplice funzione:
    FUNCTION FormCreata(ctrlFrm : TCustomForm) : Boolean;
          VAR Var1: Integer;
        BEGIN
              Result := False;
              For Var1:=0 To Screen.FormCount-1 Do
                  If Screen.Forms[Var1]=ctrlFrm Then
                     Begin
                     Result := True;
                     Break;
                     End;
        END;
    Per aggiornare una voce del menù, come ti hanno già detto, puoi usare l'evento "onClic" della voce del menù che ti interessa, e controllare lo stato della variabile o richiamo la funzione:
    procedure TForm1.VoceMenuClick(Sender: TObject);
        begin
              SceltaMenu.Enabled := FormCreata(Form2);
        end;
    
  • Re: [Solved] Modifica Menu form padre da form figlio

    Grazie a tutti, faccio delle prove.
  • Re: [Solved] Modifica Menu form padre da form figlio

    Questo è uno scenario tipico in cui conviene usare un componente TActionList e definire il comando di apertura del Form secondario come azione (TAction), regolando tramite l'evento OnUpdate della ActionList l'abilitazione/disabilitazione del comando stesso, agganciando poi la voce di menu all'azione specifica tramite la proprietà "Action".

    Per approfondire l'uso delle azioni, parti da (ma è uno strumento che esiste fin dalle prime versioni).

    Ciao!
  • Re: [Solved] Modifica Menu form padre da form figlio

    Grazie mille. Vedo di capirne il funzionamento.
Devi accedere o registrarti per scrivere nel forum
9 risposte