Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Ehlib

Автор: monsoon
Дата сообщения: 20.05.2008 12:20
В версии 4.2.16 при вызове стандартного окна поиска в combo "Find in" можно задать поле или выбрать <All> (вроде как по всем полям ). Выбрав по всем полям находится первая запись, а потом ни в какую.
Автор: PowerChute
Дата сообщения: 20.05.2008 12:58
monsoon
Есть такой глюк. Я переделывал функцию поиска.
Если есть интерес, то в ПМ. Вышлю переделки.
Автор: delover
Дата сообщения: 21.05.2008 11:37
Ребяты )
Вопросец, может быть и не сюда,... но!
1. У меня два гига памяти (проц новый).
2. Эхи я пользую с фибами.
3. Датасеты фетчь олл, следовательно данные я уже забрал.
4. Записей всего две тысячи.

Я пробегаю в цикле по букмаркам (с дизабленными контролами), собираю примари кейные айдишники в строку через запятую. Работает это медленно. Почему?

Можно ли написать такую функцию RecNo_To_PrimaryKey: Variant?

Дело в том, что на mssql запросе трёхминуток (22000 записей умножить на 500 каналов) я успевал посчитать формульные группы, запихнуть данные в одну строку с табами переносами строки и заголовками. Успевал отдать эту строку в стринг гридину. Стринг гридина парсила её и выводила в новом окне. Это было на проце который на года эдак три старше и памяти в два раза меньше. И брал я через ADO интерфейсы. А скорость приблизительно та же. Я чего-то недопонимаю. Разве с селектом в гридине никто не работал? И вообще нафига нужна гридина без примари? Разве только для того, чтобы редактировать прямо в полях?...

Буду благодарен за ответы, так как вроде бы фибы выбрали из-за скорости.
Автор: delover
Дата сообщения: 22.05.2008 07:57
Я тут сначала подумал омануть RecNo. То есть в селекте создать поле совпадающее с RecNo который я получу. Но в следующем селекте эти цифири могут не совпасть если я пролетел мимо транзакции. Так что этот подход рисковый. Айди есть айди, и сомневаюсь что человечество от него откажется.
Автор: monsoon
Дата сообщения: 22.05.2008 10:05
Наткнулся на недокументированное свойство DBGridEh: GridLineColors->BrightColor
В результате сетка окрашивается в заданный вами цвет!
Есть еще свойство GridLineColors->DarkColor, но я не понял для чего оно.

А вопрос в следующем. Необходимо задать толщину линий сетки.
У TDrawGrid и TStringGrid для этого есть свойство GridLineWidth.
Рисование в DrawColumnCell не подходит, т.к. используется фишка 4-й версии HideDuplicate для скрытия провторяющихся значений в столбце (стираются разделительные линии между дублями).
Есть какое-нибудь решение?
Автор: delover
Дата сообщения: 27.05.2008 15:42
Вопрос решился
[more=Мешал код который в комменте]
Код: [no]
procedure TfmServiceCommonWork.actCopyExecute(Sender: TObject);
var
L: TStrings;
I, Id: Integer;
q: TpFIBDataSet;
FieldName, S: string;
grid: TDBGridEh;
Cutted: Boolean;
begin
grid := TDBGridEh(TUserAction(Sender).Content);
if (grid <> ActiveControl) then exit;
Cutted := (Sender = actCut) or (Sender = actSelectCut);
AppClipboard.Clear;
L := TStringList.Create;
try
q := TUserAction(Sender).DataSet as TpFIBDataSet;
FieldName := TUserAction(Sender).FieldName;
q.DisableScrollEvents;
q.DisableCalcFields;
q.DisableControls;
grid.SaveBookmark;
try
if grid.Selection.Rows.Count < 2 then
begin
Id := q.FieldByName(FieldName).AsInteger;
L.Add(IntToStr(Id));
if Cutted then
AppClipboard.Cut(Id);
end else
for I := 0 to grid.Selection.Rows.Count - 1 do
begin
q.GotoBookmark(Pointer(grid.SelectedRows.Items[I]));
Id := q.FieldByName(FieldName).AsInteger;
S := IntToStr(Id);
//---if L.IndexOf(S) < 0 then
//---begin
L.Add(S);
if Cutted then
AppClipboard.Cut(Id);
//---end;

L.Add(S);
if Cutted then
AppClipboard.Cut(Id);
end;
finally
grid.RestoreBookmark;
q.EnableControls;
q.EnableCalcFields;
q.EnableScrollEvents;
end;
S := StringReplace(TrimRight(L.Text), #13#10, ',', [rfReplaceAll]);
AppClipboard.SetIdents(S, Cutted, Self.ClassName, FieldName);
finally
L.Free;
end;
end;
[/no]
Автор: xNikitos
Дата сообщения: 09.06.2008 22:55

Цитата:
EhLib 4.1 Build 4.1.5 Russian version. Full source included.
Но после установки IBX7.08:
Cannot load package 'ibxpress70' It contains unit 'IBXConst,' which is also contained in package 'ibxpress73'
при инсталляции DclEhLibDataDrivers70.dpk
После деинсталляции IBX7.08 возникла ошибка "Required package 'clxib' not found"
Что сделать?


- то же самое. Что сделать? Где взять исходники, чтобы перекомпилить ibxpress?
Автор: delover
Дата сообщения: 17.06.2008 07:31
xNikitos

Цитата:
то же самое. Что сделать? Где взять исходники, чтобы перекомпилить ibxpress?

А попробуй заглянуть в папку windows\system32 и найти там что нибудь типа ibxpress73.bpl или 70. Если такой будет найден, то не знаю что делать, а если не будет вообще ibx, то по идее его переустанавливают. Возможно инсталлер посчитал, что это его файло и грохнул. Однако если открыть DclEhLibDataDrivers70.dpk, то можно сделать "Remove file" ibxpress и потом "Add Reference" 73. Очень похоже что 73 уже в памяти а он пробует загрузить 70.
Автор: xNikitos
Дата сообщения: 01.09.2008 14:39
Не, проблема именно в том, что EhLib скомпилен под старую версию IBX.
Автор: zvyagaaa
Дата сообщения: 05.11.2008 17:04
здравствуйте, есть вопросик маленький по эхлибу.
У эхлиб есть прикольная функция dghRecordMoving. - это функция перетаскивания строки в датасете.
Так вот - вроде бы работает она, но когда выбираешь несколько строк, то почему-то они после того, как их кинешь в место назначения, то они сортируются в обратном порядке, а второй раз это же выделение берешь - пересортировывается правильно.
С чем может быть баг?
Эхлиб лицензия - но саппорта у компонента считай нету, наверное сильно занят, поэтому я и спрашиваю здесь.
Автор: Chulpon
Дата сообщения: 09.03.2009 11:06
Привет всем!
У меня вопрос Ehlib умеет сортировать по клику на титл Calculated field и lookup field? И как?
Заранее благодарен.
Автор: apnss
Дата сообщения: 09.03.2009 18:20
Chulpon

это зависит от движка работы с базой : ADO - нет, SDAC - точно ДА (причем дополнительно ничего делать не нужно... ну развечто создания своего сервиса для сдака см. EhLib\DataService)

ну или работать через мемтейбл , но это - изврат
Автор: Chulpon
Дата сообщения: 11.03.2009 16:54
Спасибо .
Но я исользую TibclientDataset из палитри IBX + delphi 6 Добавил USes EhlibIbx.pas но это не помогло.. потом поправил EhlibCds,pas под IbclientDataset но теперь работает фильтр и сортировка.. Но Лукап и Калкулатед полям нет.. Говорит Not Found при сортировке как быть мне? Создаю лукап и калкулатед динамически..
И Еще один вопрос
когда я фильтр делаю по каком то полю да
там есть содержить такой значение (095)-8798-79-78. Если фильтре так напишу ((095)-8798-79-78 в гридеЕх) то ругается на Error in expression: ( в чем проблема ?
а если в апостр '(095)-8798-79-78' то нормально пашет. Но мне надо чтобы пользователь из списка выбрал (095)-8798-79-78 и автоматом фильтровал.. Автоматом я сделал. Но осталось
2 задач решить
1) Лукап и Калкулатед
2) Error in Expression(095)-8798-79-78
Заранее огромное спасибо.
Автор: asdnsd
Дата сообщения: 26.03.2009 20:08
Подскажите пожалуйста как можно реализовать через ехГрид следующее:

