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

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

Нужна таблица с возможностью перемещения строк внутри драг-дропом [D7, WinXP]


zinetz_victor ©   (2007-03-29 14:05:00) 

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

Понадобилось вот с пару часов - пока посмотрел на стандартный TStringGrid - у него некрасивый процесс драг-дропания: после захвата строчки курсор просто меняется на "стрелку с листиком"

а в идеале хочется красиво реализовать именно перетаскивания строчки в нужное место

Куда/на что смотреть??


zinetz_victor   (2007-03-29 18:33:00) [1]

2Elen: респект :)


Elen   (2007-03-29 15:38:00) [2]


> то-то кажеться, что просто не получится

Ха. Чепуха! Вот попробуй это :

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
   procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
     State: TDragState; var Accept: Boolean);
   procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var t:string; oar,ac,ar:integer;
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X,
 Y: Integer);
begin
Tag:=0;   StringGrid1.Cursor:=crDefault;
StringGrid1.Options:=StringGrid1.Options - [goRowSelect];
StringGrid1.Options:=StringGrid1.Options + [goEditing,goAlwaysShowEditor];
//StringGrid1.Rows[StringGrid1.Tag]:=StringGrid1.Rows[ar];
//StringGrid1.Rows[ar].Text:=t;
end;

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X,
 Y: Integer; State: TDragState; var Accept: Boolean);
var i:integer;
begin
StringGrid1.MouseToCell(x,y,ac,ar);
if (oar<>ar) then begin
 t:=StringGrid1.Rows[ar].Text;
 StringGrid1.Rows[ar]:=StringGrid1.Rows[oar];
 StringGrid1.Rows[oar].Text:=t;
 StringGrid1.Row:=ar;
end else begin
end;
oar:=ar;
end;

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StringGrid1.MouseToCell(x,y,ac,ar);
if ac=0 then begin
StringGrid1.Options:=StringGrid1.Options - [goEditing];
StringGrid1.Options:=StringGrid1.Options + [goRowSelect];
StringGrid1.Row:=ar;
StringGrid1.Tag:=ar;oar:=ar;
t:=StringGrid1.Rows[ar].Text;
StringGrid1.BeginDrag(true);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
caption:=paramstr(0);
end;

end.


zinetz_victor   (2007-03-29 15:34:00) [3]

2Elen: этого мало - хочется, чтобы визуально все выглядело именно как перетаскивание целой строки

что-то кажеться, что просто не получится... в общем, можно и не StringGrid использовать, а к примеру ListBox (хотя с ним красивше тоже пока не получается)...


Elen   (2007-03-29 14:19:00) [4]


>  после захвата строчки курсор просто меняется на "стрелку
> с листиком"

а ты не пытался задать StringGrid1. DragCursor?


zinetz_victor   (2007-03-29 14:07:00) [5]

да, забыл указать, что хотелось бы что-то более-менее стандартное (иначе бы использовал EasyListView да и все)


Наверх

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