Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС 2017
выпущен 15 марта!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Delphi и CorelDraw


Автор: Грабец Олег

- А знаете, Ватсон, чем наполнены шары у CorelDraw?
- Чем, мистер Холмс?
- Водородом!
- ??
- Ну это же элементарно, Ватсон... Вчера у меня Corel рухнул - так всю Винду разнесло нафиг!

Надеюсь, многие сталкивались с Corel Draw? А у многих слюнки текли, что это мощнейший графический редактор и хотелось бы под него свои программы писать, к примеру, чертежи выводить? Я один из вас :)

Формат файлов *.cdr конечно, не представлю, т.к. сам его не знаю :), но как с этим зверем работать расскажу. Вычитал, что с Corel Draw можно работать только через скрипт, причем изначально я готовил файлы скриптов *.csc, а затем их запускал в самом редакторе. Рабочий инструмент для освоения - Corel Script Editor. Если Вы хотите действительно что-то написать, то он вам просто необходим, хотя бы ради того, что смотреть как Corel Draw их сам создает, ну и самое главное - дока по языку и функциям. Все замечательно, только вот скрипты медленно работают т.к. они эмитируют работу человека - т.е. кнопочки сами нажимаются, панельки меняются и т.д.

А чертеж, к примеру на котором около 3000 объектов мог загружаться и исполнятся до часу! Нет, кода это утомляет, то можно и самому посидеть - глядишь за неделю сделаешь :)

И тут я "чисто случайно" наткнулся на статейку http://www.djpate.freeserve.co.uk/AutoCDrw.htm. Оказывается можно и через OLE этот Corel Draw дергать, и как оказывается, не так уж оно и сложно. Да, совершенно верно, нужно использовать CorelDraw.Automation.xx. Я возился с 8-й версией. Забегая на перед, скажу, что тот же чертеж выводился в течении 5-10 минут.

Ну что, начнем?


 var
   CorelDraw: Variant;
 ...
 CorelDraw := CreateOleObject('CorelDraw.Automation.8');
 // цифирку можете свою поставить
 CorelDraw.FileNew;
 // или CorelDraw.FileOpen(FileName);
 CorelDraw.SetDocVisible(True);
 // можно и не показывать, что он там делает, но ведь интересно! :)
 // кстати, можно нарисовать, а потом показать - будет на 30% быстрее
 ... // ну и в конце
 CorelDraw.FileSave('NewName', 0, False, 0, False);
 CorelDraw.FileExit(False); // можно не писать, если не надо закрывать
 CorelDraw := Unassigned;
 

Формат функций доступным английским языком описан в draw_scr.hlp. Ну а дальше, чего душа (или начальство :) ) желает:


 CorelDraw.SetPageOrientation(0);
 CorelDraw.SetPageSize(PageW, PageH);
 CorelDraw.NewLayer('NewLayer1');
 CorelDraw.SelectLayer('NewLayer1');
 CorelDraw.CreateEllipse(CalcY(Y1)), CalcX(X1), CalcY(Y2), CalcX(X2), 0, 0, 0);
 // ничего я не перепутал!!! именно так у них координаты!
 CorelDraw.CreateRectangle(CalcY(Y1)), CalcX(X1), CalcY(Y2), CalcX(X2), CalcX(Radius));
 ...
 

Все ясно? За дело!

Да, чуть не забыл о самом главном - как и у любой системы в Corel Draw есть свои "заморочки" :)

Ноль координат находится в середине листа бумаги (оригинально, правда?)

Положительная ось Y направлено вверх, а X - в право.

Координаты - целые числа в микронах. Для удобства я писал функцию:


 function CalcX(x_mm: double): longint;
 begin
   result := Round(x_mm * 10000);
 end;
 

Углы не знаю в чем, но 90 градусов надо записать как 90000000. Положительные против часовой стрелки.

Принцип прорисовки таков: создается объект, а затем ему присваиваются различные свойства, такие как цвет, тип заливки, толщина линий и пр. По умолчанию эти значения через автоматизацию выставить нельзя - не поддерживается.

Выше упомянутое наглядно видно на прорисовке текста:


 CorelDraw.CreateArtisticText( Text, CalcX(X), CalcY(Y));
 // создаем текст. X,Y - левый нижний
 // как видите, нет параметров шрифта, размера и пр.
 with Font do
 begin
   if (Italic) and (Bold) then
     FSK:=14
   else
   if (Italic) then
     FSK:=8
   else
   if (bold) then
     FSK:=13
   else
     FSK:=7;
 end;
 CorelDraw.SetCharacterAttributes( 0, 0, Font.name, FSK, Abs(Font.Size)*10,
 0, 0, 0, 0, 0, 1000, 1000, HAlign);
 // присваиваем атрибуты шрифта.
 // HAlign имеет значения 1,2,3 - влево, по центру, вправо соответственно
 ColorToCMYK(Font.Color, C,M,Y,K);
 // это моя функция для преобразования tColor в составляющие в модели CMYK 
 CorelDraw.StoreColor(2, C,M,Y,K, 0,0,0,0); // создание цвета
 CorelDraw.ApplyUniformFillColor; // применяем цвет к объекту
 

Тоже самое относится к трансформации объектов – сперва создаете, а затем изменяете как хотите.

Работают функции для получения информации.


 CorelDraw.GetSize(XSize, YSize); // получили размеры объекта
 CorelDraw.MoveObject(0, -YSize); // сдвинули его вниз на свой размер
 

Можно "проверить" все существующие объекты. За круглым столом спрашивали, как это делается, а делается это так:


 var
   ObjID, FirstObjID: longint;
 begin
   CorelDraw.SelectAllObjects;
   CorelDraw.SelectNextObject(true);
   // true для "захода" в сгруппированный объект
   FirstObjID := CorelDraw.GetObjectsCDRStaticID;
   repeat
     ...
     // работа с объектом CorelDraw.SelectNextObject(true);
     ObjID := CorelDraw.GetObjectsCDRStaticID;
   until
     ObjID = FirstObjID;
   ...
 

Вот теперь вроде все. Пишите, если что не понятно.




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS