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

Composants VCL Delphi Discussion :

Développement de composants et TStrings


Sujet :

Composants VCL Delphi

  1. #1
    Inactif
    Homme Profil pro
    Analyste-programmeur Delphi
    Inscrit en
    Décembre 2003
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur Delphi

    Informations forums :
    Inscription : Décembre 2003
    Messages : 490
    Points : 287
    Points
    287
    Par défaut Développement de composants et TStrings
    Bonjour à tous,

    Bien que familiarisé avec le développement de composant, pour la 1ère fois j'ai besoin d'intégrer un TStrings à un composant, avec accès à un éditeur de liste de chaînes dans l'inspecteur d'objet.
    Exactement comme la propriété Lines du TMemo.

    Je fais donc :
    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
     
    protected
        FToto:                       TStrings;
        procedure SetToto(Value: TStrings);
     
    published
        property Toto:  TStrings    read FToto     write SetToto;
     
    implementation
     
    procedure TComposant.SetToto(Value: TStrings);
    begin
      if FToto <> Value then
         FToto := Value;
    end;
    Et D7 me fait une violation d'accès dans le rtl70.bpl.

    J'ai bien regardé l'implémentation du TMemo et essayé de faire quelque chose d'approchant, mais je n'ai pas réussi à me défaire d'une erreur abstraite.

    Du coup même quand je "commente" les lignes ci-dessus, il continue de me fait la violation d'accès.

    Quelqu'un pourrait-il me permettre d'avancer ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Assigne la valeur à Toto par copie en utilisant Assign:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TComposant.SetToto(const Value: TStrings);
    begin
      if Value.Text <> FToto.Text then
        FToto.Assign(Value);
    end;
    Au cas où, tu as bien créé une instance de FToto dans le constructeur de la classe (avec libération dans le destructeur) ?

    @+ Claudius

  3. #3
    Inactif
    Homme Profil pro
    Analyste-programmeur Delphi
    Inscrit en
    Décembre 2003
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur Delphi

    Informations forums :
    Inscription : Décembre 2003
    Messages : 490
    Points : 287
    Points
    287
    Par défaut
    Autant pour moi,
    j'avais bien essayé FToto.Assign(Value) puisque c'était implémenté comme cela dans le TMemo. Comme cela ne marchait pas, j'étais revenu à mon point de départ.
    Oui, je créé l'instance de Toto dans le Create de la classe, mais je n'en gère pas la destruction. Peut-être le devrais-je ? En fait, je n'ai besoin que d'une seule instance de Toto pour fonctionner, je partais donc du principe que le nettoyage se ferait tout seul à la destruction de l'appli.
    J'ai rajouté, au cas où, la déclaration constante de Toto.
    Mon code est donc maintenant :

    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
     
    protected
        FToto: TStrings;
        procedure SetToto(const Value: TStrings);
     
    published
        property Toto:  TStrings    read FToto     write SetToto;
     
    implementation
     
    constructor TComposant.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
     
      FToto := TStrings.Create;
    end;
     
    procedure TComposant.SetToto(const Value: TStrings);
    begin
      if Value.Text <> FToto.Text then
         FToto.Assign(Value);
    end;
    Et quand j'essaie d'accéder à l'éditeur de liste de chaînes dans l'inspecteur d'objet, il me fait la fameuse "erreur abstraite".
    Je me suis dit qu'il s'agissait peut-être d'un problème d'initialisation, puisque le Lines du TMemo est initialisé à "Memo1". Mais je n'ai pas trouvé où se faisait cette initialisation.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu ne peux pas instancier un TStrings, il faut utiliser une TStringList ou mieux faire ta propre classe TStrings héritée spécifique à ton objet, comme celles d'un TMemo ou d'une TListBox
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Inactif
    Homme Profil pro
    Analyste-programmeur Delphi
    Inscrit en
    Décembre 2003
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur Delphi

    Informations forums :
    Inscription : Décembre 2003
    Messages : 490
    Points : 287
    Points
    287
    Par défaut
    Non mais j'y crois pas

    Je suis vraiment un âne

    Ca marche mieux comme ça.

    Merci à tous, je vais pouvoir continuer.

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    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
    type
      TComposant = class(TComponent)
      private
        fStrings : TStringsList;
        procedure SetToto(const Value: TStringsList);
      published
        property Toto: TStringsList  read FToto write SetToto;
      public 
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      end;
     
    implementation
     
    constructor TComposant.Create(AOwner: TComponent);
    begin
      inherited;
     
      FToto := TStringList.Create;
    end;
     
    destructor TComposant.Destroy;
    begin
      FToto.Free;
     
      inherited;
    end;
     
    procedure TComposant.SetToto(const Value: TStringList);
    begin
       FToto.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!

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

Discussions similaires

  1. [Joomla!] Tuto pour développer un composant pour Joomla 1.7
    Par poitierjohan dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 11/10/2011, 19h21
  2. [Joomla!] un excellent tutoriel pour développement de composant
    Par cool dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 29/08/2011, 21h23
  3. Réponses: 7
    Dernier message: 04/08/2010, 10h02
  4. Réponses: 4
    Dernier message: 21/12/2009, 17h16
  5. Aide pour développement de composant
    Par Bruno13 dans le forum Delphi
    Réponses: 3
    Dernier message: 18/06/2007, 14h05

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