В версии 4.2.16 при вызове стандартного окна поиска в combo "Find in" можно задать поле или выбрать <All> (вроде как по всем полям ). Выбрав по всем полям находится первая запись, а потом ни в какую.
» Вопросы по Ehlib
monsoon
Есть такой глюк. Я переделывал функцию поиска.
Если есть интерес, то в ПМ. Вышлю переделки.
Есть такой глюк. Я переделывал функцию поиска.
Если есть интерес, то в ПМ. Вышлю переделки.
Ребяты )
Вопросец, может быть и не сюда,... но!
1. У меня два гига памяти (проц новый).
2. Эхи я пользую с фибами.
3. Датасеты фетчь олл, следовательно данные я уже забрал.
4. Записей всего две тысячи.
Я пробегаю в цикле по букмаркам (с дизабленными контролами), собираю примари кейные айдишники в строку через запятую. Работает это медленно. Почему?
Можно ли написать такую функцию RecNo_To_PrimaryKey: Variant?
Дело в том, что на mssql запросе трёхминуток (22000 записей умножить на 500 каналов) я успевал посчитать формульные группы, запихнуть данные в одну строку с табами переносами строки и заголовками. Успевал отдать эту строку в стринг гридину. Стринг гридина парсила её и выводила в новом окне. Это было на проце который на года эдак три старше и памяти в два раза меньше. И брал я через ADO интерфейсы. А скорость приблизительно та же. Я чего-то недопонимаю. Разве с селектом в гридине никто не работал? И вообще нафига нужна гридина без примари? Разве только для того, чтобы редактировать прямо в полях?...
Буду благодарен за ответы, так как вроде бы фибы выбрали из-за скорости.
Вопросец, может быть и не сюда,... но!
1. У меня два гига памяти (проц новый).
2. Эхи я пользую с фибами.
3. Датасеты фетчь олл, следовательно данные я уже забрал.
4. Записей всего две тысячи.
Я пробегаю в цикле по букмаркам (с дизабленными контролами), собираю примари кейные айдишники в строку через запятую. Работает это медленно. Почему?
Можно ли написать такую функцию RecNo_To_PrimaryKey: Variant?
Дело в том, что на mssql запросе трёхминуток (22000 записей умножить на 500 каналов) я успевал посчитать формульные группы, запихнуть данные в одну строку с табами переносами строки и заголовками. Успевал отдать эту строку в стринг гридину. Стринг гридина парсила её и выводила в новом окне. Это было на проце который на года эдак три старше и памяти в два раза меньше. И брал я через ADO интерфейсы. А скорость приблизительно та же. Я чего-то недопонимаю. Разве с селектом в гридине никто не работал? И вообще нафига нужна гридина без примари? Разве только для того, чтобы редактировать прямо в полях?...
Буду благодарен за ответы, так как вроде бы фибы выбрали из-за скорости.
Я тут сначала подумал омануть RecNo. То есть в селекте создать поле совпадающее с RecNo который я получу. Но в следующем селекте эти цифири могут не совпасть если я пролетел мимо транзакции. Так что этот подход рисковый. Айди есть айди, и сомневаюсь что человечество от него откажется.
Наткнулся на недокументированное свойство DBGridEh: GridLineColors->BrightColor
В результате сетка окрашивается в заданный вами цвет!
Есть еще свойство GridLineColors->DarkColor, но я не понял для чего оно.
А вопрос в следующем. Необходимо задать толщину линий сетки.
У TDrawGrid и TStringGrid для этого есть свойство GridLineWidth.
Рисование в DrawColumnCell не подходит, т.к. используется фишка 4-й версии HideDuplicate для скрытия провторяющихся значений в столбце (стираются разделительные линии между дублями).
Есть какое-нибудь решение?
В результате сетка окрашивается в заданный вами цвет!
Есть еще свойство GridLineColors->DarkColor, но я не понял для чего оно.
А вопрос в следующем. Необходимо задать толщину линий сетки.
У TDrawGrid и TStringGrid для этого есть свойство GridLineWidth.
Рисование в DrawColumnCell не подходит, т.к. используется фишка 4-й версии HideDuplicate для скрытия провторяющихся значений в столбце (стираются разделительные линии между дублями).
Есть какое-нибудь решение?
Вопрос решился
[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]
[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]
Цитата:
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?
xNikitos
Цитата:
А попробуй заглянуть в папку windows\system32 и найти там что нибудь типа ibxpress73.bpl или 70. Если такой будет найден, то не знаю что делать, а если не будет вообще ibx, то по идее его переустанавливают. Возможно инсталлер посчитал, что это его файло и грохнул. Однако если открыть DclEhLibDataDrivers70.dpk, то можно сделать "Remove file" ibxpress и потом "Add Reference" 73. Очень похоже что 73 уже в памяти а он пробует загрузить 70.
Цитата:
то же самое. Что сделать? Где взять исходники, чтобы перекомпилить ibxpress?
А попробуй заглянуть в папку windows\system32 и найти там что нибудь типа ibxpress73.bpl или 70. Если такой будет найден, то не знаю что делать, а если не будет вообще ibx, то по идее его переустанавливают. Возможно инсталлер посчитал, что это его файло и грохнул. Однако если открыть DclEhLibDataDrivers70.dpk, то можно сделать "Remove file" ibxpress и потом "Add Reference" 73. Очень похоже что 73 уже в памяти а он пробует загрузить 70.
Не, проблема именно в том, что EhLib скомпилен под старую версию IBX.
здравствуйте, есть вопросик маленький по эхлибу.
У эхлиб есть прикольная функция dghRecordMoving. - это функция перетаскивания строки в датасете.
Так вот - вроде бы работает она, но когда выбираешь несколько строк, то почему-то они после того, как их кинешь в место назначения, то они сортируются в обратном порядке, а второй раз это же выделение берешь - пересортировывается правильно.
С чем может быть баг?
Эхлиб лицензия - но саппорта у компонента считай нету, наверное сильно занят, поэтому я и спрашиваю здесь.
У эхлиб есть прикольная функция dghRecordMoving. - это функция перетаскивания строки в датасете.
Так вот - вроде бы работает она, но когда выбираешь несколько строк, то почему-то они после того, как их кинешь в место назначения, то они сортируются в обратном порядке, а второй раз это же выделение берешь - пересортировывается правильно.
С чем может быть баг?
Эхлиб лицензия - но саппорта у компонента считай нету, наверное сильно занят, поэтому я и спрашиваю здесь.
Привет всем!
У меня вопрос Ehlib умеет сортировать по клику на титл Calculated field и lookup field? И как?
Заранее благодарен.
У меня вопрос Ehlib умеет сортировать по клику на титл Calculated field и lookup field? И как?
Заранее благодарен.
Chulpon
это зависит от движка работы с базой : ADO - нет, SDAC - точно ДА (причем дополнительно ничего делать не нужно... ну развечто создания своего сервиса для сдака см. EhLib\DataService)
ну или работать через мемтейбл , но это - изврат
это зависит от движка работы с базой : ADO - нет, SDAC - точно ДА (причем дополнительно ничего делать не нужно... ну развечто создания своего сервиса для сдака см. EhLib\DataService)
ну или работать через мемтейбл , но это - изврат
Спасибо .
Но я исользую 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
Заранее огромное спасибо.
Но я исользую 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
Заранее огромное спасибо.
Подскажите пожалуйста как можно реализовать через ехГрид следующее:
Грид отображает таблицу заказов (например), она содержит id покупателя из таблицы покупателей и цену. Как можно сделать чтобы отображался не id а ФИО из таблицы покупателей?
Поле в гриде указывает на Lookup поле из датасета грида.
Грид отображает таблицу заказов (например), она содержит id покупателя из таблицы покупателей и цену. Как можно сделать чтобы отображался не id а ФИО из таблицы покупателей?
Поле в гриде указывает на Lookup поле из датасета грида.
Chulpon
По поводу апострофов можно попытаться самостоятельно их выставить, в том случае если их не найдено, а можно попытаться ещё доки почитать по синтаксису который используется. Если это скуль то по синтаксису скуля.
Добавлено:
asdnsd
У лукопа в прюнципе два поля - данные которые вы берёте и связанные данные которые показывать надо.
Добавлено:
asdnsd
Но это в том случае если у связного датасета имена полей ID совпадают. А так получается три.
По поводу апострофов можно попытаться самостоятельно их выставить, в том случае если их не найдено, а можно попытаться ещё доки почитать по синтаксису который используется. Если это скуль то по синтаксису скуля.
Добавлено:
asdnsd
У лукопа в прюнципе два поля - данные которые вы берёте и связанные данные которые показывать надо.
Добавлено:
asdnsd
Но это в том случае если у связного датасета имена полей ID совпадают. А так получается три.
Цитата:
Chulpon
По поводу апострофов можно попытаться самостоятельно их выставить, в том случае если их не найдено, а можно попытаться ещё доки почитать по синтаксису который используется. Если это скуль то по синтаксису скуля.
Как я ничего не делаю он сам автоматом фильтр делает правильно..
Даже в демо Ehlib такой ошибка выдает.
если знаешь помоги..
в исходниках ко что убрал но это не помогло
Цитата:
там есть содержить такой значение (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)
Люди, говорят для EhLib есть справка на русском языке, выложите пожайлуста.
Asm64D
держи http://slil.ru/27481231
держи http://slil.ru/27481231
fcdobpiy
Спасибо!!!
Спасибо!!!
Кто-нить сталкивался с такой ошибкой: после запроса к БД, данные показываются в таблице, настроены автофильтры на некоторых полях. Всё работает отлично, но стоит использовать один из автофильтров, а затем сформировать новый взапрос к БД - вываливается ошибка "List index out of bounds". В чем трабл?
Привет всем. Есть немного нестандартный вопрос, можно ли как-нибудь заставить компоненты EhLib отрисовываться несколько по другому, ну например чтобы они отрисовывались с помощью тем из DevExpress?
Добрый день.
Очень радует то, что хорошо известная библиотека Е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)
Очень радует то, что хорошо известная библиотека Е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)
Vladislav_Matvienko
ты бы изложил все это Дмитрию Большакову, автору ehlib. Напиши ему это письмом. Недавно с ним общался - отвечает на письма, адекватно себя ведет, обсуждает проблему. (не в пример сообществу far -) )
ты бы изложил все это Дмитрию Большакову, автору ehlib. Напиши ему это письмом. Недавно с ним общался - отвечает на письма, адекватно себя ведет, обсуждает проблему. (не в пример сообществу far -) )
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;
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;
X11
1.
TDBLookupComboboxEh.ListVisible унаследовано от TDBLookupCombobox
2. добавь обработчик события OnButtonClick
что то типо этого
if (sender as TDBLookupComboboxEh).ListVisible then Handled:=true;
но появится такой баг, что последующие клики мышкой по кнопке не свернут лист. но тут думаю добавишь еще один флаг для проверки
1.
TDBLookupComboboxEh.ListVisible унаследовано от TDBLookupCombobox
2. добавь обработчик события OnButtonClick
что то типо этого
if (sender as TDBLookupComboboxEh).ListVisible then Handled:=true;
но появится такой баг, что последующие клики мышкой по кнопке не свернут лист. но тут думаю добавишь еще один флаг для проверки
кошмар %) а попроще нельзя?
Цитата:
а что значит Handled:=true?
Цитата:
if (sender as TDBLookupComboboxEh).ListVisible then Handled:=true;
а что значит Handled:=true?
из справки по ehlib про событие OnButtonClick
Цитата:
Цитата:
это про 2 пункт я надеюсь ? ))
проще как мне кажется нельзя, т.к.отловить вход в объект при передаче фокуса (tab, enter) мы кроме как в OnEnter не сможем. а встроенного свойства влияющего на это я не вижу, даже в более новом ehlib
да и получаются у нас ситуации
а) ничего не добавляя в обработку - клик мышкой в любую облать объекта раскрывает лист, клик по кнопке также раскрывает. а вот при передаче фокуса по tab не раскрывает
б)добавляем твой код - список раскрывается всегда, но имеем 2 бага "Когда нажимаю кнопку справа для того, чтобы список раскрылся, то список раскрывается и сразу же закрывается. Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет."
в) к твоему коду добавляем обработку события клика на кнопку (что приведен выше) - работает все , но остался один баг "Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет."
Цитата:
Установите Handled в True если вы не хотите чтобы контрол отображал выпадающий список.
Цитата:
кошмар %) а попроще нельзя?
это про 2 пункт я надеюсь ? ))
проще как мне кажется нельзя, т.к.отловить вход в объект при передаче фокуса (tab, enter) мы кроме как в OnEnter не сможем. а встроенного свойства влияющего на это я не вижу, даже в более новом ehlib
да и получаются у нас ситуации
а) ничего не добавляя в обработку - клик мышкой в любую облать объекта раскрывает лист, клик по кнопке также раскрывает. а вот при передаче фокуса по tab не раскрывает
б)добавляем твой код - список раскрывается всегда, но имеем 2 бага "Когда нажимаю кнопку справа для того, чтобы список раскрылся, то список раскрывается и сразу же закрывается. Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет."
в) к твоему коду добавляем обработку события клика на кнопку (что приведен выше) - работает все , но остался один баг "Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет."
fcdobpiy, +1 за if TDBLookupComboboxEh(sender).ListVisible then Handled:=true;
Всем привет!
Есть база Interbase, вывожу ее в DBGridEh, в ней есть поле COUNTRY, в котором хранятся названия стран, нужно в ячейку напротив названия страны вывести флаг соответсвующий стране в ячейке. В DBGridEh есть возможность выводить картинку из ImageList, но в ImageList картинке присваивается только числовой индекс. Может кто знает как можно проставить соответствия названия стран индексу в ImageList?
Заранее спасибо.
Добавлено:
Вопрос снимаю, разобрался.
Только вот новая проблема. Если ставлю ShowTextAndImage:=true, все равно выводится только картинка, что может быть?
Добавлено:
Еще одна проблема с фильтрацией.
Есть DBgridEh, поставил в нем STFilter, работает, фильтрует, но после того как отфильтровал, в списке для фильтрации доступно только то значение по которому уже отфильтровалось, вместо всех возможных. Кто с таким сталкивался?
Есть база Interbase, вывожу ее в DBGridEh, в ней есть поле COUNTRY, в котором хранятся названия стран, нужно в ячейку напротив названия страны вывести флаг соответсвующий стране в ячейке. В DBGridEh есть возможность выводить картинку из ImageList, но в ImageList картинке присваивается только числовой индекс. Может кто знает как можно проставить соответствия названия стран индексу в ImageList?
Заранее спасибо.
Добавлено:
Вопрос снимаю, разобрался.
Только вот новая проблема. Если ставлю ShowTextAndImage:=true, все равно выводится только картинка, что может быть?
Добавлено:
Еще одна проблема с фильтрацией.
Есть DBgridEh, поставил в нем STFilter, работает, фильтрует, но после того как отфильтровал, в списке для фильтрации доступно только то значение по которому уже отфильтровалось, вместо всех возможных. Кто с таким сталкивался?
Страницы: 1234567891011121314151617181920212223
Предыдущая тема: Конвертация char в ASCII код; c
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.