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 :

Encore un overload refusé


Sujet :

Lazarus Pascal

  1. #1
    Membre éclairé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 777
    Par défaut Encore un overload refusé
    Bonjour à tous

    Décidément, j'ai des surprises en passant de D7 à Lazarus.

    J'ai un composant créé ainsi :

    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
    TMagrille : class(TDBGrids);
    // ici ddes propriétés et des fonctions
    .
    .
    .
    TMaNouvelle_Grille : class(TMagrille);
      private
        { Déclarations privées }
        FAlternateColor : TColor;
        FSelectionColor : TColor;
        FSelection : TListInteger; 
        FClePrimaireInteger : TField;
        FCleSelection : TListInteger;
        FOnListeSelectionChange: TNotifyEvent;
      protected
        { Déclarations protégées }
        procedure KeyDown(var Key: Word; Shift: TShiftState); override;
        procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
          Column: TColumn; State: TGridDrawState); override;
        procedure ListeSelectionChange; dynamic;
    et là, la procédure DrawColumnCell est refusée. Pourtant, il me semble que la Classe DBGrids à bien un évènement OnDrawColumnCell, alors j'ai du mal à comprendre pourquoi j'ai ce message :
    Error: There is no method in an ancestor class to be overridden: "procedure DrawColumnCell(const RECT;LongInt;TColumn;TGridDrawState);"

  2. #2
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 741
    Par défaut
    onDraw et Draw, c'est pas pareil ...

  3. #3
    Membre éclairé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 777
    Par défaut
    Certes, onDraw et Draw ce n'est pas pareil. Alors comment puis-je surcharger la procédure DrawColumnCell ? Je n'ai pas ce soucis en Delphi.

  4. #4
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 741
    Par défaut
    Citation Envoyé par JP.NUAGE Voir le message
    Certes, onDraw et Draw ce n'est pas pareil. Alors comment puis-je surcharger la procédure DrawColumnCell ? Je n'ai pas ce soucis en Delphi.
    Il y a des différences entre Lazarus et Delphi dans pas mal de composants, alors, il se peut que DrawColumnCell n'existe pas dans Lazarus (pas le temps de chercher). Le mieux est de regarder dans le sources de dbgrids pour voir comment sont gèrer les évènements OnDraw....

    Bon courage

    JS

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je commence un peu à décrocher en Lazarus... et je connais mal les dbGrids puisque j'utilisais mes propres dbStringGrids. Donc le propos suivant est peut être complètement erroné.

    Il me semble que le DrawColumnCell est un évènement des dbGrids : "The OnDrawColumnCell event handler is called... "

    En Lazarus, je ne sais pas si on peut "overrider" un évènement... Je n'y suis jamais arrivé... J'ai utilisé une méthode de contournement.

    J'ai enlevé ce qui n'a pas d'utilité pour vous dans l'ancien code de mes lzBtitButton et laissé ce qui me permettait "d'overrider" l'évènement MouseUp. J'espère que cela pourra vous être utile. Par réplication, même si c'est un peu lourd, je pense que vous pouvez contourner votre problème de la même manière.

    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
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons;
     
    type
      TlzBitBtn = class(TBitBtn)
      private
      { Private declarations }
     
        // Modification des événements............................... [partie 1]
        FOnMouseUp   : TNotifyEvent;
     
        // Modification des évènements............................... [partie 1-bis]
        procedure SelfOnMouseUp (Sender: TObject; Button: TMouseButton;
                  Shift: TShiftState; X, Y: Integer);    
     
      protected
        { Protected declarations }
     
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
     
      published
        { Published declarations }
     
        // Modification des évènements .................................. [partie 2]
        property OnMouseUp : TNotifyEvent read FOnMouseUp write FOnMouseUp;
    end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      {$I lzbitbtn_icon.lrs}
      RegisterComponents('Additionlz',[TlzBitBtn]);
    end;
     
    constructor TlzBitBtn.Create(AOwner: TComponent);
    begin
        Inherited Create(AOwner);
        // Modification de l'évènement OnMouseUp..................... [partie 3]
        Inherited OnMouseUp := @SelfOnMouseUp;
    end;
     
    destructor TlzBitBtn.Destroy;
    begin
      inherited Destroy;
    end;
     
     
    procedure TlzBitBtn.SelfOnMouseUp(Sender: TObject;Button: TMouseButton;
              Shift: TShiftState; X, Y: Integer);
    begin
      {Mon code : ici placé avant ce qui serait le inherited d'un classique override}
      if Button <> mbLeft then
       inherited
      else begin
       if (X > 0) and (X < Self.Width) and (Y > 0) and (Y < Self.Height) then
        Self.Glyph := FBitmapOver
       else
        Self.Glyph := FBitmapOut;
     
      //Si code OnMouseUp alors l'exécuter
      if Assigned(FOnMouseUp) then FOnMouseUp(Sender);
      //Cette dernière ligne est à éliminer s'il s'agit d'un code de remplacement et
      //non d'un code complémentaire précédant ou suivant le code de l'utilisateur.
     
      end;
    end;
    En conclusion, le principe du contournement est simple même s'il est un peu long à écrire. De prime abord je peux supposer qu'il est réplicable mais sans certitude car je n'ai plus de Lazarus installé.... histoire de ne pas me laisser tenter et surtout de ne pas interférer avec mon apprentissage de QT/C++... Je crois d'ailleurs que son maintien lors d'une tentative récente a été -sans être prédominante- une des causes de mon rejet de FMX.

    Bonne continuation.
    Cordialement. Gilles
    Dernière modification par Invité ; 22/11/2013 à 16h02.

  6. #6
    Membre éclairé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 777
    Par défaut
    Merci selzig pour cette approche, hélas, elle ne fonctionne pas. Je pense que OnDrawColumnCell n'est pas un NotifyEvent et le chainage n'est pas accepté par le compilateur et donc

    Ce qui me surprend est que j'arrive sur l'ordre Repaint, et que celui-ci n'appelle pas du tout la procedure DrawColumnCell

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ce n'est pas un TNotifyEvent mais un TDrawColumnCellEvent. Le principe me semble donc pouvoir être dupliqué au moins en théorie. Pour les raisons évoquées, je n'ai pas essayé.

    Cordialement. Gilles
    Dernière modification par Invité ; 05/12/2013 à 17h01.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je viens rapidement de vérifier. Le principe est jouable.
    Je vous transmets un composant de test lzdbgrid comprenant également un projet de test avec une minibase SQLite3 sous Win 32. Appuyez une fois sur bouton1 : cela remplit une base SQLite en mémoire (ne cherchez pas le fichier ). Et une fois sur le bouton2 : cela remplit le lzdbGrid.

    L'héritier du dbgrid colorie la dernière cellule en rouge pour les lignes impaires et vert pour les autres.

    Donc à regarder de plus près : je crois que c'est jouable. Il faut faire les tests nécessaires avant d'adopter cette solution... Mais vraiment je n'ai pas le temps.

    Cordialement. Gilles
    Fichiers attachés Fichiers attachés

  9. #9
    Membre éclairé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 777
    Par défaut
    Merci infiniment selzig. En effet c'est un TDrawColumnCellEvent. Je vais regarder ce que vous avez envoyé.

    Il y a cependant une chose que je n'arrive pas à comprendre. Voilà ce que j'ai trouvé dans le code de DBGrids
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      TCustomDBGrid=class(TCustomGrid)
      private
    .....
    .....
      public
          procedure DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
    et bien sûr, plus loin le code de cette procédure. Puis il y a la création de la classe TDBGrid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TDBGrid = class(TCustomDBGrid)
       public
    .....
    .....
    dans la rubrique public, j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); override;
    et plus loin j'ai codifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {TDBGrid}
    procedure TDBGrid.DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
       inherited;
    end;
    juste pour tester. Et bien j'ai un message me disant qu'il n'y a pas, dans un ancêtre, de procédure à surcharger ! Et là je ne pige plus.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 933
    Billets dans le blog
    6
    Par défaut
    {TDBGrid}
    procedure TDBGrid.DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
    inherited; // il n'y en a effectivement pas !!!
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TMyDBGrid = class(TDBGrid) ... ;
    procedure TMyDBGrid.DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
       inherited; // il y a bien TDBGrid.DefaultDrawColumnCell
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  2. [sql 2K5]Connection refused (encore :))
    Par Lucator dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 23/01/2008, 17h01
  3. Permission refusée (...encore)
    Par KalHadj-Nikov dans le forum ASP
    Réponses: 11
    Dernier message: 27/04/2005, 09h20
  4. TEdit (encore)
    Par dj.motte dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/12/2002, 19h02
  5. TPalette (encore)
    Par Flipper dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2002, 23h45

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