Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Ehlib

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

Открыть новую тему     Написать ответ в эту тему

xteam2005



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В EhLib 6.3 Build 6.3.182 без изменений

Всего записей: 13 | Зарегистр. 30-10-2010 | Отправлено: 03:45 14-07-2014
relictus

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно ли реализовать в TDBGridEh выпадающий список цветов в виде полосок с разными цветами (или как-то еще "овизуалить" цвет), на основе целочисленных значений из поля БД?
Только недавно начал осваивать сей грид, а тут затык с вышенаписанным случился, помогите советом/примером, пожалуйста!

Всего записей: 3716 | Зарегистр. 19-04-2005 | Отправлено: 10:42 01-08-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я делал справочник
   
код там  
procedure TKAT_DOL.DBGGetCellParams(Sender: TObject; Column: TColumnEh; AFont:
  TFont; var Background: TColor; State: TGridDrawState);
begin
  if Column.Index = 1 then Background := DM.STATUS.FN('COLOR').AsInteger;
end;

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 14:48 01-08-2014 | Исправлено: YuriyRR, 14:58 01-08-2014
relictus

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuriyRR
Спасибо! А что подвязано на дропдаун кнопку столбца цветов?

Всего записей: 3716 | Зарегистр. 19-04-2005 | Отправлено: 16:16 01-08-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
relictus
У меня     TColorDialog;
procedure TKAT_DOL.DBGColumns1EditButtons0Click(Sender: TObject; var Handled:
  Boolean);
begin
  if DBG.EditorMode then
  begin
    DBG.EditorMode := False;
    DBG.Refresh;
  end;
  CD.Color := DM.STATUS.FN('COLOR').AsInteger;
  if CD.Execute then
  begin
    DM.STATUS.Edit;
    DM.STATUS.FN('COLOR').Value := CD.Color;
    DM.STATUS.Post;
    DM.FTR.CommitRetaining;
    DBG.Refresh;
  end;
end;

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 18:36 01-08-2014
deyatel1974

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как правильно сопоставлять выделенные в гриде строки с данными? Мне нужно пробежать в цикле кэшированные в MemTable данные соответствующие выделенным строкам.

Код:
procedure TForm1.DBGridEhSelectionChanged(Sender: TObject);
var
  I, F, K: Integer;
begin
  for I := 0 to DBGridEh.SelectedRows.Count - 1 do begin
    K := DBGridEh.SelectedRows.Items[I][0];      // тут нужно получить индекс строки в MemTableEh сответствующей выделенному  
    F := MemTableEh.RecordsView.MemTableData.RecordsList[K].Value[1, dvvValueEh];       // дальше обрабатываем даные из поля
  end;
end;

Однако это не работает если порядок строк изменен сортировкой. Как правильно делать?

Всего записей: 23 | Зарегистр. 10-08-2014 | Отправлено: 00:18 10-08-2014
Samotek

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deyatel1974

Цитата:
Однако это не работает если порядок строк изменен сортировкой. Как правильно делать?
 

Пройдись так же по выделенным строкам, собери уникальные ключи записи в массив, а потом пройдись по этому массиву с Dataset.Locate(уникальный ключ). В этом случае текущий порядок будет безразличен.

Всего записей: 2448 | Зарегистр. 18-05-2005 | Отправлено: 00:42 10-08-2014
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Samotek, смысл задачи (насколько я понял) в том и состоит, чтобы не ходить по датасету (это очень медленно), а выбрать нужные данные напрямую из MemTableEh.

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 13:05 10-08-2014
Samotek

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
landy

Цитата:
смысл задачи (насколько я понял) в том и состоит, чтобы не ходить по датасету (это очень медленно), а выбрать нужные данные напрямую из MemTableEh.  

А как можно выбрать данные из датасета и не ходить по нему? Такого не бывает. При использовании мемтабле или другой таблицы в памяти в основном скорость тратится на отображение перемещения гридом. Для этого надо использоавть пару dataset.Disblecontrols - dataset.enablecontrols, естественно в блоке try finaly

Всего записей: 2448 | Зарегистр. 18-05-2005 | Отправлено: 13:18 10-08-2014 | Исправлено: Samotek, 13:19 10-08-2014
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет, MemTableEh предоставляет возможность один раз закачать все данные из датасета и обращаться к ним напрямую. Это позволяет значительно увеличить производительность при доступе к ним.

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 15:54 10-08-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
landy
вопрос терминологии - MemTableEh тоже датасет

Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 15:57 10-08-2014
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPerformer, формально согласен, но при использовании DBGridEh он работает посредником между нормальным датасетом (интерфейсом к БД) и, собственно, гридом и обладает интерфейсом для прямого доступа к данным в памяти.

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 16:05 10-08-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
landy

Цитата:
использовании DBGridEh он работает посредником между нормальным датасетом  

именно поэтому не надо трогать исходный датасет, а позиционироваться через MemTableEh, как показано ниже
 
deyatel1974
>> MemTableEh.RecordsView.MemTableData.RecordsList
это как-то уж очень замысловато...
 
Почему вы не позиционируетесь в гриде как обычно  
          for nRow := 0 to Selection.Rows.Count - 1 do begin
            MemTableEh.Bookmark := Selection.Rows.Items[nRow];
 
должно сработать и после изменения порядка сортировки

Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 16:36 10-08-2014
deyatel1974

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPerformer спасибо твой вариант рабочий но мне хотелось использовать самый прямой интерфейс. хотя для MemTableEh разницы наверное не будет.

Всего записей: 23 | Зарегистр. 10-08-2014 | Отправлено: 17:15 10-08-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
но мне хотелось использовать самый прямой интерфейс

зачем? кроме запутанного кода и ошибок, это ничего не дает

Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 17:22 10-08-2014
Samotek

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPerformer

Цитата:
должно сработать и после изменения порядка сортировки  

Возможны проблемы, если в процессе бега по селшен изменяются поля сортировки. Я для избегания этого собираю Id веделенных записей датасета грида, а потом спокойно их редактирую. В этом случае порядок сортировки не имеет значения.

Всего записей: 2448 | Зарегистр. 18-05-2005 | Отправлено: 17:31 10-08-2014
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deyatel1974, MemTableData.RecordsList предназначен для того, чтобы обойти все загруженные строки, игнорируя наложенные фильтры и сортировки (и не двигая курсор - текущую запись.)

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 21:40 10-08-2014
deyatel1974

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPerformer я полагал что это увеличит производительность. ну и в учебных целях конечно

Всего записей: 23 | Зарегистр. 10-08-2014 | Отправлено: 13:22 11-08-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deyatel1974
В учебных - это конечно.
А если производительность увеличить в разы  - то лучше взять другой компонент, здесь было сравнение http://forum.ru-board.com/topic.cgi?forum=33&topic=8529&start=5760#20

Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 14:17 11-08-2014
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPerformer, полезное исследование. А какая версия EhLib там участвовала? Может, нынешние себя получше ведут и уже не умирают на 100 тыс записей?

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 15:56 11-08-2014 | Исправлено: landy, 15:56 11-08-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Ehlib


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru