Форум: "Базы";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
Вниз
Как узнать, принадлежит ли эта колонка 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.022 c