Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.25;
Скачать: CL | DM;

Вниз

Как узнать, принадлежит ли эта колонка bookmark у?   Найти похожие ветки 

 
Rat   (2005-06-14 04:57) [0]

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


 
ЮЮ ©   (2005-06-14 05:49) [1]

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

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


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

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


 
Zacho ©   (2005-06-14 08:06) [3]

Rat   (14.06.05 7:21) [2]

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


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

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


 
Zacho ©   (2005-06-14 08:37) [5]

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


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

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


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

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


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

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


 
msguns ©   (2005-06-14 09:17) [9]

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


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

О, thanks! Помогло


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

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

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


 
msguns ©   (2005-06-14 09:36) [12]

>Rat   (14.06.05 09:23) [11]

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


 
msguns ©   (2005-06-14 09:47) [13]

Как пример:

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:54) [14]

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


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

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


 
ЮЮ ©   (2005-06-15 08:17) [16]

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

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


 
ЮЮ ©   (2005-06-15 08:30) [17]

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


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

thanks!


 
msguns ©   (2005-06-15 09:12) [19]

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.026 c
14-1120464205
Тульский
2005-07-04 12:03
2005.07.25
Игровые автоматы


8-1111913571
seregka
2005-03-27 12:52
2005.07.25
потоки и размер файла


3-1118428253
Andy Nortsov
2005-06-10 22:30
2005.07.25
импорт данных из Excel в Firebird


4-1117345046
NikNet
2005-05-29 09:37
2005.07.25
Как внутри ASM кода объявить PCHAR строку?


14-1120125202
andrey111111
2005-06-30 13:53
2005.07.25
Nsis