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

» Вопросы по Ehlib

Автор: abalex
Дата сообщения: 08.11.2006 14:59

Цитата:
А ты передергивай свойство SumList.Active, по моему помогает

IMHO лучше дернуть SumList.RecalcAll()
а то у меня на некоторых движках после смены SumList.Active раз 5 туда-сюда, прога вылетает с ошибкой переполнения буфера
Добавлено.
По крайней мере год назад так было, счас не проверял уже этот случай
Автор: Just_Perf
Дата сообщения: 08.11.2006 18:08

Цитата:
IMHO лучше дернуть SumList.RecalcAll()


спасибо! теперь все работает как нужно!
Автор: vladk1973
Дата сообщения: 09.11.2006 03:00

Цитата:
а то у меня на некоторых движках после смены SumList.Active раз 5 туда-сюда, прога вылетает с ошибкой переполнения буфера

abalex
Это в какой версии было, инетересно? Просто не замечал такого
Автор: abalex
Дата сообщения: 10.11.2006 09:00

Цитата:
Это в какой версии было, инетересно? Просто не замечал такого

Это было еще в 3-ей версии. Надо будет проверить в 4-ой.
Автор: vladk1973
Дата сообщения: 14.11.2006 05:27
abalex
Я сейчас в четвертой сижу, не замечал такого бага.
Зато в четверке полно других ошибок

Вот использовал TIniPropStorageManEh в главной форме приложения, как учили

Код: var
IniPropStorageMan: TIniPropStorageManEh;

initialization

IniPropStorageMan := TIniPropStorageManEh.Create(nil);
IniPropStorageMan.IniFileName := 'MyIniFile.Ini';
SetDefaultPropStorageManager(IniPropStorageMan);
end.
Автор: Denchik
Дата сообщения: 15.11.2006 17:06
есть столбец с картинками, проблема в том, что не на каждому элементу в выпадающем списке может соответсвовать картинка, при отображении значения ячейки это хорошо решается через OnGetCellParams, но в выпадающем списке значения "едут" - не соответсвуют картинкам

Добавлено:
нашел в исходниках функцию PopupListboxGetImageIndex, там был закомменчен вызов события OnGetItemImageIndex столбца, раскомментировал пока все работает...
Автор: vladk1973
Дата сообщения: 16.11.2006 02:28
Denchik
Я вывешивал картинки стандартным способом - через свойство KeyList:

Цитата:
Show bitmaps in data cells depending on field values.

TDBGridEh allows to show bitmaps from TImageList component depending on field values. To show bitmaps depending on field values need: Fill list of field values to Column.KeyList property (every value in separate line) and set Column.ImageList property to ImageList control that has the bitmap in according index. Set Column.NotInKeyListIndex to index of bitmap that will be shown if field's value does not correspond to any value in KeyList (for instance you can set index of image for Null field value). At run time you are not allowed to edit bitmap in column cell. Use blank key and mouse click to set next value from Column.KeyList to the field; Shift-blank key and Shift-Mouse click to set previous value from Column.KeyList. Set Column.DblClickNextval to True have allows to change value on mouse double click.

Если делать так, то проблем не замечено
Автор: Denchik
Дата сообщения: 16.11.2006 10:12
vladk1973

Цитата:
Fill list of field values to Column.KeyList property (every value in separate line) and set Column.ImageList property to ImageList control that has the bitmap in according index.

в том то все и дело, индекс картинки берется по номеру строки в KeyList и если каждой строке соответвует картинка, то тогда действительно "проблем не замечено", если же нет, то картинки едут, например:

картинка - KeyList
А - 1
- 2
Б - 3

в ImageList будет 2 картинки А и Б, потому как пихать пустую картинку, имхо, не есть правильно, в итоге грид воспринимает это дело как:

картинка - KeyList
А - 1
Б - 2
- 3

при отрисовке ячейки это легко обходится через событие OnGetCellParams столбца, а вот при формировании выпадающего списка такого события не было
Автор: vladk1973
Дата сообщения: 17.11.2006 08:07

Цитата:
Set Column.NotInKeyListIndex to index of bitmap that will be shown if field's value does not correspond to any value in KeyList (for instance you can set index of image for Null field value).

А это разве не помогает в твоем случае ?
Автор: Denchik
Дата сообщения: 17.11.2006 10:27
vladk1973

Цитата:
А это разве не помогает в твоем случае ?

если я правильно понимаю английский, нет

Цитата:
Set Column.NotInKeyListIndex to index of bitmap that will be shown

значит, картинка, которая будет отображена для значения поля не содержащегося в KeyList (в моем примере, если Field->Value = 4 или Field->Value = NULL), должна быть в ImageList, у меня же такой картинки нет, соответсвенно и ее индекса
Автор: Rounder2000
Дата сообщения: 19.01.2007 13:17
Доброго дня.
Подскажите плиз как сделать та, чтобы на Title колонки не сробатывало popupMenu
Т.е. оно должно срабатывать в любой точке грида кроме title.
Или на крайний случай, как получить имя колонки, на title которой было нажато правой клавишей мыши.
Спасибо.
Автор: vserd
Дата сообщения: 01.02.2007 09:41
ответ на пост relictus в http://forum.ru-board.com/topic.cgi?forum=33&topic=6679&start=1780#lt

