Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
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;
  ...

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

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay