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

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

Как определить запись перед/над которой отпускаю Drop в DBGrid-e


Silver... ©   (2007-03-09 14:20:00) 

Как определить запись перед/над которой отпускаю Drop в DBGrid-e

Cell определяю так:

TDBGrid(Sender).MouseCoord(x, y).Y
TDBGrid(Sender).MouseCoord(x, y).X

а вот до записи никак не доберусь :(


Silver...   (2007-03-10 21:35:00) [1]

Ну на самом деле все не так страшно (в данном конкретном случае)

единстевенная проблемма это вставка много записей разом (но опять же в данном конкретном случае не привысит 10)

 А вообще все дело в точности, в данном случае для 10 хватит

а решение скорее доп. возможнасть нежели панацея (...эту бы строчику ниже выше, ... и всё)

... можно и ограничить

- вставка маx. 5
- когда разность падает сгенерировать Sequence
- ...


sniknik   (2007-03-09 20:49:00) [2]

> на самом деле я мучаюсь красиво это
> ...
> сделать
все похоже еще хуже чем думал...
какое начальное приращение будет между записями? т.е. NextRecord.Sequence - PrecRecord.Sequence чему равно? допустим 100, хватит? начинаешь вставлять по 100 записей, каждая получает средние между соседними значение, т.е. 50 - 25 - 12.5 - и т.д. и на сколько думаешь хватит? на 10 -15 раз по сто записей для переноса... дальше разность будет равна 0.  а у тебя будет ограничение для юзера, то данной функцией можно только 10 раз пользоваться? а дальше идут непонятные глюки "я ее тащу, а оно назад скачет...", а еще хуже, в непонятно куда.
а если есть функции выделения всего (типа Ctrl+A) и/или выделяется (и переносится) сразу 1000 записей?...


Silver...   (2007-03-09 20:41:00) [3]

Вопрос снят все работает на ура

спасибо

> sniknik ©   (09.03.07 17:08) [3]


...и всем остальным


Ega23   (2007-03-09 19:00:00) [4]


> причем вся проблема в том как получить ID записи куды кладу


[3] - ИМХО, наиболее удобно.


Silver...   (2007-03-09 18:46:00) [5]


> ANB ©   (09.03.07 18:30) [9]


Да это всё уже работает тока некрасиво а я хочу Drag and Drop
причем вся проблема в том как получить ID записи куды кладу


ANB   (2007-03-09 18:30:00) [6]


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

Небось он еще захочет эту сортировку сохранить . . .

ИМХО - на стандартном гриде задерешься эту фичу делать.


Silver...   (2007-03-09 18:11:00) [7]

на самом деле я мучаюсь красиво это

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1173273530&n=1

сделать

 Сортуровку Юзер может делать как хочет кликая по заголовку, но если ему ручная сортировка нужна по какому нибудь тока ему извесному принципу будет ручками таскать.
 Вот тут и проблемы начинаются ибо если надо переместить по више или по ниже области видения :( облом

 New_Y = 1 для ID=1 и для ID=3

id
--------------
1
2
3                  - "область видения"
4
5
-----------
3
4
5                      - Др. "область видения" - после скрулинга
6
7

Вот отсюда и желание плучть ID той записи куда кладу


Ega23   (2007-03-09 18:10:00) [8]


> посмотри на приведенный код внимательней... первые 2 строчки.


Сорри. Протест снят.  :)


sniknik   (2007-03-09 18:05:00) [9]

> Ага. Вот только у стандартного TDBGrid DataLink в protected сидит.
посмотри на приведенный код внимательней... первые 2 строчки.


Ega23   (2007-03-09 17:44:00) [10]


> Ага. Вот только у стандартного TDBGrid DataLink в protected
> сидит. Так что - только свой писать, дабы так просто было.
> ..


И даже не у него, а у TCustomDBGrid...


Ega23   (2007-03-09 17:41:00) [11]


> sniknik ©   (09.03.07 17:08) [3]


Ага. Вот только у стандартного TDBGrid DataLink в protected сидит. Так что - только свой писать, дабы так просто было...


sniknik   (2007-03-09 17:08:00) [12]

> Думал можно на прямую из DBGrid-а узнать
можно, из буфера на отображение (реальный там буфер или те же ссылки в датасет тебе в принципе неважно (спорили както тут по этому поводу... я уж и не помню кто победил ;), да и как оно там на самом деле тоже...))

пример. по координатам на движения мыши показывает значение поля из 1-го столбца.
type
 TMyDBGrid = class(TDBGrid);
...
procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
 i, sr: integer;
 GridCoord: TGridCoord;
begin
 with TMyDBGrid(Sender) do begin
   GridCoord:= MouseCoord(X, Y);
   i:= GridCoord.Y;
   if i > 0 then begin
     sr:= DataLink.ActiveRecord;
     DataLink.ActiveRecord:= i-1;
     Label1.Caption:= DataLink.Fields[0].AsString;
     DataLink.ActiveRecord:= sr;
   end else
     Label1.Caption:= '<none>';
 end;
end;


в принципе все что тебе нужно, но вот сама идея порядковые номера записей использовать, вставки между записями делать, имхо убогая... (а вот как сортировка по какомунибудь полю... и т.д. бред получится/либо ограничение, вот только по одному полю отсортировал и баста, больше нельзя ;()


Silver...   (2007-03-09 16:23:00) [13]

Мне собственнто тока Значение одного поля нужно. Думал можно на прямую из DBGrid-а узнать.

если нет то наверное так лучше

DataSet.MoveBy(new_Y - old_Y);


Ega23   (2007-03-09 14:45:00) [14]

300 лет назад делал. Что и как - уже не помню. Может чем поможет:


procedure TFMain.rxgPlantGoodsEndDrag(Sender, Target: TObject; X,
 Y: Integer);
var
xCol, xRow : LongInt;
i:Integer;
ss:string;
// OldGoodID, NewGoodID, OldGoodOrd, NewGoodOrd : Integer;
NewGoodID, NewGoodOrd : Integer;
// OldGoodNam, NewGoodNam:String;
NewGoodNam:String;
StartRow:LongInt;
begin

StartRow:=(Sender as TRXDBGrid).Row;
//@@@@@@@@@@@@@@@@@@
(Sender as TRXDBGrid).MultiSelect := True;
IsDragging:=False;
(Sender as TRXDBGrid).MouseToCell(X, Y, xCol, xRow);
// if (StartRow=xRow) or (xRow=0) then Exit;
if (xRow=0) then Exit;

{
OldGoodID:=DMmilk.RQPlantGoods.FieldByName('GoodID').AsInteger;
OldGoodOrd:=DMmilk.RQPlantGoods.FieldByName('GoodOrd').AsInteger;
OldGoodNam:=Trim(DMmilk.RQPlantGoods.FieldByName('GoodNam').AsString);
}
i:=0;
DMmilk.RQPlantGoods.DisableControls;
if StartRow<xRow then
 begin
  While (i<(xRow-StartRow)) do
   begin
    i:=i+1;
    DMmilk.RQPlantGoods.Next;
   end;
 end
else
 begin
  While (i<(StartRow-xRow)) do
   begin
    i:=i+1;
    DMmilk.RQPlantGoods.Prior;
   end;
 end;


Наверх

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