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

Composants VCL Delphi Discussion :

DBCtrlGrid, clique ne fonctionne pas dans la première cellule


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Février 2016
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2016
    Messages : 57
    Points : 11
    Points
    11
    Par défaut DBCtrlGrid, clique ne fonctionne pas dans la première cellule
    Salut tout le monde,
    J'ai un petit soucis avec le composant DBCtrlGrid mais je n'arrive pas à trouver la solution, il est relié à une base de données pour m'afficher une liste d'articles dans une grille chaque article dans une cellule , le principe est que lorsque je clique dans une cellule, l'article est choisi, tout marche sauf que si je clique au depart sur la premiere cellule(1,1) il apparaît comme désactivé jusqu’à ce que j'appuie sur une autre cellule,aidez moi SVP.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Tu es sur qu'il apparait comme désactivé mais plutôt comme "enregistrement en cours" sans avoir la focalisation ?

    Je passe souvent en SelectedColor à clMoneyGreen et ShowFocus à False pour un rendu plus compréhensible par l'utilisateur
    Je fais de même avec la TDBGrid, cela donne ainsi un visuel cohérent dans l'écran

    les 4 images du haut, c'est l'affichage par défaut
    la grande image du bas, c'est SelectedColor à clMoneyGreen et ShowFocus à False

    Nom : DBCtrlGrid.png
