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

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

Как узнать, принадлежит ли эта колонка bookmark'у? [D7, MSSQL]


Rat ©   (2005-06-14 04:57:00) 

Для Dbgrid выполняется событие onDrawColumnCell.
Ну в нем допустим все колонки раскрашиваются в красный цвет.
А надо, чтобы колонки, которые я выбрал(multiselect), раскрашивались в синий цвет(а оставшиеся в красный).
Обрабатывается допустим очередная колонка- и как узнать, входит ли она в этот bookmark или нет?


msguns   (2005-06-15 09:12:00) [1]

>Rat   (15.06.05 08:04) [15]
>И еще- у тебя в этих процедурах Grid передается как параметр, но чего-то нигде не используется.

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


Rat   (2005-06-15 08:42:00) [2]

thanks!


ЮЮ   (2005-06-15 08:30:00) [3]

Или с другой стороны:
 Column.Field.DataSet.Field...


ЮЮ   (2005-06-15 08:17:00) [4]

когда рисуется строка, DataSet в обработчике как раз находится в рисуемой записи, т.е.

TCustomDBGrid(Sender).DataSource.DataSet.Field...


Rat   (2005-06-15 08:04:00) [5]

Че-то не совсем понятно- нету там FindByName. ты имел ввиду ListFonds_FindByID? И еще- у тебя в этих процедурах Grid передается как параметр, но чего-то нигде не используется.
Но это так, мелочи:)).
Я хотел спросить еще- а как с помощью ячейки которая в данный момент обрабатывается в OnDrawColumnCell  обратиться к строке, которой она принадлежит(чтобы узнать ID из другого поля этой же строки)?


msguns   (2005-06-14 09:54:00) [6]

С "клиента" (формы с гридом) записи в список добавляются-удаляются просто с помощью вызова определенных выше процедур.
В событии OnDrawColumnCell для того, чтобы определить есть ли рисуемая запись в списке достаточно опять же обратиться к функции ..FindByName и, если вернет не nil, рисовать чекнутый чекбокс или красить во что надо как выбранную.


msguns   (2005-06-14 09:47:00) [7]

Как пример:

MainForm:

type
 PSelFonds = ^RSelFonds;
 RSelFonds = record
   FID: integer;
   FLetter: string[1];
   FNumber: integer;
   FType: integer;
   FCategory: integer;
   FChecked: boolean;
 end;
 ...
 public
   { Public declarations }
   List_SelFonds: TList;
   // Методы работы со списком отобранных фондов
   procedure ListFonds_Clear(List: TList);
   function ListFonds_Add(Grid: TStringGrid; List: TList; FLetter: string; FID,FNumber,FType,FCategory: integer; ShowGrid: boolean = true): PSelFonds;
   procedure ListFonds_Delete(Grid: TStringGrid; List: TList; Fond: PSelFonds);
   function ListFonds_FindByID(Grid: TStringGrid; List: TList; ID: integer): PSelFonds;
   function ListFonds_GetIndex(Grid: TStringGrid; List: TList; Fond: PSelFonds): integer;
   ...

procedure TMainForm.ListFonds_Clear(List: TList);
// Очистка списка отобранных фондов
var
 i: integer;
begin
 for i := 0 to List.Count-1 do Dispose(PSelFonds(List[i]));
 List.Clear;
end;

function TMainForm.ListFonds_Add(Grid: TStringGrid; List: TList; FLetter: string; FID,FNumber,FType,FCategory: integer; ShowGrid: boolean = true): PSelFonds;
// Добавление в список отобранных нового фонда
begin
 result := ListFonds_FindByID(Grid,List,FID);
 if result<>nil then exit;
 result := NEW(PSelFonds);
 result.FID := FID;
 result.FLetter := FLetter;
 result.FNumber := FNumber;
 result.FType := FType;
 result.FCategory := FCategory;
 result.FChecked := false;
 List.Add(result);
end;

procedure TMainForm.ListFonds_Delete(Grid: TStringGrid; List: TList; Fond: PSelFonds);
// Удаляет фонд из списка отобранных
var
 ndx: integer;
