EPCL
Введение
Зачем может быть использована библиотека EPCL? Её основное предназначение -
экономия времени программиста. Во время написания приложений часто возникают различные элементарные задачи. И при их решении часто возникает чувство... Как при изобретении велосипеда. Данные исходники не выдуманы просто так. Реализация что-то подобного наверняка приходила в голову многим опытным программистам.
Вот максимально краткий список того, что больше не придётся делать:
- Приводить типы при обращении к элементам списка
mycomponent:=list[i] as TMyComponent;
- Перекрывать методы TList, TObjectList и подобных для того, чтобы сделать свой список чего-либо без приведения типов
- Преобразовывать в строку каждую переменную по отдельности, чтобы показать её пользователю
ShowMessage('x = ', IntToStr(x) + ', f = ', FloatToStr(f));
- При назначении обработчиков обрабатывать и передавать только те параметры, которые зарезервировали для вас авторы вроде какого-нибудь PData: pointer
- Разбирать документацию на английском языке, шарить чужие исходники (в данном случае, мои), читать скудную сгенерированную PASDOC'ом документацию, чтобы разобраться что к чему, т.к. кроме неё к каждой фиче пишется "подробнейший туториал"
- Возиться с организацией лога
Далее чуть более подробный список задач, решаемых EPCL
Шаблонные списки
Первая и важнейшая фича - шаблонные списки. FreePascal предоставляет программисту три основных пути реализации списка
type
{ #1 }
TMyArray = array of mytype; // нет вставки, удаления,
// добавки элементов и прочих фич
{ #2 }
TMyList = class(TList) // есть фичи, но сначала надо перекрыть
// некоторые методы TList
// ...
// ...
// ...
end;
{ #3 }
var
list: TList; // просто список
begin
list:=TList.Create; //надо его создать
list.Add(...); //добавить элементы,
//но простые типы хранить не так просто
x:=Tx(list[i]); // и нужно приведение типов каждый раз
end;
Вот что позволяет делать со списками EPCL
type
TMyList = specialize TGenericList<TMy>; //Не нужно перекрывать методы
//Может хранить простые типы
var
a, b, c, x: TMy;
l: TMyList;
begin
l:=TMyList.Create([a, b, c]); //при создании сразу можно указать
// элементы которые будут в списке в любом количестве
x:=l[2]; //нет приведения типов
end;
EPCL.exList - туториал
Также имеются уже готовые специализированные списки для
- Integer: TIntegerList
- Real: TRealList
- пока всё
EPCL.exSomeLists - подробный туториал
Строки
EPCL содержит механизм формирования строк наподобие того, как выводит их WriteLN
s:=caption + ': x = ' + IntToStr(x) + '; y = ' + IntToStr(y) + '; '
+ 'myobj = ' + myobj.AsText + '; ' +
+ 'addr of myobj = @' + IntToStr(integer(pointer(myobj))) + '; '
+ 'float = ' + FloatToStr(sillyfloat);
s:=asString( [caption, 'x = ', x, '; ', 'y = ', y, '; ',
'myobj = ', myobj, '; ', 'addr of myobj = ', pointer(myobj), '; ',
'float = ', sillyfloat] );
EPCL.exStrigns - Туториал по строковым утилитам
Поименованный список вариантов
TVariantList: Хранит варианты и вместо индексов у них имена.
i:=10;
list['i']:=i;
list['s']:='silly string';
list['sillyfloat']:=1.6;
i:=list['i'] + 1;
WriteLN(list['s']);
Должен быть полезен при хранении разных переменных с именами в одном флаконе. Особенно, при передаче параметров в функцию
EPCL.exVariantList - Туториал по списку вариантов
Лог
var
log: TStreamLog;
begin
log:=TStreamLog.Create(Owner, 'FileName.text');
log.OnTexts.Add(@myobj.OnTextProc);
log<<'Global variable x is '<< x <<endl;
log<<'Gobal variable m is '<< m <<endl;
log<<'test: ' + 1.6 + '; ' + r + '; ' + m + endl;
log.Free;
function TMy.DoIt: boolean;
begin
log - self + 'Text sent by object' + endl;
// TMy: Text sent by object
Do1;
Do2;
result:=Do3;
log - self + 'Result of doing it: ' + result + endl;
// TMy: Result of doing it: True
end;
EPCL.exLog - туториал по логам