Bonjour,

Tout a été déclenché lorsque j'ai lu une discussion sur un autre forum de langue anglaise. Était-il possible d'obtenir, selon la colonne de la grille (StringGrid), le nom du champ utilisé par la liaison ?
Un peu comme en VCL où la DBGrid permet facilement d'obtenir le nom du champ de la colonne.

Au début je penchais pour le NON mais, à la réflexion, il s'agissait de chercher dans les livebindings. Seulement voilà, avez-vous remarqué que même si cela semble être une propriété des composants on ne peut pas accéder à celle-ci (en exemple : StringGrid1.Livebindings est tout bonnement inaccessible)

En fait il faut se pencher sur le BindingsList et rechercher dans ce dernier.
Voilà une ébauche
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
procedure TForm1.Button1Click(Sender: TObject);
var B : TContainedBindComponent;
    C : TLinkGridToDataSourceColumns;
    ib,ic : integer;
begin
  for ib:=0 to BindingsList1.BindCompCount-1 do
  begin
   B:=BindingsList1.BindComps[ib];
   if (B.ControlComponent.ClassType.ClassParent.ClassNameIs('TCustomGrid')) then
   begin
     if TLinkGridToDatasource(B).Columns.Count=0 then
       begin
        Memo1.Lines.Add('No columns defined');
        {todo  comment retrouver les colonnes dans ce cas ?}
       end
     else
     // Colonnes définies au design
     for ic := 0 to TLinkGridToDatasource(B).Columns.Count-1 do
      begin
       C :=TLinkGridToDataSourceColumns(TLinkGridToDatasource(B).Columns);
       Memo1.lines.add(c[ic].MemberName+' '+B.Index.ToString);
      end;
   end;
  end;
end;
 
function TForm1.FieldNameOfGridCol(const Grid: TcustomGrid;
  const col: Integer): String;
var B : TContainedBindComponent;
    ib : integer;
begin
 for ib:=0 to BindingsList1.BindCompCount-1 do
  begin
   B:=BindingsList1.BindComps[ib];
   if (B.ControlComponent=Grid) then
     try
       result:=TLinkGridToDataSourceColumns(TLinkGridToDatasource(B).Columns)[col].MemberName;
       break;
     except
       result:='';
     end;
  end;
end;
Seulement, ce premier jus ne fonctionne pas dans deux cas :
  • Les colonnes ne sont pas créées (le todo dans le code)
  • Les colonnes sont déplacées à l'exécution


Nom : Capture.PNG
Affichages : 243
Taille : 11,3 Ko

J'en suis là, si vous avez des suggestions je prends