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

» Вопросы по Ehlib

Автор: delover
Дата сообщения: 13.05.2013 08:00
На работе EhLib 5.6 но я не могу найти компоненты MyDataSource и MyQuery. Это MySQL либа? UNiDac или я не догоняю?

Добавлено:
Попробовал с фибами...

Код: v := SumList.SumCollection.GetSumByOpAndFName(SumListArray[Footer.ValueType], FieldName).SumValue;
Автор: XPerformer
Дата сообщения: 13.05.2013 10:13
delover
ничего, что среднее считается как сумма деленная на кол-во? зачем его в цикле считать-то?
Автор: delover
Дата сообщения: 13.05.2013 11:29
XPerformer
В этом цикле перечисляются элементы. Без элементов среднего не будет. В этом цикле есть вычисление Min Max Count и Sum. Вы предлагаете Avg считать отдельно, в другом цикле или считать вообще без элементов???

EhLib
Порадовало

Код: procedure TRecordsViewEh.QuickSort(L, R: Integer; Compare: TCompareRecords; ParamSort: TObject);
...
begin
if L >= R then Exit; //<--??? Это что от дурака защита на все времена???
//На практике 'L >= R' = false.
Автор: XPerformer
Дата сообщения: 13.05.2013 11:34
delover
может, туплю, конечно, что если Sum/Count не среднее получится?
Автор: miwa
Дата сообщения: 13.05.2013 11:58
delover

Цитата:
if L >= R then Exit; //<--??? Это что от дурака защита на все времена???

А что не так? Вполне себе правильная проверка, на практике не всегда 'L >= R' = false. Pазве что я бы какой-нибудь assert/exeption делал вместо exit-а.

XPerformer
delover, наверное, подразумевает, что для вычисления суммы/количества все равно нужен цикл.
Автор: delover
Дата сообщения: 13.05.2013 12:08
XPerformer

Цитата:
может, туплю, конечно

Наверно. Я вообщето про Eh-код пишу, а не про что то. Нету ещё ни Sum ни Count

> DBGridEh1.SumList.RecalcAll;

Предположительно означает, что программист захотел пересчитать агрегатные функции.
Это значит нет ни Sum ни Count - их надо сосчитать. Для MemTable расчёт выполняется отдельно:

if Supports(DataSet, IMemTableEh, AIntMemTable)
then
begin
RecalcAllForIntMemTable;

Функция которая реализует само суммирование:

[more]
Код: [no]procedure TCustomMemTableEh.GetAggregatedValuesForRange(FromBM, ToBM: TUniBookmarkEh;
FieldName: String; var ResultArr: TAggrResultArr; AggrFuncs: TAggrFunctionsEh);
var
FromRN, ToRN: Integer;
i: Integer;
v: Variant;
VarTypeNum: Integer;
FieldIndex: Integer;
begin
ResultArr[agfSumEh] := Null;
ResultArr[agfCountEh] := 0;
ResultArr[agfAvg] := Null;
ResultArr[agfMin] := Null;
ResultArr[agfMax] := Null;
if not Active then Exit;
if FromBM <> NilBookmarkEh then
if UniBookmarkValid(FromBM)
then FromRN := UniBookmarkToRecNo(FromBM)
else Exit
else
FromRN := 1;
if ToBM <> NilBookmarkEh then
if UniBookmarkValid(ToBM)
then ToRN := UniBookmarkToRecNo(ToBM)
else Exit
else
ToRN := RecordCount;

if (FieldName = '') and (AggrFuncs = [agfCountEh]) then
begin
for i := FromRN-1 to ToRN-1 do
ResultArr[agfCountEh] := ResultArr[agfCountEh] + 1;
Exit;
end;

