StringGrid et MaskEdit

Résolu
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014 - 28 mars 2014 à 09:53
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 - 9 avril 2014 à 10:59
Bonjour,

J'utilise une StringGrid dans laquelle je voudrais utiliser un Mask de date dans la 1ere colonne.
pour cela dans l'événement "OnGetEditMask" de la StringGrid, je mets :

              
if ACol=0 then
begin
Value:='99/99/2099'; // mois/jour/année
end;
Ma première question est la suivante : pourquoi en utilisant ce masque, j'ai l'affichage suivant dans la cellule :"__/__/2___" au lieu de "__/__/20__" ?

Ensuite, je voudrais faire en sorte que la personne qui entre la date ne puisse pas entrer quelque chose du style "88/88/2888", donc paramétrer
- le 1er chiffre
pour des valeurs 0..1 si le 2eme [0..2]
pour des valeurs 0 si le 2eme [3..9]
....
donc j'utilise la fonction "OnKeyPress", avec ce code


var
MyTEXT : String;
ed: TInplaceEdit;
MyValue : Integer;
begin
if (MyCOL=0) then
begin
MyTEXT:=REVISION_LISTBOX.Cells[MyCOL,MyROW];
ed:= GetInPlaceEdit(REVISION_LISTBOX);
if ed <> nil then
begin
case ed.SelStart of
//mois
0 :
begin
case StrToIntDef(MyTEXT[2], 0) of
0..2 : if not (key in ['0','1']) then key:=#0;
3..9 : if not (key = '0') then key:=#0;
-1 : if not (key in ['0'..'9']) then key:=#0;
end;
end;
//jour
//annee
end;
end;
end;

Mais lorsque le 2eme chiffre du mois n'est pas indique (vide), j'ai un "acces violation" alors que cela se passe bien s'il est indique.
Ma question est donc : a quoi correspond le vide dans le mask si "StrToIntDef" ne s'en sort pas ?

Par avance, merci de vos lumieres.

10 réponses

drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
4 avril 2014 à 08:28
Bonjour,
un petit up car je n'ai toujours pas trouve de solution

--
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
4 avril 2014 à 15:07
Je semble avoir trouvé une solution pour le 2eme point :
- initialiser la cellule a tester a sa création par "00/00/0000"
en cliquant dessus pour l'éditer cela affiche : "00/00/2___"

ensuite le code suivant fonctionne, apparemment :
sur le onkeypress de la sringrid
var
MyTEXT : String;
ed: TInplaceEdit;
MyValue : Integer;
begin
MyTEXT:=REVISION_LISTBOX.Cells[MyCOL,MyROW];

ed:= GetInPlaceEdit(REVISION_LISTBOX);
if ed <> nil then
begin
case ed.SelStart of
//mois
0 :
begin
case StrToIntDef(MyTEXT[2], 0) of
0..2 : if not (key in ['0','1']) then key:=#0;
3..9 : if not (key = '0') then key:=#0;
-1 : if not (key in ['0'..'9']) then key:=#0;
end;
end;
1 :
begin
case StrToIntDef(MyTEXT[1], 0) of
0 : if not (key in ['0'..'9']) then key:=#0;
1 : if not (key in ['0'..'2']) then key:=#0;
-1 : if not (key in ['0'..'9']) then key:=#0;
end;
end;
//jour
3 :
begin
case StrToIntDef(MyTEXT[5], 0) of
0..1 : if not (key in ['0'..'3']) then key:=#0;
2..9 : if not (key in ['0'..'2']) then key:=#0;
-1 : if not (key in ['0'..'3']) then key:=#0;
end;
end;
4 :
begin
case StrToIntDef(MyTEXT[4], 0) of
0..2 : if not (key in ['0'..'9']) then key:=#0;
3 : if not (key in ['0'..'1']) then key:=#0;
-1 : if not (key in ['0'..'9']) then key:=#0;
end;
end;
//annee
7 : key:='0';
end;
end;
end;

la solution vient de l'initialisation de la cellule.
Si elle ne l'est pas, la cellule avec son mask (__/__/2___) a une longueur nulle et donc StrToIntDef ne passe pas


Concernant le premier point je suis toujours a la recherche d'une solution :
" pourquoi en utilisant ce masque (
Value:='99/99/2099'; // mois/jour/année
), j'ai l'affichage suivant dans la cellule :"__/__/2___" au lieu de "__/__/20__" ? "

Donc si quelqu'un a une solution.....

Par avance, merci
--
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
Modifié par korgis le 4/04/2014 à 18:16
Salut,

Pour la réponse à la première question :

Value:='00/00/\2\000';

(par ailleurs "0" c'est mieux que "9" puisque ça rend le caractère numérique obligatoire)

J'en savais trop rien, mais c'est ce que j'ai déduit en regardant l'aide (F1)... ;-)
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
4 avril 2014 à 20:47
Salut,

Pour la réponse à la première question :

Value:='00/00/\2\000';


(par ailleurs "0" c'est mieux que "9" puisque ça rend le caractère numérique obligatoire)

J'en savais trop rien, mais c'est ce que j'ai déduit en regardant l'aide (F1)... ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
4 avril 2014 à 20:48
Le message ci-dessus est à supprimer.
Désolé et merci à l'admin :-)
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
7 avril 2014 à 07:53
Merci Korgis .

--
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
8 avril 2014 à 20:16
Bonjour,
Pourquoi, beaucoup plus simple, n'utiliserais-tu pas un tDatetimepicker qui s'afficherait dans la cellule de ton stringgrid ? Regarde il y a plein d'exemples sur le net, ici c'est dans un dbgrid mais le principe est le même, et çà marche super bien.

http://delphi.about.com/od/usedbvcl/l/aa121503a.htm

Bon courage.

solilog
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
9 avril 2014 à 07:48
Bonjour solilog,

En fait, je n'avais pas du tout penser pouvoir mettre un TDateTimePicker dans un StringGrid.
Je vais regarder.

--
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
9 avril 2014 à 10:00
Suite au conseil de solilog et a la lecture de son lien,
(une Form, une StringGrid et un DateTimePicker)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs
, GRIDs // TStringGrid
, ComCtrls // TDateTimePicker
;

type
TForm1 = class(TForm)
MyGRID: TStringGrid;
DateTimePicker: TDateTimePicker;
procedure MyGRIDDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
procedure DateTimePickerExit(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure MyGRIDSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
MyCOL, MyROW : Integer;

implementation

{$R *.dfm}

procedure TForm1.DateTimePickerExit(Sender: TObject);
begin
MyGRID.Cells[MyCOL, MyROW]:=FormatDateTime('mm/dd/yyyy', DateTimePicker.Date);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DateTimePicker.Date:=Now;
end;

procedure TForm1.MyGRIDDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
txt : string;
I : Integer;
begin
With Sender As TStringGrid Do With Canvas Do
Begin
DateTimePicker.Visible:=False;
if (ACol <> 0) then
begin
FillRect(rect);
end else
begin
if (gdFocused in State) then
begin
with DateTimePicker do
begin
Left := Rect.Left + MyGRID.Left + 1;
Top := Rect.Top + MyGRID.Top + 1;
Width := Rect.Right - Rect.Left + 2;
Width := Rect.Right - Rect.Left + 2;
Height := Rect.Bottom - Rect.Top + 2;

Visible := True;
end;
MyCOL:=ACol;
MyROW:=ARow;
end;
FillRect(rect);
End;
DrawText(Canvas.Handle,PChar(Cells[ACol,ARow]),-1,Rect,DT_CENTER or DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE );
end;
end;

procedure TForm1.MyGRIDSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
if (ACol <> 0) then DateTimePicker.Visible:=False
else DateTimePicker.Visible:=True;
end;

end.

cela fonctionne


--
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
9 avril 2014 à 10:59
Salut drexl
Tu vois c'est tout facile :-)
(ferme ton post).
Bonne journée.

solilog
0
Rejoignez-nous