DBGrids

Résolu
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012 - 11 nov. 2009 à 18:33
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012 - 25 nov. 2009 à 20:38
Bonjours à tous
Je reproduit une source qui doit permettre de passer un enregistrement d'un DBGrid à un autre ou plutôt d'une table à une autre:
var i:integer;
begin
table2.edit;
for i:=0 to table1.fieldscounts-1 do
begin table2.fieldsvalues[i].assign(table1.fieldvalues[i ]);
end;
table2.post;
end;
mais elle ne fonctionne pas, me signal que l'instruction fieldscounts n'est pas déclarée.
Serait-il possible de m'indiquer une procédure qui fonctionne, qui par un simple clique sur un enregistrement de la première table par l'intermédiaire d'un DBGrid puisse passer cet enregistrement dans le second DBGrid donc dans la deuxième table.
Merci à vous tous pour votre aide.
Amités AEC1...

9 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
11 nov. 2009 à 23:04
bonsoir,

Drag and drop


cantador
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
12 nov. 2009 à 10:05
Salut AEC1,

Tu peux trouver ici ou là des exemples de drag and drop entre un conteneur (ListBox, ListView etc..) et un DbGrid mais entre deux DBGrids, ils sont plus rares...

Voilà un code perso mais qui exécute un drag and drop manuel :
UNIT Unit1;

INTERFACE

USES
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, DBTables, Grids, DBGrids;

TYPE
  TForm1 = CLASS(TForm)
    Query1: TQuery;
    DataSource1: TDataSource;
    Query2: TQuery;
    DBGrid2: TDBGrid;
    DataSource2: TDataSource;
    Query2Name: TStringField;
    Query2Capital: TStringField;
    Query2Continent: TStringField;
    Query2Area: TFloatField;
    Query2Population: TFloatField;
    DBGrid1: TDBGrid;
    Query1Name: TStringField;
    Query1Capital: TStringField;
    Query1Continent: TStringField;
    Query1Area: TFloatField;
    Query1Population: TFloatField;
    PROCEDURE DBGrid2DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; VAR Accept: Boolean);
    PROCEDURE FormCreate(Sender: TObject);
    PROCEDURE DBGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
    PROCEDURE DBGrid1StartDrag(Sender: TObject;
      VAR DragObject: TDragObject);
    PROCEDURE DBGrid1CellClick(Column: TColumn);
//    procedure DBGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
  PRIVATE
    { Déclarations privées }
  PUBLIC
    { Déclarations publiques }
  END;

VAR
  Form1: TForm1;
  DragRecords: ARRAY OF variant;
  ASource, DestSource: TDataSource;
IMPLEMENTATION

{$R *.dfm}


PROCEDURE TForm1.DBGrid2DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; VAR Accept: Boolean);
BEGIN
  Accept := (Source IS TDBGrid) AND (TDBgrid(sender).DataSource <> NIL);
END;

PROCEDURE TForm1.FormCreate(Sender: TObject);
BEGIN
  Query1.Open;
  Query2.Open;
END;

PROCEDURE TForm1.DBGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
VAR
  I: integer;
BEGIN
  DestSource := TDBGrid(sender).DataSource;
  IF ASource = DestSource THEN exit;
  TRY
    TDBGrid(sender).ReadOnly := false;
    TDBGrid(sender).DataSource.DataSet.Insert;
    FOR I := 0 TO TDBGrid(sender).FieldCount - 1 DO
      TDBGrid(sender).Fields[I].Value := DragRecords[I];
    TDBGrid(sender).DataSource.DataSet.Post;
  FINALLY
    TDBGrid(sender).ReadOnly := true;
    TDBGrid(sender).DragMode := dmManual;
  END;
END;

PROCEDURE TForm1.DBGrid1StartDrag(Sender: TObject;
  VAR DragObject: TDragObject);
VAR
  I: Integer;
BEGIN
  ASource := TDBGrid(sender).DataSource;
  SetLength(DragRecords, TDBGrid(sender).FieldCount);
  FOR I := 0 TO TDBGrid(sender).FieldCount - 1 DO
    DragRecords[I] := TDBGrid(sender).Fields[I].Value;
END;

PROCEDURE TForm1.DBGrid1CellClick(Column: TColumn);
BEGIN
  DBGrid1.BeginDrag(true);
END;

END.


on clique avec la souris et on dépose sans le glisser en cliquant une seconde fois ..

Voilà un lien qui propose une autre solution que je n'ai pas testée :
Drag and drop

cantador
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
12 nov. 2009 à 16:25
l'avantage du variant fait que cela généralise un peu plus la procédure.

Mais, tu peux mettre aussi "array of string"
pour pallier à tes difficultés sous delphi 5.


cantador
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
25 nov. 2009 à 11:58
je suis pas mal occupé en ce moment mais
précision pour copier des enregistrements de grid vers listbox, là en revanche, il y a beaucoup d'exemples sur ce site et sur d'autres comme :
wwww.delphiabout.com

bon courage


cantador
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
12 nov. 2009 à 05:26
Bonjours Cantador, il y avais longtemps que l'on ne s'est croisé su le site.
Je te remercie pour ton info. mais tu sais, je ne suis pas un expert et je craint d'avoir un peut de mal pour l'utiliser. Si tu as un peut plus à me donné afin de mieux comprendre son fonctionnement, je t'en remercie d'avance.
Sincères amitiés, AEC1.
0
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
12 nov. 2009 à 14:44
Bonjours Cantador,
encore merci pour ton aide. Cela me fais pensé en voyant ton listing que j'ai des soucis avec VARIANTS, je suis sous Delphi5 pro et chaque fois que je test un code avec cette bibliothèque, j'ai une erreur parce-que tout simplement je n'en dispose pas.
Je vais voir si je peut la récupérée sur le site. Puis aussi essayer tout cela, je te tiens au courant. Merci à bientôt AEC1.
0
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
13 nov. 2009 à 04:29
Bonjours Cantador,
je vais faire quelques essais et je te contact ultérieurement. Merci une fois de plus.
Amitiés, AEC1
0
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
25 nov. 2009 à 11:50
Bonjours Cantador,
Je me suis absenté quelques temps et je n’ai toujours pas trouvé la solution à mon problème qui maintenant devient pour moi un brin urgent. Le code qui suit est dans un bouton, il me permet quand j’ai déjà sélectionné un enregistrement dans le DBGrid2 de me l’envoyer dans la ListBox1 et je peu répété l’opération autant de fois que je le souhaite soit le même enregistrement ou un autre suivant sur lequel je suis pointé. A partir de ce principe, je souhaiterais pouvoir passer l’enregistrement que j’ai pointé dans le DBGrid2 et non plus l’envoyer dans la ListBox1 mais l’envoyé dans le DBGrid3, puisque je souhaite avoir une sélection de cette première liste qui sera regroupée dans la seconde. Une fois de plus j’ai étais bien long mais sur le plan du code je nage un max. Je te remercie beaucoup dans la mesure ou tu peu m’aidé.
AEC1
procedure TForm1.BitBtn3Click(Sender: TObject);
var // Envoyer la selection matériels dans la liste d'un service
i,j :Integer;
s:string;
begin
if DBGrid2.SelectedRows.Count>0 then with DBGrid2.DataSource.DataSet do
for i:=0 to DBGrid2.SelectedRows.Count-1 do
begin
GotoBookmark(pointer(DBGrid2.SelectedRows.Items[i]));
for j:=0 to FieldCount-1 do
begin
if(j>0)then s:=s+' | ';
s:=s+Fields[j].AsString;
s:=s+'';
end;
Listbox1.Items.Add(s);
Listbox1.Items.Add(' ');
s:='';
end;
end;
0
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
25 nov. 2009 à 20:38
Désolé de t'embêter avec ça, je sais qu'il y a plein de code pour passer d'un DBGrid à une ListBox, mais ce que je souhaité c'est de passé d'un DBGrid à un autre.
Merci quand même, au plaisir de se contacter.
AEC1
0
Rejoignez-nous