Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2009, 06:39   #1
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
По умолчанию Выделение записей в DBGrid (многопользовательский вариант )

возникла такая задача: выделение записей пробелом
сделал так: поместил на форму ListBox'ы в них хранил ID строки и в зависимости от того естьли ID в листбоксе крашу сетку. Но здесь есть небольшая проблема - при выборе очень большого количества записей программа начинает "тормозить" - причина мне ясна
вот процедура перерисовки грида
Код:
for i := 0 to ListBoxDate.Items.Count - 1 do
    begin
    if (Field.FieldName = 'DATEDOC') and (not (gdFocused in State))
        and
  ( (ListBoxDate.Items.Strings[i] = f_date )
  and (ListBoxNdoc.Items.Strings[i] = f_ndoc)
  and (ListBoxSum.Items.Strings[i] = f_sum )  )
        then Brush.Color := clBlue;
        DBGrid_Nal.DefaultDrawDataCell(Rect,Field,State);
    end;
  end;
становится очень много проверок...кто знает как сделать более шустрый вавариант?

PS
У меня есть и другой вариант который на 100% работает быстро - добавить поле в таблицу и хранить там статус выделенной записи, а при нажатии клавиши менять на противоположный - это все хорошо работает в однопользовательской версии программы , а у меня сетевая версия, поэтому такой вариант не подходит - причина : один пользователь выделил запись , а другой увидит выделение.
если есть идеи про второй способ подскажите, буду очень признателен.
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Старый 10.09.2009, 08:24   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
причина : один пользователь выделил запись , а другой увидит выделение.
Ну иногда преподаватели рекомендуют делать дополнительное поле в котором хранят имя пользователя ктоторый "выделил запись", а для другого просто поставить фильтр на чисто его и не занятые записи в этом поле.
Но ты скажи другое мне - ты ведь полксаешь набор, как другой пользователь может твои изменения увидеть если ты в БД еще не сохранил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2009, 08:31   #3
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
По умолчанию

Stilet
Но ты скажи другое мне - ты ведь полксаешь набор, как другой пользователь может твои изменения увидеть если ты в БД еще не сохранил?

Если я использую листбокс то пользователи естественно не увидят то, что выделил другой. Но если я сделаю дополнительное поле как рекомендуют преподаватели - подскажи в какой таблице? в тойже которую выделяю?
тогда произойдет следующее: один выделил - изменил поле "USER" - второму тоже нужно выделить эту же запись - и он переписывает пользователя и тот который выделил первым не увидит своей выбранной записи.

и еще раз на счет листбоксов - работает все корректно, но только чем больше записей я выбираю тем медленнее происходит перерисовка строки DBGrid
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Старый 10.09.2009, 08:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
один выделил - изменил поле "USER" - второму тоже нужно выделить эту же запись
Ну дык имеется ввиду два момента:
1. Записи не сохраняются про работе
2. Вообще-то преподаватель когда-то признался мне что под подобной фразой имеется ввиду некая а-ля настройка доступа пользователей к наборам.

т.е. пользователь твой получил набор и начинает ставить в неких полях галочки - типа выделяю. Скажи это потом должно сохраняться в БД?
Цитата:
но только чем больше записей я выбираю тем медленнее происходит перерисовка строки
Ну тут нужно в код смотреть. Во первых я бы от ДБГрид отошел ибо он сам по себе достаточно медлен и требует чтоб подключение к набору даныых было активно. а это не есть гут. Лучше получать набор, в цикле по нему проити и вывести все в обычный грид, и закрыть подключение. Отработать все изменения в этом гриде, и потом уж послать их запросом провайдеру.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2009, 09:09   #5
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
По умолчанию

Цитата:
Ну тут нужно в код смотреть.
на форме 5 листбоксов в них все хранится важное для поиска (раскраска)
Вот код нажатия пробела
Код:
procedure TForm1.DBGrid_NalKeyPress(Sender: TObject; var Key: Char);
var
f_date,f_ndoc,f_sum,f_customerId,f_Obrabotano:string;
i:integer;
begin
if Key = chr(vk_space) then
begin

f_date := DataMAIN.SetMain_Import_NalDATEDOC.AsString;
f_ndoc := DataMAIN.SetMain_Import_NalNDOC.AsString;
f_sum := DataMAIN.SetMain_Import_NalSUM.AsString;
f_customerId := DataMAIN.SetMain_Import_NalIDSPR1.AsString;
f_Obrabotano := DataMAIN.SetMain_Import_NalOBRABOTANO.AsString;

for i := 0 to ListBoxDate.Items.Count - 1 do
begin
  if (ListBoxDate.Items.Strings[i] = f_date )
  and (ListBoxNdoc.Items.Strings[i] = f_ndoc)
  and (ListBoxSum.Items.Strings[i] = f_sum )
  and (ListBoxCustomerId.Items.Strings[i] = f_customerId )
  and (ListBoxObrabotano.Items.Strings[i] = f_Obrabotano )
  then
  begin
  ListBoxDate.Items.Delete(i);
  ListBoxNdoc.Items.Delete(i);
  ListBoxSum.Items.Delete(i);
  ListBoxCustomerId.Items.Delete(i);
  ListBoxObrabotano.Items.Delete(i);