Грид отображает таблицу заказов (например), она содержит id покупателя из таблицы покупателей и цену. Как можно сделать чтобы отображался не id а ФИО из таблицы покупателей?

Поле в гриде указывает на Lookup поле из датасета грида.
Автор: delover
Дата сообщения: 26.03.2009 20:48
Chulpon
По поводу апострофов можно попытаться самостоятельно их выставить, в том случае если их не найдено, а можно попытаться ещё доки почитать по синтаксису который используется. Если это скуль то по синтаксису скуля.

Добавлено:
asdnsd
У лукопа в прюнципе два поля - данные которые вы берёте и связанные данные которые показывать надо.

Добавлено:
asdnsd
Но это в том случае если у связного датасета имена полей ID совпадают. А так получается три.
Автор: Chulpon
Дата сообщения: 31.03.2009 16:32

Цитата:
Chulpon
По поводу апострофов можно попытаться самостоятельно их выставить, в том случае если их не найдено, а можно попытаться ещё доки почитать по синтаксису который используется. Если это скуль то по синтаксису скуля.

Как я ничего не делаю он сам автоматом фильтр делает правильно..
Даже в демо Ehlib такой ошибка выдает.
если знаешь помоги..
в исходниках ко что убрал но это не помогло
Автор: spambog1234
Дата сообщения: 10.04.2009 18:40

Цитата:
там есть содержить такой значение (095)-8798-79-78. Если фильтре так напишу ((095)-8798-79-78 в гридеЕх) то ругается на Error in expression: ( в чем проблема ?
а если в апостр '(095)-8798-79-78' то нормально пашет. Но мне надо чтобы пользователь из списка выбрал (095)-8798-79-78 и автоматом фильтровал..


Проблема в том, что скобки распознаются как выражение вида IN(value1,value2,value3) и т.д. Сам бы хотел от этого избавится. В большинстве случаев DBGridEh пытается сам распознать фильтр, но со скобками у него получается ужасно.


Код: Значения в ячейке могут выглядеть как: "1", ">=1", ">1 AND <=5", "%TestStr%".

Текст выражения в ячейке фильтра должен иметь следующий формат:

[Operator1] Operand1 [)] [AND|OR Operator2 Operand2 [)] ]

