StringGrid et MaskEdit [Résolu]

drexl 56 Messages postés mardi 13 février 2007Date d'inscription 22 juillet 2014 Dernière intervention - 28 mars 2014 à 09:53 - Dernière réponse : solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

10 réponses

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

--
Commenter la réponse de drexl
drexl 56 Messages postés mardi 13 février 2007Date d'inscription 22 juillet 2014 Dernière intervention - 4 avril 2014 à 15:07
0
Merci
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
--
Commenter la réponse de drexl
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - Modifié par korgis le 4/04/2014 à 18:16
0
Merci
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)... ;-)
Commenter la réponse de korgis
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 4 avril 2014 à 20:47
0
Merci
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)... ;-)
Commenter la réponse de korgis
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 4 avril 2014 à 20:48
0
Merci
Le message ci-dessus est à supprimer.
Désolé et merci à l'admin :-)
Commenter la réponse de korgis
drexl 56 Messages postés mardi 13 février 2007Date d'inscription 22 juillet 2014 Dernière intervention - 7 avril 2014 à 07:53
0
Merci
Merci Korgis .

--
Commenter la réponse de drexl
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 8 avril 2014 à 20:16
0
Merci
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
Commenter la réponse de solilog
drexl 56 Messages postés mardi 13 février 2007Date d'inscription 22 juillet 2014 Dernière intervention - 9 avril 2014 à 07:48
0
Merci
Bonjour solilog,

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

--
Commenter la réponse de drexl
drexl 56 Messages postés mardi 13 février 2007Date d'inscription 22 juillet 2014 Dernière intervention - 9 avril 2014 à 10:00
0
Merci
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


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

solilog
Commenter la réponse de solilog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.