StringGrid et MaskEdit [Résolu]

Signaler
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014
-
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
-
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

Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

Bonjour,
un petit up car je n'ai toujours pas trouve de solution

--
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

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
--
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
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)... ;-)
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
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)... ;-)
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
Le message ci-dessus est à supprimer.
Désolé et merci à l'admin :-)
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

Merci Korgis .

--
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
10
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
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

Bonjour solilog,

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

--
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

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


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

solilog