if FRecordsView.MemTableData.DataStruct.FindField(FieldName) = nil then
Exit;
VarTypeNum := FRecordsView.MemTableData.DataStruct.FieldByName(FieldName).GetVarDataType;
FieldIndex := FRecordsView.MemTableData.DataStruct.FieldIndex(FieldName);
for i := FromRN-1 to ToRN-1 do
begin
v := FRecordsView.RecordView[i].Rec.Value[FieldIndex, dvvValueEh];
if not VarIsNullEh(v) then
begin
if (agfCountEh in AggrFuncs) or (agfAvg in AggrFuncs) then
ResultArr[agfCountEh] := ResultArr[agfCountEh] + 1;
if VarTypeNum in [varSmallint, varInteger, varSingle, varDouble, varCurrency,
{$IFDEF EH_LIB_6}
varShortInt, varWord, varInt64, varLongWord,
{$ENDIF}
varByte, varDate] then
begin
if (agfSumEh in AggrFuncs) and (VarTypeNum <> varDate) then
if VarIsNullEh(ResultArr[agfSumEh])
then ResultArr[agfSumEh] := v
else ResultArr[agfSumEh] := ResultArr[agfSumEh] + v;

if agfMin in AggrFuncs then
     if VarIsNullEh(ResultArr[agfMin]) then
ResultArr[agfMin] := v
else if ResultArr[agfMin] > v then
ResultArr[agfMin] := v;

if agfMax in AggrFuncs then
if VarIsNullEh(ResultArr[agfMax]) then
ResultArr[agfMax] := v
else if ResultArr[agfMax] < v then
ResultArr[agfMax] := v;
end
end;
end;

if agfMax in AggrFuncs then
if not VarIsNullEh(ResultArr[agfSumEh]) then
ResultArr[agfAvg] := ResultArr[agfSumEh] / ResultArr[agfCountEh];
end;[/no]
Автор: XPerformer
Дата сообщения: 13.05.2013 12:09
delover
понимаю. Но у меня все работает
Автор: delover
Дата сообщения: 13.05.2013 12:13
miwa

Цитата:
Вполне себе правильная проверка

С учётом что афтор это делает в цикле сортировки которая "Быстрая" якобы.
if L < J then
QuickSort(L, J, Compare, ParamSort);


Добавлено:
Надо ещё sleep(1) добавить в цикл QuickSort. А чтоб жизнь мёдом не казалась.
Автор: miwa
Дата сообщения: 13.05.2013 20:05
delover

Цитата:

miwa

Цитата: Вполне себе правильная проверка

С учётом что афтор это делает в цикле сортировки которая "Быстрая" якобы.
Автор: LadyOfWood
Дата сообщения: 13.05.2013 21:54

Цитата:
С учётом что афтор это делает в цикле сортировки которая "Быстрая" якобы.
    if L < J then
      QuickSort(L, J, Compare, ParamSort);

Это со стороны кажется что все нормально, в реальности может быть немного по другому. Я тоже делаю

Код:
if AObj = nil then Exit;
Автор: miwa
Дата сообщения: 13.05.2013 22:34
LadyOfWood
А почему не Assert/Exception? Не приходилось еще полдня искать, "почему оно не работает и нифига не ругается"?
Автор: LadyOfWood
Дата сообщения: 14.05.2013 00:11

Цитата:
А почему не Assert/Exception? Не приходилось еще полдня искать, "почему оно не работает и нифига не ругается"?

Assert только на дебажном билде (а там как всегда все хорошо), exception это уже определенная ошибка, которая должна быть понятна пользователю или кем-то съедена по дороге.

Цитата:
"почему оно не работает и нифига не ругается"?

Не не приходилось
Автор: miwa
Дата сообщения: 14.05.2013 07:02

Цитата:
Exception это уже определенная ошибка, которая должна быть понятна пользователю или кем-то съедена по дороге

У меня «последний рубеж обороны» - Application.OnException, который в зависимости от типа ошибки и настроек либо что-то говорит пользователю, либо пишет лог, либо даже делает скриншот и шлет на почту в случае большого ппца.
Автор: rich76
Дата сообщения: 14.05.2013 09:04
delover
XPerformer
похоже нужно прикручивать вариант с форума ehlib-а
DBGrid->Columns->Items[7]->Footer->ValueType = fvtStaticText;
if (DBGrid->SumList->SumCollection->Items[1]->SumValue != 0)
{
DBGrid->Columns->Items[7]->Footer->Value = FormatFloat ("0.00" ,(100*DBGrid->SumList->SumCollection->Items[0]->SumValue / DBGrid->SumList->SumCollection->Items[1]->SumValue));
}
else
{
DBGrid->Columns->Items[7]->Footer->Value = 0;
}
правда в проекте не один грид
Автор: delover
Дата сообщения: 14.05.2013 17:04
LadyOfWood

Цитата:
Это со стороны кажется что все нормально, в реальности может быть немного по другому. Я тоже делаю

Разделяю целиком и полностью. Но что касается именно метода QuickSort, то тут я бы разрешил все акцесс виолейшены - очень интересно что будет, ну если я вдруг решил сыграть дурочка. Интересны те люди которые хотят отсортировать только данные от записи 1000 до записи 2000, а остальные не трогать. Кстати мой подход - заметил у меня ошибку - исправь и не говори мне.


Цитата:
Надо ещё sleep(1) добавить в цикл QuickSort. А чтоб жизнь мёдом не казалась.

Ну я то лучший из худших, так что моя сортировка в тысячи медленнее чем если добавить sleep. Думаю шутка простительна.

Добавлено:
Небольшая подробность. Сегодня сортирую, прошло пол часа, поставил брейкпоинт - она ещё 10% не отсортировала. Думаю надо уметь так... Я в трамвае ехал ржал над глюком, а потом даже поперхнулся - думаю может кто-то пожалел что-то, но уж не для меня.)
Автор: delover
Дата сообщения: 14.05.2013 20:23

Цитата:
записи 1000 до записи 2000

Посортируйте плиз - публичная процедура.
Автор: LadyOfWood
Дата сообщения: 14.05.2013 20:32

Цитата:
У меня «последний рубеж обороны» - Application.OnException, который в зависимости от типа ошибки и настроек либо что-то говорит пользователю, либо пишет лог, либо даже делает скриншот и шлет на почту в случае большого ппца.

У меня последний рубеж EurekaLog, но все равно доводить до нее стоит только что-то важное.
Автор: rich76
Дата сообщения: 28.05.2013 15:16
delover

Цитата:
это значит что для AVG тоже надо знать количество. Больше про AVG никто не вспоминал. Возможно автора отвлекли в этот момент. Либо момент был очень волнительный. Но расчёта AVG тут нет...

Вы правы, поправил для себя GetAggregatedValuesForRange
...
if ((agfSumEh in AggrFuncs)or (agfAvg in AggrFuncs)) and (VarTypeNum <> varDate) then
...

и
if agfAvg in AggrFuncs then
вместо
if agfMax in AggrFuncs then
Автор: delover
Дата сообщения: 30.05.2013 19:58
rich76
Ну Вам спасибо, но я думаю Вы не поймёте.

После 2-х лет воздержания под юбилей решил использовать EhLib. Знаете - это был самый большой подарок - мультиселект ровселект без рецтангле +
Автор: Unnicked
Дата сообщения: 13.07.2013 16:12
Прошу помочь со следующей проблемой.

Есть старый проект, в нем почему-то возникает следующая ошибка линковки:


Цитата:
[Linker Error] Unresolved external '__fastcall Dbgrideh::TCustomDBGridEh::SetOptions(System::Set<Dbgrids::TDBGridOption, 0, 12>)' referenced from ...
[Linker Error] Unresolved external '__fastcall Dbgrideh::TBookmarkListEh::GetItem(int)' referenced from ...
[Linker Error] Unresolved external '__fastcall Dbgrideh::TBookmarkListEh::GetCount()' referenced from ...
[Linker Error] Unresolved external '__fastcall Dbgrideh::TCustomDBGridEh::DefaultDrawColumnCell(const Types::TRect&, int, Dbgrideh::TColumnEh *, System::Set<Grids::Grids__3, 0, 2>)' referenced from ...


В проекте используется множество функций EhLib, но линкер ругается только на эти.

Пути к библиотеке прописаны. Версия EhLib 4.0 Build 4.0.9. Проект в C++ Builder 6.0.

В чем может быть причина и как ее можно устранить?
Автор: FreePaul
Дата сообщения: 20.08.2013 07:17
Здравствуйте!
Возможно, кому-то вопрос покажется смешным. Однако, все же задам его.
Есть DBGridEh, к нему привязано всплывающее меню с пунктами "Выделить все", "Инвертировать выделение", "Снять выделение". С первым и последним пунктами все ясно и понятно. А вот с инвертированием - не очень...
Как организовать инвертирование выделения в DBGridEh?
Автор: karlss0n
Дата сообщения: 20.08.2013 10:33
FreePaul

Запоминаете выделение, далее выделить всё, снять выделение (то, что запомнили)
Автор: mrUlugbek
Дата сообщения: 02.12.2013 07:33
Здравствуйте
Как в MemtableEH в режиме TreeView найти родительский записи..
Мне надо узнать ИД родителя и название..
Заранее благодарен
Автор: FreePaul
Дата сообщения: 25.02.2014 06:12
Здравствуйте!
Имеется результат выбора данных, выведенный в DBGridEh. В этом наборе данных имеется колонка "UN".
Стоит задача скопировать в буфер обмена значения нескольких полей "UN".
Отбор производится оператором, выделяющим строки с интересующими данными. Выделение строк может быть не подряд, т.е. между выделенными строками могут быть разрывы.
Автор: xpin2013
Дата сообщения: 21.03.2014 22:15
MultiSelect + BookMark. Я может ошибаюсь в идентификаторах, если что в ПМ пишите, не будем захламлять топик..
Автор: miwa
Дата сообщения: 24.03.2014 10:54
FreePaul
Ответ предыдущего оратора неправильный. У EhLib есть свойствa SelectedRows и Selection - вот там и стоит искать свои данные.
Автор: xpin2013
Дата сообщения: 27.03.2014 17:46
miwa
Вы брешете как не знаю кто, ваш Select это набор букмарков который так же успешно слетает после сортировки.

Цитата:

Здравствуйте! Вы просили обращаться в ПМ, чтобы не захламлять топик.
На всякий случай, вот задача:
Имеется результат выбора данных, выведенный в DBGridEh. В этом наборе данных имеется колонка "UN".
Стоит задача скопировать в буфер обмена значения нескольких полей "UN".
Отбор производится оператором, выделяющим строки с интересующими данными. Выделение строк может быть не подряд, т.е. между выделенными строками могут быть разрывы.

Буду очень Вам признателен, если подскажете путь реализации. Что-то у меня с этим туго...


Вам просто необходимо познакомится с тем что такое Boorkmark и моим изобретением.

Код: [no]type
TMyDBGridEhStyle = class(TDBGridEhStyle)
protected
function HighlightDataCellColor(AGrid: TCustomDBGridEh; ACol, ARow: Integer;
DataCol, DataRow: Integer; const Value: string; AState: TGridDrawState;
InMultiSelect: Boolean; var AColor: TColor; AFont: TFont): Boolean; override;
function HighlightNoDataCellColor(AGrid: TCustomDBGridEh; ACol, ARow: Integer;
DataCol, DataRow: Integer; CellType: TCellAreaTypeEh; AState: TGridDrawState;
InMultiSelect: Boolean; var AColor: TColor; AFont: TFont): Boolean; override;
end;

procedure SetMultiSelectOptions(DBGridEh: TDBGridEh; IsMultiSelect: Boolean);
begin
if IsMultiSelect then
begin
DBGridEh.AllowedSelections :=
DBGridEh.AllowedSelections - [gstRectangle, gstColumns];
DBGridEh.IndicatorOptions :=
DBGridEh.IndicatorOptions + [gioShowRowselCheckboxesEh];
DBGridEh.Options :=
DBGridEh.Options + [dgAlwaysShowSelection, dgMultiSelect] - [dgEditing];
DBGridEh.OptionsEh :=
DBGridEh.OptionsEh + [dghIncSearch, dghPreferIncSearch, dghRowHighlight];
DBGridEh.RowSizingAllowed := False;
end else
begin
DBGridEh.AllowedSelections :=
DBGridEh.AllowedSelections + [gstRectangle, gstColumns];
DBGridEh.IndicatorOptions :=
DBGridEh.IndicatorOptions - [gioShowRowselCheckboxesEh];
DBGridEh.Options :=
DBGridEh.Options - [dgAlwaysShowSelection, dgMultiSelect] + [dgEditing];
DBGridEh.OptionsEh :=
DBGridEh.OptionsEh - [dghIncSearch, dghPreferIncSearch, dghRowHighlight];
DBGridEh.RowSizingAllowed := True;
end;
end;

{ TMyDBGridEhStyle }

function TMyDBGridEhStyle.HighlightDataCellColor(AGrid: TCustomDBGridEh;
ACol, ARow, DataCol, DataRow: Integer; const Value: string;
AState: TGridDrawState; InMultiSelect: Boolean; var AColor: TColor;
AFont: TFont): Boolean;
begin
Result := inherited HighlightDataCellColor(AGrid, ACol, ARow, DataCol,
DataRow, Value, AState, InMultiSelect, AColor, AFont);
if InMultiSelect and not (gdFocused in AState) and
not (gdSelected in AState) then
AColor := TColor($FFEFCF);
if (dghRowHighlight in AGrid.OptionsEh) and (ARow = AGrid.Row) then
AColor := clHighlight;
end;

function TMyDBGridEhStyle.HighlightNoDataCellColor(AGrid: TCustomDBGridEh;
ACol, ARow, DataCol, DataRow: Integer; CellType: TCellAreaTypeEh;
AState: TGridDrawState; InMultiSelect: Boolean; var AColor: TColor;
AFont: TFont): Boolean;
begin
Result := inherited HighlightNoDataCellColor(AGrid, ACol, ARow, DataCol,
DataRow, CellType, AState, InMultiSelect, AColor, AFont);
if InMultiSelect and not (gdFocused in AState) and
not (gdSelected in AState) then
AColor := TColor($FFEFCF);
if (dghRowHighlight in AGrid.OptionsEh) and (ARow = AGrid.Row) then
AColor := clHighlight;
end;
[/no]
Автор: xpin2013
Дата сообщения: 01.04.2014 17:34
miwa
Ой простите голубчик. Я неправильно всё интерпретировал. Я сейчас переношу старый для Delphi7 DevExpress на XE5. На 2010 я эти компоненты портировал, но в XE5 ещё морока с TBookmark. В общем я просто заработался и против Вас лично ничего не имею. Вы правильно сказали SelectedRows
Автор: Schnider
Дата сообщения: 22.04.2014 15:39
Грид в режиме дерева (TreeList.Active), хочу перетаскивать (Drag&Drop) строки из одного узла в другой, такое возможно?
Автор: Shaman2
Дата сообщения: 22.04.2014 15:42
Использую RowDetailPanel, но она отмечает плюсом для раскрытия каждую строку. А мне нужно чтобы панель открывалась только на тех строках, где есть дочерние данные. И соответственно плюсы для раскрытия выводились только на этих строках. Подскажите как это сделать?

Страницы: 1234567891011121314151617181920212223

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


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