Affichages : 1009
Taille : 64,8 Ko

    tu ne confonds pas l'effet plus clair de TDBEdit avec un mode "désactivé"

    Dans ce code, le nombre de colonne dans le TDBCtrlGrid est dynamique, une belle usine à gaz

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    //------------------------------------------------------------------------------
    procedure TModuleZZYyyyForm.ShowYyyy();
     
      // Vide la grille, contenu et structure
      procedure ClearGrid(AGridPanel: TGridPanel);
      begin
        // Libère les Panels de AGridPanel
        AGridPanel.ControlCollection.Clear();
        // RAZ les dimensions de FGridPanel
        AGridPanel.ColumnCollection.Clear();
        AGridPanel.RowCollection.Clear();
      end;
     
      // initialise la taille (structure) de la grille
      procedure InitGrid(AGridPanel: TGridPanel; AColumnCount, ARowCount: Integer);
      var
        I: Integer;
        RowItem: TRowItem;
        ColItem: TColumnItem;
      begin
        ClearGrid(AGridPanel);
     
        for I := 0 to AColumnCount - 1 do
        begin
          ColItem := AGridPanel.ColumnCollection.Add();
          ColItem.SizeStyle := ssPercent;
          ColItem.Value := 100 / AColumnCount;
        end;
     
        for I := 0 to ARowCount - 1 do
        begin
          RowItem := AGridPanel.RowCollection.Add();
          RowItem.SizeStyle := ssPercent;
          RowItem.Value := 100 / ARowCount;
        end;
      end;
     
      // AutoSize est refusée dans un TDBCtrlGrid et Wordwrap est ignoré
      // Gestion manuelle de l'AutoSize
      function GetRayonLibelleMaxTextWidth(): Integer;
      var
        Remember: TBookmark;
      begin
        Result := 0;
        with FConfiguration.Yyyy do
        begin
          Remember := Bookmark;
          try
            First();
            while not EOF do
            begin
              Result := Max(Result, DBTextYyyySousRayon.Font.GetTextWidth(SousRayonLibelle));
              Next();
            end;
          finally
            Bookmark := Remember;
          end;
        end;
      end;
     
      // Création des Editeurs pour la largeur et la profondeur pour chaque groupe de magasin
      procedure ShowLargeurEtProfondeur();
      var
        I: Integer;
        GridWidth, ColWidth, SRWidth: Integer;
        EditorHeight: Integer;
        Editor: TDBEdit;
        Legend: TPanel;
      begin
        with FConfiguration.Yyyy do
        begin
          // Calcul de la taille d'un Edit
          ColWidth := Max(Font.GetTextWidth(IntToStr(LargeurMaxValue)), Font.GetTextWidth(IntToStr(ProfondeurMaxValue))) + Font.GetTextWidth('  ');
          // Calcul de la taille de la grille des Edit
          GridWidth := (ColWidth+2) * GroupeMagasinCount;
          // Calcul d'un manuel de l'AutoSize de libellé de sous rayon
          SRWidth := GetRayonLibelleMaxTextWidth();
     
          // Défini la structure de la grille de titre et la grille de données
          InitGrid(GridPanelYyyyGroupeMagasinTitle, GroupeMagasinCount, ROW_TITLE_COUNT);
          InitGrid(GridPanelYyyyGroupeMagasin, GroupeMagasinCount, ROW_STOCK_COUNT);
     
          DBTextYyyySousRayon.DataField := FieldSousRayonLibelle.FieldName;
     
          EditorHeight := 0;
          for I := 0 to GroupeMagasinCount - 1 do
          begin
            // Titre
            Legend := TPanel.Create(nil);
            GridPanelYyyyGroupeMagasinTitle.ControlCollection.AddControl(Legend, I, ROW_TITLE_INDEX);
            Legend.Parent := GridPanelYyyyGroupeMagasinTitle; // le Parent d'un contrôle libère le contrôle.
            Legend.Align := alClient;
            Legend.Caption := GroupeMagasinCodes[I];
            Legend.Hint := GroupeMagasinLibelles[I];
            Legend.ShowHint := True;
     
            // Largeur
            Editor := TDBEdit.Create(nil);
            GridPanelYyyyGroupeMagasin.ControlCollection.AddControl(Editor, I, ROW_STOCK_LARGEUR_INDEX);
            Editor.Align := alClient;
            Editor.Parent := GridPanelYyyyGroupeMagasin; // le Parent d'un contrôle libère le contrôle.
            Editor.DataField := FieldLargeurs[I].FieldName;
            Editor.DataSource := DSYyyy;
            if I = 0 then
              Inc(EditorHeight, Editor.Height);
     
            // Profondeur
            Editor := TDBEdit.Create(nil);
            GridPanelYyyyGroupeMagasin.ControlCollection.AddControl(Editor, I, ROW_STOCK_PROFONDEUR_INDEX);
            Editor.Align := alClient;
            Editor.Parent := GridPanelYyyyGroupeMagasin; // le Parent d'un contrôle libère le contrôle.
            Editor.DataField := FieldProfondeurs[I].FieldName;
            Editor.DataSource := DSYyyy;
            if I = 0 then
              Inc(EditorHeight, Editor.Height);
          end;
        end;
     
        // Gestion manuelle de la taille de la grille des Edit en fonction de la taille cumulée des Edit
        GridPanelYyyyGroupeMagasin.Height := EditorHeight;
        // Défini la taille d'un panneau qui s'adapte à son contenu
        DBCtrlGridYyyy.PanelWidth := Max(GridPanelYyyyGroupeMagasin.Left + GridWidth, SRWidth) + 4;
        DBCtrlGridYyyy.PanelHeight := GridPanelYyyyGroupeMagasin.Top + EditorHeight + 4;
        // Gestion de la molette de la souris
        FOldDBCtrlGridYyyyWindowProc := DBCtrlGridYyyy.WindowProc;
        DBCtrlGridYyyy.WindowProc := DBCtrlGridYyyyWindowProc;
     
        // Pour agrandir le conteneur de la grille qui donne les dimensions maximum de la grille a panneau,
        // il faut agrandir le parent qu'il se charge d'agrandir le reste,
        // la grille est SANS ancrage (obligatoire pour que PanelHeight soit conservé intact) et dépend de son conteneur qui lui fourni sa taille maximale
        // le conteneur de la grille est TOUT ancrage et aligné avec marges !
        pnlYyyy.Constraints.MinWidth := grpYyyy.Left + pnlYyyyGrid.Left*2 + DBCtrlGridYyyy.PanelWidth + 4;
        GridPanelYyyyGroupeMagasin.Width := GridWidth;
        // Najia veut un écran plus "espacé"
        pnlYyyy.Width := Min(pnlYyyy.Constraints.MinWidth * 3 div 2, Screen.WorkAreaWidth div 3 * 2);
     
        // Calcul de la taille en fonction du nombre de panneau
        pnlYyyyGrid.Width := grpYyyy.ClientWidth - pnlYyyyGrid.Left*2;
        DBCtrlGridYyyy.AdjustSizeAccording(pnlYyyyGrid.Height, pnlYyyyGrid.Width);
      end;
     
    var
      Patience: TObject;
    begin
      Patience := TXxxxPatience.Create();
      try
        TXxxxPatience.Show(Patience);
     
        ShowLargeurEtProfondeur();
        DSYyyy.DataSet := FConfiguration.Yyyy;
     
        TXxxxPatience.Hide(Patience);
      finally
        Patience.Free();
      end;
    end;
    Sous XE2 la même chose avec les thèmes, il faut dessiner manuellement car SelectedColor n'est pas géré par les thèmes dans cette version et même la couleur de sélection normale du thème n'est pas utilisée

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
     
    //------------------------------------------------------------------------------
    procedure TModuleZZYyyyForm.DBCtrlGridYyyyPaintPanel(DBCtrlGrid: TDBCtrlGrid; Index: Integer);
    begin
      if not DBCtrlGrid.ThemeUseSelectedColor and (DBCtrlGrid.PanelIndex = Index) then
      begin
        if DBCtrlGrid.Focused or (ActiveControl is TDBCtrlPanel) then
          DBCtrlGrid.DrawSelection(Index)
        else
          DBCtrlGrid.DrawSelection(Index, DBCtrlGrid.SelectedColor);
      end;
    end;
     
    ...
     
      TDBCGridSliteHelper = class helper for TDBCtrlGrid
      public
        procedure AdjustSizeAccording(MaxHeight, MaxWidth: Integer);
        procedure DrawSelection(Index: Integer; ASelectedColor: TColor = clNone);
        function ThemeUseSelectedColor(): Boolean;
      end;
     
    ...
     
    { TDBCGridSliteHelper }
     
    //------------------------------------------------------------------------------
    procedure TDBCGridSliteHelper.AdjustSizeAccording(MaxHeight, MaxWidth: Integer);
    begin
      with TDBCtrlGridSLTAssistant.Create(Self) do
      try
        AdjustSizeAccording(MaxHeight, MaxWidth);
      finally
        Free();
      end;
    end;
     
    //------------------------------------------------------------------------------
    procedure TDBCGridSliteHelper.DrawSelection(Index: Integer; ASelectedColor: TColor = clNone);
    begin
      with TDBCtrlGridSLTAssistant.Create(Self) do
      try
        DrawSelection(Index, ASelectedColor);
      finally
        Free();
      end;
    end;
     
    //------------------------------------------------------------------------------
    function TDBCGridSliteHelper.ThemeUseSelectedColor(): Boolean;
    begin
      Result := TDBCtrlGridSLTAssistant.ThemeUseSelectedColor;
    end;
     
     
    //------------------------------------------------------------------------------
    (*                SoLuTions is an Versatile Library for Delphi                 -
     *                                                                             -
     *  Copyright ou © ou Copr. "SLT Solutions", (2006)                            -
     *  contributeur : ShaiLeTroll (2007) - Passage en Classe d'un code procédural -
     *  contributeur : ShaiLeTroll (2012) - Renommage Fichier et Correction XE2    -
     *  contributeur : ShaiLeTroll (2012) - Gestion des Styles sous C++BuilderXE2  -
     *  contributeur : ShaiLeTroll (2012) - Documentation Insight                  -
     *  contributeur : ShaiLeTroll (2014) - Traduction du code C++Builder vers DelphiXE2
     *                                                                             -
     * ShaiLeTroll@gmail.com                                                       -
     *                                                                             -
     * Ce logiciel est un programme informatique servant à aider les développeurs  -
     * Delphi avec une bibliothèque polyvalente, adaptable et fragmentable.        -
     *                                                                             -
     * Ce logiciel est régi par la licence CeCILL-C soumise au droit français et   -
     * respectant les principes de diffusion des logiciels libres. Vous pouvez     -
     * utiliser, modifier et/ou redistribuer ce programme sous les conditions      -
     * de la licence CeCILL-C telle que diffusée par le CEA, le CNRS et l'INRIA    -
     * sur le site "http://www.cecill.info".                                       -
     *                                                                             -
     * En contrepartie de l'accessibilité au code source et des droits de copie,   -
     * de modification et de redistribution accordés par cette licence, il n'est   -
     * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,   -
     * seule une responsabilité restreinte pèse sur l'auteur du programme,  le     -
     * titulaire des droits patrimoniaux et les concédants successifs.             -
     *                                                                             -
     * A cet égard  l'attention de l'utilisateur est attirée sur les risques       -
     * associés au chargement,  à l'utilisation,  à la modification et/ou au       -
     * développement et à la reproduction du logiciel par l'utilisateur étant      -
     * donné sa spécificité de logiciel libre, qui peut le rendre complexe à       -
     * manipuler et qui le réserve donc à des développeurs et des professionnels   -
     * avertis possédant  des  connaissances  informatiques approfondies.  Les     -
     * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du      -
     * logiciel à leurs besoins dans des conditions permettant d'assurer la        -
     * sécurité de leurs systèmes et ou de leurs données et, plus généralement,    -
     * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.          -
     *                                                                             -
     * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez      -
     * pris connaissance de la licence CeCILL-C, et que vous en avez accepté les   -
     * termes.                                                                     -
     *                                                                             -
     *----------------------------------------------------------------------------*)
    unit SLT.Controls.VCL.DBCGridsEx;
     
    interface
     
    uses
      System.Classes, System.SysUtils, System.Types,
      Vcl.Controls, Vcl.Grids, Vcl.DBCGrids, Vcl.Themes, Vcl.Graphics,
      Data.DB,
      Winapi.Windows,
      SLT.Common.SystemEx;
     
    type
      /// <summary>Erreur liée à l'assistant TDBCtrlGridSLTAssistant de la classe TDBCGrid</summary>
      EDBCGridSLTAssistantError = class(Exception);
     
      /// <summary>Assistance de la classe TDBCGrid </summary>
      /// <remarks>Le TDBCtrlGridSLTAssistant n'est pas un class helper car lors de sa création en 2002 sous Delphi 5, le code était procédural,
      /// lors de la refonte en classe en 2007 et 2012, les versions utilisées était Delphi 7 et C++Builder 2007 puis C++Builder XE2.
      /// <para>Reprise en Delphi XE2 (en 2014) en s'inspirant du concept des Assistances de classes (Class Helper) du Delphi
      /// tout en conservant une approche OO sous la forme d'une classe externe plus élégant et explicite que les véritables "class helper".</para></remarks>
      TDBCtrlGridSLTAssistant = class(TObject)
      private
        // Membres privés
        FDBCGrid: TDBCtrlGrid;
      private
        // Accesseurs
        class function GetThemeUseSelectedColor(): Boolean; static;
      public
        // Constructeurs
        constructor Create(ADBCGrid: TDBCtrlGrid); overload;
        constructor Create(Sender: TObject); overload;
     
        /// <summary>DrawPanelBackground est un assistant pour OnPaintPanel pour afficher une autre couleur de fond que Color ou SelectedColor</summary>
        /// <param name="Index">Le paramètre Index désigne l'indice du volet à dessiner, 0 indiquant le premier volet, 1 le deuxième, etc.</param>
        /// <param name="ABackgroundColor">Couleur de fond</param>
        procedure DrawPanelBackground(Index: Integer; ABackgroundColor: TColor);
     
        /// <summary>DrawSelection est un assistant pour OnPaintPanel pour afficher une autre couleur de fond que Color ou SelectedColor</summary>
        /// <param name="Index">Le paramètre Index désigne l'indice du volet à dessiner, 0 indiquant le premier volet, 1 le deuxième, etc.</param>
        /// <param name="ASelectedColor">Couleur de fond, clNone permet d'utiliser la sélection comme dans une DBGrid</param>
        procedure DrawSelection(Index: Integer; ASelectedColor: TColor = clNone);
     
        /// <summary>AdjustSizeAccording est la réciproque de la méthode privée AdjustSize, c'est à dire quel tente d'agrandir le nombre de panels en fonction de la taille de la grille </summary>
        /// <param name="MaxHeight">MaxHeight indique la taille maximale possible pour la grille</param>
        /// <param name="MaxWidth">MaxWidth indique la taille maximale possible pour la grille</param>
        procedure AdjustSizeAccording(MaxHeight, MaxWidth: Integer);
     
        // Propriétés
        property DBCGrid: TDBCtrlGrid read FDBCGrid;
      public
        class property ThemeUseSelectedColor: Boolean read GetThemeUseSelectedColor;
      end;
     
    implementation
     
    uses SLT.Controls.VCL.DialogsEx, SLT.Controls.VCL.GraphicsEx;
     
    const
      ERR_UNASSISTED_CLASS = 'La Classe d''Assistance %s ne prend pas en charge la classe %s mais la classe %s';
     
    { TDBCtrlGridSLTAssistant }
     
    //------------------------------------------------------------------------------
    constructor TDBCtrlGridSLTAssistant.Create(ADBCGrid: TDBCtrlGrid);
    begin
      inherited Create();
     
      FDBCGrid := ADBCGrid;
    end;
     
    //------------------------------------------------------------------------------
    procedure TDBCtrlGridSLTAssistant.AdjustSizeAccording(MaxHeight, MaxWidth: Integer);
    var
      W, H, R, C: Integer;
    begin
      if DBCGrid.Orientation = goVertical then
      begin
        H := MaxHeight;
        R := H div DBCGrid.PanelHeight;
        if R <> DBCGrid.RowCount then
          DBCGrid.RowCount := R;
        if DBCGrid.Align in [alNone, alLeft, alRight] then
          DBCGrid.Width := MaxWidth;
      end
      else
      begin
        W := MaxWidth;
        C := W div DBCGrid.PanelWidth;
        if C <> DBCGrid.ColCount then
          DBCGrid.ColCount := C;
        if DBCGrid.Align in [alNone, alTop, alBottom] then
          DBCGrid.Height := MaxHeight;
      end;
    end;
     
    //------------------------------------------------------------------------------
    constructor TDBCtrlGridSLTAssistant.Create(Sender: TObject);
    begin
      inherited Create();
     
      if Assigned(Sender) then
      begin
        if Sender is TDBCtrlGrid then
          FDBCGrid := TDBCtrlGrid(Sender)
        else
          raise EDBCGridSLTAssistantError.CreateFmt(ERR_UNASSISTED_CLASS, [ClassName(), Sender.ClassName(), TDBCtrlGrid.ClassName()]);
      end
      else
        raise EDBCGridSLTAssistantError.CreateFmt(ERR_UNASSISTED_CLASS, [ClassName(), '[nil]', TDBCtrlGrid.ClassName()])
    end;
     
    //------------------------------------------------------------------------------
    procedure TDBCtrlGridSLTAssistant.DrawPanelBackground(Index: Integer; ABackgroundColor: TColor);
    var
      LRect: TRect;
      Brush: HBrush;
    begin
      if ABackgroundColor <> clNone then
      begin
        Brush := CreateSolidBrush(ColorToRGB(ABackgroundColor));
        try
          LRect := Rect(0, 0, DBCGrid.PanelWidth, DBCGrid.PanelHeight);
          FillRect(DBCGrid.Canvas.Handle, LRect, Brush);
        finally
          DeleteObject(Brush);
        end;
      end;
    end;
     
    //------------------------------------------------------------------------------
    procedure TDBCtrlGridSLTAssistant.DrawSelection(Index: Integer; ASelectedColor: TColor = clNone);
    var
      LRect: TRect;
    begin
      if ASelectedColor <> clNone then
      begin
        DrawPanelBackground(Index, ASelectedColor);
      end
      else
      begin
       LRect := Rect(0, 0, DBCGrid.PanelWidth, DBCGrid.PanelHeight);
       StyleServices.DrawElement(DBCGrid.Canvas.Handle, StyleServices.GetElementDetails(tgCellSelected), LRect);
      end;
    end;
     
    //------------------------------------------------------------------------------
    class function TDBCtrlGridSLTAssistant.GetThemeUseSelectedColor(): Boolean;
    begin
      // En XE2, cela ne gère pas la couleur de sélection,
      // ni SelectedColor ni même une couleur de thème
    {$IF CompilerVersion = CompilerVersionXE2}
      Result := not StyleServices.Enabled or StyleServices.IsSystemStyle;
    {$ELSE}
      raise EAbstractError.Create('TDBCtrlGridSLTAssistant.GetThemeUseSelectedColor');
    {$IFEND}
    end;
     
    end.

    Nom : DBCtrlGrid_themeKamri.png
Affichages : 1163
Taille : 88,2 Ko
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Février 2016
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2016
    Messages : 57
    Points : 11
    Points
    11
    Par défaut
    Salut, oui plutôt comme "enregistrement en cours" voiçi mon example
    Nom : DBCtrlGrid.png
Affichages : 1193
Taille : 82,7 Ko

    Si je clique partout ça marche mais la ou il y'a un cercle non, disant la ou l'enregistrement est focaliser le on click ne marche pas...

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Pour ce genre d'affichage, j'utilise plutôt une TListView et non une TDBCtrlGrid qui est surtout utile pour de la modification complexe et non pour un affichage de listing

    Je ne crois avoir jamais tenter de capturer le OnClick d'un TDBCtrlGrid
    As-tu mis dans les TDBLabel et TDBImage, le OnClick ?
    Faut savoir que seul les controles de l'enregistrement en cours existe vraiment, les autres, ce n'est que du dessin, heureusement car cela serait trop lourd (trop de handle pour rien)

    Si tu gère le OnClick d'un TDBCtrlGrid, cela fonctionne sur les autres car les controles TDBLabel et TDBImage n'exite pas au moment du Click ce qui te permet de le récupérer, juste après, les contrôles sont déplacés là ou il faut
    C'est pour cela qu'il change d'aspect comme je l'ai montré dans mon image
    Et comme tu as des DB Controls par dessus le TDBCtrlGrid, ce dernier ne peut plus recevoir le Click, c'est les DB Controls qui le chope à sa place, c'est un problème tout bête d'imbrication de contrôle et de Z-Order

    Il te faut donc mettre le OnClick dans les TDBLabel et TDBImage en plus de ceux du TDBCtrlGrid
    Dans le TDBCtrlGrid pour gérer les enregistrements non actif
    Dans les TDBLabel et TDBImage pour gérer l'enregistrement actif (et aussi le TDBCtrlGrid pour les endroits non recouvert par un DB Controls )
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Février 2016
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2016
    Messages : 57
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Pour ce genre d'affichage, j'utilise plutôt une TListView et non une TDBCtrlGrid qui est surtout utile pour de la modification complexe et non pour un affichage de listing

    Je ne crois avoir jamais tenter de capturer le OnClick d'un TDBCtrlGrid
    As-tu mis dans les TDBLabel et TDBImage, le OnClick ?
    Faut savoir que seul les controles de l'enregistrement en cours existe vraiment, les autres, ce n'est que du dessin, heureusement car cela serait trop lourd (trop de handle pour rien)

    Si tu gère le OnClick d'un TDBCtrlGrid, cela fonctionne sur les autres car les controles TDBLabel et TDBImage n'exite pas au moment du Click ce qui te permet de le récupérer, juste après, les contrôles sont déplacés là ou il faut
    C'est pour cela qu'il change d'aspect comme je l'ai montré dans mon image
    Et comme tu as des DB Controls par dessus le TDBCtrlGrid, ce dernier ne peut plus recevoir le Click, c'est les DB Controls qui le chope à sa place, c'est un problème tout bête d'imbrication de contrôle et de Z-Order

    Il te faut donc mettre le OnClick dans les TDBLabel et TDBImage en plus de ceux du TDBCtrlGrid
    Dans le TDBCtrlGrid pour gérer les enregistrements non actif
    Dans les TDBLabel et TDBImage pour gérer l'enregistrement actif (et aussi le TDBCtrlGrid pour les endroits non recouvert par un DB Controls )
    Trés bonne idée, je n'est pas pensé le OnClick sur TDBImage corrige bien la situation a plus de 90%, dans ce cas rare mon client ne doit pas en plus cherché en dehors de l'image ou le label pour me cassé la tete Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FTP] fopen qui ne fonctionne pas dans tous les contextes ..
    Par Christophe Charron dans le forum Langage
    Réponses: 6
    Dernier message: 15/06/2006, 10h25
  2. Réponses: 3
    Dernier message: 26/01/2006, 13h11
  3. La fonction CurrentDb() ne fonctionne pas dans une requête
    Par Sébastien Le Goyet dans le forum Access
    Réponses: 8
    Dernier message: 24/11/2005, 17h46
  4. Réponses: 1
    Dernier message: 27/10/2005, 21h48
  5. [Jar] Double clique ne fonctionne pas ...
    Par sylvain_2020 dans le forum Général Java
    Réponses: 4
    Dernier message: 11/08/2004, 19h24

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