Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1120728354
SergP.
2005-07-07 13:25
2005.07.25
Рекурсивное описание типов.


1-1120778579
A013B
2005-07-08 03:22
2005.07.25
Всё тодже String и PAnsiChar правильно сформулированный вопрос.


6-1113448443
NikNet
2005-04-14 07:14
2005.07.25
WinSock2 на чистом API без форм! Может у кого заволялось?


14-1119716063
Soft
2005-06-25 20:14
2005.07.25
Радиолюбителям.


1-1120819580
1+Random(9999)
2005-07-08 14:46
2005.07.25
Сокеты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский