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

Langage Delphi Discussion :

Probleme avec TCollectionItem


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut Probleme avec TCollectionItem

    Bonjour,

    Mon composant utilise l'éditeur de collection pour inserer des items (de type TCollectionItem). Voir la miniature

    Je n'arrive pas à retirer un item de ma collection, alors que l'éditeur le fait par l'intermédaire du deuxième bouton en partant de la gauche de l'éditeur. je n'ai pas vu de méthode héritée pour supprimer un item.Je n'ai pas non plus trouvé dans la FAQ ou le Forum une solution.

    Quelqu'un a t'il une piste ou voir, la solution?

    merci d'avance

    A+
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 446
    Points : 5 867
    Points
    5 867
    Par défaut
    salut

    ca nous parle pas beaucoup ton exemple
    tu as deriver un TCollection et un TCollectionItem ?

    un peu de code nous permettrai peut etre d'etre pls a meme de te repondre correctement

    @+ Phil

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut

    Bonjour,

    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
    unit Planning;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    	Grids;
     
    type
    	TRessource=class;
    	TPLanning=Class;
    //----------------------------------------------------------------
    	TRessource=class(TCollectionItem)
    	private
    	 { Déclarations privées }
    		FPLanning:TPlanning;
    		Ftext:String;
    		FOnClick:TNotifyEvent;
    		Procedure SetText(Const Nouveau:String);
    		//procedure SetEnabled(Nouveau:Boolean);
    	protected
    		{ Déclarations protégées }
    		function GetDisplayName:string;OverRide;
    	public
    		{ Déclarations publiques }
    		constructor Create(Collection:TCollection);OverRide;
    		destructor destroy;override;
    		procedure assign(Source:TPersistent);OverRide;
    		procedure click;
    	published
    		{ Déclarations publiées }
    		property text:string read Ftext write SetText;
    		property OnClick: TNotifyEvent Read FOnClick Write FOnClick;
    	end;
    //----------------------------------------------------------------
    	TRessources=class(TCollection)
    	private
    		{ Déclarations privées }
    		FPLanning:TPlanning;
    		Function GetItem(Index:Integer):TRessource;
    		Procedure SetItem(Index:Integer;Value:TRessource);
    	protected
    		{ Déclarations protégées }
    		Function GetOwner:TPersistent;OverRide;
    	public
    		{ Déclarations publiques }
    		constructor Create(MonPlanning:TPlanning);
    		function Add:TRessource;
    		function AddItem(Item:TRessource;Index:Integer):TRessource;
    		function insert(index:integer):TRessource;
    		property Items[Index:Integer]:TRessource read GetItem write SetItem;default;
    	published
    		{ Déclarations publiées }
    	end;
    	TRessourceClickEvent=procedure(sender:TObject;Index:Integer;Ressource:TRessource) of Object;
    //----------------------------------------------------------------
    	TPlanning = class(TStringGrid)
    	private
    		{ Déclarations privées }
    		FRessources:TRessources;
    		FOnClickRessource:TRessourceClickEvent;
    		procedure SetRessources(Nouveau:TRessources);
    	protected
    		{ Déclarations protégées }
     
    		procedure notification(Acomponent:TComponent;Operation:TOperation);OverRide;
    		//Procedure AdjustSize;OverRide;
    		//procedure paint;OverRide;
    		procedure DoClickRessource(Index:Integer;Ressource:TRessource);Virtual;
    		Procedure ClickRessource(Index:Integer);
    	public
    		{ Déclarations publiques }
    		constructor Create(AOwner:TComponent);OverRide;
    		destructor destroy;OverRide;
    	published
    		{ Déclarations publiées }
    		Property Ressources:TRessources read FRessources write SetRessources;
    		property OnClickRessource:TRessourceClickEvent read FOnClickRessource Write FOnClickRessource;
    	end;
    //----------------------------------------------------------------
    procedure Register;
     
    implementation
     
    constructor TRessource.create(Collection:TCollection);
    var x:integer;
    begin
    	Inherited;
    	FPlanning:=TRessources(Collection).FPlanning;
    	FText:='Ressource_'+inttostr(FPlanning.ressources.count-1);
    	Fplanning.Cells[0,FPlanning.ressources.count]:=Ftext;
    end;
     
    destructor TRessource.Destroy;
    begin
    	Inherited;
    end;
     
    procedure TRessource.SetText(const nouveau : string);
    begin
    	FText:=Nouveau;
    	Changed(False);
    end;
     
    function TRessource.GetDisplayName:String;
    begin
    	Result:=FText;
    end;
     
    Procedure TRessource.Click;
    begin
    	if Assigned(FOnClick) then
    		FOnClick(Self);
    	FPlanning.ClickRessource(Index);
    end;
     
    procedure TRessource.Assign(Source:Tpersistent);
    var
    	RessourceSource:TRessource;
    begin
    	if Source is TRessource then
    		begin
    			RessourceSource:=TRessource(Source);
    			FText:=RessourceSource.FText;
    			Changed(True);
    		end
    	else
    		Inherited;
    end;
    ////////////////////////////////////////////
     
    constructor TRessources.create(MonPlanning:TPlanning);
    begin
    	Inherited create(Tressource);
    	FPlanning:=MonPlanning;
    end;
     
    function TRessources.GetItem(Index:Integer):TRessource;
    begin
    	Result:=TRessource(Inherited getItem(Index));
    end;
     
    procedure TRessources.SetItem(Index:Integer;Value:TRessource);
    begin
    	Inherited SetItem(Index,Value);
    end;
     
    function TRessources.GetOwner:TPersistent;
    begin
    	result:=FPlanning;
    end;
     
    function TRessources.Add:TRessource;
    begin
    	Result:=TRessource(Inherited add);
    end;
     
    procedure TRessources.DellItem(Item:TRessource;index:Integer);
    begin
    	Item.Free;
    end;
     
    function TRessources.AddItem(Item:TRessource;Index:Integer):TRessource;
    begin
    	If Item=nil then
    		Result:=Add
    	else
    		Result:=Item;
    	if Assigned(Result) then
    		begin
    			Result.Collection:=Self;
    			if Index<0 then
    				Index:=Count-1;
    			Result.Index:=Index;
    		end;
    end;
     
    function Tressources.Insert(Index:Integer):TRessource;
    begin
    	result:=AddItem(nil,index);
    end;
     
    //----------------------------------------------------------------
    Constructor TPlanning.Create(AOwner:TComponent);
    begin
    	Inherited;
    	FRessources:=TRessources.Create(self);
    end;
     
    Destructor TPlanning.Destroy;
    begin
    	Inherited;
    end;
     
    procedure TPlanning.Notification(AComponent:TComponent;Operation:TOperation);
    var i : integer;
    begin
    	Inherited;
    end;
     
    procedure TPlanning.SetRessources(Nouveau:TRessources);
    begin
    	FRessources.Assign(Nouveau);
    end;
     
    procedure TPlanning.DoClickRessource(Index:Integer;Ressource:TRessource);
    begin
    	if Assigned(FOnClickRessource) then
    		FOnClickRessource(Self,Index,Ressource);
    end;
     
    procedure TPlanning.ClickRessource(Index:Integer);
    begin
    	if index<>-1 then
    		DoClickRessource(Index,Ressources[Index]);
    end;
     
     
    procedure Register;
    begin
    	RegisterComponents('Standard', [TPlanning]);
    end;
     
    end.
    Donc le but du jeu est de gérer les lignes de ma grille au moyen d'un collection d'item. A terme je désire pouvoir mettre sur la première colonne de chaque ligne du texte qui pourra être formaté (couloeur alignement etc.)

    Mais je n'en suis pas là.

    Pour info lorsque je supprime au moyen du bouton [supprimer] de l'editeur de collection un item, ma grille n'est pas à jour. Par contre lorsque je fais un essai elle l'est bien.

    Voilà...

    A+

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut

    Bon j'ai trouvé pour retirer une ressource :

    il faut que j'utilise la méthode Destroy de TRessource (TCollectionItem), puis supprimer une ligne de ma grille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    destructor TRessource.Destroy;
    begin
    	Inherited;
    	Fplanning.rowCount:=Fplanning.RowCount-1;
    end;
    MAintenant je vais essayer de formater le text pour chaque item

    a+

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 446
    Points : 5 867
    Points
    5 867
    Par défaut
    salut

    a mon avis ce n'est pas sur la bonne methode que tu supprime
    la ligne
    la methode destroy n'est la que pour détruire l'instance de l'objet instancié au par avant

    utilise plutot la methode delete de TCollection

    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
    unit Planning;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    	Grids;
    
    //----------------------------------------------------------------
    	TRessources=class(TCollection)
    	private
                ...
                procedure Delete(Index: Integer);
                ...
    	end;
    ...
    implementation
     
     
    procedure TRessources.Delete(Index : integer);
    begin
       Inherited Delete(Index);
    end;
    ...
    end.
    la notification devrais se faire tous seul

    @+ Phil

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut

    Salut,

    J'ai essayé comme suggéré avec la méthode delete, le problème est que la méthode delete n'existe pas dans TCollection.

    PS : Je suis sous delphi4 std.

    Pourquoi destroy n'est il pas envisageable ?

    Pour moi, lil fait ce que j'attend, c'est à dire lors de suppression depuis l'éditeur de collection, il semble bien me supprimer mon item!!!

    A+

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut

    SAlut,
    Petite précision issue de l'aide :

    TCollection.Destroy

    Détruit la collection et tous ses éléments.

    destructor Destroy; override;

    Description

    Destroy appelle la méthode Clear pour libérer tous les éléments référencés dans le tableau Items puis détruit la collection.


    TCOLLECTION.Clear

    Efface tous les éléments de la collection.

    procedure Clear;

    Description

    Clear vide le tableau Items et détruit chaque objet TCollectionItem.
    Je pense que la méthode DESTROY est tout à fait utilsable dans mon cas, qu'en pensez vous ?

    A+

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 11h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 08h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 23h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 08h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 09/06/2002, 00h06

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