begin
 if Fond=nil then exit;
 ndx := ListFonds_GetIndex(Grid,List,Fond);
 if ndx=-1 then exit;
 Dispose(PSelFonds(List[ndx]));
 List.Delete(ndx);
end;

function TMainForm.ListFonds_FindByID(Grid: TStringGrid; List: TList; ID: integer): PSelFonds;
// Ищет фонд в списке отобранных и возвращает указатель на объект.
var
 i: integer;
begin
 result := nil;
 for i := 0 to List_SelFonds.Count-1 do
   if PSelFonds(List_SelFonds[i])^.FID=ID then
     begin
      result := PSelFonds(List_SelFonds[i]);
      exit;
     end;
end;

function TMainForm.ListFonds_GetIndex(Grid: TStringGrid; List: TList; Fond: PSelFonds): integer;
// Определяет индекс фронда в списке по объекту
var
 i: integer;
begin
 result := -1;
 for i := 0 to List_SelFonds.Count-1 do
   if PSelFonds(List_SelFonds[i])^.FID=Fond.FID then
     begin
      result := i;
      exit;
     end;
end;
 ...
procedure TMainForm.FormCreate(Sender: TObject);
begin
 ...
 List_SelFonds := TList.Create;
end;


msguns   (2005-06-14 09:36:00) [8]

>Rat   (14.06.05 09:23) [11]

Для "указателя на запись" лучше всего использовать идентификатор записи (ID), если он, конечно, есть (если БД спроектирована правильно). В качестве списка можно использовать обычный TList, с ним очень удобно работать (в отличие от массива, который надо каждый раз перересайзить и писать самому сорт.
Такая схема очень удобна хотя бы тем, что не влияет от порядка следования записей, который может поменяться (в результате переупорядочения записей) либо их кол-ва в рез-те фильтрации.
Кроме того, в случае необходимости можно показать список выбранных в отдельной окошке, что может быть очень удобно, если записей в курсоре много или помеченные разбросаны по нему.


Rat   (2005-06-14 09:23:00) [9]

>>О, thanks! Помогло-
Это я про TDBGrid.SelectedRows.CurrentRowSelected

А по  поводу :"Вместо мультиселекта, неудобного...."- как(синтаксис) можно получить указатель на запись?


Rat   (2005-06-14 09:19:00) [10]

О, thanks! Помогло


msguns   (2005-06-14 09:17:00) [11]

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


Rat   (2005-06-14 08:40:00) [12]

Да блин!!!- знак вопроса лишний поставил зачем-то:)


Rat   (2005-06-14 08:38:00) [13]

Sorry? пока писал, не видел что пришел новый ответ


Rat   (2005-06-14 08:38:00) [14]

В любом случае, конечная цель для меня- это сделать так, чтобы в обработчике все ячейки, КРОМЕ тех, что "входят" в bookmark раскрашивались в например красный цвет. А те что входят- не должны никак окрашиваться, потому что иначе будет так, что я не буду видеть, какие записи я выбрал мультиселектом(т.к. они все будут тоже красные).


Zacho   (2005-06-14 08:37:00) [15]

Можно.
См. TDBGrid.SelectedRows.CurrentRowSelected


Rat   (2005-06-14 08:32:00) [16]

Но ячейка то принадлежит какой-то записи!
Событие onDrawColumnCell обрабатывает каждую ячейку.
А у меня допустим несколько записей выбраны мультиселектом(Ctrl+Click)=> для них создался bookmark.
И в момент, когда очередная ячейка обрабатывается в onDrawColumnCell, мне и нужно узнать, принадлежит ли эта ячейка какой-нибудь записи, входящей в текущий bookmark
Неужели никак нельзя это сделать?


Zacho   (2005-06-14 08:06:00) [17]

Rat   (14.06.05 7:21) [2]

Так всё равно bookmark - это указатель на записьнабора данных, а вовсе не на ячейку грида.


Rat   (2005-06-14 07:21:00) [18]

E...бабай! Естественно, это ЯЧЕЙКИ (Cells), а про "колонки" это я неправильно написал:).


ЮЮ   (2005-06-14 05:49:00) [19]

bookmark - это записи, а колонки - поля записи.

Каким образом тебе удается таким образои выбирать колонки?


Наверх

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