Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Доступ к данным ячеек в DBGrid'e


Автор: FFire 5.5.2006, 22:21
Ни как не могу решить проблемку:
Как получить доступ к значению в ячейке DBGrid'а...
Т.е. имеется номер столбца/строки DBGrid'а, (х,у) а как поиметь данные типа cells(x,y) именно из DBGrid'а а не из DataSource? 

Автор: Fazil6 5.5.2006, 22:30
Цитата

как поиметь данные типа cells(x,y) именно из DBGrid'а а не из DataSource

никак. 
Grid данные только отображает, а не владеет ими. Никак кроме как через соответствующий DataSet ты до данных не доберешься. 

Автор: FFire 5.5.2006, 23:09
 --- Grid данные только отображает....

Ок.
Но что делать если очень надо ))

У меня зреет такой вариант: при отрисовке ячейки запихивать данные в массив (благо нужна не вся таблица, а только одно поле) и потом обращаться к этому массиву вроде как к ДБГриду. Как на это смотрите? 

Автор: Savek 6.5.2006, 08:14
Зачем так извращаться? чем не устраивает DataSet? 

Автор: Dynamic 6.5.2006, 08:20
DBGridEh.SelectedField.......

Добавлено @ 08:25 
про DBGrid не помню, есть ли такое св-во...  

Автор: Fazil6 6.5.2006, 09:09
Цитата

Но что делать если очень надо ))

У меня зреет такой вариант: при отрисовке ячейки запихивать данные в массив (благо нужна не вся таблица, а только одно поле) и потом обращаться к этому массиву вроде как к ДБГриду. Как на это смотрите? 

не очень понятен смысл такого алгоритма. Какая тебе разница откуда ты для массива будешь брать значения из грида или DataSet ? 

Автор: Vit 7.5.2006, 05:30
можно конечно гланды удалять через задницу и автогеном.... но не лучше ли как это принято... Смысл брать что-то прямо из DBGrid до меня плохо доходит... чем не устраивают корреспондентные поля...


PS. Новичкам бы вообще запретил пользоваться DBGrid... действует развращающе на неокрепшие знания... Совет будет - забыть вообще о существовании DBGrid на пол года, стереть его и не использовать, через пол года работы с базами данных прийдёт понимание как это всё работает и такие вопросы отпадут сами собой 

Автор: FFire 7.5.2006, 06:52
Цитата(Vit @ 7.5.2006,  05:30)
чем не устраивают корреспондентные поля...

А что такое корреспондентные поля?
Где можно о них почитать?



 

Автор: Dynamic 10.5.2006, 05:36
Поля БД, которые отображаются в гриде.
Vit имел ввиду, что программно работать с данными надо через набор данных (DataSet, Query), а не через грид. Грид - для конечного пользователя программы, а не для программиста. 

Автор: FFire 10.5.2006, 09:58
Ну понятно, естественно я через DataSet, Query работаю, добавление удаление и т.п.
Дело в другом. 
Хорошо поставлю вопрос иначе.
Пользователь выбирает в дбГриде запись (записи), мышкой водит по другим записям, а в мемо в это время выводится инфа на основании выбраной записи (или записей) и той записи над которой висит мышка.
Так вот, каким образом получить данные над которыми висит мышка (не обязательно из самого дбГрида, но обязательно те данные над которой мышь все еще висит)??

 

Автор: Dynamic 10.5.2006, 13:18
что значит
Цитата(FFire @  10.5.2006,  09:58 Найти цитируемый пост)
мышкой водит по другим записям


при выборе строки в DBGrid мышкой или с клавиатуры или скроллом изменяется текущая запись НД, с нее и читай данные. 
или или еще перефразируй вопрос, потому как непонятно, чего ты хочешь..
 

Автор: FFire 10.5.2006, 15:09
Мышкой водит, ну т.е. пользователь просто мышку перемещает, не выбирая запись. В Мемо же должна ложиться инфа по на основании уже выбранных записей и той над которой висит мышка. Что то на подобе OnHint. Только этот ОнХинт, как бы сказать, динамический и зависит не только от того над чем мышка находится но и какие записи уже выбраны. и проявляется он не как хинт (желтенькое поле) а как текст в Мемо. 
Да, очень похоже на Хинт, только без задержки.
К выбранным записям обратиться не проблема, а вот как обратится к записи которая не выделена, но над которой находится указатель (мышка по нашему)?

 

Автор: Alex 10.5.2006, 15:19
FFire, мда понимания конечно у вас отсутствует напрочь smile Ну, да ладно это дело поправимое, на сколько я вас понял вы хотите при перемещении мышки на ячейку, в которой текст полностью не помещается показать его в хинте. Так? 

Автор: FFire 10.5.2006, 15:42
Ну не в хинте, но типа того. 

Автор: Alex 10.5.2006, 16:01
А где? 

Автор: FFire 10.5.2006, 16:41
В мемо, на форме. 

Автор: Alex 10.5.2006, 17:33
это что же за издевательство вы хотите делать? 

Автор: Dynamic 11.5.2006, 08:30
OnMouseMove + ItemAtPos() (не помню, что там у грида для этого) тебе в руки.... 

Автор: Vit 11.5.2006, 15:26
Цитата(Alex @  10.5.2006,  08:33 Найти цитируемый пост)
это что же за издевательство вы хотите делать?  



Алекс, если знаешь, помоги человеку... может действительно надо... хотя задача прямо сказать не из стандартных и может не решаться 

Автор: FFire 12.5.2006, 07:46
Цитата(Dynamic @ 11.5.2006,  08:30)
OnMouseMove + ItemAtPos() 

К сожалению, метода ItemAtPos, у дбГрида нет. 

Автор: bas 12.5.2006, 09:01
Цитата(Vit @  11.5.2006,  15:26 Найти цитируемый пост)
хотя задача прямо сказать не из стандартных и может не решаться  

Даже очень нестандартная.
1.Надо знать положение курсора на экране.
2.Узнать находиться ли курсор над гридом.
3.Вычислить поле над которым находимся.
4.Вычислить номер записи и вот тут надо повозиться, так как надо узнать какие записи на экране (скажем 10 из 2000).

Можно при периресовки грида загонять все данные(и координаты тоже) в массив и оттуда считывать.

  

Автор: Dynamic 12.5.2006, 09:27
показываю направление:
Код

procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var c: TGridCoord;
    f: tfield;
begin
     c := DBGrid1.MouseCoord(x, y);
     f := DBGrid1.DataSource.DataSet.Fields[c.x];  << ----- поле под курсором
end;

 

Автор: Alex 12.5.2006, 11:42
Цитата(Vit @  11.5.2006,  16:26 Найти цитируемый пост)
Алекс, если знаешь, помоги человеку... может действительно надо... хотя задача прямо сказать не из стандартных и может не решаться

Цитата

Написать можно все - главное четко представлять, что ты хочешь получить в конце.

Код

type 
  TMyDBGrid = class (TCustomDBGrid)
  protected
    function GetTitleOffset: Byte;
  public
    property TitleOffset: Byte read GetTitleOffset;
  end;

...

procedure TfrmMain.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Cell: TGridCoord;
  DLink: TDataLink;
  OldActiveRec: Integer;
  MyGrid: TMyDBGrid;
  aTitleOffset: Byte;
begin
  if not (Sender is TDBGrid) then Exit;
  MyGrid:= TMyDBGrid(Sender);
  Cell:= MyGrid.MouseCoord(X, Y);
  DLink := MyGrid.DataLink;
  if Assigned(DLink) then begin
    aTitleOffset:= MyGrid.TitleOffset;
    if (Cell.X < MyGrid.IndicatorOffset) or (Cell.Y < aTitleOffset) then begin
      Memo1.Text:= '';
      Exit;
    end;
    OldActiveRec := DLink.ActiveRecord;
    try
      DLink.ActiveRecord := Cell.Y - aTitleOffset;
      Memo1.Text:= DBGrid1.Columns[Cell.X - MyGrid.IndicatorOffset].Field.AsString;
    finally
      DLink.ActiveRecord := OldActiveRec;
    end;
 end;
end;

{ TMyDBGrid }

function TMyDBGrid.GetTitleOffset: Byte;
var
  i: Integer;
  j: Integer;
begin
  Result:= 0;
  if dgTitles in Options then
  begin
    Result:= 1;
    if (Datalink <> nil) and (Datalink.Dataset <> nil) and Datalink.Dataset.ObjectView then begin
      for I := 0 to Columns.Count-1 do begin
        if Columns[i].Showing then begin
          j:= Columns[i].Depth;
          if j >= Result then Result:= j + 1;
        end;
      end;
    end;
  end;
end;


PS:
Кто скажет из какой статьи в DRKB сделан этот пример получит + (80% ответов на все ваши вопросы уже лежат у вас на компе, нужно просто поискать...) 

Автор: Dynamic 12.5.2006, 12:09
а можно мне?
Цитата

Как в TDBGrid узнать над каким полем висит мышь

 smile  smile  smile

Добавлено @ 12:11 
а вот еще в тему: "Как вывести Hint для ячейки DBGrid"

ЗЫ. Код не даю, ибо
Цитата(Alex @  12.5.2006,  11:42 Найти цитируемый пост)
80% ответов на все ваши вопросы уже лежат у вас на компе, нужно просто поискать...

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)