Newsgroup: it.comp.lang.delphi
Titolo: Problema con Button.Enable da Form a Frame

Ciao a tutti,
il titolo del topic non è molto esaustivo ma...in pratica ho la form
principale che carica alcuni frame al suo interno e poi ho altre due
form settate come Normal che interagiscono con i frame. Quello che mi
serve è:
1) Dal frame clicco su un bottone che mi apre una form
2) Una volta creato e aperto il form, il frame disabilita i bottoni al
suo interno
3) Alla chiusura della form devo riabilitare i bottoni del frame
disabilitati in precedenza
Direi una cosa semplicissima.
Peccato che continua a darmi access violation e non capisco perchè!
Quando clicco il bottone dal frame (SettingsPageFrame) per aprire la
nuova form (ImportFile), uso questo codice:
If ImportFile = nil then
ImportFile := TImportFile.Create(nil)
else
ImportFile.Show
Quando invece chiudo il form (ImportFile) riabilito i bottoni del
frame (SettingsPageFrame) in questo modo:
SettingsPageFrame.Button.Enabled := true;
Qui ho l'errore di access violation.
Perchè diavolo fa così????
Non riesco a capirne il motivo.
Grazie

 Non riesco a capirne il motivo.
Posta il codice per favore.
Di solito un access violation si scatena se cerchi di agire su oggetti non
istanzati..
Ciao
-- 
Morde

Dal Frame SettingsPageFrame, all'evento onClick del bottone che
dovrebbe aprire il Form ImportFile
procedure TSettingsPageFrame.ButtonRTAdvancedClick(Sender: TObject);
begin
  inherited;
  Button1.Enabled := false;
  Button2.enabled := false;
  ButtonRTAdvanced.Enabled := false;
  MainForm.Enabled := false;
  // Imposta il valore della strasparenza per il form principale
  MainForm.AlphaBlendValue := 180;
  // Imposta a true l'abilitazione della trasparenza
  MainForm.AlphaBlend := true;
  if ImportFile = nil then
    ImportFile := TImportFile.Create(nil)
  else
    ImportFile.Show;
  ImportFile.Visible := true;
end;
Dal form ImportFile, alla chiusura della finestra:
procedure TImportFile.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
  FreeAndNil(ImportFile);
  FreeAndNil(RealTimeAdvancedForm);
  MainForm.Enabled := true;
  MainForm.AlphaBlend := false;
  SettingsPageFrame.ButtonRTAdvanced.Enabled := true; <---------------
ACCESS VIOLATION
end;

 end;
Stai invocando il freeandnil di un form mentre lui esiste ancora.
Sposta il freeandnil all'interno del form chiamante. (Usa un showmodal con
il controllo sul modalresult *se questo non sconvolge la tua logica*).
una cosa del tipo:
procedure TSettingsPageFrame.ButtonRTAdvancedClick(Sender: TObject);
begin
  inherited;
[....]
  ImportaFile.create(nil);
  ImportaFile.ShowModal;
[...]
end;
-- 
Morde

Il problema dell'access violation rimane. Ho provato a commentare i
FreeAndNil ma non cambia nulla.

Lo stesso problema dell'Access Violation ce l'ho se tento di
modificare le proprietà di qualsiasi componente che si trova
all'interno di qualsiasi frame. E' normale o ho sbagliato qualcosa?

Ho provato a settare lo stesso bottone come enable false da un'altra
form che già usavo nel progetto ma il risultato è identico, sempre
access violation. Deduco che i frame debbano essere modificati con
altri metodi anche se mi sembra parecchio strano.



Riesce difficile seguirti, perchè si tratterebbe di conoscere cosa fa la
tua applicazione.. Prova a documentarti sul modo corretto di usare i
frames, leggi un po' questo:
http://bdn1.borland.com/article/borcon/files/6006/paper/6006.html
-- 
Morde

Mettiamo da parte per un attimo cosa fa l'applicazione, mi basterebbe
capire se è possibile modificare da un form, settato come normal, le
proprietà di un oggetto posto su un frame caricato sulla Form
principale e configurata come MDIForm. Nel caso fosse possibile, quali
sarebbero le istruzioni? Sono differenti rispetto al classico
riferimento tra due form che ho postato negli esempi di prima?
Mi viene il dubbio che la proprietà FormStyle possa influire.

colde ha scritto:

Dal mio punto di vista, hai un riferimento non impostato (uguale a 
*nil*) oppure che fa riferimento ad un Frame che non è più istanziato.
Per il resto, un componente è un oggetto, così come lo è l'istanza del 
Frame... sono entità che, a patto di aver un riferimento valido, possono 
essere manipolate invocando metodi o cambiando il valore delle proprietà.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)
     Non hai la possibilità di scaricare Turbo Delphi Explorer?
     Te lo spedisco io!! [
http://blog.marco.breveglieri.name/?p=48
]