Label2.Caption := FloatToStr(CalcListbox(ListBoxSum));
DataMAIN.SetMain_Import_Nal.Next; 
DBGrid_Nal.Refresh;
  exit;
  end;
  
end;
ListBoxDate.Items.Add(f_date);
ListBoxNdoc.Items.Add(f_ndoc);
ListBoxSum.Items.Add(f_sum);
ListBoxCustomerId.Items.Add(f_customerId);
ListBoxObrabotano.Items.Add(f_Obrabotano);
DBGrid_Nal.Refresh;

Label2.Caption := FloatToStr(CalcListbox(ListBoxSum));
DataMAIN.SetMain_Import_Nal.Next;

end;

end;
это прорисовка (раскраска) выбранных записей
Код:
procedure TForm1.DBGrid_NalDrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var
f_date,f_ndoc,f_sum:string;

i:integer;
begin
  with DBGrid_Nal.Canvas do
  begin
if ((Field.FieldName = 'SUM') or (Field.FieldName = 'NDOC') )and (not (gdFocused in State))
    and (DataMAIN.SetMain_Import_Nal.FieldByName('OBRABOTANO').AsInteger = 1)
    then Brush.Color := clYellow;
    DBGrid_Nal.DefaultDrawDataCell(Rect,Field,State);
f_date := DataMAIN.SetMain_Import_NalDATEDOC.AsString;
f_ndoc := DataMAIN.SetMain_Import_NalNDOC.AsString;
f_sum := DataMAIN.SetMain_Import_NalSUM.AsString;
for i := 0 to ListBoxDate.Items.Count - 1 do
    begin
    if (Field.FieldName = 'DATEDOC') and (not (gdFocused in State))
        and
  ( (ListBoxDate.Items.Strings[i] = f_date )
  and (ListBoxNdoc.Items.Strings[i] = f_ndoc)
  and (ListBoxSum.Items.Strings[i] = f_sum )  )
        then Brush.Color := clBlue;
        DBGrid_Nal.DefaultDrawDataCell(Rect,Field,State);
    end;
  end;
end;
Цитата:
в цикле по нему проити и вывести все в обычный грид,
а циклом не долго ли будет перелопачивать? мне хотябы 300 записей необходимо. под обычным гридом понимается StringGrid ?
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Старый 10.09.2009, 11:32   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

2 Paul Hindenburg
а как вы обрабатываете ситуацию одновременной работы нескольких пользователей над одними и теми же данными (речь даже не про раскраску, а именно про данные)?
soleil@mmc вне форума Ответить с цитированием
Старый 10.09.2009, 11:50   #7
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
2 Paul Hindenburg
а как вы обрабатываете ситуацию одновременной работы нескольких пользователей над одними и теми же данными (речь даже не про раскраску, а именно про данные)?
в данный момент никак у меня нет такой необходимости, но это не проблема - можно добавить поле в котором будет храниться статус блокировки записи, ну или в конце концов на сервере бд - это тоже контролируется. я не понял к чему этот вопрос
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Старый 10.09.2009, 12:14   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
for i := 0 to ListBoxDate.Items.Count - 1 do
Мда... Тут бы стратегию поменять. Я сталкивался с такими фишками как циклы в обработчиках-раскрасках. Другого пожалуй не осмельсю посоветовать.
Цитата:
под обычным гридом понимается StringGrid ?
Да. Ну я на него перешел - пока горя не знаю.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2009, 12:38   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

есть вариант использовать MemoryData
т.е. набор данных из БД копируется в память и работаешь с ним как с обычным набором данных
можно в нем завести фиктивное поле и в нем отмечать любой признак выделения - все работает быстро
soleil@mmc вне форума Ответить с цитированием
Старый 10.09.2009, 12:57   #10
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
есть вариант использовать MemoryData
т.е. набор данных из БД копируется в память и работаешь с ним как с обычным набором данных
можно в нем завести фиктивное поле и в нем отмечать любой признак выделения - все работает быстро
можно поподробнее - я в первый раз слышу об этом объекте
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение ячейки в DBGrid правой кнопкой мыши RIO БД в Delphi 2 20.08.2009 17:53
Добавление записей в DBGrid с помощью Query Droid БД в Delphi 5 21.06.2009 03:02
Выбор записей в DBGrid-e artemavd БД в Delphi 12 16.05.2009 19:45
Выделение цветом нужных строк таблицы DBGrid XFilippowX Общие вопросы Delphi 4 16.02.2009 10:02
Сохранение нескольких записей из DbGrid в базу Canadec БД в Delphi 5 06.09.2007 14:26