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 :

Problème de création d'un composant comportant un TEdit [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Problème de création d'un composant comportant un TEdit
    Bonjour à toutes et à tous,

    A partir d'un TGraphicControl, j'ai créé un composant TBoutonCoinRond qui n'est autre qu'un joli cadre dessiné avec TBGRABitmap et à qui j'ai affecté les deux procédures parentes MousDown et MouseUp. Cela fonctionne très bien.

    Maintenant, je voudrais créer un nouveau composant à partir de mon TBoutonCoinRond sur lequel je souhaite ajouter un TEdit. Tout ça pour avoir un TEDit avec un joli cadre.

    Et là, je tourne en rond, je patauge, je n'arrive pas à positionner le TEdit dans mon cadre, il se positionne par rapport à la fenêtre dans laquelle je dépose mon composant. Voilà le code que j'ai écrit :

    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
    type
      TEditeurCoinRond = class(TBoutonCoinRond)
      private
        Editeur: TEdit;
      protected
     
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
     
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      {$I editeurarrondi_icon.lrs}
      RegisterComponents('ChP',[TEditeurCoinRond]);
    end;
     
    constructor TEditeurCoinRond.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      Editeur:= TEdit.Create(AOwner);
      Editeur.Parent:= TWinControl(Self.Parent);
      Editeur.AutoSize:= False;
      Editeur.Left:= Left+18;
      Editeur.Top:= Top+4;
      Editeur.Width:= Width-36;
      Editeur.Height:= Height-8;
    end;
     
    destructor TEditeurCoinRond.Destroy;
    begin
      Editeur.Free;
      inherited Destroy;
    end;
     
    end.
    J'ai essayé pour la création, le parent, les positions et tailles d'utiliser Aowner, Parent, Self, ... Je n'arrive à rien, je tourne en rond.

    Question : est-ce ce que je veux faire est réalisable et si oui, comment faire ?

    NOTA : le composant TBoutonCoinRond : BoutonCoinRond.zip

    Cordialement.

    Pierre.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    La position du contrôle n'est pas encore définie au moment du Create, Left et Top sont à 0.

    Surcharge SetBounds et positionne l'edit depuis là.

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    La position du contrôle n'est pas encore définie au moment du Create, Left et Top sont à 0.

    Surcharge SetBounds et positionne l'edit depuis là.
    En attendant une réponse, j'ai regardé mon composant parent et c'est là que je me suis dit : mais quel bougre d'an...lle ! si je veux que ça se dessine, redessine, c'est dans la procédure Paint qu'il faut faire cela --> dont acte et cela fonctionne.

    J'ai essayé avec la seule surcharge de SetBounds, ça plantait à la simple dépose du composant dans une fenêtre avec une erreur du type "Access violation".

    Cordialement.

    Pierre.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Si tu as une VA c'est que tu forces la position avant que l'edit soit créé. Tu as certainement un Left/Top := 0 dans TBoutonCoinRond.Create.

    Soit tu supprimes ces Left/Top qui ne sont de toute façon pas utiles puisque les champs sont mis à zéro (ou nil) à l'instanciation, soit tu conditionnes SetBounds avec un if Assigned(Editeur) then.

    Mais Paint n'est clairement pas la bonne place pour faire ce genre de chose.

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Si tu as une VA c'est que tu forces la position avant que l'edit soit créé. Tu as certainement un Left/Top := 0 dans TBoutonCoinRond.Create.

    Soit tu supprimes ces Left/Top qui ne sont de toute façon pas utiles puisque les champs sont mis à zéro (ou nil) à l'instanciation, soit tu conditionnes SetBounds avec un if Assigned(Editeur) then.

    Mais Paint n'est clairement pas la bonne place pour faire ce genre de chose.

    J'ai supprimé le Left et le Top de mon composant TBoutonCoinRond qui effectivement ne servait à rien.

    Dans mon composant TEditeurCoinRond, j'ai surchargé la procédure SetBounds. Puis j'ai utilisé ou non le if Assigned(Editeur) :

    Si je l'utilise, quand je place le composant sur la Form, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur en déplaçant le composant EditeurCoinRond1 : TEditeurCoinRond
    Si je ne l'utilise pas, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur de création du composant TEditeurCoinRond : Access Violation.
    Voici le code de mon composant TEditeurCoinRond :

    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
    unit EditeurArrondi;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, StdCtrls, LResources, Forms, Controls, Graphics, Dialogs, BoutonArrondi;
     
    type
      TEditeurCoinRond = class(TBoutonCoinRond)
      private
        Editeur: TEdit;
      protected
    //    procedure Paint; override;
        procedure SetBounds(L, T, W, H: Integer); override;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
                            X, Y: Integer); override;
        procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
                          X, Y: Integer); override;
      published
        property OnClick;
        property OnMouseDown;
        property OnMouseUp;
        property Enabled;
        property Visible;
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      {$I editeurarrondi_icon.lrs}
      RegisterComponents('ChP',[TEditeurCoinRond]);
    end;
     
    constructor TEditeurCoinRond.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      Parent:= TWinControl(AOwner);
      Actif:= False;
      Editeur:= TEdit.Create(Parent);
      Editeur.Parent:= TWinControl(Parent);
      Editeur.BorderStyle:= bsNone;
      Editeur.AutoSize:= False;
      Editeur.Font.Style:= [fsBold];
    end;
     
    destructor TEditeurCoinRond.Destroy;
    begin
    //  Editeur.Free;
      inherited Destroy;
    end;
     
    procedure TEditeurCoinRond.SetBounds(L, T, W, H: Integer);
    begin
    //  inherited SetBounds(L, T, W, H); // Cette ligne ne change rien à l'affaire
    //  if Assigned(Editeur) then
    //  begin
        Editeur.Left:= Left+16;
        Editeur.Top:= Top+4;
        Editeur.Width:= Width-32;
        Editeur.Height:= Round((Height-8)*0.8);
        Editeur.Font.Size:= Round((Height-8)*0.5);
    //  end;
    end;
     
    {procedure TEditeurCoinRond.Paint;
    begin
      inherited Paint;
      Editeur.Left:= Left+16;
      Editeur.Top:= Top+4;
      Editeur.Width:= Width-32;
      Editeur.Height:= Round((Height-8)*0.8);
      Editeur.Font.Size:= Round((Height-8)*0.5);
    end;}
     
    procedure TEditeurCoinRond.MouseDown(Button: TMouseButton; Shift: TShiftState;
                            X, Y: Integer);
    begin
      inherited MouseDown(Button, Shift, X, Y);
    end;
     
    procedure TEditeurCoinRond.MouseUp(Button: TMouseButton; Shift: TShiftState;
                            X, Y: Integer);
    begin
      inherited MouseUp(Button, Shift, X, Y);
    end;
     
    end.
    Cordialement.

    Pierre.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    inherited est obligatoire dans SetBounds puisque le positionnement se fait dans TControl.

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

Discussions similaires

  1. [Lazarus] Problème de création de composant
    Par Gouyon dans le forum Lazarus
    Réponses: 24
    Dernier message: 05/11/2011, 23h25
  2. Réponses: 1
    Dernier message: 29/05/2007, 00h00
  3. [AS2] Problème avec ComboBox lors création d'un composant perso
    Par aldo-tlse dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 24/05/2006, 18h51
  4. Réponses: 3
    Dernier message: 16/05/2006, 16h24
  5. Problème avec la création d'un composant
    Par jeromelef dans le forum Composants VCL
    Réponses: 6
    Dernier message: 01/10/2005, 00h51

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