![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить запись перед/над которой отпускаю 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;