Newsgroup: it.comp.lang.delphi
Titolo: Controllo date inserite??

Ciao a tutti.
Ho realizzato una delle prime applicazioni con delphi ed ora ho questo
problemino:
l'utente inserisce una data nel formato gg/mm/aa ed io dovrei controllare
che non abbia scritto una assurdita' del tipo 31/31/31 . Come fare ?
In Vb c'era , anzi c'e', una bella funzione isDate che mi diceva se era una
data valida ma con delphi??
Grazie.

 ha scritto

io questo genere di funzione me l'ero fatta. ( in Delphi ovviamente )
Puoi farla con un "EncodeDate".
Se non viene generata eccezione, allora il risultato è True ( per dire )
altrimenti è False.
Cioè "EncodeDate" deve stare racchiuso in un blocco TRY - EXCEPT
In genere se la data è errata, viene sollevata un eccezione del tipo
EConvertError
Vabbè, ti saluto. Buona Domenica.
Antonio Tarolla

che non abbia scritto una assurdita' del tipo 31/31/31 . Come fare ?
TMaskEdit, usando !99/99/00;1;_ come proprieta' EditMask.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

E se usi il componente che delphi ha già per le date (DataTimePicker)?
--
_________________________________
Edmondo Di Tucci 
snar...@tin.it
www.powernetsi.it
 
edm...@powernetsi.it

 wrote in message
0WVt8.28042$m41.7...@twister2.libero.it...


> TMaskEdit, usando !99/99/00;1;_ come proprieta' EditMask.
Cosě perň potrebbe scrivere 34/56/88 o anche __/__/02


Cosě perň potrebbe scrivere 34/56/88 o anche __/__/02
Infatti, basta semplicemente scriversi una funzione:
function IsValidDate(S: String): Boolean;
begin
  try
    StrToDate(S);
    Result := true;
  except
    Result := false;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsValidDate(MaskEdit1.Text) then
    ShowMessage('Data valida !')
  else
    ShowMessage('Data non valida !');
end;
L'uso di MaskEdit e' molto piu' comodo che non quello dei
DateTimePicker, in interfacce grafiche in cui l'utente
digita velocemente le informazioni.


 digita velocemente le informazioni.
E perché? Col DTP non è necessario scegliere col mouse dal menu, si può
anche scrivere 'a mano' la data e vengono automaticamente impedite le date
impossibili


E perché? 
Il DTP l'ho usato moltissimo nelle mie applicazioni, cosi'
come ho usato gli EditMask.  Per quel che ho potuto vedere,
in applicazioni in cui serve un'interazione veloce, questi
ultimi sono migliori.  Anche perche', e' importante che vi
sia coerenza nell'interfaccia grafica e non esiste un
DBDateTimePicker.



Nei componenti RX esiste un TDBDateEdit e poi con un pochino di buona
volonta ci si può creare il DBDateTimePicker in fondo basta aggiungere le
proprietà datasource e datafield..... o sbaglio ??
Saluti NEA

proprietą datasource e datafield..... o sbaglio ??
Non e' cosi' semplice e comunque stiamo sconfinando nella
costruzione di un componente o l'estensione di uno gia'
esistente.  E' un altro discorso.  In ogni caso, i
componenti db-aware hanno bisogno di mantenere un link con i
dati (incorporano, difatti, un TDataLink).
In ogni cao, che io sappia, i componenti RX non sono piu'
supportati.


 supportati.
E' vero però io sono un romantico e da D5 li ho riportati anche in D6 :)
Saluti NEA

E' vero però io sono un romantico e da D5 li ho riportati anche in D6 :)
Ma non e' una buona idea, a mio avviso, utilizzare
componenti non supportati dal produttore in software
commerciale.  La regola generale dovrebbe essere quella di
usare solo componenti di cui si posseggano anche i sorgenti.
Non so se gli RX vengano forniti o meno con i sorgenti, non
li ho mai usati, ma se il tuo software si appoggia
pesantemente a dei componenti di cui non hai sorgenti, in
caso di bug non sapresti dove sbattere la testa.  A dire il
vero, anche usando dei componenti con sorgenti disponibili
la questione non e' da prendere cosi' leggermente: in caso
di bug, non c'e' quasi mai tempo di mettere mano al codice
del componente per "aggiustarlo".  Quando il software passa
nelle mani del cliente, si apre per lui tutta un'altra vita.
Le modifiche (anche semplici) diventano sempre piu'
impossibili, man mano che passa il tempo e il tempo di
sviluppo sempre piu' ridotto all'osso.  Il componente
TDateTimePicker, per esempio, ha degli aspetti a mio avviso
"subdoli", che possono far perdere tempo allo sviluppatore,
nella ricerca di risolvere qualcosa che assomiglia molto a
un bug.  Come sai, il TDTP puo' servire sia a selezionare
date che ore.  Ora, segui i seguenti passi:
1. Apri un progetto Delphi;
2. Inserisci un DateTimePicker sul Form1 (per default
assumera' la data del giorno corrente e come Kind il
dtkDate);
3. Inserisci un bottone sul Form1;
4. Doppio click sul bottone e scrivi il seguente codice:
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if DateTimePicker1.DateTime = Date then
    ShowMessage('Hai scelto il giorno corrente !')
  else
    ShowMessage('NON hai scelto il giorno corrente !')
end;
5. Fai un Run dell'applicazione.
Il confronto, come vedi, e' del tutto lecito, ma come avrai
modo di constatare, a meno che tu non abbia posizionato il
DateTimePicker alla mezzanotte esatta del giorno, il
confronto tra il DateTime conservato nel TDateTimePicker e
la Data corrente fallira' sempre, nonostante tu abbia
specificato di voler usare il DTP per selezionare delle date
(e non degli orari) e nonostante esso sia effettivamente
posizionato sulla data corrente.
Il problema e', ovviamente, dovuto al fatto che il DateTime
conserva anche informazioni sull'ora (la proprieta' Time
viene impostata al momento della creazione del componente),
per cui il confronto corretto diventa:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Trunc(DateTimePicker1.DateTime) = Date then
    ShowMessage('Hai scelto il giorno corrente !')
  else
    ShowMessage('NON hai scelto il giorno corrente !')
end;
Questo comportamento, a mio avviso, e' ai limiti del bug: ho
specificato che voglio soltanto una data, mentre il
componente mi restituisce comunque informazioni sull'ora e
il "malfunzionamento" e' molto difficile da individuare.
Ho citato l'esempio del TDateTimePicker, perche' se ne sta
parlando nel thread, ma il concetto di base e' che il numero
di funzionalita' offerte da un componente e' direttamente
proporzionale ai problemi e/o bug eventuali.
Nel caso del DTP non si tratta propriamente di un bug, ma
incontrare un problema del genere, puo' farti perdere molto
tempo durante lo sviluppo.


 tempo durante lo sviluppo.
OK sono d'accordo
Saluti NEA
PS vista l'ora non mi cimento nella creazione del TDBDateTimePicker... ma
appena avrò tempo e voglia voglio farci un pensierino ....così per esercizio
:))))))))))

??? potrebbe andare come patch ????
Non c'e' bisogno: lo imposti a 0 a disegno.


 ha scritto nel messaggio
news:0WVt8.28042$m41.7...@twister2.libero.it...


 tuoi clienti :)
beh a loro non frega niente del romanticismo :) vogliono solo il
prodotto bello pronto e funzionante e noi i soldi!
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

prodotto bello pronto e funzionante e noi i soldi!
Appunto.


end;
Non ti conviene impostare i controlli sulla validita' della
data sull'OnExit.  Ci sono circostanze in cui l'OnExit non
viene scatenato a meno di non forzare lo spostamento del
Focus da un'altra parte.
Nel mio codice (che probabilmente non hai letto), ti ho
scritto una funzione:
function IsValidDate(S: String): Boolean;
begin
  try
    StrToDate(S);
    Result := true;
  except
    Result := false;
  end;
end;
che puoi usare per verificare il dato inserito, senza
bisogno di scomporre la stringa di partenza.


Si si  l'ho letta, ma sai  com'e' talvolta piace di piu' non copiare
esattamente ma cercare di inventarsi qualcosa ( ovviamente seguendo consigli
piu' esperti). Grazie ancora


piu' esperti). Grazie ancora
Reinventando la ruota, si rischia di sbagliare, come nel tuo
caso: il controllo degli errori non testa l'EConvertError
(che si verifica se io semplicemente non scrivo niente nel
MaskEdit).
p.s.: quota *sotto* il testo a cui rispondi, non sopra.


 tuoi clienti :)
Non ho clienti il mio č un hobby niente di serio ;)
Di seguito posto il componente TDBDateTimePicker derivato da TDateTimePicker
con l'aggiunta delle proprietą DataSource, ReadOnly, DataField, l'ho testato
solo 30 sec non assicuro il funzionamento, se qualcuno che conosce delphi un
po' meglio di me vuole darmi un suo parere per me č tutta esperienza Grazie.
Saluti NEA
unit DateTimePicker1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, DB, DBCtrls;
type
  TDBDateTimePicker = class(TDateTimePicker)
  private
    { Private declarations }
    FDataLink: TFieldDataLink;
    function GetReadOnly: Boolean;
    procedure SetReadOnly(Value: Boolean);
    function GetDataField: string;
    function GetDataSource: TDataSource;
    procedure SetDataField(const Value: string);
    procedure SetDataSource(Value: TDataSource);
    procedure DataChange(Sender: TObject);
    procedure CMExit(var Message: TWMNoParams); message CM_EXIT;
  protected
    Procedure Change; Override;
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(Aowner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    property ReadOnly: Boolean read GetReadOnly write SetReadOnly default
False;
    property DataField: string read GetDataField write SetDataField;
    property DataSource: TDataSource read GetDataSource write SetDataSource;
  end;
procedure Register;
implementation
constructor TDBDateTimePicker.Create(AOwner: TComponent);
begin
   inherited Create(AOwner);
   FDataLink:=TFieldDataLink.Create;
   FDataLink.OnDataChange:=DataChange;
   if Kind in [dtkDate] then
     Time := 0;
end;
destructor TDBDateTimePicker.Destroy;
begin
   FDataLink.OnDataChange:=nil;
   FDataLink.Free;
   inherited Destroy;
end;
Procedure TDBDateTimePicker.Change;
begin
  Inherited Change;
  if not FDataLink.editing then FDataLink.Edit;
     FDataLink.Field.AsDateTime:=self.DateTime;
end;
procedure TDBDateTimePicker.DataChange(Sender: TObject);
begin
   if not Assigned(FDataLink.Field) then
     Self.DateTime:=Now
   else
     Self.DateTime := FDataLink.Field.AsDateTime;
end;
procedure TDBDateTimePicker.CMExit(var Message: TWMNoParams);
begin
   try
      FDataLink.UpdateRecord;
   except
      on Exception do
        SetFocus;
   end;
   inherited;
end;
function TDBDateTimePicker.GetReadOnly: Boolean;
begin
  Result := FDataLink.ReadOnly;
end;
procedure TDBDateTimePicker.SetReadOnly(Value: Boolean);
begin
  FDataLink.ReadOnly := Value;
end;
function TDBDateTimePicker.GetDataField: string;
begin
   Result:=FDataLink.FieldName;
end;
function TDBDateTimePicker.GetDataSource: TDataSource;
begin
   Result:=FDataLink.DataSource;
end;
procedure TDBDateTimePicker.SetDataField(const Value: string);
begin
   FDataLink.FieldName:=Value;
end;
procedure TDBDateTimePicker.SetDataSource(Value: TDataSource);
begin
   FDataLink.DataSource:=Value;
end;
procedure Register;
begin
  RegisterComponents('Samples', [TDBDateTimePicker]);
end;
end.

 data valida ma con delphi??
function IsValidDate(const AYear, AMonth, ADay: Word): Boolean;
alle altre domande, altri hanno gia' risposto.
Saluti
Paolo Arosio

Attento pero' a StrToDate poichè utilizza le impostazioni della
macchina (guarda l'help per maggiori info) e quindi potrebbe non fare
al caso tuo..
Ciao, Rocco