и снова InDesing + Delphi

Статус
Закрыто для дальнейших ответов.

Dенис

Участник
Топикстартер
Сообщения
126
Реакции
0
Уважаемые! Те, кто пишет скрипты или пробует писать для InDesign на Delphi, помогите начать. Покажите рабочий код, делающий следующее:
- цепляем InDesign
- создаем новый документ
- на первой странице создаем текстовый фрейм
- пишем в нем "Hello, world!"
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Ответ: и снова InDesing + Delphi

А зачем на нем?
 

Dенис

Участник
Топикстартер
Сообщения
126
Реакции
0
Ответ: и снова InDesing + Delphi

Причины две:
1. нужен специфический интерфейс, чтобы отображать двухмерную структуру данных, произвольной размерности (типа сетки)
2. хочется, чтобы скрипт бегал и под CS2, а там ScriptUI сильно ограничен
 

JAW

15 лет на форуме
Сообщения
15 797
Реакции
3 454
Ответ: и снова InDesing + Delphi

vbatushev
А что ты имеешь супротив Паскаля?
Всяко лучше, чем Васик ;)
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Ответ: и снова InDesing + Delphi

Ничего не имею. На JS большей частью пишу. Спросил просто. Чистое любопытство :)
 

Specialist

15 лет на форуме
Сообщения
2 035
Реакции
8
Ответ: и снова InDesing + Delphi

Пишите на мыло, помогу.
raven85{cobaka]mail.ru
 

Specialist

15 лет на форуме
Сообщения
2 035
Реакции
8
Ответ: и снова InDesing + Delphi

Тема вызвала некоторый ажиотаж, поэтому отвечать придется здесь и сразу всем.
Я сейчас выложу кусок из своего скрипта, который создает документ заданного размера и с заданными полями, а затем сохраняет его под заданным именем:
Код:
Application1.Connect;
Application1.DocumentPreferences.pageWidth:=InttoStr(FW)+' mm'; //Ширина страницы
Application1.DocumentPreferences.pageHeight:=inttostr(FH)+' mm'; //Высота страницы.
Application1.MarginPreferences.top:=inttostr(trunc((FH-H)/2))+' mm'; //Задаем поля сверху (top), снизу (bottom), ну справа-слева - понятно. Ага?
Application1.MarginPreferences.bottom:=inttostr(trunc((FH-H)/2))+' mm';
Application1.MarginPreferences.left:=inttostr(trunc((FW-W)/2))+' mm';
Application1.MarginPreferences.right:=inttostr(trunc((FW-W)/2))+' mm';

Application1.Documents.Add(true, 'default'); //Создаем документ 
doc1:=Application1.ActiveDocument;
doc1.close(2036691744, 'c:\MyDocumentName.indd'); //Закрываем с сохранением

Application1.Disconnect;


=====================

Вечерком добавлю текстовый фрейм со словами Hellow World. Сейчас нету Дельфи под рукой.

PS

Еще один момент. Перед тем, как все это начнет работать нужно импортировать в Дельфи библиотеку типов. Подробно распишу тоже вечером.

PPS
Ребят, это только у меня появились паразитные пробелы в коде?
Не знаю с чем это связано, может глюки форумного движка. Если нажать на моем сообщении кнопку Цитировать, то можно увидеть его в первозданном виде.
 

Specialist

15 лет на форуме
Сообщения
2 035
Реакции
8
Ответ: и снова InDesing + Delphi

vbatushev

Видимо пора начинать сотрудничество с Тулбоксом. Можно по этому поводу обратиться к вам или только к Бутрину? Дело в том, что я до него уже давно достучаться не могу, видимо, он сильно загружен работой...

Планирую написать статейку про работу с Индизайном из Дельфи и выложить пару скриптов которые пока использовал только для себя. Я выкладывал их на форуме, но темы благополучно утонули.
 

Specialist

15 лет на форуме
Сообщения
2 035
Реакции
8
Ответ: и снова InDesing + Delphi

Да ладно вам! Вам что ветки "Скриптинг" мало?
 

Dенис

Участник
Топикстартер
Сообщения
126
Реакции
0
Ответ: и снова InDesing + Delphi

Статья - это было бы супер. Приведенный фрагмент ничего не дает, хотелось бы именно рабочий кусок. А здесь непонятно с первой строчки, Application1 - это кто?
С нетерпением жду вечера.
 

Cedar

Участник
Сообщения
29
Реакции
0
Ответ: и снова InDesing + Delphi

я цепляюсь в делфине к индюку таким образом:

var
InDesign: Variant;
begin
InDesign := CreateOleObject('InDesign.Application');
...
myDoc := InDesign.ActiveDocument; - дальше например так
...
//отпускаем InDesign
InDesign := Unassigned;
end;
 

Cedar

Участник
Сообщения
29
Реакции
0
Ответ: и снова InDesing + Delphi

насчет необходимости отдельной ветки по Delphi - абсолютно согласен.
есть много нюансов при кодинге, возникающих при передаче данных из делфи. например, таблиц SafeArray, которых в явном виде нет в дельфине
 

Specialist

15 лет на форуме
Сообщения
2 035
Реакции
8
Ответ: и снова InDesing + Delphi

Обещанная статья в приложении. В формате RTF, ибо оформлять средствами форума было лениво. Также приложены исходники цитируемые в статье.

Критику и предложения рассмотрю, на вопросы постараюсь ответить. :)
 

Вложения

  • code.zip
    6.2 КБ · Просм.: 459
  • article.zip
    8.1 КБ · Просм.: 1 192

Dенис

Участник
Топикстартер
Сообщения
126
Реакции
0
Ответ: и снова InDesing + Delphi

2 Cedar: если на машине стоит два Индизайна, как через CreateOleObject выбирать к какому обращаться? У меня всегда цепляется только CS2.

2 Specialist: ваш метод никак не могу победить, но у меня под рукой только Дельфи 4.5 и он при Import Type Library не создает компонента в палитрах. Пока не понял, делается ли это как-то по другому или же это возможность старших версий. Можите выложить скриншот импорта и вид компонента в палитре?
 

Steve

Участник
Сообщения
227
Реакции
0
Ответ: и снова InDesing + Delphi

Dенис сказал(а):
2 Cedar: если на машине стоит два Индизайна, как через CreateOleObject выбирать к какому обращаться? У меня всегда цепляется только CS2.
CreateOleObject('Indesign.Application'); обращается к последней версии.
По аналогии с VB (тестил на Иллах), должно быть:
Код:
CreateOleObject('Indesign.Application.CS2');//и так далее

2 Specialist
А debug(watches) "нормально работает" в дельфи? Можно посмотреть коллекции различных объектов и их св-ва?
 

Specialist

15 лет на форуме
Сообщения
2 035
Реакции
8
Ответ: и снова InDesing + Delphi

Dенис сказал(а):
2 Specialist: ваш метод никак не могу победить, но у меня под рукой только Дельфи 4.5 и он при Import Type Library не создает компонента в палитрах. Пока не понял, делается ли это как-то по другому или же это возможность старших версий. Можите выложить скриншот импорта и вид компонента в палитре?

Ну я же писал, что про Дельфи 4 ничего не знаю. Не работал в ней никогда. Скриншот я выложу, но чем он вам поможет не представляю.

Steve сказал(а):
А debug(watches) "нормально работает" в дельфи? Можно посмотреть коллекции различных объектов и их св-ва?

Работает нормально, и "свои" переменные посмотреть можно, но что вы там увидите? А увидите, насколько я понимаю что-то вроде 3213456464 тоесть идентификатор интерфейса. :) Вечером проэкспериментирую.
 

Specialist

15 лет на форуме
Сообщения
2 035
Реакции
8
Ответ: и снова InDesing + Delphi

Dенис сказал(а):
Можите выложить скриншот импорта и вид компонента в палитре?

Выкладываю.
 

Вложения

  • delphi1.gif
    delphi1.gif
    10.6 КБ · Просм.: 590
  • delphi2.gif
    delphi2.gif
    3.1 КБ · Просм.: 917

Cedar

Участник
Сообщения
29
Реакции
0
Ответ: и снова InDesing + Delphi

Steve сказал(а):
CreateOleObject('Indesign.Application'); обращается к последней версии.
не совсем верно. обращается к той версии что по умолчанию.
у меня например, спокойно запускается по умолчанию CS при установленных CS и CS3.
CreateOleObject('Indesign.Application.CS2');//и так далее
при указании версии работает конкретно с нужной версией индюка
 

barakuda

Участник
Сообщения
424
Реакции
12
Ответ: и снова InDesing + Delphi

Вот навоял на delphi скриптик для ознакомительных целей
может кому и пригодится

скрипт для автоверстки :)
при наборе текста перед абзацем ставите любой тег (напр. #1#) тегов может быть сколько угодно, для заголовков для подзаголовков для основного текста и т.д. и указываете какому тегу соответствует какой стиль.

Все теги и названия стилей хранятся в БД

вот тут лежит http://webfile.ru/1550151

PHP:
var myDoc, MyPage, MyTextFrame:OleVariant;
text: string;  i,n,p:integer;
begin  Application1.Connect;
myDoc:=Application1.activeDocument;  MyPage:=myDoc.Pages.Item(1);  table1.First;
while not table1.Eof do
begin
p:=1;
while p<>MyPage.TextFrames.count+1 do
begin  MyTextFrame:=MyPage.TextFrames.Item(p);
i:=1;
while i<>MyTextFrame.Paragraphs.count+1 do
begin  text:=MyTextFrame.Paragraphs[i].contents;  n:=Pos(table1.fieldbyname('tag').AsString, text);
if n<>0 then  begin
delete(text, 1,3);
MyTextFrame.Paragraphs[i].contents:=text;
MyTextFrame.paragraphs[i].appliedCharacterStyle:=myDoc.characterStyles.item(table1.fieldbyname('Style').AsString); end;
inc(i);
end;
inc(p);
end;
table1.Next;
end;
Application1.Disconnect;
end;
end.
 

Вложения

  • screen.jpg
    screen.jpg
    52.4 КБ · Просм.: 912
Статус
Закрыто для дальнейших ответов.