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 :

Mon premier composant


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut Mon premier composant
    Bonjour,

    Je dois créer un composant dans le cadre d'un cours et j'ai des problèmes dès l'installation. Pour l'installer je vais dans nouveau/autres/composants, je choisis le type d'héritage, le nom, la palette et le dossier d'enregistrement. Ensuite je clique sur installer, il me demande le paquet et il se retrouve dans ma palette "Standard".

    Il y a ça qui est encodé auto dans mon composant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    procedure Register;
     
    implementation
     
    procedure Register; 
    begin
    RegisterComponents('Standard', [MaBox]);
    end;
    Et je compile dans le paquet.

    Mais lorsque que je ferme delphi ou que je crée une nouvelle application, mon composant disparait de la palette. Quelqu'un peut-il m'aider à résoudre ce problème?

    Merci d'avance.

    Edit: Quand je fais un clic droit sur la palette et que je regarde les composants qui y sont installés le mien s'y trouve mais impossible de le faire apparaitre dans la barre.

  2. #2
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Salut Jenojen

    Je pense qu'il vaudrait mieux "isoler" ton composant dans un nouveau paquet et une nouvelle palette
    Je ne sais pas quelle est ta version de Delphi
    J'ai D6 perso et voilà comment je procèderais...
    Une fois le composant défini (menu composant/nouveau composant... [OK]), sauvegarde l'unité (.pas) après avoir modifié la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RegisterComponents('Standard', [MaBox]);
    en par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RegisterComponents('Perso', [MaBox]);
    Quand tu installeras ton composant, (menu composant/installer un composant) choisis dans nouveau paquet pour le différencier des composants standards.
    Il apparaitra dans la palette 'Perso' après que ton paquet aura été compilé
    Choisir, c'est renoncer...

  3. #3
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci de ta réponse. Il se trouve que le problème était tout simplement que j'avais choisis la mauvaise classe en héritage pour mon editbox.

    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
    procedure tbox.UpCaseFirstChar;
     
    procedure tbox.UpCaseFirstChar;
    var FirstChar: Char;
        str:string;
        i, j:integer;
    begin
     str:=Text;
     j:= length(str);
     if Str = EmptyStr then Exit;
     FirstChar := UpCase(Str[1]);
     for i=0 to i=j do begin
      if str[i]='-' then Upcase(str[i+1]);
      i:=i+1;
     end;
     
    Text := FirstChar + Copy(Str, 2, Length(Str) - 1);
    end;
    J'aurai maintenant besoin d'aide sur ce bout de code. C'est une procédure pour mettre en majuscules le premier caractère ainsi que celui suivant directement le tiret. Mais j'ai un message d'erreur qui me dit "La variable de controle de boucle doit être une variable locale simple". Hors il me semble pourtant que ça soit le cas.

    Merci de bien vouloir m'aider.

  4. #4
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Un nouveau problème se pose à moi, mon code pour mettre juste la première lettre en majuscule ne fonctionne que sur la fiche de travail mais pas lorsque le programme est compilé et exécuté. Sur la feuille de travail la première lettre s'affiche bien en majuscule mais lorsque le programme est lancé ca ne fonctionne plus. J'ai tenté de mettre ma procédure automatiquement sur l'événement onchange ou onKeypress de mon composant mais sans succès.

    Merci de bien vouloir m'aider pour ça aussi.

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Voilà un exemple.

    J'ai transformer ta procedure en function

    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
    function TForm1.UpCaseChar(Str: String): String;
    var
      Newstr: String;
      i:integer;
    begin
     NewStr := '';
     i:= 1;
     if Str = EmptyStr then Begin Exit; Result := ''; end; // si c'est vide on sort
     while i <= Length(Str) do  // Si on atteind la limite du String on sort
     Begin
      if i = 1 then NewStr := UpCase(Str[i])  // Valable une seul fois
      else
      Begin
        if (str[i]='-') and (i < Length(Str)) then  // Si on tombe sur un TIRET et que l'on est pas sur le dernier caractère (on c'est jamais si l'utilisateur de met un tiret à la fin du mot
        Begin
          NewStr := NewStr + str[i] + Upcase(str[i+1]); // On construit la nouvelle chaine
          Inc(i); // On incrémente i exceptionnellement dans ce cas
        end
        else NewStr := NewStr + str[i]; // Construction de la nouvelle chaine
      end;
      inc(i); // on passe au cractère suivant
     end;
    result := NewStr; // On retourne le résultat
    end;
    pour l'utilisation, mets un Tedit Un Tbutton dans ta form, tape ce que tu veux dans ton Tedit. (n'oublie pas de liée cette procédure à ton boutton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Edit1.Text := Upcasechar(Edit1.Text);
    end;

    Je n'ai pas du tout optimisé la function, je pense que ce n'était pas ton but.

  6. #6
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup pour ton aide,

    Par contre le truc du bouton c'est pas ce que je veux faire. La je veux intégrer ce code a mon composant (Box) qui est une editbox modifiée. Ca doit pouvoir s'appliquer sans bouton et sans qu'il y ait besoin de mettre la procédure derrière un événement pour l'utilisateur. Ce code la doit être pris en compte automatiquement dans mon composant. En gros des qu'on tape un caractère dans ma Box peut-importe son nom (Box1, Box2, etc.) le code doit s'activer pour vérifier le caractère entré et au besoin le mettre en majuscule.

    Merci de m'aider.

    edit: De plus la fonction ne peut être liée a une forme mais bien à mon composant.

    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
    unit box;
     interface
     uses
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
     StdCtrls;
     
    type
     TDonnees=string;
     Tbox = class(TEdit)
     
     
    private
    { Déclarations privées }
     FDonnees:TDonnees;
     FOnChangeCase:TNotifyEvent;
     Procedure SetDonnees(Donnees: TDonnees);
     
    protected
    { Déclarations protégées }
     
    public
     
     
     Constructor Create(AOwner:TComponent); override;
     procedure UpCaseFirstChar;
     procedure Onchange(Sender: TObject);
    { Déclarations publiques }
     
     
     
     
    published
    { Déclarations publiées }
     property Donnees:TDonnees read FDonnees write SetDonnees;
     property OnChangeCase : TNotifyEvent read FOnChangeCase write
     FOnChangeCase;
    end;
     
     
    procedure Register;
     
    implementation
     
     
    procedure tbox.UpCaseFirstChar;
    var FirstChar: Char;
        str:string;
        i, j:integer;
    begin
    str:=Text;
    j:= length(str);
    if Str = EmptyStr then Exit;
    FirstChar := UpCase(Str[1]);
    //for i=0 to i=j do begin
    //if str[i]='-' then Upcase(str[i+1]);
    //i:=i+1;
    //end;
     
    Text := FirstChar + Copy(Str, 2, Length(Str) - 1);
    if Assigned(FOnChangeCase) then FOnChangeCase(Self);
     
    end;
     
    procedure tBox.Onchange(Sender: TObject);
    begin
    upcasefirstchar;
    END;
     
     
     
     
    //if Donnees=-1 then Text:=AnsiLowerCase(Text);
    //if Assigned(FOnChangeCase) then FOnChangeCase(Self);
    //end;
     
    Constructor tbox.Create(AOwner:TComponent);
    begin
     InHerited Create(AOwner);
      Font.Color:=ClGreen;
      Donnees:='S';
      FOnChangeCase:=nil;
    end;
     
    procedure tbox.SetDonnees (Donnees: TDonnees);
    begin
     if (Donnees<>'N') or (Donnees<>'S') or (Donnees <>'M') then Donnees:='S';
     FDonnees:=Donnees;
     if (donnees='M') then UpCaseFirstChar;
    end;
     
    procedure Register;
    begin
     RegisterComponents('Standard', [tbox]);
    end;
     
     
    end.
    Voici mon code si cela permet d'y voir plus clair.

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    C'est pour t'aiguillé...

    Recherche un evenement pour ton Box qui te permet cela, je pense à onchange par exemple.
    Une fois que tu l'auras trouvé (je te laisse chercher) tu peux mettre l'interieur de la function dedans directement.

    A plus.

  8. #8
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Ok merci à force c'est passé. En fait fallait que je déclare les procédures héritées (on change, onkeypress, etc) en override. Le problème c'est que le tilt focusse sur le début de la tbox a chaque caractère entré. Comment faire pour qu'il focusse sur la fin de la chaine?

  9. #9
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Regarde du côté de TCustomEdit.SelStart
    Choisir, c'est renoncer...

  10. #10
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par OutOfRange Voir le message
    Regarde du côté de TCustomEdit.SelStart
    Merci de ta réponse,

    J'ai essayé de placer selstart:=i+1; au bout de mon code. J'arrive à compiler mais quand je veux mettre ma box sur ma feuille de travail ça me dit que "Le contrôle 'box1' n'a pas de fenêtre parente.

    Merci de m'aider.

Discussions similaires

  1. mon premier composant perso
    Par iznogoud_23 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 13/04/2011, 18h28
  2. [JSF] mon premier JSF:Cannot find FacesContext
    Par anitshka dans le forum JSF
    Réponses: 15
    Dernier message: 24/08/2007, 18h19
  3. [Débutant] Mon premier programme: rien ne va...
    Par vincent0 dans le forum OpenGL
    Réponses: 10
    Dernier message: 02/08/2005, 13h59
  4. [JSF] mon premier custom component
    Par anitshka dans le forum JSF
    Réponses: 5
    Dernier message: 14/06/2005, 13h31
  5. [debutant]Mon premier prog OpenGL
    Par Revan777 dans le forum OpenGL
    Réponses: 5
    Dernier message: 04/04/2005, 17h40

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