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

Lazarus Pascal Discussion :

Dessiner sur le Canvas d'un TImage, d'un TPaintBox ou d'un TPanel : avantages et inconvénients? [Lazarus]


Sujet :

Lazarus Pascal

  1. #21
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour jurassic pork .
    Hallucinant . Le travail que tu t'es appuyé pour me montrer comment personnaliser une grille, et en plus parfaitement adapté à mon cas, pas seulement théorique... . Je suppose, par contre, qu'il n'est pas possible d'agir sur l'affichage des lignes de la grille pour les supprimer à l'intérieur d'une réservation, comme je fais actuellement.

    Est-ce qu'il est possible de rendre la saisie interactive?
    Je m'explique. Dans mon logiciel, par exemple, je commence par renseigner une fiche client avec au moins, le nom et le prénom (obligatoires), puis je clique sur la cellule représentant le début de la réservation, donc à l'intersection de la rangée "date de début" et de la colonne du gîte considéré, ce qui me dessine le premier petit rectangle à droite de la cellule, puis je fais de même pour la fin de la période, ce qui me dessine le petit rectangle à gauche de la cellule, remplit la zone intermédiaire et affiche les nom et prénom renseignés sur la fiche client, et supprime les lignes à l'intérieur de la zone.

    Citation Envoyé par jurassic pork
    Je suppose que tu utilises une base de données pour gérer les locataires ?
    Même pas . La quantité de donnée est faible. J'ai une vingtaine de champs par location, et l'affluence n'est pas à la hauteur de mes espérances . Je stocke l'ensemble dans un fichier texte en ASCII délimité. C'est léger et je maîtrise totalement (enfin presque) ce système (depuis Dos ).

    Quelque chose m'intrigue : Comment Affiches-tu le nom d'un locataire quand il n'a pris q'une nuitée ?
    C'est très simple, et tu vas t'en vouloir de ne pas y avoir pensé . Je ne loue pas pour une seule nuit. Ce ne sont pas des chambres d'hôtes et je ne souhaite pas faire de concurrence à l’hôtellerie. Les normes auxquelles les hôteliers sont astreints sont très importantes en comparaison avec les nôtres et je juge cette concurrence déloyale.

    Merci beaucoup ,

    amicalement,
    naute.

  2. #22
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 056
    Points : 9 477
    Points
    9 477
    Par défaut
    hello,
    Citation Envoyé par naute Voir le message
    Je suppose, par contre, qu'il n'est pas possible d'agir sur l'affichage des lignes de la grille pour les supprimer à l'intérieur d'une réservation, comme je fais actuellement.
    Cela me semble difficile à réaliser avec un TStringGrid car le tracé des lignes est la dernière étape dans le dessin des cellules (donc après onDrawCell) :
    Grid lines. The last step for each cell is to paint the grid lines: if grid options goVertLine, goHorzLine, goFixedVertLine and goFixedHorzLine are specified the cell grid is drawn at this point. Grids with only rows or only cols can be obtained by changing these options. If the programmer elected to have a "themed" look it is done at this point also (see property TitleStyle).
    Citation Envoyé par naute Voir le message
    Est-ce qu'il est possible de rendre la saisie interactive?
    Voici ce que je propose :
    1 - Ajouter un menu contextuel à la TStringGrid (TpopupMenu).
    2 - Dans ce menu ajouter deux éléments un pour le début de location et un autre pour la fin de location.
    3 - Ajouter trois variables globales :
    • Une qui mémorise la cellule de la grille quand on fait apparaître le menu contextuel de la grille.
    • Une qui mémorise la cellule de la grille quand on clique sur le début de Location.
    • Une qui mémorise la cellule de la grille quand on clique sur la fin de Location.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CellCourante,CellDeb,CellFin : TPoint;
    Et voici la gestion des événements correspondants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.StringGrid1ContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);
    begin
        CellCourante := StringGrid1.MouseToCell(MousePos);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.DebLocClick(Sender: TObject);
    begin
     CellDeb := CellCourante;
     StringGrid1.Cells[CellDeb.x,CellDeb.y] := 'Deb';
     end;
    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
    procedure TForm1.FinLocClick(Sender: TObject);
    var x: integer;
    begin
     StringGrid1.Cells[CellDeb.x,CellDeb.y] := '';
     CellFin := CellCourante;
     if  NomClient.Text = '' then  // on efface ce qui existe
        begin
        for x := CellDeb.y to CellFin.y  do
         begin
         reserv[CellDeb.x,x].jourdeb := 0;
         reserv[CellDeb.x,x].jourfin := 0;
         reserv[CellDeb.x,x].nom := '';
         reserv[CellDeb.x,x].jouraffiche := 0;
         end;
        end
     else
     begin
     reserv[CellDeb.x,CellDeb.y].jourdeb := CellDeb.y;
     for x := CellDeb.y to CellFin.y  do
         begin
         reserv[CellDeb.x,x].nom := NomClient.Text;
         if (x = CellDeb.y + 1) then reserv[CellDeb.x,x].jouraffiche := x;
         end;
     reserv[CellFin.x,CellFin.y].jourfin := CellFin.y;
     end;
     // on rafraîchit la colonne de la grille
     StringGrid1.InvalidateCol(CellFin.x);
    end;
    Je remets le code de l'événement OnDrawCell car il y avait une erreur dans mon code de mon message précédent (une ligne en trop sans conséquence).
    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
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
      aRect: TRect; aState: TGridDrawState);
    var MyRect : TRect;
     function RectDeb(myRect: Trect): TRect;
       begin
           myRect.Left := myRect.Right - myRect.Width div 3;
           RectDeb := myRect;
       end;
     function RectFin(myRect: Trect): TRect;
       begin
           myRect.Width := myRect.Width div 3;
           RectFin := myRect;
       end;
     
    begin
      if (aRow > 0 ) And (aCol > 0) then  // on est dans la partie active de la grille
        begin//
          if Reserv[aCol,aRow].nom <> '' then
            begin
              // Changer couleur suivant colonne
              if aCol = 1 then
                TStringGrid(Sender).canvas.Brush.Color :=  frGite1
              else if  aCol = 2 then
                TStringGrid(Sender).canvas.Brush.Color :=  frGite2
              else   TStringGrid(Sender).canvas.Brush.Color :=  frGite3;
              if Reserv[aCol,aRow].jourdeb = aRow then
                TStringGrid(Sender).canvas.FillRect(RectDeb(Arect));
              if Reserv[aCol,ARow].jourfin = aRow then
                TStringGrid(Sender).canvas.FillRect(RectFin(Arect));
              if (Reserv[aCol,aRow].jourdeb <> aRow) And
                 ( Reserv[aCol,ARow].jourfin <> aRow) Then
                 TStringGrid(Sender).canvas.FillRect(ARect);
              if Reserv[aCol,ARow].jouraffiche = aRow then
                 TStringGrid(Sender).Canvas.TextOut(aRect.Left + 40, aRect.Top + 2,
                   Reserv[aCol,aRow].nom);
             end;
        end;
    end;
    et voilà ce que cela donne :
    Nom : SaisiePlanning.gif
Affichages : 608
Taille : 134,8 Ko

    L'effacement des réservations est fait en mettant le nom du locataire à "vide" et en sélectionnant une zone supérieure à la zone à effacer.
    Pour un code plus robuste, il faudrait faire des tests avant de valider une location (début et fin de location dans la même colonne, fin après au moins début +1 jour etc...)

    Ami calmant, J.P (sans T)

  3. #23
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour jurassic pork .

    Superbe boulot , surtout quand je vois le temps qu'il m'a fallu et le nombre de lignes de code pour arriver un résultat similaire.

    Je vais étudier ton code en détail.

    Si j'ai bien compris, pour supprimer une location, il faut cliquer au dessus et en dessous de la période louée? En reprenant ton exemple, j'ai l'impression qu'il n'est pas possible de supprimer la location de BeanzMaster sans toucher à celle de jipété car elles sont contiguës. Or c'est un cas de figure qui peut se (s'est déjà) présenter. Mais c'est peut-être une mauvaise interprétation de ma part. De toute manière, je vais faire les tests .

    Encore merci et bravo ,

    amicalement,
    naute.

  4. #24
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 056
    Points : 9 477
    Points
    9 477
    Par défaut
    hello,
    Citation Envoyé par naute Voir le message
    Bonjour jurassic pork .
    J'ai l'impression qu'il n'est pas possible de supprimer la location de BeanzMaster sans toucher à celle de jipété car elles sont contiguës. Or c'est un cas de figure qui peut se (s'est déjà) présenter.
    Effectivement j'ai été obligé de remanier mon code pour ce cas de figure. J'ai aussi rajouté quelques champs pour la partie du locataire. Pour éviter de se disperser, je mets l'ensemble du code de mon projet en pièce jointe.
    Voilà à qui cela ressemble maintenant :

    Nom : SaisiePlanning.gif
