IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Coloration d'une cellule stringgrid, oui je sais.


Sujet :

Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Technicien Général
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Myanmar

    Informations professionnelles :
    Activité : Technicien Général
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut Coloration d'une cellule stringgrid, oui je sais.
    Bonjour à tous,
    Ne me hurlez pas dessus s'il vous plait.
    Je suis juste un petit débutant en delphi et après avoir cherché sur de nombreux forums et faq, je ne capte toujours pas la procédure ondrawcell.
    C'est pour un hôtel
    Mon StringGrid a pour lignes : le n° de chambre ( 20 chambres )
    et pour colonnes : les jours du mois en cours ( entre 28 et 31, mais le stringgrid a toujours 31(+1) colonnes ).
    Je récupère à la suite de la procédure :
    _ la chambre ( la ligne )
    _ le jour ( la colonne )
    _ le status ( couleur rouge vert bleu jaune ou gris suivant un string donné )

    Queaumand faire ?

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par Soxid Voir le message
    (...) Queaumand faire ?

    Comment faire quoi ?
    Parce qu'au final, il n'y a pas de question dans ton post, à part celle-ci...

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 595
    Billets dans le blog
    65
    Par défaut
    C'est vrai que la FAQ ne colorie pas une cellule particulière mais une ligne . Cependant le principe est toujours le même , utiliser le canvas , changer la couleur de la "brosse" (brush) selon la condition,dessiner le rectangle (le fond),puis écrire le texte .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      With Sender As TStringGrid Do 
      With Canvas Do
      Begin
        { sélection de la couleur de fond }
        If gdFixed in State then Brush.Color := clBtnFace   // N° de Chambre colonne 0
       // peut être remplacé par if ACol=0 then Brush.Color := clBtnFace
        Else
          // récupérer le status selon la position ARow (chambre) Acol (jour) , ça je peux pas indiquer comment faire 
     
          if status=?  then Brush.Color=clRed
          else if status=? then Brush.Color=clGreen 
          else if status=? then Brush.Color=clNavy 
          else if status=? then Brush.Color=clYellow 
          else if status=? then Brush.Color=clGray; 
     
        { Dessin du fond }
        FillRect(Rect);
          { Dessin du texte }
        TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
      End;
    end;
    petite astuce , si Status peut être converti en nombre , un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case StatusNumerique of
       1 : Brush.Color=clRed; 
       2 : Brush.Color=clGreen;
       3 : Brush.Color=clNavy;
       4 : Brush.Color=clYellow;
       5 : Brush.Color=clGray;
    end;
    sera beaucoup plus lisible

  4. #4
    Membre habitué
    Homme Profil pro
    Technicien Général
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Myanmar

    Informations professionnelles :
    Activité : Technicien Général
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    Jipété > Ma question se trouvait en fait dans le titre du post.
    Elle est la suivante : comment je fais pour colorier une case dont j'ai les coordonnées avec une couleur différente suivant une variable.

    SergioMaster > Je vais transformer ma variable en numérique comme tu me l'as conseillé, cela me parait aussi plus propre. Cette procédure, je dois l'appeler quelque part ? Ou est-elle automatiquement appelée ?
    Autre chose, quand tu mets que tu ne peux pas savoir, c'est parce qu'il te faut connaitre ces variables ?
    Jour est dans StrToInt(addresainfo[1]) "jour d'arrivée" ( faut faire un for jusqu'à StrToInt(addresainfo[4]) "jour de départ" )
    Chambre est dans [1..20] si addresaroom[i]=true (faut faire un for sur addresaroom[i], il peut y avoir plusieurs chambres )
    Si je ne veux pas de dessin de fond ni de texte ( pour le moment ), dois-je supprimer les deux dernières expressions ?

    En tous cas, merci beaucoup pour vos réponses rapides.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 595
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Soxid Voir le message
    Cette procédure, je dois l'appeler quelque part ? Ou est-elle automatiquement appelée ?
    en lieu et place du if status ....
    Autre chose, quand tu mets que tu ne peux pas savoir, c'est parce qu'il te faut connaitre ces variables ?
    moi j'ai l'habitude d'utiliser des Bases de Données et quand j'ai un problème de ce genre j'indique au moins la structure de la table
    Jour est dans StrToInt(addresainfo[1]) "jour d'arrivée" ( faut faire un for jusqu'à StrToInt(addresainfo[4]) "jour de départ" )
    Chambre est dans [1..20] si addresaroom[i]=true (faut faire un for sur addresaroom[i], il peut y avoir plusieurs chambres )
    il n'y a pas de boucle a faire , le OnDrawCell en fait déjà
    Pas très clair comme structure de données , ça demande des explications

    Fut un temps j'étais prof d'info c'était un de mes sujets d'exos favoris (gérer l'occupation des chambres) je demandais une gestion flottante (sur 32 jours en utilisant un entier sur 4bits pour les réservations histoire de faire travailler le binaire une chambre ne pouvant qu'être occupée ou non )
    structure de la table :
    NUM_CHAMBRE SMALLINT; << 2 Octets
    RESERVATIONS INTEGER; << 4 Octets
    à cette époque la place disque était cruciale , mais je digresse .....


    Si je ne veux pas de dessin de fond ni de texte ( pour le moment ), dois-je supprimer les deux dernières expressions ?
    Uniquement le "dessin du texte" donc TextOut

  6. #6
    Membre habitué
    Homme Profil pro
    Technicien Général
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Myanmar

    Informations professionnelles :
    Activité : Technicien Général
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    Une démo vaut bien mieux que quoique ce soit d'autre, alors voici le code de l'obtention des infos de réservation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    procedure TForm1.addfinish;
    begin
            addresainfo[1]:=Form2.dayselecCI.Text;       //jour d'arrivée
            addresainfo[2]:=Form2.monthselecCI.Text;     //mois d'arrivée
            addresainfo[3]:=Form2.yearselecCI.Text;      //année d'arrivée
            addresainfo[4]:=Form2.dayselecCO.Text;       //jour de départ
            addresainfo[5]:=Form2.monthselecCO.Text;     //mois de départ
            addresainfo[6]:=Form2.yearselecCO.Text;      //année de départ
            addresainfo[7]:=Form2.paxedit.Text;          //nombre de personnes
            addresainfo[8]:=Form2.groupnameedit.Text;    //nom du groupe
            addresainfo[9]:=Form2.agentedit.Text;        //nom de l'agent
            addresainfo[10]:=Form2.remarkedit.Text;      //les remarques
            addresainfo[11]:=Form2.statusedit.Text;      //le status
            addresaroom[1]:=Form2.room1.Checked;         //et le reste c'est des checkbox
            addresaroom[2]:=Form2.room2.Checked;         //pour savoir quelle chambre ils
            addresaroom[3]:=Form2.room3.Checked;         //prennent
            addresaroom[4]:=Form2.room4.Checked;
            addresaroom[5]:=Form2.room5.Checked;
            addresaroom[6]:=Form2.room6.Checked;
            addresaroom[7]:=Form2.room7.Checked;
            addresaroom[8]:=Form2.room8.Checked;
            addresaroom[9]:=Form2.room9.Checked;
            addresaroom[10]:=Form2.room10.Checked;
            addresaroom[11]:=Form2.room11.Checked;
            addresaroom[12]:=Form2.room12.Checked;
            addresaroom[13]:=Form2.room13.Checked;
            addresaroom[14]:=Form2.room14.Checked;
            addresaroom[15]:=Form2.room15.Checked;
            addresaroom[16]:=Form2.room16.Checked;
            addresaroom[17]:=Form2.room17.Checked;
            addresaroom[18]:=Form2.room18.Checked;
            addresaroom[19]:=Form2.room19.Checked;
            addresaroom[20]:=Form2.room20.Checked;
    end;
    Quand je demandais où l'appeler, je cherchais en fait la fonction Repaint, mais puisque j'en parle, c'est que j'ai trouvé

    En ce qui concerne les bdd, je me remets petit à petit à Delphi, et j'étais déjà pas allé très loin. Je pense que me lancer dans des bdd pour le moment c'est un peu prématuré. Pour le moment, je stock tout dans un dossier dans des fichiers txt, par mois.

    Le soucis c'est qu'il n'y a pas juste, le jour & la chambre renvoie un boolean, il doit renvoyer plus que ca, et notamment dans le futur, il y aura la fusion des cellules similaires ( réservation sur plusieurs jours, ou plusieurs chambres par groupe ).

    Je te sens un peu tendu et agacé par mes questions et mon incompétence, je suis désolé mais mon bouquin sur le delphi n'arrive que dans 1 semaine, et pour le moment je n'ai que le net pour m'aider.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 595
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Soxid Voir le message
    Je te sens un peu tendu et agacé par mes questions
    du tout , il est juste difficile de se mettre dans ta logique

    pour ce qui est de la question de départ : Colorier une cellule , je pense avoir répondu , après ce n'est qu'une question de manipulation de données .

    Pour ce qui est de la gestion :
    je stock tout dans un dossier dans des fichiers txt, par mois.
    là , il y a de gros efforts a faire de mon point de vue : Il serait sage d'envisager une base de données (même access ) ou un fichier de structure HTML (sans s'occuper des mois) .
    Pour moi une bonne structure de données c'est la moitié voir plus du Programme

  8. #8
    Membre habitué
    Homme Profil pro
    Technicien Général
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Myanmar

    Informations professionnelles :
    Activité : Technicien Général
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    Concrètement, je mets quoi dans mon "else" ?
    Parce que j'ai essayé et retourné le truc dans tous les sens, même quand j'essaie avec deux constantes pour arow & acol, ca marche pas.

    Bonus : un bon lien vers un tuto bdd simple à gérer ?

    Merci encore pour tout.

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 595
    Billets dans le blog
    65
    Par défaut
    Au Temps pour moi , après avoir 'dormi dessus' je me suis dit qu'il fallait bien la remplir cette stringgrid (je travaille trop avec des DBgrid , chargée à l'ouverture du Datasource)

    Comment faire :
    Tout d'abord (hors l'event drawcell, pour voir le remplissage) il faut remplir la stringgrid .
    Donc , a partir du fichier texte , lire chaque ligne puis la traiter en conséquence,
    donc calculer les colonnes en fonction de la date . Au vu de tes données cela donne quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    procedure remplirGrille(Annee,Mois: integer);
    var F : TextFile; 
         Ligne : String;
        datedebut,datefin,DateGrille : TDateTime;
         i,c,,Col,lapstemps : Integer;
         aa,mm,jj : word;
    begin
    // initialiser la Grille 
    // recupérer denier jour du Mois
    DateFin:=EndOfAMonth(Annee,Mois);
    DecodeDate(DateFin,aa,mm,jj); 
    // cerise sur le gateau on peut tailler le stringGrid en fonction du nombre de jours
    stringGrid1.Colcount:=jj+1;
    StringGrid1.RowCount:=1+20; Ligne jours + 20 chambres
    StringGrid1.Cells[0,0]:=formatdateTime('mmmm',DateFin);
    StringGrid1.FixedCols:=1;
    StringGrid1.FixedRows:=1;
    // on peut même définir les largeurs de colonnes 
    StrinGrid1.DefaultColWidth:=30;
    StringGrid1.ColWidths[0]:=80; 
    // Chambres
    for i :=1 to 20 do
      begin
         StringGrid1.Cells[0,i]:=Format('Chambre %2d',[i]);
      end;
    // Jours 
    for i:=1 to jj do
     begin
       StrinGrid1.Cells[i,0]:=Format('%2d',[i]);
     end;
    // ouvrir Fichier Texte
    AssignFile(F,nomFichier);  // voir le nom du fichier
    Reset(F);
    While not EOF(F) do 
    begin
    // lire la ligne
    readln(F,ligne);
    // parser la Ligne, cela dépendra du format que tu utilises CSV,Taille Fixe, etc....  
    // pour la suite je considère que tu a parser la ligne dans la structure indiquée dans le post #6 
    // Traiter les dates
    DateDebut:=EncodeDate(StrToInt(addresainfo[1]),StrToInt(addresainfo[2]),strtoint(addresainfo[3]);
    // au cas ou c'est une période 'à cheval'
    if StrToInt(addresainfo[2])<Mois then DateDebut:=StartOfAMonth(annee,mois);
    // au cas ou c'est une période 'à cheval'
    DateFin:=EncodeDate(StrToInt(addresainfo[4]),StrToInt(addresainfo[5]),strtoint(addresainfo[6]);
    if StrToInt(addresainfo[5])>Mois then DateDebut:=EndOfAMonth(Annee,Mois);
    lapsTemps:=dateDiff(datedebut,dateFin); 
    for  i:=0 to lapstemps do
     begin
        DateGrille:=IncDay(DateDebut,i); 
        Col:=DecodeDate(DateGrille,aa,mm,jj);
        // Chercher chambre
        for c:=1 to 20 do
          begin
             if addresaroom[c] then StringGrid1.Cells[Col,c]:='1';  // à voir si plus d'état
          end;
    end; 
    // fermer fichier 
    CloseFile(F);
    end;
    Un Coup que la Grille sera remplie convenablement (j'ai codé directement dans le post , donc hors delphi , sur une base d'un D2010 donc il se peut qu'avec un delphi<D2010 les IncDate,StartOfAmonth,EndOfAmonth n'existe pas)
    edit : Seule la partie remplissage des 'constantes' est vérifiée
    ensuite , le OnDrawcell devient une 'Formalité'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var statut : Integer;
    begin
      With Sender As TStringGrid Do 
      With Canvas Do
      Begin
        { sélection de la couleur de fond }
        If gdFixed in State then Brush.Color := clBtnFace   // N° de Chambre colonne 0 , et Ligne jours 
       // peut être remplacé par if ACol=0 then Brush.Color := clBtnFace
        Else begin
          Statut:=StrtoIntDef(Cells[Acol,Arow],0);
          Case Statut of
           0 : Brush.Color:=clGreen;  // inocupée 
           1 : Brush.Color:=clRed;     // occupée
    // autres états         
          end;  
        end;      
        { Dessin du fond }
        FillRect(Rect);
          { Dessin du texte , uniquement pour jours et Chambre}
      If gdFixed in State then
         TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
      End;
    end;
    edit Pour le Bonus ,
    de même que pour un fichier texte il y plusieurs choix (CSV,longueur Fixe,Fichier HTML) de même il y aura beaucoup de SGBD .
    il y a de nombreux tuto sur le sujet , cela va beaucoup dépendre du choix du SGBD , personnellement je suis un addict a Firebird et déteste Access . Recherches dans les tutoriels du forum selon ton choix et ta version de Delphi

  10. #10
    Membre habitué
    Homme Profil pro
    Technicien Général
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Myanmar

    Informations professionnelles :
    Activité : Technicien Général
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    Et bien ça commence à bien se préciser tout ça.
    Ton code a l'air très puissant, et je viens de passer une bonne demi-heure pour formater mes données pour qu'elles puissent rentrer sans encombre, et pour pouvoir implanter ce code dans mon programme.

    Deux erreurs subsistent, ce qui m'empêche de tester si ça fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lapsTemps:=dateDiff(datedebut,dateFin);
    DateDiff non disponible, c'est ce que tu as du dire avant, mais je ne vois pas comment faire une fonction qui calcule ça.

    EDIT : J'ai trouvé la fonction DaysBetween, fait-elle la même chose ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Col:=DecodeDate(DateGrille,aa,mm,jj);
    Voici l'erreur que cela m'affiche :
    Types incompatibles : 'Integer' et 'procedure, untyped pointer or untyped parameter'

    Comment je résous ça ?

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 595
    Billets dans le blog
    65
    Par défaut
    DaysBetween , oui , ça doit faire la même chose

    Quant à col , une erreur de ma part , voilà ce que je voulais écrire , des fois ma pensée va plus vite que mes doigts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DecodeDate(DateGrille,aa,mm,jj);
    Col:=jj;

  12. #12
    Membre habitué
    Homme Profil pro
    Technicien Général
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Myanmar

    Informations professionnelles :
    Activité : Technicien Général
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    Mon Code doit vraiment être super sale parce que ça marche toujours pas
    Dans ta procédure, il me dit déjà que "ligne" n'est jamais utilisé, ainsi que "statut" que j'ai modifié en "status" ( partout hein tkt pas ), et que j'ai remplacé en début de procédure par 1,2,3,4,5 suivant le statut de la résa.
    Je ne comprends pas non plus le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Status:=StrtoIntDef(Cells[Acol,Arow],0);
    puisque je suis déjà sensé l'avoir ce nombre ( c'est juste avant le case, où j'ai vraiment rajouté tous les cas. )

    Et le pompon, il me sort un gros overflow, genre bien sale aussi avec un débordement de pile.

    EDIT Je faisais appel à une procédure dans laquelle je fais appel à ta fonction. Nawak x)

  13. #13
    Membre habitué
    Homme Profil pro
    Technicien Général
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Myanmar

    Informations professionnelles :
    Activité : Technicien Général
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    Bon je te colle ce que j'ai fait, avec des explications bien sûr.

    voici ta fonction remaniée que j'ai appelée fillgrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    procedure TForm1.fillgrid(Annee,Mois: integer);
    var F : TextFile;
         Ligne : String;
        datedebut,datefin,DateGrille : TDateTime;
         i,c,Col,lapstemps : Integer;
         aa,mm,jj : word;
    begin
    // initialiser la Grille
    // recupérer denier jour du Mois
    DateFin:=EndOfAMonth(Annee,Mois);
    DecodeDate(DateFin,aa,mm,jj);
    // cerise sur le gateau on peut tailler le stringGrid en fonction du nombre de jours
    Form1.Calend.Colcount:=jj+1;
    Form1.Calend.RowCount:=1+20; //Ligne jours + 20 chambres
    Form1.Calend.Cells[0,0]:=formatdateTime('mmmm',DateFin);
    Form1.Calend.FixedCols:=1;
    Form1.Calend.FixedRows:=1;
    // on peut même définir les largeurs de colonnes
    Form1.Calend.DefaultColWidth:=30;
    Form1.Calend.ColWidths[0]:=80;
    // Chambres
    for i :=1 to 20 do
      begin
            Form1.Calend.Cells[0,i]:=Format('Chambre %2d',[i]);         // je t'avoue que les trucs des
      end;                                                              // %2d je comprends pas =)
    // Jours
    for i:=1 to jj do
     begin
       Form1.Calend.Cells[i,0]:=Format('%2d',[i]);
     end;
    // ouvrir Fichier Texte
    //Form1.initcurrmonthtxt;
    //AssignFile(F,'C:\Program Files (x86)\Borland\Delphi6\Projects\VPProg\DB\'+currmonthtxt);  // voir le nom du fichier
    //Reset(F);                                                          j'ai mis ces lignes en comm
    //While not EOF(F) do                                                parce que je fais déjà tout ca dans
    //begin                                                              getmonthinfo
    // lire la ligne
    //readln(F,ligne);
    // parser la Ligne, cela dépendra du format que tu utilises CSV,Taille Fixe, etc....
    // pour la suite je considère que tu a parser la ligne dans la structure indiquée dans le post #6
    Form1.getmonthinfo;
    // Traiter les dates
    DateDebut:=EncodeDate(StrToInt(tablresa[1]),StrToInt(tablresa[2]),StrToInt(tablresa[3]));
    // au cas ou c'est une période 'à cheval'
    if StrToInt(tablresa[2])<Mois then DateDebut:=StartOfAMonth(annee,mois);
    // au cas ou c'est une période 'à cheval'
    DateFin:=EncodeDate(StrToInt(tablresa[4]),StrToInt(tablresa[5]),strtoint(tablresa[6]));
    if StrToInt(tablresa[5])>Mois then DateDebut:=EndOfAMonth(Annee,Mois);
    lapsTemps:=DaysBetween(datedebut,dateFin);
    for  i:=0 to lapstemps do
     begin
        DateGrille:=IncDay(DateDebut,i);
        DecodeDate(DateGrille,aa,mm,jj);
        Col:=jj;
        // Chercher chambre
        for c:=1 to 20 do
          begin
             if tablroom[c] then Form1.Calend.Cells[Col,c]:='1';  // à voir si plus d'état
          end;
    //end;
    // fermer fichier
    CloseFile(F);
    end;
    end;
    Ta fonction drawcell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    procedure TForm1.CalendOnDrawCell(Sender: TObject; ACol, ARow: Longint;
      Rect: TRect; State: TGridDrawState);
    var status : Integer;
    begin
         begin
          if tablresa[11]='Waiting' then status:=1
            else
            if tablresa[11]='Confirmed' then status:=2
            else
            if tablresa[11]='Unconfirmed' then status:=3
            else
            if tablresa[11]='Paid' then status:=4
            else
            if tablresa[11]='Cancelled' then status:=5
            else status:=6;
         end;
    With Sender As TStringGrid Do
      With Canvas Do
      Begin
        { sélection de la couleur de fond }
        If gdFixed in State then Brush.Color := clBtnFace   // N° de Chambre colonne 0 , et Ligne jours
       // peut être remplacé par if ACol=0 then Brush.Color := clBtnFace
        Else begin
          //Status:=StrtoIntDef(Cells[Acol,Arow],0);
          Case status of
           1 : Brush.Color:=clNavy;  // en attente
           2 : Brush.Color:=clGreen;     // confirmée
           3 : Brush.Color:=clYellow;     // non confirmée
           4 : Brush.Color:=clGray;     // payée
           5 : Brush.Color:=clRed;     // annulée
           6 : Brush.Color:=clWhite;
    // autres états
          end;  
        end;
        { Dessin du fond }
        FillRect(Rect);
          { Dessin du texte , uniquement pour jours et Chambre}
      If gdFixed in State then
         TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
      End;
    end;
    Et ma fonction getmonthinfo pour que tu comprennes le schmilblick :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    procedure TForm1.getmonthinfo;                                      // ma fonction qui récupère tout
    var                                                                 //tablresa avec les données dites dans #6
            F:TextFile;                                                 //tablroom avec un tableau[1..20] de bool
            filetxt,str:string;
            i,j:integer;
    begin
           Form1.initcurrmonthtxt;
           filetxt:='C:\Program Files (x86)\Borland\Delphi6\Projects\VPProg\DB\'+currmonthtxt;
           if FileExists(filetxt) then
           begin
           Assignfile(F,filetxt);
           Reset(F);
           repeat
           Readln(F,str);
           i:=1;
           j:=1;
           while (str[j]<>']') do
                 begin
                    if str[j]<>'[' then
                            begin
                                 if str[j]=',' then
                                    begin
                                    j:=j+1;
                                    i:=i+1;
                                    end
                                 else
                                    begin
                                    tablresa[i]:=tablresa[i]+str[j];
                                    j:=j+1;
                                    end;
                            end
                    else
                       j:=j+1;
                 end;
           j:=1;
           i:=1;
           Readln(F,str);
           while (str[j]<>']') do
                 begin
                    if str[j]<>'[' then
                            begin
                                 if str[j]=',' then
                                    j:=j+1
                                 else
                                    begin
                                    tablroom[i]:=IntToBool(StrToInt(str[j]));
                                    j:=j+1;
                                    i:=i+1;
                                    end;
                            end
                    else
                       j:=j+1;
                 end;                                             // J'ai récup tout pour 1 résa,
           until EOF(F);                                          // je dois trouver le moyen de
           CloseFile(F);                                          // stocker ca dans un méga array
           end;                                                   // pour pouvoir en gérer plusieurs
    end;
    Si je te poste tout ça, c'est parce que, tu t'en doutes, ça ne marche toujours pas ..

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 595
    Billets dans le blog
    65
    Par défaut
    On va essayé de faire la part des choses
    l'instruction Format
    Format('Chambre %2d',[i]); // c'est la fonction format classique (aide delphi)
    si j'avais voulu avoir les jours numérotés par ex : 01 02 etc.. j'aurais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Format('Chambre %.2d',[i]);
    enfin cela est plus joli que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Calend.Cells[0,i]:='Chambre '+inttostr(i);
    A ce propos inutile de mettre Form1.Calend.cells[0,i] etc...
    Calend (la stringgrid) appartenant a de Form1

    La procédure OnDrawCell
    en première lecture cela semble correct. Une suggestion , avant de la mettre active , il vaudrait mieux voir comment s'effectue un remplissage 'classique' . Je dirais que cette partie est la dernière couche de peinture

    le schmilblick
    le noeud du problème , avec peut être des soucis de calculs de jour provoquant le
    il me sort un gros overflow, genre bien sale aussi avec un débordement de pile.
    quoique je n'en soit pas sur .

    // je dois trouver le moyen de
    // stocker ca dans un méga array
    // pour pouvoir en gérer plusieurs
    Eh oui , c'est a ça que servent des enregistrements contenues dans des tables (elles mêmes ,parfois ,contenues dans une base de données)

    je serais maintenant curieux de voir un exemple de fichier 'C:\Program Files (x86)\Borland\Delphi6\Projects\VPProg\DB\'+currmonthtxt;'
    j'apprends par la même que tu utilises D6 si tu pouvais en fournir un en pièce jointe ça serait pas mal je crois qu'il y a pas mal de boulot a faire de ce coté là

  15. #15
    Membre habitué
    Homme Profil pro
    Technicien Général
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Myanmar

    Informations professionnelles :
    Activité : Technicien Général
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    [29,10,2012,02,11,2012,8,ASIA HOL,JMR,Arrival time around 1:00PM,Confirmed]
    [1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0]
    Ceci est la réservation affichée pour 8 personnes du groupe Asia Holidays, réservation effectuée par Jean Michel R, du 29 octobre 2012 au 02 novembre 2012, statut Confirmé, avec les chambres 1, 2, 18 et 19 ( qui portent en réalité d'autres noms :/ )

    A propos de Format, je réponds illico à ton message, et je jette un coup d'oeil après.
    Ma procédure getmonthinfo est correcte ( testée avec un showmessage mégamoche mais correct ).

    La base de donnée ... ah, j'en rêve, bientôt peut-être :p
    A plus tard !
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/01/2007, 14h08
  2. formatage d'un text dans une cellule stringgrid en float
    Par iam dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/04/2006, 15h05
  3. changer de couleur dans une cellule stringgrid
    Par popy1970 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 24/04/2006, 20h21
  4. Bord de couleur pr une cellule StringGrid ou AdvStringGrid
    Par gazier20 dans le forum Composants VCL
    Réponses: 12
    Dernier message: 05/02/2006, 03h00
  5. [VB.NET] Datagrid coloration d'une cellule
    Par cosmos38240 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/07/2005, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo