Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

помогите определиться с форматом функции


Страницы:   1 2 3

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 нужным колбаком.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо