понедельник, декабря 11, 2006

Переезды блогов.

Давненько не писал :(
К сожалению, не хватает сил себя заставить...
---
Ближе к Новому году наметелась "массовая миграция" блогов представителей ECO сообщества.
Вслед за переездом Holger's Thoughts on Delphi - сюда, переехал и блог Питера Морриса (а точнее, Питер завел себе новый блог).
В отличие от меня, эти парни не леняться писать регулярно.
Кстати, приятно было прочесть пост он нашем сайте.

четверг, апреля 06, 2006

Снова о классах-ассоциациях

С поиском связанных объектов в Bold мы вроде бы разобрались в одном из предыдущих постов. Сегодня нашел решение для ECO. Автор mr. Peter Morris [Droopy eyes software] (думаю представлять не надо). Далее цитирую дословно.

There will be two properties, I don't remember exactly how they are named
but it will be something like this

[ClassA] (AInstances)---[MyAssociationClass]---(BInstances) [ClassB]

To get from ClassA to ClassB you would do ClassA.BInstances.
To get from ClassA to the association classes you would do
ClassA.MyAssociationClass, which returns a list of MyAssociationClass.

To get the specific class you would do something like

Index := ClassA.BInstances.IndexOf[ClassBInstanceILinkedTo];
AssociationObject := ClassA.AssociationClass[Index];


I think that's right, but I have never needed it in code before.

среда, апреля 05, 2006

Установка BoldPersistenceHandleDBISAM

Более года назад потратил некоторое время на то, что бы поставить BoldPersistenceHandleDBISAM, затем в форуме http://mda-delphi.ru/forums/ меня спрашивали как это делается, я написал кратенькое руководство. Сейчас возникла необходимость вновь поставить это дело. Отрыл сосбственный мануал, и, как и ожидалось все прошло без проблем. Вот привожу его здесь.

1. Все закрыть.
2. Меню Component|Install Component;
3. Закладка Into New Package


4. Открыть тот файл, что указан на рисунке (BoldPersistenceHandleDBISAMReg)
Package file name – свое имя, и разместить где-нибудь по пути, который прописан для поиска, что бы потом не перепрописывать. Например, там же. Хотя, аккуратности ради, можно создать каталог и поставить на него пути…
5.Сказать Yes в ответ на этот вопрос

5. Откомпилировать(Кнопка Compile) и получить ошибку

В секции Uses того модуля который ругается прописать DBISamConsts

6. Нажать кнопку Install на вновь появившейся форме из п.5
7. Нажать "Ок"

8. Получить
9. На вкладке BoldPersistence заметить новую кнопку :)

среда, марта 22, 2006

Bold. Копирование объектов.


В настоящий момент я внедряю проект, реализованный (почти) на Bold. Параллельно добавляются некоторые вкусности и полезности, и, естественно, устраняются багги. Одной из таких полезностей является копирование объектов. Что я имею в виду? Предположим, имеется накладная, содержащая неоторые товары. Количество и стоимость товара являются атрибутами класса-ассоциации. Я именую такой класс - расшифровка накладной. Процесс формирования накладной занимает определенное время (подбор товара, указание цены и количества и т.д.). Достаточно часто возникает необходимость создания типовых накладных. С точки зрения пользователя, в этом случае, значительно удобнее сделать копию имеющейся накладной, чем создавать новую «с нуля». Что должно произойти с технической точки зрения?

Создается новый объект – экземпляр класса «накладная»;
Устанавливаются связь нового объекта с теми товарами, которые ассоциированы с копируемой накладной;
Ищутся соответсвующие экземпляры класса –ассоциации и копируются их атрибуты.
Здесь очень важно правильно найти соответсвующие расшифровки накладных. Если в исходной накладной проводится два процессора и один винчестер, то в копии должно быть именно два процессора и винчестер, а не наоборот.

Почему задача должна решаться именно так? Мы не можем создать класс ассоциацию обычным методом. Он создается автоматически после связывания двух объектов. Возможно, было бы удобнее, создавать экземпляр класса –ассоциации, так как создаются экземпляры обычных классов, и это бы приводило к автоматическому связыванию ассоциацией соответсвующих объектов, но так не происходит. Функции TBoldCopyAndClone.BoldCopy и TBoldCopyAndClone.BoldClone также не справляются с задачей.

В принципе, вышеописанная задача достаточно типична. И я решил написать две подпрограммы, которые можно использовать в подобной ситуации без модификаций.

Вот их текст:



function TfClientCard.LocateAssObject(AssClName:string;
frstObj, secObj: TBoldObject): TBoldElement;
var

Expr: string;
brL: TBoldReferenceHandle;
BOV: TBoldOCLVariables;
CI: TBoldVariableTuple;
begin
try
brl:=TBoldReferenceHandle.Create(self);
brl.StaticSystemHandle:= DM.bsh;
brl.StaticValueTypeName:=secObj.BoldClassTypeInfo.ExpressionName;
brl.Value:= secObj
as TBoldElement;
BOV:=TBoldOCLVariables.Create(self);
CI:=TBoldVariableTuple(BOV.Variables.Add);
CI.VariableName:=
'vNewObj';
CI.BoldHandle:=brl;
Expr:=
'self.'+LowerCase(AssClName)+
'->select('+LowerCase(secObj.BoldClassTypeInfo.ExpressionName)+'=vNewObj)->first';
result:=frstObj.EvaluateExpressionAsDirectElement(Expr,BOV.VariableList);

finally
bov.Free;
brl.Free;
end;
end;


procedure TfClientCard.CopyAssociations(SourceObj, DistObj: TBoldObject;
AssClassName, RoleName:
string);
// SourceObj - объект-источник
// DistObj - объект -приемник
// AssClassName - имя класса ассоциации
// AssName - имя роли
var
i: integer;
AssObjRel: TBoldObject;
AssObjectDist, AssObjectSource: TBoldObject;
begin
// здесь весьма нетрадиционный, но действенный способ проверки
//множественности ассоциации (а точнее роли)
// если аккуратно передавать параметры, то это и не нужно
if Pos('List',SourceObj.BoldMemberByExpressionName[RoleName].ClassName)<>0 then
begin
if
DistObj.ClassName=SourceObj.ClassName then
begin
for
i := 0 to (SourceObj.BoldMemberByExpressionName[RoleName]

as TBoldObjectList).Count-1 do
begin
// если источник и приемник - экземпляры одного класса
if Assigned((SourceObj.BoldMemberByExpressionName[RoleName]
as TBoldObjectList)[i] as TBoldObject) then
begin

AssObjRel:=(SourceObj.BoldMemberByExpressionName[RoleName]
as TBoldObjectList)[i] as TBoldObject;
(DistObj.BoldMemberByExpressionName[RoleName]
as TBoldObjectList).Add(AssObjRel);

AssObjectDist:=LocateAssObject(AssClassName,DistObj, AssObjRel)
as TBoldObject;
AssObjectSource:=LocateAssObject(AssClassName,SourceObj, AssObjRel)
as TBoldObject;

TBoldCopyAndClone.BoldCopy(AssObjectDist,AssObjectSource,bcmAttributes,true);
end;

end;
end;
end
// я затрудняюсь это правильно сказать :(
else ShowMessage('Ассоциация не множественная');

end;
end.


Alexander Bozhko Bold&ECO blog

Alexander Bozhko Bold&ECO blog

четверг, марта 16, 2006

Статья

Недавно на сайте издания Xakep была опубликована очередная моя статья.
Borland IDE: что дальше?
Правда уже задним числом я нашел пару ляпов. Но в принципе... судите сами.

Новый блог

Прочувствовав все преимущества Google, я решил перевести свой старый блог сюда. Возможно, это простимулирует меня почаще писать.
---
В качестве теста я перенесу пару постов из старого блога, дабы освоиться.
---
Ну, и не забывайте посетить сайт Russian ECO&Bold Community, участником которого я являюсь.