relictus


Цитата:
И если хочешь автоматической сортировки/фильтрации ни вкоем случае не создавай обработчиков соответствующего действия. Иначе автоматика не работает.
И поставить /*FILTER*/ и Order By в отдельную строку в самое начало.

А можно по-подробнее насчет этого?


А доку почитать? А исходный код посмотреть?
для того чтобы EHLib начал фильтровать, нужно в отдельную строку запроса поставить /*FILTER*/ 1=1, причем обязательно на первую позицию.
пример:

Код:
Select * From MyTable where /*FILTER*/ 1=1 не работает
Select * From MyTable where
/*FILTER*/ 1=1 не работает
Select * From MyTable where
/*FILTER*/ 1=1 работает
Автор: relictus
Дата сообщения: 01.02.2007 09:52
vserd
Спасибо! Пишу свой модуль для DBISAM'a.
A запросы пока мне не понадобились - в гриде тупо сидит одна табличка из 4-х полей. Но все равно спасибо, когда-нибудь эта инфа будет востребована
Автор: Dauren111
Дата сообщения: 01.02.2007 13:31
а события OnCellDbClick у Ehlib нету
как заменить?
Автор: relictus
Дата сообщения: 01.02.2007 16:01
Как грамотно на сабжевом гриде реализовать такое:
в гриде отображается напрямую содержимое одной таблицы, причем значениями последнего поля являются числа, которые могут быть равны нулю. Что надо сделать, чтобы в гриде, строка имеющая в том поле 0 отображалась, к примеру, красным цветом?
Через OnGetCellParams могу подобраться только к конкретной ячейке, но не строке...
Автор: vserd
Дата сообщения: 01.02.2007 16:15
Именно через GetCellParams и получается доступ. Данный код отрисовывает всю строку желтым цветом.

procedure TfrmCommonGridFormWithPeriod.DBGridEh1GetCellParams(Sender: TObject;
Column: TColumnEh; AFont: TFont; var Background: TColor; State: TGridDrawState);
begin
inherited;
if Assigned(IBQuery.FindField('IS_FOLDER')) and (not IBQuery.IsEmpty) then
if (IBQuery.FieldByName('IS_FOLDER').Value) then Background := clYellow;
end;
Автор: SERGE_BLIZNUK
Дата сообщения: 01.02.2007 17:12
Dauren111
Цитата:
а события OnCellDbClick у Ehlib нету как заменить?

могу предложить крайне кривое решение - если не найдёте лучше - тогда можете попытаться - через установку меток в CellClick и проверке их на onDblClick [more]

1) в переменные формы добавить два параметра
private
{ Private declarations }
FTimeTitleClick : Cardinal;
FAllowDblClick : boolean;

2) иницилазация - (например, на создании формы)
// FORM-OnCreate (.FormCreate)
FTimeTitleClick := 0;
FAllowDblClick := false;

3) на onCellClick
procedure TForm1.DBGridEh1CellClick(Column: TColumnEh);
begin
FTimeTitleClick := GetTickCount;
FAllowDblClick := true;
end;

4) на onDblClick

procedure TForm1.DBGridEh1DblClick(Sender: TObject);
var
DiffTicks : Cardinal;
begin
DiffTicks := abs(GetTickCount - FTimeTitleClick);
if DiffTicks > GetDoubleClickTime then begin
FAllowDblClick := false;
Exit;
end;
if not FAllowDblClick then Exit;
FAllowDblClick := false;
ShowMessage('Double click on CELL');
end;
ешё раз подчёркиваю, что решение некрасивое и громоздкое - но может быть, пригодится...
[/more]
Удачи.
Автор: relictus
Дата сообщения: 02.02.2007 08:36
vserd
Что-то не так... у меня такой код меняет бэкграунд только в ОДНОЙ ячейке (в той где 0), а не во всей строке!

procedure TForm1.DBGridEhSkladGetCellParams(Sender: TObject; Column: TColumnEh;
AFont: TFont; var Background: TColor; State: TGridDrawState);
begin
inherited;
if (Column.FieldName = 'KOLVO') and (Column.Field.Value = 0) then Background := clYellow;
end;

Что я делаю не так?
Автор: vserd
Дата сообщения: 02.02.2007 09:47

Цитата:
у меня такой код меняет бэкграунд только в ОДНОЙ ячейке (в той где 0), а не во всей строке!

Этот код работает правильно. Он и должен закрашивать фон только у одной ячейки.
Внимательно почитай и подумай почему. :)


Цитата:
Что я делаю не так?

Column. А вот и ответ.

Попробуй так:
if Sender is TDBGridEh then
if Assigned(TDBGridEh(Sender).DataSource.Dataset.FindField('KOLVO')) and
(TDBGridEh(Sender).DataSource.Dataset.FieldByName('KOLVO').value = 0)
then Background := clYellow;

