DBGrids [Résolu]

AEC1
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
24 décembre 2012
- 11 nov. 2009 à 18:33 - Dernière réponse : AEC1
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
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...
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 11 nov. 2009 à 23:04
3
Merci
bonsoir,

Drag and drop


cantador

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_cantador
Meilleure réponse
cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 12 nov. 2009 à 10:05
3
Merci
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

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_cantador
Meilleure réponse
cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 12 nov. 2009 à 16:25
3
Merci
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

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_cantador
Meilleure réponse
cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 25 nov. 2009 à 11:58
3
Merci
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

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_cantador
AEC1
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
24 décembre 2012
- 12 nov. 2009 à 05:26
0
Merci
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.
Commenter la réponse de AEC1
AEC1
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
24 décembre 2012
- 12 nov. 2009 à 14:44
0
Merci
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.
Commenter la réponse de AEC1
AEC1
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
24 décembre 2012
- 13 nov. 2009 à 04:29
0
Merci
Bonjours Cantador,
je vais faire quelques essais et je te contact ultérieurement. Merci une fois de plus.
Amitiés, AEC1
Commenter la réponse de AEC1
AEC1
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
24 décembre 2012
- 25 nov. 2009 à 11:50
0
Merci
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;
Commenter la réponse de AEC1
AEC1
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
24 décembre 2012
- 25 nov. 2009 à 20:38
0
Merci
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
Commenter la réponse de AEC1

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.