Affichages : 463
Taille : 195,6 Ko


    PS : J'ai ajouté une version du projet qui rend le projet compatible sous linux et lazarus 1.6 ( propriété DPPI , TRect et strtoDateTime sous linux) testé sous Lubuntu 16.04 Lazarus 1.6


    Ami calmant, J.P
    Fichiers attachés Fichiers attachés

  5. #25
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour jurassic pork .

    Si j'ai bien suivi, tu veux de me faire comprendre gentiment qu'il vaudrait mieux que j'arrête d'essayer de programmer et qu'il faut laisser ça à ceux qui savent . Et ben non . Je vais quand même insister, malgré le décalage.

    Toue plaisanterie mise à part, je suis bluffé par les possibilités de customisation du TGrille que tu me fais découvrir. J'ai toujours utilisé ce composant dans sa version de base un peu tristounette (à par la coloration différente des rangées paires et impaires). Je me rends bien compte que mon utilisation des composants est très basique, et qu'elle se résume, du moins en ce qui concerne leur personnalisation, à agir sur les propriétés présentes dans l'inspecteur d'objets.

    Ma grille de planning, un TImage, est probablement plus personnalisable dans la mesure où je réalise la totalité du dessin, mais tout le traitement destiné à donner des fonctionnalités à cette grille qui au départ n'en a aucune est assez long et compliqué à développer, du moins pour moi, et j'étais quand même assez content du résultat. Mais, comme il ne s'agissait de faire qu'une grille bien définie, tout est codé en dur et la moindre modification nécessite du temps. Avec ta solution, il est évident que les modification éventuelles à apporter, quelle qu'en soient les raisons, le seront beaucoup plus simplement.

    Trois petits points à préciser :
    1 - Pourquoi la réservation de Mr et Mme Martin, que je remercie d'avoir choisi nos gîtes, ne commence-t'elle pas par un rectangle coloré à droite de la cellule, comme les autres?

    2 - La compilation du code déclenche l'exception suivante :
    Le projet reservation a levé une classe d'exception "EConvertError" avec le message :
    "01/01/2018" is not a valide date format
    J'ai remplacé les deux occurrences de la ligne
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    madate:= StrToDateTime('01/01/2018 00:00');
    par la ligne
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    maDate:= Trunc(Now)-7;
    La grille n'a en effet pas besoin de commencer avant le jour présent (je prends une semaine de marge) dans la mesure où il est peu probable que quelqu'un fasse une réservation pour le mois dernier, la technique des voyages dans le temps n'étant pas encore tout à fait au point .
    Là ça fonctionne, mais as-tu une idée sur ce qui empêche cette ligne de fonctionner chez moi alors que je suppose qu'elle fonctionne bien chez toi?

    3 - Le remplissage de la colonne de gauche (les dates) se fait en anglais. Au niveau fonctionnel, ce n'est bien sûr pas gênant, mais mon coté franchouillard se sent tout chose. Y a-t'il moyen de remédier à ça?

    Encore merci et bravo,
    amicalement,
    naute.

  6. #26
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par naute Voir le message
    3 - Le remplissage de la colonne de gauche (les dates) se fait en anglais. Au niveau fonctionnel, ce n'est bien sûr pas gênant, mais mon coté franchouillard se sent tout chose. Y a-t'il moyen de remédier à ça?
    Salut je t'ai deja répondu sur ce point dans ce message

    Bon dimanche

  7. #27
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour BeanzMaster .

    Citation Envoyé par BeanzMaster
    Salut je t'ai deja répondu sur ce point dans ce message
    Oui, je sais, et ça fonctionne d'ailleurs très bien, je te remercie, mais techniquement, si ça fournit une solution opérationnelle, ça ne résout pas le problème. Après un petit tour sur le forum, j'ai vu que je n'étais pas le seul à avoir eu ce cas, mais apparemment, personne ne l'a résolu. Je ne suis pas sûr que ça vienne de GNU-Linux parce que les dates et heures du système sont affichées correctement, de même que les champs Date dans Libre Office Writer. Pour moi, c'est interne à Lazarus. Pas forcément un bug, peut-être un mauvais paramétrage, mais je n'ai pas trouvé.

    J'ai également un autre problème lié à Lazarus, concernant la touche AltGr qui par moment ne fonctionne pas, ce qui rend entre autre la saisie des [ ] et { } compliquée. Je précise bien sûr que j'ai vérifié avec Libre Office Writer et Kate et qu'à ces moments là, ça fonctionnait parfaitement avec ces deux logiciels. En général, en redémarrant ma session Lazarus, je résous le problème, si je puis dire, mais ce n'est pas normal. Ce sont peut-être des dysfonctionnements liés à la version 1.8.2, je ne sais pas.

    @ jurassic pork

    Bonjour .

    Dans un autre ordre d'idée, j'ai un petit soucis concernant le redimensionnement de la colonne des Dates de la grille. Les dates en français sont un peu trop larges et dépassent sur les cotés (pas pour Lundi 1 Mai mais pour Mercredi 31 Septembre par exemple). Donc, je voudrais élargir cette colonne sans toucher aux autres dont la largeur est suffisante. En conception, le redimensionnement fonctionne très bien, mais à l'exécution, rien ne se passe. Je sais . Je peux bien sûr agrandir toute la grille mais je ne vois pas trop l'intérêt d'occuper tout l'écran, d'autant que les ScrollBars de la grille ne veulent pas s'afficher (on retombe ici sur des problèmes d'affichages loufoques vus dans d'autres discussions). Je dis bien ScrollBars de la grille car si je dépose un TScrollBar sur la fiche, lui il s'affiche parfaitement . Et c'est bien un problème d'affichage car les réservations à droite et en bas de la grille sont bien là, et en plus, sont opérationnelle . Enfin!!!

    Citation Envoyé par naute
    Pourquoi la réservation de Mr et Mme Martin, que je remercie d'avoir choisi nos gîtes, ne commence-t'elle pas par un rectangle coloré à droite de la cellule, comme les autres?
    C'était juste dû à un chiffre erroné :
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      reserv[3,5].jourdeb := 15;
      reserv[3,5].nom := 'Mr et Mme Martin';
    au lieu de :
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      reserv[3,5].jourdeb := 5;
      reserv[3,5].nom := 'Mr et Mme Martin';

    Amicalement,
    naute.

  8. #28
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 877
    Points : 11 373
    Points
    11 373
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Tu peux demander la largeur nécessaire pour afficher du texte dans une colonne à la fonction TCanvas.TextWidth, pour peu que le Canvas adressé ait les mêmes paramètres de fonte.

  9. #29
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour tourlourou et merci.

    Cependant, mon problème n'est pas tant de déterminer la largeur nécessaire à mon affichage que de forcer la première colonne de la grille à respecter la largeur que je lui demande . Je dois m'y prendre comme un manche parce que c'est forcément possible.

    Amicalement,
    naute.

  10. #30
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 877
    Points : 11 373
    Points
    11 373
    Billets dans le blog
    6
    Par défaut
    qqch comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StrinGrid1.Columns.items[0].Width := aCanvas.TextWidth('ma phrase la plus longue')+QuelquesPixelsDeSecurite;
    Ta phrase la plus longue peut être une constante (elle est connue à l'avance).
    Le code doit pouvoir se loger dans le OnCreate, si la grille est déjà créée à ce moment.

  11. #31
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    ,

    ça fonctionne impeccable .

    beaucoup,

    amicalement,
    naute.

  12. #32
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 056
    Points : 9 477
    Points
    9 477
    Par défaut
    hello,
    Effectivement j'avais quelques erreurs ou mauvais paramètrages dans le projet que j'avais mis en partage :

    1 - Tu as trouvé tout seul le problème avec Mr et Mme Martin.

    2 - La TstringGrid n'était pas dans son onglet si bien que les scrollbars ne fonctionnaient pas pour la grille.

    3 - Le paramètre AutoFillColumns de la TStringGrid était à True si bien que les colonnes étaient dimensionnées automatiquement pour remplir la grille entière : on ne pouvait plus imposer la largeur des colonnes (propriété Width des TgridColumns).

    En ce qui concerne ton erreur EConvert et tes dates en anglais sous linux, c'est certainement que tu n'as pas mis l'unité clocale comme je l'avais fait dans mon deuxième projet (windows et linux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    uses
    {$IFDEF UNIX}
    clocale,
    { required on Linux/Unix for formatsettings support}
    {$ENDIF}
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
      ExtCtrls, Grids, Menus, StdCtrls, XMLPropStorage,dateUtils, Types;
    J'ai apporté quelques améliorations au projet :
    1 - Les colonnes sont redimensionnables en exécution maintenant (propriété Options/GoColSizing).
    2 - La position de la fenêtre et sa taille, les propriétés de la grille (largeur de colonnes etc ...) sont mémorisés grâce à la propriété SessionProperties (choix des propriétés à mémoriser) et à un composant (qui est dans misc) TXmlPropStorage qui enregistre les propriétés à mémoriser dans un fichier xml (dans mon projet reservation.xml).
    Voici ce que cela donne sous Lubuntu 16.04 Lazarus 1.8.2 :
    Nom : Réservations_Lubuntu.png
Affichages : 388
Taille : 102,5 Ko
    En pièce jointe le projet.

    Ami calmant, J.P (sans T)
    Fichiers attachés Fichiers attachés

  13. #33
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour J.P (sans T) .

    Citation Envoyé par jurassic pork Voir le message
    La TstringGrid n'était pas dans son onglet si bien que les scrollbars ne fonctionnaient pas pour la grille.
    Je ne comprends pas ce que tu veux dire par là.

    Citation Envoyé par jurassic pork Voir le message
    En ce qui concerne ton erreur EConvert et tes dates en anglais sous linux, c'est certainement que tu n'as pas mis l'unité clocale comme je l'avais fait dans mon deuxième projet (windows et linux) :
    Exact! Pas fais attention .
    J'avais fait ça sur les conseils de BeanzMaster :
    Code Pascal : 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
     
      var
        SetFrenchDate: TFormatSettings;
     
    .../...
     
      with SetFrenchDate do
      begin
        LongMonthNames[1]:='Janvier';
        LongMonthNames[2]:='Février';
        LongMonthNames[3]:='Mars';
        LongMonthNames[4]:='Avril';
        LongMonthNames[5]:='Mai';
        LongMonthNames[6]:='Juin';
        LongMonthNames[7]:='Juillet';
        LongMonthNames[8]:='Août';
        LongMonthNames[9]:='Septembre';
        LongMonthNames[10]:='Octobre';
        LongMonthNames[11]:='Novembre';
        LongMonthNames[12]:='Décembre';
        LongDayNames[1]:='Dimanche';
        LongDayNames[2]:='Lundi';
        LongDayNames[3]:='Mardi';
        LongDayNames[4]:='Mercredi';
        LongDayNames[5]:='Jeudi';
        LongDayNames[6]:='Vendredi';
        LongDayNames[7]:='Samedi';
      end;
     
    .../...
      For x:= 1 To 365 do
     
        begin
        StringGrid1.Cells[0,x] :=  FormatDateTime('dddd d mmmm yyyy',madate,SetFrenchDate);
        madate := incDay(maDate,1);
        end;
    ce qui est une excellente solution car elle permet une vraie personnalisation, mais qui est, à l'évidence, plus longue à coder. Ici, j'ai fais le minimum pour mes besoins, mais j'imagine que si je veux couvrir l'ensemble des TFormatSettings, y a du boulot .

    Citation Envoyé par jurassic pork Voir le message
    Les colonnes sont redimensionnables en exécution maintenant (propriété Options/GoColSizing).
    J'ai également ajouté goThumbTracking pour une utilisation plus pratique de l’ascenseur.

    Citation Envoyé par jurassic pork Voir le message
    La position de la fenêtre et sa taille, les propriétés de la grille (largeur de colonnes etc ...) sont mémorisés grâce à la propriété SessionProperties (choix des propriétés à mémoriser) et à un composant (qui est dans misc) TXmlPropStorage qui enregistre les propriétés à mémoriser dans un fichier xml (dans mon projet reservation.xml).
    Excellent : Je ne connaissais pas du tout. Voilà une fonctionnalité que je vais me faire un plaisir d'utiliser. Jusqu'à présent, je stockais ce genre de paramètres dans un fichier .ini mais cette technique m'a l'air bien plus simple.

    Merci,

    amicalement,
    naute.

  14. #34
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 919
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 919
    Points : 15 356
    Points
    15 356
    Par défaut
    Salut,
    Citation Envoyé par naute Voir le message
    J'avais fait ça sur les conseils de BeanzMaster :
    Code Pascal : 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
     
      with SetFrenchDate do
      begin
        LongMonthNames[1]:='Janvier';
        LongMonthNames[2]:='Février';
        LongMonthNames[3]:='Mars';
        LongMonthNames[4]:='Avril';
        LongMonthNames[5]:='Mai';
        LongMonthNames[6]:='Juin';
        LongMonthNames[7]:='Juillet';
        LongMonthNames[8]:='Août';
        LongMonthNames[9]:='Septembre';
        LongMonthNames[10]:='Octobre';
        LongMonthNames[11]:='Novembre';
        LongMonthNames[12]:='Décembre';
        LongDayNames[1]:='Dimanche';
        LongDayNames[2]:='Lundi';
        LongDayNames[3]:='Mardi';
        LongDayNames[4]:='Mercredi';
        LongDayNames[5]:='Jeudi';
        LongDayNames[6]:='Vendredi';
        LongDayNames[7]:='Samedi';
      end;
    ce qui est une excellente solution car elle permet une vraie personnalisation, mais qui est, à l'évidence, plus longue à coder.
    Ça se discute...
    Car en termes d'ortho-typographie française (les autres pays je n'en sais rien), les noms de mois et de jour sont des noms... communs, comme table ou chaise ou chien ou chat, et donc avec ou sans majuscule selon leur position dans la phrase, hé oui ! Genre
    Aujourd'hui 23 mai 2018 est un mercredi tristounet, avec une météo aléatoire.
    Alors oui, on est loin du code et de sa rigueur, mais si ça peut passer dans un tableau, ça va beaucoup moins bien dans un texte soigné : reçu hier un courrier de ma banque où je pouvais lire le nom du mois avec la majuscule en introduction du courrier (A [sic ! Et l'accent, alors, ] Paris, le 18 Mai 2018) et en minuscule dans la première ligne du texte (le 21 mai 2018...), juste sous la date : quelle incohérence graphique !

  15. #35
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 056
    Points : 9 477
    Points
    9 477
    Par défaut
    Citation Envoyé par naute Voir le message
    Bonjour J.P (sans T)
    Je ne comprends pas ce que tu veux dire par là.
    Avant :
    Nom : Reservations_Avant.png
Affichages : 342
Taille : 17,9 Ko

    Après :
    Nom : Reservations_Après.png
Affichages : 365
Taille : 19,7 Ko


    Ami calmant, J.P (sans T)

  16. #36
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour jipété .

    Toujours sur la brèche .

    Citation Envoyé par Jipété Voir le message
    Ça se discute...
    Car en termes d'ortho-typographie française (les autres pays je n'en sais rien), les noms de mois et de jour sont des noms... communs, comme table ou chaise ou chien ou chat, et donc avec ou sans majuscule selon leur position dans la phrase, hé oui !
    Je connais parfaitement cette règle, mais, si les tables, chaises, chiens et chats sont des millions, il n'y a que 7 noms de jours et 12 noms de mois, ce qui, pour moi, leur confère la qualité de nom propre et leur donne donc le droit à la majuscule. Ce n'est pas une faute, c'est de la rébellion contre ce que j'estime illogique.

    Cela dit, je fais malheureusement, et involontairement, bien d'autres fautes, soit par étourderie, soit par méconnaissance, et je prends bien volontiers tous les conseils et toutes les remarques .

    Par contre, pour orthotypographie, il semblerait que le trait d'union ne soit pas nécessaire, mais je peux me tromper .

    Quant à la météo d'aujourd'hui, je ne sais pas où tu habites mais chez moi, en Bretagne, c'est quasi plein soleil .

    @ jurassic pork

    Pigé! Mais comment se fait-il que la grille soit visible si elle n'est pas dans l'onglet actif?

    Amicalement,
    naute.

  17. #37
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 858
    Points
    20 858
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par naute Voir le message
    Dans le cadre de la migration d'un petit soft de Windows/Delphi vers GNU-Linux/Lazarus, et comme une partie du graphisme va être à réécrire, je me pose la question du choix de la surface de dessin :
    • TImage
    • TPaintBox
    • TPanel

    Ma question est simple : quels sont les critères à prendre en considération pour effectuer un choix pertinent?
    Bonjour,

    J'arrive après la bagarre, mais il me paraît utile d'apporter une précision suite à la discussion parallèle qui a abordé indirectement le problème. Comme l'a rappelé Paul Toth, TImage a un dessin persistant, ce qui nécessite un peu plus d'outillage et de lourdeur. L'expérience montre que sous Linux le composant TImage peut ralentir de manière (très) conséquente l'affichage.

    Gilles

  18. #38
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par jurassic pork Voir le message
    Width des TgridColumns).

    En ce qui concerne ton erreur EConvert et tes dates en anglais sous linux, c'est certainement que tu n'as pas mis l'unité clocale comme je l'avais fait dans mon deuxième projet (windows et linux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    uses
    {$IFDEF UNIX}
    clocale,
    { required on Linux/Unix for formatsettings support}
    {$ENDIF}
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
      ExtCtrls, Grids, Menus, StdCtrls, XMLPropStorage,dateUtils, Types;
    Je connaissais pas l'existence de cette unité, c'est bon à savoir. Il est dommage qu'elle ne soit pas incluse dans les uses du fichier lpr comme "CThreads"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Uses
     {$IFDEF UNIX}
        {$IFDEF UseCThreads}
          cthreads,
        {$ENDIF}
         clocale,
    {$ENDIF}
    Cela me parait évident qu'il faudrait l'ajouté par défaut.

  19. #39
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour Gilles .

    Citation Envoyé par gvasseur58 Voir le message
    Bonjour,
    J'arrive après la bagarre, mais il me paraît utile d'apporter une précision suite à la discussion parallèle qui a abordé indirectement le problème. Comme l'a rappelé Paul Toth, TImage a un dessin persistant, ce qui nécessite un peu plus d'outillage et de lourdeur. L'expérience montre que sous Linux le composant TImage peut ralentir de manière (très) conséquente l'affichage.
    Gilles
    Merci pour cette précision. J'en étais déjà arrivé à cette conclusion et c'est une des raisons qui m'avait fait ouvrir ce fil. Je suis (du verbe suivre et non pas du verbe être) d'ailleurs avec attention celui auquel tu fais allusion mais n'y participe pas, n'ayant rien de constructif à y apporter. Et pourtant j'aimerais bien pouvoir être utile . Mais bon! Un jour, peut-être .

    Bonjour BeanzMaster .

    Citation Envoyé par BeanzMaster
    Je connaissais pas l'existence de cette unité, c'est bon à savoir.
    Je me sens déjà moins seul .
    Citation Envoyé par BeanzMaster
    Cela me parait évident qu'il faudrait l'ajouté par défaut.
    Oui, mais, en même temps, si ton programme ne l'utilise pas, est-ce bien utile. Je ne sais pas vraiment ce qui se passe quand j'ajoute une unité à mon programme, mais je suppose, sans en être sûr, que son code est ajouté à mon exécutable, même si je ne l'utilise pas.

    Amicalement,
    naute.

  20. #40
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par naute Voir le message
    Bonjour BeanzMaster .


    Je me sens déjà moins seul .

    Oui, mais, en même temps, si ton programme ne l'utilise pas, est-ce bien utile. Je ne sais pas vraiment ce qui se passe quand j'ajoute une unité à mon programme, mais je suppose, sans en être sûr, que son code est ajouté à mon exécutable, même si je ne l'utilise pas.

    Amicalement,
    naute.
    Salut,

    Dans le cas, de la cross-compilation je dirais que oui, car sous Windows cette fonctionnalité est automatiquement prise en compte donc faire de même avec Linux me semble logique. De plus si tu fais des traductions de ton projet en plusieurs langues la prise en charge automatique du langage du système me semble également évident. Si non tu t'imagines, pour chaque OS on devrait réaliser des fichiers de traduction supplémentaires juste pour des dates. Et dans ce cas il le faire pour Windows sera également obligatoire pour plus de simplicité et il faut que les fichiers de traductions soient synchrones. Si non à quoi bon prendre en charge la langue du système automatiquement pour un OS et pas l'autre ? C'est d'ailleurs le cas ici avec la traduction des dates.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [API HTML5] Enlever une image dessinée sur le canvas
    Par tails dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 21/01/2015, 02h19
  2. Dessiner sur un Canvas
    Par macRiaz dans le forum Composants graphiques
    Réponses: 20
    Dernier message: 12/02/2010, 20h01
  3. Dessin sur un canvas dans une DLL
    Par colorid dans le forum Langage
    Réponses: 1
    Dernier message: 07/03/2009, 14h09
  4. [C#] Dessiner sur un canvas et manipuler des formes avec la souris
    Par nemesisTHEone dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 18/01/2009, 15h37
  5. [Lazarus] [Débutant] Opération de trame dans un dessin sur un canvas
    Par Alcatîz dans le forum Lazarus
    Réponses: 3
    Dernier message: 30/10/2008, 15h17

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