Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315

    [delphi] risalire a proprieta FormStyle di una Form

    ciao a tutti,

    ho un programma dal quale posso aprire piu volte la stessa form, questa form a secondo di alcune opzioni viene generata a runtime in modalita' fsMDIChild o fsNormal (x poi visualizzarla con ShowModal).

    il mio problema e' quello di capire se la form e' una MdiChild o una Normal (la Normal viene visualizzara con showmodal)

    mi sapete aiutare?

    grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Basterebbe ispezionare la proprietà FormStyle dell'istanza della form che ti interessa.

    Mi è sfuggito qualcosa?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    non so per quale motivo ma ieri ottenevo errore all'interrogazione del formstyle x cui ho risolto inserendo una label sulla form e controllando il suo contenuto.

    ti volevo chiedere questo:

    ho una FormMovimenti dalla quale x rintracciare il numero ID_MOVIMENTO attivo una FormEstratto in modalita Showmodal, in questa form visualizzo l'estratto conto di un cliente in una dbgrid e con doppio click seleziono automaticamente l'ID_MOVIMENTI...

    fin qui funziona tutto ok.

    sulla FormEstratto ho un ulteriore bottone che mi fa visualizare una FrmHelp sempre in modalita ShowModal nella quale rintraccio il codice del cliente.

    quindi mi trovo in questa situazione:

    una form MDIChild, al di sopra una formEstratto in modalita Showmodal e al di sopra di questa ancora una FormHelp in modalita ShowModal.

    nel momento che seleziono il codice cliente mi chiude automaticamente anke la formEstratto.

    ci sto sbattendo la testa a fare prove...ma non riesco a risolvere

    mi puoi aiutare?


    grazie
    fulvio

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da 123delphi321
    non so per quale motivo ma ieri ottenevo errore all'interrogazione del formstyle x cui ho risolto inserendo una label sulla form e controllando il suo contenuto.
    Cosa c'entra una Label con il FormStyle?

    Originariamente inviato da 123delphi321
    nel momento che seleziono il codice cliente mi chiude automaticamente anke la formEstratto.
    Ci vorrebbe un po' di codice...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    partendo da FrmMovimenti su cui ho un Edit1 nel quale devo inserire l'ID_MOVIMENTO ho un button dove attivo una funzione di ricerca:
    codice:
    procedure TFrmMovimenti.BtnHelpClick(Sender: TObject);
    var
    rres:string;
    begin
      rres := Helpest(Edit1.Text);
      if rres <> '' then
       begin
        Edit1.Text:= rres;
        BtnCerca.Click ;
       end
      else
       Edit1.SetFocus ;
    end;
    
    
    Function HelpEst(attuale:string) : string;
    var
      FrmEstratto: TFrmEstratto ;
    begin
      Application.CreateForm(TFrmEstratto , FrmEstratto);
      FrmEstratto.FormStyle:= fsNormal ;
      FrmEstratto.Position:= poScreenCenter ;
      FrmEstratto.Visible := False ;
      FrmEstratto.LblResult.Caption :='';
      try
        FrmEstratto.Showmodal;
        Result := FrmEstratto.LblResult.Caption ;
      finally
       FrmEstratto.Close ;
      end;
    end;
    nella FrmEstratto.LblResult.Caption scrivo il valore selezionato con doppio click da una dbgrid posta in FrmEstrato

    fin qui funziona bene, il problema nasce quando da FrmEstratto premo il button x rintracciare il codice cliente....

    in frmEstratto ho un campo dbedit associato ad ibtable1.
    (se utilizzo la frmEstratto in modalita MDIChild funziona bene)

    codice:
    procedure TFrmEstratto.BtnHelpFornitoriClick(Sender: TObject);
    begin
     IBTable1.FieldByName('FORNITORE').AsString := Helppia('Fornitori', IBTable1.FieldByName('FORNITORE').AsString);
     JvDBDateEdit1.SetFocus ;
    end;
    
    Function helppia(nometabella,attuale:string) : string;
    var
      Frm: TFrmHelp ;
    begin
      Application.CreateForm(TFrmHelp , Frm);
      Frm.LblTabella.Caption := nometabella;
      Frm.LblResult.Caption := attuale;
      try
        Frm.Showmodal;
        Result := Frm.LblResult.Caption ;
      finally
        Frm.Close ;
      end;
    end;
    ecco quando chiudo la FormHelp (frm) visualizzata in showmodal viene chiusa anke la precedente frmEstratto anch'essa aperta showmodal

    grazie

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da 123delphi321
    ecco quando chiudo la FormHelp (frm) visualizzata in showmodal viene chiusa anke la precedente frmEstratto anch'essa aperta showmodal
    Mi sembra del tutto normale osservando il tuo codice.

    Apri una finestra usando ShowModal, la quale apre una nuova finestra sempre usando ShowModal.

    Il metodo ShowModal "blocca il codice" (concedimi il termine improprio) fino a quando la finestra non viene chiusa.

    Nel tuo codice, l'istruzione seguente alla ShowModal è una Close in entrambi i casi, quindi significa che chiudendo la form superiore, il codice nella routine chiamante segue usando il metodo Close e chiudendo quindi anche quella sottostante.

    Se fai seguire una Close ad una chiamata ShowModal di un'altra finestra secondaria, quando tale finestra viene chiusa il programma prosegue e chiude anche la finestra chiamante.

    Inoltre, permettimi di commentare il codice perchè trovo che il costrutto try...finally non abbia molto senso usato in questo modo: lo usi per "forzare" la chiusura di una finestra che, però, deve essere chiusa a priori per poter entrare nel blocco finally...end, quindi è di fatto inutile.

    Il costrutto try...finally serve (in generale) per garantire la deallocazione di risorse, poichè Delphi è un compilatore Win32 che lavora in un ambiente "non gestito" (il programmatore ha la responsabilità di liberare tutta la memoria che alloca, salvo alcuni casi eccezionali).

    Nel tuo codice, il metodo CreateForm viene richiamato più volte, ma non c'è mai una Free del form che vai a creare; ciascuna istanza creata occupa memoria, ma siccome ad ogni chiamata il riferimento dato dalla variabile omonima al form viene sostituito con quello di una nuova istanza creata con CreateForm, la tua applicazione si troverà ad avere n form non più referenziabili e quindi indistruttibili.

    Quando si richiama una finestra di dialogo modale, spesso il suo utilizzo cessa di essere necessario quando la finestra viene chiusa, pertanto lo "scheletro" più usato in questi casi è il seguente:
    codice:
    procedure TMainForm.CallButtonClick(Sender: TObject);
    var
      Frm: TMyForm;
    begin
      Frm := TMyForm.Create(Application);
      try
        Frm.ShowModal;
      finally
        Frm.Free;
      end;
    end;
    La form MyForm viene creata e visualizzata; indipendentemente dal fatto che la visualizzazione e le azioni correlate vadano a buon fine, il costrutto try...finally garantisce la chiamata del metodo Free che distrugge l'oggetto.

    Ovviamente, questo approccio non si può utilizzare con le form normali MDI o in generale le form visualizzate con il metodo Show, poichè l'esecuzione della routine non viene bloccata quindi si andrebbe a distruggere la form esattamente qualche istante dopo la sua creazione e visualizzazione.

    Infine, c'è da dire che il metodo ShowModal restituisce un valore (ModalResult) che può essere impostato nella form chiamata in base al fatto che l'utente abbia o meno confermato o annullato un inserimento, una selezione o altro; impostando la proprietà ModalResult nel codice del form modale, la form viene chiusa e il valore impostato viene restituito come valore di ritorno per la funzione ShowModal, consentendo alla routine chiamante di controllare questa condizione e procedere o meno all'interpretazione dei parametri (ispezionando lo stato della form modale e dei controlli ivi contenuti) prima di distruggere il form attraverso il metodo Free.

    Credo di essere stato fin troppo prolisso...fai qualche prova e consulta la Guida in linea per maggiori indicazioni.

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

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    codice:
    procedure TMainForm.CallButtonClick(Sender: TObject);
    var
      Frm: TMyForm;
    begin
      Frm := TMyForm.Create(Application);
      try
        Frm.ShowModal;
      finally
        Frm.Free;
      end;
    end;
    scusa x chiudere una form visualizzata in showmodal devo eseguire il comando close?

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da 123delphi321
    scusa x chiudere una form visualizzata in showmodal devo eseguire il comando close?
    Puoi impostare la proprietà ModalResult oppure chiamare il metodo Close.

    Non capisco però perchè mi hai quotato quella porzione di codice: il metodo Close va richiamato all'interno della form modale che vai a visualizzare, nell'evento OnClick di un pulsante per la chiusura, ad esempio.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315


    scusami Alka, ma sto impazzendo a furia di fare prove in piu modi...

    allora il mio problema e' che apro 2 finestre diverse in modalita ShowModal e quando chiudo l'ultima aperta viene chiusa anke la precedente.

    premetto che ho fatto una prova nella quale apro n volte la stessa form in modalita ShowModal....questa prova funziona correttamente.

    ti spiego la mia struttura:

    ho un programma MDI dal quale posso aprire 1 FormMovimenti in modalita MDIChild e 1 FormEstrattoConto sempre in modalita MDIchild.

    sull'evento OnClose di entrambe le Form MDIchild action: caFree

    dalla FormEstrattoConto visualizzo i movimenti di un cliente in una Dbgrid,...x il cliente inserisco il codice o lo seleziono premendo un bottone che mi visualizza una FormHelp in modalita showModal.
    codice:
    procedure TFrmEstratto.BtnHelpFornitoriClick(Sender: TObject);
    var
      Frm: TFrmHelp ;
    begin
      Frm := TFrmHelp.Create(Application);
      Frm.LblTabella.Caption := 'Fornitori';
      try
        if Frm.Showmodal = mrOk then
         begin
          IBTable1.FieldByName('FORNITORE').AsString := trim(frm.JvDBGrid1.Fields[0].AsString);
          JvDBDateEdit1.SetFocus ;
         end
        else
          DBEdit1.SetFocus ;
      finally
        frm.Free;
      end;
    end;
    
    ....
    procedure TFrmHelp.JvDBGrid1DblClick(Sender: TObject);
    begin
      if not IBDataSet1.IsEmpty then 
        ModalResult := mrOk ;
    end;
    ....
    e fin qui tutto ok.

    dalla FormMovimenti gestisco i movimenti. il ID_MOVIMENTI lo posso rintracciare premendo un bottone che mi visualizza la suddetta FormEstrattoConto in modalita showModal:
    codice:
    procedure TFrmMovimenti.BtnHelpClick(Sender: TObject);
    var
      FrmE: TFrmEstratto ;
    begin
      FrmE := TFrmEstratto.Create(Application);
      FrmE.FormStyle:= fsNormal ;
      FrmE.Position:= poScreenCenter ;
      FrmE.Visible := False ;
      try
        if FrmE.Showmodal = mrOk then
         begin
          Edit1.Text := trim(FrmE.JvDBGrid1.Fields[0].AsString);
          BtnCerca.Click ;
         end
        else
         Edit1.SetFocus ;
      finally
        FrmE.Free;
      end;
    end;
    ovviamente ho dovuto settare le proprieta della FormEstratto affinche questa da FormMDIChild potesse essere visualizata in modalita Showmodal.

    quindi a questo punto mi ritrovo sulla FormMovimenti la FormEstrattoConto dalla quale visualizando i movimenti di un cliente e selezionando dalla JvDbgrid un elemento funziona correttamente.

    Se pero' dalla FormEstrattoConto premo il pulsante x rintracciare il codice cliente tramite la FormHelp,...nel momento della chiusura della FormHelp (sia premendo 'x' che selezionando con doppio click l'elemento dalla JvDbgrid) viene chiusa anke FormEstrattoConto.

    ci sto sbattendo la testa,...veramente non riesco a capire cosa impedisce il buon funzionamento...

    mi puoi aiutare x favore?

    grazie
    fulvio

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Qual è il codice dell'evento OnClick per il pulsante TFrmMovimenti.BtnCerca?
    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.