Problème Violation d'accès drag&drop entre 2 tableaux

Flash11 Messages postés 54 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 14 août 2011 - 11 août 2011 à 20:46
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 24 août 2011 à 17:14
Bonjour ,

Je vais tenter d'être le plus clair et je remercie d'avance tout ceux qui vont m'aider.

Voila j'ai un programme composé de :

-2 TDBGrid
-2 Tquery
-2 Datasource

Un TDBGrid est une table rempli et la 2ème TDBGrid est une table avec la même architecture vide.
Je souhaiterais par le biais d'un drag & drop pouvoir envoyer une ligne du TDBGrid1 dans le 2.

J'ai beaucoup cherché sur différents forums et tutorial mais je suis a court d'idée c'est pourquoi je viens vous demander de l'aide.

J'ai eu un problème qui me disait Query2:Impossible de lire surr ensemble de données en lecture seule.
Désormais mon erreur est une violation d'accès lorsque j'opère le drag & drop.


Voici mon code :
unit projetgarde;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, ExtCtrls, DBCtrls, Grids, DBGrids, RpDefine, RpRave,
  RpCon, RpConDS, StdCtrls, Menus, Mask, IBCustomDataSet, IBUpdateSQL;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    Query1: TQuery;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    Query2: TQuery;
    procedure FormCreate(Sender: TObject);
    procedure DBGrid2CellClick(Column: TColumn);
    procedure DBGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure DBGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure DBGrid1StartDrag(Sender: TObject; var DragObject: TDragObject);

  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.DBGrid1DragDrop(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.DBGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TDBGrid) and (TDBgrid(sender).DataSource <> nil);
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.DBGrid2CellClick(Column: TColumn);
begin
DBGrid2.BeginDrag(true);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Query1.Open;
  Query2.Open;

end;

end.



Merci à vous pour votre aide, Flash11.

2 réponses

Flash11 Messages postés 54 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 14 août 2011
14 août 2011 à 23:24
Up vraiment besoin d'aide
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
24 août 2011 à 17:14
Bonjour,

Il semble que ce code (dont je suis l'auteur..) ne fonctionne pas bien..

En fait, j'ai tenté d'adapter ce code pour 2 TcxGrid qui marche lui, sur
2 TDbGrid.

On peut néanmoins l'utiliser en deux temps, on sélectionne d'abord puis on glisse..mais on ne peut pas faire les deux en même temps.

le drag and drop entre deux TdbGrids n'est pas aisé à mettre au point..

A noter néanmoins cette autre méthode non testée :

Drag an drop

cantador
0
Rejoignez-nous