Comment mettre (inclure) une combobox dans un stringgrid avec création dynamique de composant

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 582 fois - Téléchargée 486 fois

Contenu du snippet

J'ai trouvé ce source sur un site portugais (remerciements à l'auteur). Je l'ai modifié afin qu'il traite sans buggs la possibilité d'avoir une comboBox (mais quand on a compris pour le ComboBox, ça fonctionne aussi avec d'autres composants) dans la cellule sélectionnée d'uns StringGrid.

Créez une fiche, mettez y une StringGrid dedans et c'est tout. La ComboBox et son évènement OnExit est créé dynamiquement.

C'est très simple en fait ...

Source / Exemple :


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1SelectCell(Sender: TObject; Col, Row: Integer;
      var CanSelect: Boolean);
    procedure FormShow(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    procedure ComboBox1Exit(Sender: TObject);
  end;

var
  Form1: TForm1;
  ComboBox1:TComboBox;
  
implementation

{$R *.dfm}

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
     StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:=ComboBox1.Text;
     ComboBox1.Visible := False;
     StringGrid1.SetFocus;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject;Col,Row: Integer; var CanSelect: Boolean);
var
   R: TRect;
begin
     if (Col > 0)
     and (Row <> 0)
     then begin
          R := StringGrid1.CellRect(Col, Row);
          R.Left := R.Left + StringGrid1.Left;
          R.Right := R.Right + StringGrid1.Left;
          R.Top := R.Top + StringGrid1.Top;
          R.Bottom := R.Bottom + StringGrid1.Top;
          ComboBox1.Left := R.Left + 1;
          ComboBox1.Top := R.Top + 1;
          ComboBox1.Width := (R.Right + 1) - R.Left;
          ComboBox1.Height := (R.Bottom + 1) - R.Top;
          ComboBox1.Visible := True;
          if StringGrid1.Cells[Col,Row]<>''
          then ComboBox1.Text:=StringGrid1.Cells[Col,Row]
          else ComboBox1.Text:='';
          ComboBox1.SetFocus;
     end;
     CanSelect := True;
end;

procedure TForm1.FormShow(Sender: TObject);
Var
   X:Integer;
begin
     StringGrid1.Options:=StringGrid1.Options+[goColSizing,goThumbTracking]-[goEditing];
     ComboBox1:=TComboBox.Create(Self);
     ComboBox1.Parent:=Form1;
     ComboBox1.Visible:=False;
     ComboBox1.OnExit:=ComboBox1Exit;

     ComboBox1.Clear;
     For X:=1 to 10
     do ComboBox1.Items.Add(IntToStr(X));

end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
     ComboBox1.Free;
end;

end.

A voir également

Ajouter un commentaire Commentaires
Messages postés
33
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
8 avril 2011

SALUT,

comment faire pour colorier une ligne d'une StringGrid lorsqu'une cellule depasse une certaine valeur, c'est à dire que si la ligne nr 4 possede un cellule avec une valeur > 100 elle doit la colorier en rouge, si cetet valeur est entre 50 et 100 doit la colorier en bleu et si c'est en dessous de 50 doit la colorier en jaune. J'ai cherché sur le formu mais il n'y a aucun topic, aucun code qui soumet la couler à uen condition de valuer.
Si vous ne asavez pas ne repondez pas, cela polue plus ls forum qu'autre chose, on passe de page en page sur des suposés explicaiton qui ne sont que des embrouilles.

@+
Messages postés
1
Date d'inscription
mardi 22 août 2006
Statut
Membre
Dernière intervention
4 mai 2008

Génial merci!!
Messages postés
1
Date d'inscription
vendredi 21 mars 2008
Statut
Membre
Dernière intervention
3 avril 2008

bonjour
et merci beaucoup pour ce code il m'a vraiment aider a devvelopper mon programme mais j'ai un petit probleme c'est que je veux utilser le combobbox deux ..trois fois et parfois q'une seul fois pour entrer les données dans ma cellule c.a.d:"1,2,3" puisque je viens tous juste de debuter,,je vs pris de bien m'aider et merci.
Messages postés
6
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
1 octobre 2015

c'est simple et efficace, merci !
pour les purs débutants, voici exactement comment utiliser ce code :
1. créer un nouveau projet
2. mettre sur la forme vierge un StringGrid (onglet Win32)
3. remplacer tout le code de l'unité par celui-ci
4. retourner sur la forme et affecter les évènements suivants :
SelectCell du StringGrid
FormShow de la forme
FormCloseQuery de la forme
Messages postés
2
Date d'inscription
samedi 15 mars 2003
Statut
Membre
Dernière intervention
25 octobre 2005

Très bien et merci pour cela.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.