PDA

Visualizza la versione completa : [delphi] risalire a proprieta FormStyle di una Form


123delphi321
25-04-2004, 23:42
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

alka
26-04-2004, 09:51
Basterebbe ispezionare la proprietà FormStyle dell'istanza della form che ti interessa.

Mi è sfuggito qualcosa? :confused:

123delphi321
26-04-2004, 13:06
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 :dhò:

mi puoi aiutare?


grazie
fulvio

alka
26-04-2004, 14:22
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...

123delphi321
26-04-2004, 17:18
partendo da FrmMovimenti su cui ho un Edit1 nel quale devo inserire l'ID_MOVIMENTO ho un button dove attivo una funzione di ricerca:

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)


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

alka
27-04-2004, 09:53
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:


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! :ciauz:

123delphi321
27-04-2004, 17:00
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?

alka
27-04-2004, 17:11
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.

123delphi321
28-04-2004, 21:01
:dhò: :dhò: :dhò: :dhò:

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.

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:

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

alka
29-04-2004, 01:27
Qual è il codice dell'evento OnClick per il pulsante TFrmMovimenti.BtnCerca?

Loading