Newsgroup: it.comp.lang.delphi
Titolo: Field ReadOnly a RunTime

Ciao a tutti, 
ho una DBGrid che prende i dati (tramite un DataSource)da un CDS...
Sulla griglia ho 2 campi : Codice & Descrizione.
La griglia è editabile.
In insert l'utente deve poter inserire entrambe i FIELDS...
In update invece può modificare solo la descrizione....
Esiste un modo preciso per farlo?
Io ho provato gestendo gli eventi beforeInsert e beforeEdit, ma non
sempre va a buon fine....
Ciao 
Rino

Prova così:
Dichiara una variabile di tipo integer
Esempio:
      Registra: Integer;
Mettila nella sezione pubblic in modo da poterla sempre richiamare.
Nell'evento OnNewRecord assegna la variabile a 0:
Registra:=0;
Nell'evento beforeEdit scrivi questo codice:
procedure MiaForm.BeforeEdit.....
begin
  Registra:=1;
  if Registra=1 then
  begin
    DBGridCodice.ReadOnly:=True;
    DBGridDescrizion.ReadOnly:=False;
  end;
end;
Dovrebbe funzionare.
Grazie dell'attenzione.
A presto.
 
Massimiliano Monti
Cellulare: 0039 - 335 - 8477278
Mail: 
massimili...@matia.it
--- posted by geoForum on 
http://www.delphiedintorni.it

 Dovrebbe funzionare.
Direi proprio di no, a meno di non mettere un registra:=0 nel begin..end
-- 
Morde. 
ICLDweb: 
http://www2.samatel.com/icld/

Ma se io setto Registra:=0
Ogni volta che creo un nuovo record non funziona.
Dovrei comunque risettarla nel beforeEdit in questo modo
procedure MiaForm.BeforeEdit.....
begin
  Registra:=1;
  if Registra=1 then
  begin
    DBGridCodice.ReadOnly:=True;
    DBGridDescrizion.ReadOnly:=False;
    Registra:=0;
  end;
end;


Mettila nella sezione pubblic in modo da poterla sempre richiamare.
Perché mai?
La necessità di dichiarare una variabile come public è quella di
renderla visibile al di fuori della classe, non è questo il caso.
Non è molto più semplice controllare lo stato del dataset?
Con 1 riga di codice fai tutto.
DBGridCodice.ReadOnly := Dataset.State = dsEdit;
o in casi più complessi
DBGridCodice.ReadOnly := Dataset.State in [ds..., ds...]
Non mi piacciono queste soluzioni estemporanee. Le VCL ci mettono a
disposizioni proprietà ed eventi più che sufficienti per scrivere
codice leggibile.
Ciao.
-- 
Ore 18.30: premo invio.

Sono un perfetto somaro.
Avrei dovuto scrivere cosi
procedure MiaForm.OnNewRecode.....
begin
  Registra:=0;
  if Registra=0 then
  begin
    DBGridCodice.ReadOnly:=False;
    DBGridDescrizion.ReadOnly:=False;
  end;
end;
procedure MiaForm.BeforeEdit.....
begin
  Registra:=1;
  if Registra=1 then
  begin
    DBGridCodice.ReadOnly:=True;
    DBGridDescrizion.ReadOnly:=False;
    Registra:=0;
  end;
end;
Io pensavo di mettere Registra nella dichiarazione pubblica della form 
perchč cosě la potevo richiamare sia nell'evento beforeEdit che 
OnNewRecord.
Io di solito quando ho una variabile che mi serve per fare dei controlli 
sull'inserimento, sulla modifica e altra roba sui dati, siccome mi serve 
poter richiamare la variabile in piů eventi la metto nella sezione 
pubblica del form, se invece mi serve averla in tutto il gestionale 
allora la dichiaro in un modulo.
Io finora mi sono trovato bene lavorando cosě, ma se ci sono modi piů 
comodi e semplici per utilizzare le variabili o altri arzigogoli simili, 
io non so.
Tu Massimo, puoi dirmi se ci sono metodi meno complessi.
Io programmo da 5 anni, in delphi ovviamente, e tante cose me le sono 
imparate provando e riprovando, ho ottenuto risultati interessanti, ma 
vorrei arrivare a fare di piů.
Ogni consiglio č sempre ben accetto, scrivo in questo forum anche per 
imparare da altri che ne sanno senza ombra di dubbio molto piů di me.
Le soluzioni che ho proposto mi sembravano buone, salvo qualche 
dimenticanza che ho fatto e chi mi hai fatto notare.
Grazie dei preziosi consigli.


vorrei arrivare a fare di piů.
Sě, il metodo meno complesso č quello che ti ho segnalato prima ;-)
Una riga di codice in tutto nell'evento OnStateChange del TDataSource
associato al Dataset.


Mi sa tanto che ho fatto ancora più casino di quello che pensavo.
L'idea iniziale era quella di dire al programma che ogni volta che viniva 
inserito un nuovo record potessero essere introdotti i due campi
Codice e Descrizione, ma infase di modifca solo il campo Descrizione 
dovesse essere modificato.
Io ho pensato all'arzigogole della variabile, ma mi sono resoconto solo 
dopo la tua spiegazione che in realtà non aveva senso.
Probabilmente nell'evento OnNewRecor basta settare
    DBGridCodice.ReadOnly:=False;
Mentre nell'evento BeforeEdit basta settare
    DBGridCodice.ReadOnly:=True;
Ma anche come fai notare tu si potrebbe dire nell'evento OnStateChange 
che se sono in Edit: DBGridCodice.ReadOnly:=False;
se sono in Insert: DBGridCodice.ReadOnly:=True;
Era questo che intendeve?


Era questo che intendeve?
Sì.
procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
  DataSource1.DataSet.FieldByName('NomeCampo').ReadOnly :=
DataSource1.DataSet.State <> dsInsert;
end;


Già che ci sono ti chiedo un'altra cosa:
La stessa riga di codice che mi hai scritto e precisamente
procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
  DataSource1.DataSet.FieldByName('NomeCampo').ReadOnly :=
DataSource1.DataSet.State <> dsInsert;
end;
Anche per i compontenti di interbase esiste l'evento
StateChange?



TDataSource è indipendente dai componenti.
Scusa, come fai a "linkare" il tuo dataset con la dbgrid senza un
TDatasource?


E' vero ho confuso il TDataSource con IBDataSet.
Infatti TDataSource è indipendente dai componenti InterBase
e può essere allacciato a qualsiasi tabella.
Devo fare più attenzione altrimenti rischio di dire cavolate.
Scusa ancora.
