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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 740
    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 740
    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 740
    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 740
    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

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