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 :

TCollection en cascade [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 TCollection en cascade
    Bonjour à toutes et à tous,

    Je suis en train de créer un composant d'affichage de courbes (un TChart à ma sauce) à partir d'un TCustomControl.

    Une de ses propriétés est un ensemble "TCollection/TCollectionItem" qui me permet de créer autant d'axes que je veux : un horizontal et un ou plusieurs verticaux. A chaque axe vertical correspond une courbe avec ses propres échelles. Tout cela fonctionne très bien.

    Mais où est le problème ? J'y viens.

    Sur chacun des axes que je peux créer, je souhaite pouvoir afficher diverses icônes. Pour cela j'utilise à nouveau un ensemble "TCollection/TCollectionItem" ; ce dernier étant cette fois une propriété attaché à un axe.

    Une des propriétés de ce dernier TCollectionItem est un TBitMap par lequel je peux adjoindre une image. Cette propriété étant publiée, lorsque je clique dessus dans l'inspecteur d'objet, s'ouvre l'éditeur d'image qui me permet de charger celle que je choisis (c'est long ).

    Là, mon image apparaît bien sur mon composant TCustomControl dans l'EDI, mais rien à l'exécution. Autrement dit, cette image ne s'est pas inscrite dans le fichier "lfm".

    Après moult tentatives infructueuses, je me suis aperçu qu'elle s'enregistrait si je modifiais une propriété de l'un des composants ancêtres au dernier ensemble "TCollection/TCollectionItem".

    J'ai inclus toute la colonie des Repaint, refresh, invalidate, update, Application.ProcessMessages, ... avant de réenregistrer et réessayer mon composant : rien n'y fait. Seul une modif telle que dite un peu avant, faite dans l'inspecteur d'objet fonctionne. J'ai bien essayé d'inclure dans mon code ce type de modif : ça ne fonctionne pas.

    Voilà, je suis à cours d'idées. Si vous en avez, grand merci.

    Cordialement.

    Pierre

  2. #2
    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
    Un complément d'info :

    Le problème n'est pas lié au TImage. J'ai supprimé ce type et je l'ai remplacé par un string. Le problème est le même : à ce deuxième niveau de TCollection, l'inscription ne se fait pas dans le fichier "lfm".

    Ce qui me paraît "bizarre" c'est que seule une action dans l'inspecteur d'objet permet de corriger ce problème. Suivez mon regard ...

    Des idées ?

    Cordialement.

    Pierre

  3. #3
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    la déclaration doit être comme ceci :


    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
    type
      TItemBitmap = class(TCollectionItem)
      private
        fCollection       : TCollection;
        fBitmap           : TBitmap;
        fOnBitmapChange   : TNotifyEvent;
        fOnBitmapProgress : TProgressEvent;
        procedure SetBitmap(Value: TBitmap);
      protected
        function GetDisplayName: string; override;
        procedure DoBitmapProgress(Sender: TObject; Stage: TProgressStage; PercentDone: Byte;
                                   RedrawNow: Boolean; const R: TRect; const Msg: string);
        procedure DoBitmapChange(Sender: TObject);
      published
        property Bitmap          : TBitmap        read fBitmap           write SetBitmap stored true;
        property OnBitmapChange  : TNotifyEvent   read fOnBitmapChange   write fOnBitmapChange;
        property OnBitmapProgres : TProgressEvent read fOnBitmapProgress write fOnBitmapProgress;
      public
        constructor Create(Collection: TCollection); override;
        destructor Destroy; override;
      end;
     
     
    { TItemBitmap }
     
    constructor TItemBitmap.Create(Collection: TCollection);
    begin
      inherited;
      fCollection        := Collection;
      fBitmap            := TBitmap.Create;
      fBitmap.OnChange   := DoBitmapChange;
      fBitmap.OnProgress := DoBitmapProgress;
    end;
     
    destructor TItemBitmap.Destroy;
    begin
      fBitmap.Free;
      inherited;
    end;
     
    procedure TItemBitmap.DoBitmapChange(Sender: TObject);
    begin
      Changed(false);
      if assigned(fOnBitmapChange) then
        fOnBitmapChange(Self);
    end;
     
    procedure TItemBitmap.DoBitmapProgress(Sender: TObject; Stage: TProgressStage; PercentDone: Byte; RedrawNow: Boolean;
      const R: TRect; const Msg: string);
    begin
      Changed(false);
      if Assigned(fOnBitmapProgress) then
        fOnBitmapProgress(Sender, Stage, PercentDone, RedrawNow, R, Msg);
    end;
     
    function TItemBitmap.GetDisplayName: string;
    begin
      result := 'Bitmap item <'+IntToStr(Index)+'>';
    end;
     
    procedure TItemBitmap.SetBitmap(Value: TBitmap);
    begin
      fBitmap.Assign(Value);
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  4. #4
    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
    Merci Dr.who pour ce morceau de code (issu de source DELPHI je pense).

    Sous Lazarus, pour que ce qui suit se compile,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      fBitmap.OnChange   := DoBitmapChange;
      fBitmap.OnProgress := DoBitmapProgress;
    il faut ajouter le signe @ tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      fBitmap.OnChange   := @DoBitmapChange;
      fBitmap.OnProgress := @DoBitmapProgress;
    Maintenant que cela se compile, ça plante à l'exécution ??? Si je change par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      OnBitmapChange   := @DoBitmapChange;
      OnBitmapProgress := @DoBitmapProgress;
    Cela ne plante plus. J'enregistre mon composant ainsi modifié, le teste et ... le problème reste entier.

    Cela est normal dans le sens où :

    1. la variable fCollection (que j'avais essayée sans succès) n'est pas utilisée dans ton code,
    2. les procédures "DoBitmapChange" et "DoBitmapProgress" ne font rien d'autres que de permettre à l'utilisateur de rajouter du code sur ces évènements.


    Tout le reste existe dans mon code.

    Par ailleurs, comme je l'ai précisé dans me première réponse, le problème n'est pas lié au TImage, il existe avec un string, un Extended, ...

    Merci tout de même.

    Pierre

  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
    Je viens de transposer mon composant en DELPHI. Le code relatif à mon composant est le même que celui sous Lazarus (excepté des "Line" qui n'existent pas en DELPHI et que j'ai remplacé pr des MoveTo et LineTo)

    Je l'ai installé dans la palette DELPHI 6 et ... tout fonctionne très bien. Donc comme je le suggérais dans ma première réponse, je pense qu'il y a un bug dans l'inspecteur d'objet. Comment fait-on pour remonter un problème ?

    Cordialement.

    Pierre

  6. #6
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    http://bugs.freepascal.org/view_all_bug_page.php

    Tu t'inscris et tu fais un rapport...

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

Discussions similaires

  1. Suppression de tables en cascade
    Par Moah dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/07/2004, 15h36
  2. Delete en cascade
    Par defrgly57 dans le forum ASP
    Réponses: 3
    Dernier message: 12/04/2004, 12h13
  3. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 11h02
  4. delete en cascade
    Par bruno270579 dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/12/2003, 17h17
  5. suppresion en cascade + postgres
    Par bruno270579 dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/12/2003, 16h27

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