Где:
OperatorX - один из значений: [ = | <> | != | > | < | >= | <= | ~ | !~ | in ( ].
OperandX - число, дата, строковое выражение, либо, для оператора 'IN', - список значений, разделенных запятыми.

Например:
1
>=1
>1 AND <=5
~ TestStr%
!~ TestStr_
in (1,2,3,4,5,6) and >100
in (Str1,Str2,Str3)
Автор: Asm64D
Дата сообщения: 24.04.2009 10:53
Люди, говорят для EhLib есть справка на русском языке, выложите пожайлуста.
Автор: fcdobpiy
Дата сообщения: 24.04.2009 11:22
Asm64D
держи http://slil.ru/27481231
Автор: Asm64D
Дата сообщения: 24.04.2009 11:58
fcdobpiy
Спасибо!!!
Автор: ViKingVT
Дата сообщения: 14.05.2009 08:31
Кто-нить сталкивался с такой ошибкой: после запроса к БД, данные показываются в таблице, настроены автофильтры на некоторых полях. Всё работает отлично, но стоит использовать один из автофильтров, а затем сформировать новый взапрос к БД - вываливается ошибка "List index out of bounds". В чем трабл?
Автор: Cryogen2003
Дата сообщения: 14.05.2009 08:35
Привет всем. Есть немного нестандартный вопрос, можно ли как-нибудь заставить компоненты EhLib отрисовываться несколько по другому, ну например чтобы они отрисовывались с помощью тем из DevExpress?
Автор: Vladislav_Matvienko
Дата сообщения: 07.06.2009 01:59
Добрый день.

Очень радует то, что хорошо известная библиотека ЕhLib сейчас более-менее активно развивается и поддерживается автором и хочется помочь своими "пятью копейками" в ее развитии.

Я использую связку TIBXDataDriver + TMemTableEh + TDBGridEh. Версия EhLib 4.4.48

Я попытался использовать серверную фильтрацию и сортировку, и если я правильно понял, то в текущей версии пока ее можно использовать только для простейших случаев для полей из основной таблицы. Для вычисляемых в select полей, полей на основе вложенных подзапросов, полей с алиасами т.д. в текущем виде серверная сортировка работать как я понял не будет?

С серверной сортировкой проблем гораздо меньше чем с фильтрацией, т.к. можно использовать порядковые номера столбцов в конструкции ORDER BY. Для выполнения серверной фильтрации нужно знать не только имя столбца в результате SQL запроса, а и само SQL выражение которое сформировало столбец.

В коде функции GetExpressionAsFilterString в файле DbUtilsEh при построении выражения для серверной фильтрации используется или имя поля или свойство Origin, если оно заданно, но судя по справке это свойство обычно пустое.
Help
The Origin property is only implemented for BDE-enabled datasets, which appear only in the Windows product.

Не знаю как при работе через ADO или FIB'ы, но по крайней мере при работе через IBX у меня всегда так.

Что бы решить задачу построения правильного SQL выражения для сортировки на сервере для произвольных полей я набросал на основе своего старого кода функцию, которая парсит Select SQL, вычленяя выражения для формирования полей, сопоставляет их с TField в DataSet и записывает в соответствующие TField датасета в свойство Orign выражение из SQL запроса, формирующее это поле. При разборе учитываются однострочные и многострочные комментарии, алиасы указанные через пробел или через AS, кавычки в именах полей, алиасов, строковые константы и т.д.
Таким образом появляется возможность корректно строить запросы на фильтрацию практически для любых по сложности полей, в том числе с арифметическими или строковыми операциями, функциями, с полями на основе вложенных подзапросов и т.д.

Проблемными являются запросы с использованием UNION, т.к. в этом случае думаю что невозможно сформировать условие сортировки на сервере - только на клиенте и запросы типа select таблица1.*, (вложенный подзапрос без явного алиаса), таблица2.* from ..., т.к. здесь проблематично сопоставить поля SQL запроса с полученными полями в DataSet.
Также нюансом является то, что если поля в DataSet создаются динамически, то присвоенные значения Orign теряются после переоткрытия.

Модуль uEhMyUtils.pas выкладываю у себя по адресу:
http://www.plaincad.com/EhLiB
В этой же папке проект для UnitTest работы модуля.
Эти модули можно свободно использовать, распространять и редактировать. Идеально было бы всем миром его протестировать, подоптимизировать и в идеале, возможно, включить в ehlib.

Алгоритм использования:
1. Сделать Open для TMemTableEh.
2. Вызвать SetFieldOrigin(lMemTable, MainSQL);
Где MainSQL по сути тот Select SQL из связанного объекта SQLDatadriver.
3. Все... Теперь серверная фильтрация и сортировка должна работать (при условии исправления функции procedure TMTEDatasetFeaturesEh.ApplyFilter(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean) как описано ниже).

Замечания:
1. Проверенно, работает для вычисляемых полей, полей на основе вложенных подзапросов и т.д. Я использую связку TIBXDataDriver + TMemTableEh + TDBGridEh

3. Для правильной работы серверной фильтрации никто не отменял наличие строки
whrere


Код: /*Filter*/ (1=1)
Автор: fcdobpiy
Дата сообщения: 08.06.2009 06:40
Vladislav_Matvienko
ты бы изложил все это Дмитрию Большакову, автору ehlib. Напиши ему это письмом. Недавно с ним общался - отвечает на письма, адекватно себя ведет, обсуждает проблему. (не в пример сообществу far -) )
Автор: X11
Дата сообщения: 12.06.2009 12:23
1. Есть TDBLookupComboboxEh, как узнать, состояние. Он уже выпал или закрыт?

2. Вопрос по автовыпаданию списка у TDBLookupComboboxEh.
Пользователь использует клавишу Tab или Enter лоя перемещения по компонентам ввода в окне. Когда пользователь переходит на DBLookupComboboxEh, то этот компонент должен автоматически раскрыться. Тоже самое и мышкой, если кликнуть мышкой по компоненту, то он должен сразу же раскрыться.
Как это корректно реализовать?

