Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

drag&drop в stringgrid [D7, XP]


Stringgrid ©   (2011-02-14 17:01:00) 

Здравствуйте.
Подскажите как сделать drag&drop между ячейками stringgrid, если можно с примером. В интернете куча примеров с drag&drop но между разными компонентами, а между ячейками одного компонента нет.


sniknik   (2011-02-14 22:22:00) [1]

DragMode у StringGrid1 ставишь dmAutomatic
пишешь код (без учета выхода за ячейки, сделай проверки сам)
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
   procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
   procedure StringGrid1StartDrag(Sender: TObject; var DragObject: TDragObject);
 private
   XX, YY: integer;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
 Accept:= (Source = StringGrid1) and (Sender = StringGrid1);
end;

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
 st: string;
 P: TPoint;
 ACol, ARow: integer;
begin
 with TStringGrid(Source) do begin
   P:= ScreenToClient(Point(XX, YY));
   MouseToCell(P.X, P.Y, ACol, ARow);
   st:= Cells[ACol, ARow];
   MouseToCell(X, Y, ACol, ARow);
   Cells[ACol, ARow]:= st;
 end;
end;

procedure TForm1.StringGrid1StartDrag(Sender: TObject; var DragObject: TDragObject);
begin
 XX:= Mouse.CursorPos.X;
 YY:= Mouse.CursorPos.Y;
end;

end.

простейший пример drag&drop-а, по просьбам трудящихся в stringgrid...


Stringgrid   (2011-02-14 22:22:00) [2]

Спасибо. Код из [3] то, что мне надо.


sniknik   (2011-02-14 21:53:00) [3]

> ну почему не делается, все делается
на инплейседитор событие начала "драга" вешается?

т.е. как именно между ячейками, самому хотелось бы знать. (не из stringgrid-а в себя, с последующим расчетом ячейки, как в [1] написано, а именно из ячейки в ячейку)


И. Павел   (2011-02-14 19:14:00) [4]


> И. Павел ©   (14.02.11 19:12) [3]

И еще нужно проверять, не произошел ли MouseUp вне StringGrid-а


И. Павел   (2011-02-14 19:12:00) [5]

А можно обойтись просто методами OnMouseUp/Down:
Delphi под рукой нет, так что пишу на C++Builder, чтобы не наделать ошибок. Но отличия минимальные:

int Col, Row;

void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
     TMouseButton Button, TShiftState Shift, int X, int Y)
{
 StringGrid1->MouseToCell(X, Y, Col, Row);
}

void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender,
     TMouseButton Button, TShiftState Shift, int X, int Y)
{
 int NewCol, NewRow;
 StringGrid1->MouseToCell(X, Y, NewCol, NewRow);
 StringGrid1->Cells[NewCol][NewRow] = StringGrid1->Cells[Col][Row];
}


Palladin   (2011-02-14 17:14:00) [6]

ну почему не делается, все делается


>  интернете куча примеров с drag&drop но между разными компонентами

ну и что же там написано про свойство DragMode ?


sniknik   (2011-02-14 17:11:00) [7]

так между ячейками и не делается... имхо (не работаю с stringgrid-ом), делается из компонента в компонет (сам в себя если для одного), все остальное рассчитывается  - ячейка источник это текущая, ячейка приемник это та над которой мышь в момент "дропа".


Наверх

Титульная страница Поиск, карта сайта Написать письмо