Возможно со скобками напутано, но должно работать.
Автор: relictus
Дата сообщения: 02.02.2007 10:23
vserd Гениально! Работает! ) Но в чем фишка-то? Что в моем коде обрабатывалась только одна ячейка - это понятно, но почему в твоем - вся строка, не пойму! Если не сложно, объясни! Можно в личку.
Автор: Just_Perf
Дата сообщения: 02.02.2007 10:58
вопрос по EhLib
есть форма с gridEh. Align грида по клиентскому окну. грид через мемотаблицу (МТ) берет данные с sql запроса.
вопрос таков: при открытии формы в MT отображаются все записи запроса и onCellClick отрабатывается прекрасно. как только разворачивавется клиенское окно (и, следовательно, грид вместе с ним) строки, которые ранее не входили в область грида, не отрабатывают указанное событие... словно их и нет...
если работать без MT (напрямую с запросом), то грид ведет себя корректно. свойства МТ всячески перепробовал, fetchall стоит по умолчанию. в чем м.б. проблема?
Автор: vserd
Дата сообщения: 02.02.2007 11:38
relictus
Потому что в твоем коде, анализируется значение ТЕКУЩЕЙ КОЛОНКИ грида.
В моем коде анализируется значение ПОЛЯ ТЕКУЩЕЙ ЗАПИСИ в таблице.

Когда ты осознаешь в чем разница, такой код будешь ловить на раз.
Автор: relictus
Дата сообщения: 09.02.2007 13:36
Знатоки сабжа, ну подскажите в чем дело?? см. скриншот (46 кб) http://i16.tinypic.com/2v14saa.jpg
Простенькая таблица, но почему одна строка фильтруется, а другая нет?? Голову уже сломал
Поля п/п: char(150), currency, integer
Автор: vserd
Дата сообщения: 09.02.2007 14:59
relictus
IMHO "прелести" вещественных чисел, число в базе не точно 3138,45 а к примеру
3138,4500000000000001 или 3138,4499999999999999999.
Так что смотри что реально у тебя лежит в таблице.


Автор: relictus
Дата сообщения: 09.02.2007 15:07
vserd
в базе реально лежит число с двумя знаками после запятой, ибо тип поля = currency!
Автор: vserd
Дата сообщения: 09.02.2007 15:25
relictus

Цитата:
в базе реально лежит число с двумя знаками после запятой, ибо тип поля = currency!

Вобще-то учите матчасть! взято с hччp://www.elevatesoft.com/dbisam4d5_data_types_null_support.htm

Цитата:

Currency fields are the same as Float fields except they are identified in a special way to allow for Delphi, Kylix, and C++Builder to format their values as monetary values when displayed as strings. The equivalent Delphi, Kylix, and C++Builder TFieldType is ftCurrency, the TField object used for Currency fields is the TCurrencyField object, and the equivalent SQL data type is MONEY.

Note
Don't confuse the Currency field type with the Currency data type found in Delphi, Kylix, and C++Builder. The Currency field type is essentially still a floating-point number and is not always good for storing exact monetary values, whereas the Currency data type is a fixed-point data type that minimizes rounding errors in monetary calculations. If you wish to have accurate financial figures that use up to 4 decimal places stored in DBISAM tables then you should use the BCD data type described next.



Вобще-то даже Делфийский currency если я правильно путаю и справка меня в этом убеждает имеет вещественную природу, хотя и храниться в целочисленном значении, но может иметь 4 знака после запятой.
Currency    -922337203685477.5808.. 922337203685477.5807    19-20    8
Автор: SERGE_BLIZNUK
Дата сообщения: 09.02.2007 15:37
relictus
Цитата:
Простенькая таблица, но почему одна строка фильтруется, а другая нет?? Голову уже сломал
точно не скажу - НО, на 99% виновато округление! Т.е. там нет суммы 3138.45 руб (а есть, например, 3138.44987 - при отображении двух знаков, после запятой - она округляется....) Попробуйте либо в запросе сделать округление, либо добавить вычисляемое поле, либо, чтобы убедиться, что это не так, сделайте отображение хотя бы пяти знаков после запятой - убедитесь, что там точное число.
Кстати, можете подключиться к таблице через накой-нибудь SQL Navigator - и глянуть, что же за цена фактически в базе по "Плате S775 ..."

sorry, если не угадал причину.... ;-))
Автор: relictus
Дата сообщения: 09.02.2007 15:39
vserd
сенькс! а ведь я это читал! но не обратил внимания, что currency
Цитата:
is not always good for storing exact monetary values

Автор: SERGE_BLIZNUK
Дата сообщения: 09.02.2007 15:47
Сорри за тормознутость. Пока открыл страничку. Отвлёкся на минуту - тут уже целая дискуссия ;-)))))
Автор: relictus
Дата сообщения: 12.02.2007 13:57
Как правильно реализовать следующее:
булевское поле отображается в дбгриде как CheckBox (галкой). При клике на ячейке значение меняется, но в БД не сохраняется пока не произойдет переход на другую запись, т.е. пока поле не выйдет из режима редактирования. А как сразу сохранять изменения в БД, не выходя из ячейки грида?

Страницы: 1234567891011121314151617181920212223

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


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