А то вот такая канитель:
На форме несколько TDBLookupComboboxEh
Когда нажимаю кнопку справа для того, чтобы список раскрылся, то список раскрывается и сразу же закрывается. Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет. Никаких событий у TDBLookupComboboxEh нет, кроме тех, что опишу ниже. Если щёлкать не по кнопке, а непосредственно по самому элементу, то такой проблемы не наблюдаю.

CodeGear™ RAD Studio 2007 Version 11.0.2902.10471
EhLib 4.3 Build 4.3.21 Russian version

При создании окна всем этим выпадающим спискам присваивается событие (процедура) DBLookupComboboxEhDropDown

Код:
procedure TForm1.DBLookupComboboxEhDropDown(sender: TObject);
begin
if sender is TDBLookupComboboxEh then
(sender as TDBLookupComboboxEh).DropDown;
end;
....

В событии создания формы
for i := 0 to ComponentCount-1 do
if (Components[i] is TDBLookupComboboxEh) then
(Components[i] as TDBLookupComboboxEh).OnEnter := DBLookupComboboxEhDropDown;
Автор: fcdobpiy
Дата сообщения: 12.06.2009 13:18
X11
1.
TDBLookupComboboxEh.ListVisible унаследовано от TDBLookupCombobox

2. добавь обработчик события OnButtonClick
что то типо этого
if (sender as TDBLookupComboboxEh).ListVisible then Handled:=true;

но появится такой баг, что последующие клики мышкой по кнопке не свернут лист. но тут думаю добавишь еще один флаг для проверки
Автор: X11
Дата сообщения: 12.06.2009 15:39
кошмар %) а попроще нельзя?


Цитата:
if (sender as TDBLookupComboboxEh).ListVisible then Handled:=true;

а что значит Handled:=true?
Автор: fcdobpiy
Дата сообщения: 12.06.2009 16:02
из справки по ehlib про событие OnButtonClick

Цитата:
Установите Handled в True если вы не хотите чтобы контрол отображал выпадающий список.



Цитата:
кошмар %) а попроще нельзя?

это про 2 пункт я надеюсь ? ))
проще как мне кажется нельзя, т.к.отловить вход в объект при передаче фокуса (tab, enter) мы кроме как в OnEnter не сможем. а встроенного свойства влияющего на это я не вижу, даже в более новом ehlib

да и получаются у нас ситуации
а) ничего не добавляя в обработку - клик мышкой в любую облать объекта раскрывает лист, клик по кнопке также раскрывает. а вот при передаче фокуса по tab не раскрывает
б)добавляем твой код - список раскрывается всегда, но имеем 2 бага "Когда нажимаю кнопку справа для того, чтобы список раскрылся, то список раскрывается и сразу же закрывается. Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет."
в) к твоему коду добавляем обработку события клика на кнопку (что приведен выше) - работает все , но остался один баг "Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет."

Автор: X11
Дата сообщения: 12.06.2009 17:30
fcdobpiy, +1 за if TDBLookupComboboxEh(sender).ListVisible then Handled:=true;
Автор: big big
Дата сообщения: 15.06.2009 19:04
Всем привет!
Есть база Interbase, вывожу ее в DBGridEh, в ней есть поле COUNTRY, в котором хранятся названия стран, нужно в ячейку напротив названия страны вывести флаг соответсвующий стране в ячейке. В DBGridEh есть возможность выводить картинку из ImageList, но в ImageList картинке присваивается только числовой индекс. Может кто знает как можно проставить соответствия названия стран индексу в ImageList?
Заранее спасибо.

Добавлено:
Вопрос снимаю, разобрался.
Только вот новая проблема. Если ставлю ShowTextAndImage:=true, все равно выводится только картинка, что может быть?

Добавлено:
Еще одна проблема с фильтрацией.
Есть DBgridEh, поставил в нем STFilter, работает, фильтрует, но после того как отфильтровал, в списке для фильтрации доступно только то значение по которому уже отфильтровалось, вместо всех возможных. Кто с таким сталкивался?

Страницы: 1234567891011121314151617181920212223

Предыдущая тема: Конвертация char в ASCII код; c


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.