![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите определиться с форматом функции
dev888 © (2011-10-26 15:15:00)нужно написать функции (API), которые были бы максимально удобными для перемещения по товарам магазина (GoToFirstProduct, GoToNextProduct, GoToPreviousProduct, GoToLastProduct). Нужно предусмотреть возврат идентификатора товара, а также возможность перемещения к товару. Как это лучше сделать, чтобы не писать еще и функции EOF, BOF? Пока что думаю так:
function GoToFirstProduct(out ProductId: Integer): Boolean;
function GoToLastProduct(out ProductId: Integer): Boolean;
- Если товары в магазине отсутствую, функция будет возвращать False
function GoToNextProduct(out ProductId: Integer): Boolean;
function GoToPreviousProduct(out ProductId: Integer): Boolean;
- если товары в магазине отсутствую, либо текущий товар был последним (GoToNextProduct) / первым (GoToPreviousProduct) функция будет возвращать False.
но:
если нужно пробежать по товарам магазина и выполнить над каждым какое-то действие, то получается не очень удобно для программиста.
AdapterStore.GoToFirstProduct(ProductId);
// действие на товаром
while AdapterStore.GoToNextProduct(ProductId) do
begin
// дейсвие над товаров
end;
Медвежонок Пятачок (2011-10-26 17:11:00) [21]например "обрабатываешь" связанные таблицы
Я таким механизмом обрабатываю все что имеет регулярную структуру.
датасеты, ixmldomnodelist'ы, файлы, списки и прочую дребедень.
Медвежонок Пятачок (2011-10-26 17:09:00) [22]>Послушай умного человека sniknik
Ты лучше меня послушай, так как sniknik хоть и умный человек, но совершенно не оценил всю красоту и изящество метода.
Речь же идет об элементарных принпах разработчика: разделение кода
Представь, что ты в команде. К вам "снаружи" пришла некая регулярная структура данных.
Одному в команде надо сделать по ней инсерты, другому надо сделать отчет, третьему надо сформировать html по пришедшим данным.
Мой метод:
Я раскуриваю структуру и пишу функцию енумерации структуры и публикую ее для команды.
А вся команда не вникая в сложности структуры пишет свои пользовательские функции обратного вызова и сосредотачивается на непосредственно своей задаче.
Всем сухо и комфортно.
Другой метод:
Вся команда изучает структуру, учится ее читать, затем все пишут свои циклы перебора вперемешку с обрабокой данных.
Разницу улавливаешь?
не работает при отключенных. некуда ссылаться, даталинка нет.
Ты поверь, что у меня работает. Уже лет пять.
Просто и мультиселект у меня не такой как у всех.
/* Расширенный и дополненный EhLib'ский. Который SQL-ориентированный */
sniknik (2011-10-26 17:05:00) [23]> Или все отобранные мультиселектом.
ну и вот еще кстати. "мультиселект" это в гриде имеется ввиду? с шифтом или контролом отмечено несколько записей. ???
не работает при отключенных. некуда ссылаться, даталинка нет.
sniknik (2011-10-26 17:01:00) [24]> а кто сказал, что нет отключения контролов?
ты сказал. когда про необязательность обработки датасета. и универсальность.
например "обрабатываешь" связанные таблицы (мастер детайл), как одну, без визуальных контролов, отключать вроде не обязательно, и нежелательно, т.к. "связка" с отключенными не работает. и?
т.е. в одном случае есть, в другом нет, но нужно универсально... значит возможность должна быть "урезана" ибо в одном варианте перестает работать а в другом просто добавляет тормоза.
Медвежонок Пятачок (2011-10-26 16:54:00) [25]Я вот не пойму, нафига ты задаёшь вопросы под неизвестными никами
Гражданин, не надо гнать херню.
Труп Васи Доброго (2011-10-26 16:50:00) [26]
> пишется избавление от рутины по созданию циклов в групповых
> операциях.
Я вот не пойму, нафига ты задаёшь вопросы под неизвестными никами, а потом сам же начинаешь критиковать ответы? Тебе от себя спросить стыдно? Послушай умного человека sniknik правильно говорит, не надо велосипед делать, есть SQL, есть СУБД, учи и пользуйся.
Медвежонок Пятачок (2011-10-26 16:46:00) [27]а кто сказал, что нет отключения контролов?
есть.
и эта моя универсальность ничем не карается абсолютно.
метод всего лишь тупо перебирает записи
либо с текущей, либо с начала.
либо все, либо отобранные.
на каждой итерации вызывает переданный колбак.
что он делает - методу неведомо.
вернулся тру - крутим счетчик успешных обработок.
если внутри колбака ошибка или исключение, или некое условие, то пользователь грида (программер) может выкинуть MessageDlg c вопросом "дальше будем продолжать?" и по ответу юзера выставляет флаг bMore
если он фалс делаем брейк из цикла.
Все.
Вот типичный пример:
Форма с гридом и три кнопки: add,edit,delete
С первыми двумя все ясно, а под третьей как раз место вызова BatchProcess
Ибо юзер может хотеть удалить не одну строку, а все. Или все отобранные мультиселектом.
sniknik (2011-10-26 16:38:00) [28]> необязательно идет непосредственная обработка датасета.
универсальность "карается" лишением персонализированных "плюшек" объектов с которыми работа. делается "обрезка" по наименее работоспособному.
к примеру делая цикл по таблице и не делая отключение контролов (по тому как например тот же цикл по массиву подобного не допускает) вместо выигрыша (сомнительного удобства) получаешь офигительные тормоза...
+ не восстанавливается позиция после цикла, т.к. она не везде нужна/возможна...
в итоге у это дело либо обрастет кучей параметров/триггеров "на все случаи жизни/возможные объекты" и перестанет быть удобным, либо будет убогим реализация.
а тут кстати не выбор, как делать, удобнее для себя, тут для абстрактных других программистах... типа "железной рукой в счастье". и только для того чтобы писать чуть поменьше, и знать вместо общераспространенного частную реализацию "велосипедиста"... мне лично такое "счастье" и "даром не надь".
но это конечно ИМХО.
Медвежонок Пятачок (2011-10-26 16:21:00) [29]т.е. пишется замена SQL, так?
нет не так.
пишется избавление от рутины по созданию циклов в групповых операциях.
внутри функций обратного вызова необязательно идет непосредственная обработка датасета.
в них может собираться инфа для (например) формирования sql скрипта который выполняется после BatchProcess если тот вернул > 0
Но не только это.
Это вообще некая групповая обработка записей. Любая.
sniknik (2011-10-26 16:19:00) [30]> т.е. пишется замена SQL, так?
тогда + вопрос
а чем она должна/будет лучше чем прямые методы работы с таблицей?
Ega23 (2011-10-26 16:18:00) [31]
> у меня одно из требований в тз это присутствие в имени функций
> слова "product"
Я бы порекомендовал засунуть такое тз заказчику в ухо. И поджечь.
sniknik (2011-10-26 16:17:00) [32]> причем BatchProcess обрабатывает либо текущую, либо всё, либо только мультиселект если он есть.
т.е. пишется замена SQL, так?
Медвежонок Пятачок (2011-10-26 16:15:00) [33]а чем она должна/будет лучше чем прямые методы работы с таблицей?
А прикинь, если у тебя есть вот такой грид:
nCount := MyGrid.BatchProcess(MyDeleteCallBack,ACustomData);
nCount := MyGrid.BatchProcess(MyUpdateCallBack,ACustomData);
.....
nCount := MyGrid.BatchProcess(MyExportCallBack,ACustomData);
причем BatchProcess обрабатывает либо текущую, либо всё, либо только мультиселект если он есть.
Медвежонок Пятачок (2011-10-26 16:11:00) [34]
type
TEnumCallbackFunc = function(ADataSet : TDataSet; var bMore : boolean; ACustomData : Pointer) : boolean;
function enum_dataset(ADataSet : TDataSet; ACallBack : TEnumCallBack; ACustomData : boolean; AFromTheVeryBegining : boolean = false) : integer;
var bMore : boolean;
begin
Result := 0; bMore := True;
if AFromTheVeryBegining then ADataSet.First;
while not ADataSet.Eof do
begin
if ACallBack(ADataSet,bMore,ACustomData) then Inc(result);
if not bMore then Break;
ADataSet.Next;
end;
end;
sniknik (2011-10-26 16:10:00) [35]> по сути и надо сделать обертку над компонентом-таблицей товаров базы данных
а чем она должна/будет лучше чем прямые методы работы с таблицей?
sniknik (2011-10-26 16:08:00) [36]> это присутствие в имени функций слова "product"
ну так...
productFirst;
productNext;
productEof;
Этого достаточно.
sniknik (2011-10-26 16:07:00) [37]редко кто хочет учиться... зато "велосипедотворцов" пруд пруди...
dev888 (2011-10-26 16:07:00) [38]
> чувак, ты не поверишь, но я слышал, есть такая маза крутая
> - базы данных. Говорят вставляет не по детски!!!
так мне по сути и надо сделать обертку над компонентом-таблицей товаров базы данных, чтобы человек мог из 1C загружать / выгружать товары / выполнять над ними различные действия.
> First;
> Next;
> Eof;
>
>
> Этого достаточно.
у меня одно из требований в тз это присутствие в имени функций слова "product". как тогда обозвать функцию-обертку над "eof"
Труп Васи Доброго (2011-10-26 15:55:00) [39]
> Нужно предусмотреть возврат идентификатора товара, а также
> возможность перемещения к товару. Как это лучше сделать,
> чтобы не писать еще и функции EOF, BOF?
Чувак, ты не поверишь, но я слышал, есть такая маза крутая - базы данных. Говорят вставляет не по детски!!!
Медвежонок Пятачок (2011-10-26 15:50:00) [40]у меня цикл перебора есть.
но он один и упрятан в то, что у автора называется "апи".
а пользователю апи требуется всего лишь реализовать различные варианты
TEnumCallbackFunc
b затем вызвать enum_products c нужным колбаком.