MacCentre.ru Форум Форум по компьютерам Mac, Mac OS X и продукции Apple
|
Автор |
Сообщение |
MMX

Репутация: 0
Зарегистрирован: 15.07.2001 Сообщения: 2441
|
Добавлено: Вт Янв 15, 2008 20:37 Вопросы и ответы по AppleScript |
|
|
Вопрос снят
|
|
Вернуться к началу |
|
zztatarin

Репутация: +34
Зарегистрирован: 04.08.2006 Сообщения: 4260
|
Добавлено: Пт Янв 18, 2008 20:09 Автоматор и иже с ними... |
|
|
Ну вот, а я только накатал: Код: | global tNameList
global tButtonList
global tChoice
set tNameList to {} as list
set tButtonList to {} as list
tell application "System Events"
get properties
get every process
if UI elements enabled then
tell process "Finder"
set tReturn to value of attributes of menu 1 of menu item 7 of menu 1 of menu bar item 1 of menu bar 1 as list
set tReturn to item 3 of tReturn as list --very impotent string!
set tItemCount to count of tReturn
repeat with tItem from 1 to count of tReturn
set tNameList to tNameList & title of (item tItem in tReturn)
end repeat
repeat with tItem from 1 to ((count of tNameList) - 2)
set tButtonList to tButtonList & title of (item tItem in tReturn)
end repeat
end tell
tell me
display dialog "Select Location" buttons tButtonList
set the tChoice to the button returned of the result
tell application "Finder"
activate
tell application "System Events"
click menu item tChoice of menu "Location" of menu item "Location" of menu "Apple" of menu bar 1 of process "Finder"
end tell
end tell
end tell
else
tell application "System Preferences"
activate
set current pane to pane "com.apple.preference.universalaccess"
display dialog "UI element scripting is not enabled. Check \"Enable access for assistive devices\". No eto nichego ne dast!"
end tell
end if
end tell |
_________________ Дайте мне единицу измерения и я смогу измерить ничтожность и бесконечность. А компьютер мне в х... не упёрся. Мне штангенциркуля хватит.
И ещё. Учу пользоваться документацией
Искренне Ваш ﺗﺘﺮ
Последний раз редактировалось: zztatarin (Ср Ноя 30, 2011 00:01), всего редактировалось 1 раз |
|
Вернуться к началу |
|
zztatarin

Репутация: +34
Зарегистрирован: 04.08.2006 Сообщения: 4260
|
Добавлено: Пн Янв 21, 2008 15:55
|
|
|
2moders
Перенесите тему в "Программирование и Beta-тестирование", буду примерчики с коментами сюда постить.
_________________ Дайте мне единицу измерения и я смогу измерить ничтожность и бесконечность. А компьютер мне в х... не упёрся. Мне штангенциркуля хватит.
И ещё. Учу пользоваться документацией
Искренне Ваш ﺗﺘﺮ |
|
Вернуться к началу |
|
Korwin

Репутация: +32
Зарегистрирован: 12.02.2007 Сообщения: 2657 Откуда: Севастополь / Санкт-Петербург
|
Добавлено: Пн Янв 21, 2008 17:27
|
|
|
zztatarin
А можно в двух словах что этот скрипт делает? А то из темы и комментариев сразу не понятно зачем он нужен.
_________________ Пожалуйста, воспользуйтесь поиском... |
|
Вернуться к началу |
|
zztatarin

Репутация: +34
Зарегистрирован: 04.08.2006 Сообщения: 4260
|
Добавлено: Пн Янв 21, 2008 19:06
|
|
|
Location переключает из диалога.
Можно использовать для принудительного выбора Location, если поставить в LogIn Items.
К завтрему построчно распишу.
_________________ Дайте мне единицу измерения и я смогу измерить ничтожность и бесконечность. А компьютер мне в х... не упёрся. Мне штангенциркуля хватит.
И ещё. Учу пользоваться документацией
Искренне Ваш ﺗﺘﺮ |
|
Вернуться к началу |
|
zztatarin

Репутация: +34
Зарегистрирован: 04.08.2006 Сообщения: 4260
|
Добавлено: Ср Янв 23, 2008 13:57 Вместо предисловия. |
|
|
Чем каждый день кормить ухой, лучше дать в руки удочку и научить ловить рыбу. (с)Ставка
Почему я решил всё это написать.
Не секрет, что при работе с компьютером очень часто возникают ситуации, когда надо проделывать много малоинтеллектуальных, повторяющихся действий. В некоторых программах существуют специальные средства для создания и выполнения заранее определенных действий, например Actions в Photoshop или Scripts в InDesign. Но это средства не способны выйти за пределы своих программ. А часто бывает необходимо выполнить действия в одной программе в зависимости от определённых значений в другой. И в результате высококвалифицированный специалист работает интерфейсом между двумя программами. А иногда и между определенными окнами одной программы.
Например: оператор фотонабора, которому принесли на вывод кварковский Collect, должен подключить шрифты, слинковать картинки, определить формат документа, настроить драйвер принтера в соответствии с требованиями и спринтовать PS-файл. Сидит препрессор и жмет кнопки. Эффективность работы препрессора практически равна нулю, загрузка компьютера едва ли приближается к пяти процентам. Я это делал немного иначе. На десктопе была папочка, куда бросался Collect и ... Через некоторое время в папке OUT появлялся PS-файл (группа PS-файлов). Или файл с расширением .log, где описаны проблемы данной работы. Как это реализовать, я попытаюсь обьяснить.
Многие, недавно севшие за Macintosh (не будем называть их свитчерами, назовем начинающими маководами) ищут инструмент, чтобы автоматизировать свои ежедневные задачи и облегчить жизнь. Apple предлагает два решения: Automator и AppleScript. Самоуверенный начинающий маковод начинает искать "почитать" про AppleScript. Как же, он на C++ програмировал, а тут какой-то макро-язык, почти Бейсик. Почитать, выучить операторы и вперед, писать программы. Но, как говорится, гладко было на бумаге, да забыли про овраги. Дело в том, что при компиляции скрипта получается не исполняемый код, а последовательность системных событий. Т.е. клики мышью, выбор определенного меню, нажатия клавиш. И самое главное. AppleScript работает не с абстрактными переменными, описанными в header-файле, а с конкретными объектами, которые мы видим на экране, и их свойствами.
Почему здесь и почему сейчас.
Последнее время часто встречаются вопросы: — "Где почитать про AppleScript?" Множество информации по AppleScript-у с примерами и обсуждениями находится в интернете. Посещая тематические форумы и сайты, я часто вижу достаточно интересные и нестандартные решения, которые могут пригодиться мне (и не только мне) в будущем. Но... В то время, когда эти решения перед глазами, когда код прочитан и "прочувствован", применения ему нет. А когда возникает задача, требующая решения, которым я восторгался пару месяцев назад, по закону Мерфи ссылка потеряна, History потерто. И начинается перелопачивание интернета. Как старателю, чтобы найти крупинку золота, приходится перемывать тонны пустой породы, так и мне приходится пререлопачивать кучу информации (сопровождаемой ненавязчивой рекламой). Ради трех-четырех строчек кода приходится расходовать мегабайты трафика и часы времени. Я постараюсь собрать здесь те золотые крупицы, которые мне встречались и будут встречаться в будущем. Я не претендую на абсолютную истину, поэтому критика и коментарии приветствуются. Если Вы обнаружите, что я в своем повествовании не проставил Ваш копирайт (копилефт), пишите в личку на этом форуме.
И последнее.
Если у Вас возник вопрос, задавайте его прямо здесь.
_________________ Дайте мне единицу измерения и я смогу измерить ничтожность и бесконечность. А компьютер мне в х... не упёрся. Мне штангенциркуля хватит.
И ещё. Учу пользоваться документацией
Искренне Ваш ﺗﺘﺮ |
|
Вернуться к началу |
|
whaler
Репутация: 0
Зарегистрирован: 07.07.2007 Сообщения: 12
|
Добавлено: Ср Янв 23, 2008 21:40
|
|
|
Совершенно правильно, это будет супер когда все будет собрано в одной теме.
А теперь собственно вопрос:
Есть код для подключения VPNа для Apple Script 2.0 (Leopard)
Код: | tell application "System Events"
tell current location of network preferences
set VPNservice to service "VPN service" -- name of the VPN service
if exists VPNservice then connect VPNservice
end tell
end tell |
Хотелось бы осуществить реконнект при разрыве и (если возможно)
то убрать доступ к интернету если VPN не включен.
Заранее спасибо.
|
|
Вернуться к началу |
|
whaler
Репутация: 0
Зарегистрирован: 07.07.2007 Сообщения: 12
|
Добавлено: Вс Янв 27, 2008 05:15
|
|
|
я прям смотрю лес желающих мну помочь)))
|
|
Вернуться к началу |
|
Korwin

Репутация: +32
Зарегистрирован: 12.02.2007 Сообщения: 2657 Откуда: Севастополь / Санкт-Петербург
|
Добавлено: Вс Янв 27, 2008 12:02
|
|
|
whaler писал(а): | я прям смотрю лес желающих мну помочь))) |
Вы пользуетесь UNIX-certified системой. Поэтому можете найти любой удовлетворяющий вас вариант в Google если в поиске указать вместо mac os x - UNIX.
Например ваш скрипт повесить в CRON который будет пинговать сервер ya.ru и при отсутствии пинга запускать дозвон.
Или проверять наличие установленного интерфейса через проверку назначен ли вашей машине IP-адрес или нет (hint: ifconfig)
_________________ Пожалуйста, воспользуйтесь поиском... |
|
Вернуться к началу |
|
zztatarin

Репутация: +34
Зарегистрирован: 04.08.2006 Сообщения: 4260
|
Добавлено: Пн Фев 04, 2008 15:24
|
|
|
Первые шаги.
Немного о моих приёмах "скриптописания". Для написания скриптов я стараюсь не использовать дополнительный софт по многим причинам. Одна из них - невозможность иметь под рукой компьютер в девелоперской конфигурации. Для написания кода я использую ScriptEditor, который есть на каждой машине. Кроме того, если вы сможете писать скрипты в ScriptEditor-е, то в AppleScript Studio сможете и подавно.
Итак приступим. Как водится у программистов, первая программа на любом языке - "Hello World!":
Код: |
tell me to display dialog "Hello World!" buttons {"Sam Hello!"} default button 1
|
Что в переводе означает "Скажи сам себе, чтоб показать диалог с текстом "Hello World!", содержащий кнопки "Sam Hello!" из которых активна первая.1)
Есть несколько очень важных моментов, которые я хотел бы пояснить.
Во первых. Target application (целевое приложение) — программа, которая будет выполнять то, что мы напишем. Реально будут генерироваться определённые AppleEvents (системные события), побуждающие программу выполнить необходимые действия. Фраза tell me как раз и задает target application. Ею является ScriptEditor. Хорошо, но нам же надо не только в нем работать. Нам нужно работать с другими программами. Немного изменим код:
Код: |
tell application "Finder" to display dialog "Hello World!" buttons {"Sam Hello!"} default button 1
|
Результат не изменился, однако target application у нас теперь Finder, и диалог теперь показывает не ScriptEditor, а именно он.
Зачем я все это рассказываю? Скрипт это такая же программа, и как любая программа он нуждается в отладке. А так как ScriptEditor практически не имеет отладочных средств, приходится выкручиваться следующим образом:
Код: |
global tReturn
[skip]-- You action
set tReturn to DebugVariable
tell application "Finder" to display dialog tReturn as string buttons {"Return", "Ok"} default button 2
if (the button returned of the result is "Return") then
return
end if
[skip]
return tReturn
|
Расшифрую, что здесь есть. Первая строка объявляет глобальную переменную tReturn. (Дело в том, что в AppleScript-е, как и в других языках, могут использоваться подпрограммы. Переменная, объявленная глобально, видна из любой подпрограммы.) Вторая строка (реально она не будет второй) устанавливает нашу глобальную переменную в значение того, чего нам нужно посмотреть. Уже знакомая нам строка выводит диалог.
Обращаю внимание на конструкцию tReturn as string. Первым параметром команды display dialog обязательно должна быть строка, а переменной tReturn могло быть присвоено значение произвольного типа. Указание as string обязательно. И ещё. Target application обязательно Finder. Ведь программа, для которой мы пишем скрипт, может ничего не знать о команде display dialog. Finder — программа, которая всегда запущена и которая способна выполнить эту команду.
В том случае, если мы видим, что искомое значение неверно, жмем Return и прерываем выполнение скрипта. В случае, если все идет как надо, дождавшись окончания скрипта мы получим расшифровку искомого значения в окошке снизу.
Во вторых. Имена переменных. Имя переменной может быть любым кроме зарезервированных слов. Поэтому я стараюсь давать им такие имена, что бы назначение переменной было понятно без коментариев. Дабы избежать совпадений с зарезервированными словами, перед именем я ставлю маленькую "t".
В третьих. Как Вы уже догадались, для написания скрипта надо знать, какие команды способна выполнять target application. Мало того, надо ещё знать, с какими элементами мы можем работать. Где все это узнать? В словаре.
В ScriptEditor-е выбираем меню Open Dictionary, выбираем Finder и изучаем.
Рекомендую сразу же переключить вид к inheritance и поизучать элементы Finder-a. Ибо следующий кусок будет называться "Триединая Система. Finder, AppleEvents и SystemUIServer."
Может быть получилось сумбурно и не вполне понятно. Но попробуйте обьяснить кому-нибудь как Вы дышите.
1)Я не уверен в переводе tell как скажи. Скорее прикажи, попроси.
Кстати, очень забавно читать автоматические переводы конкретных скриптов. Очень похоже на разговор с китайцем. См. пример. Зачастую, прочитав этот корявый перевод понимаешь как и что работает.
Описание: |
|
 Скачать |
Название файла: |
Sample.zip |
Размер файла: |
1.37 кб |
Скачено: |
90 раз(а) |
_________________ Дайте мне единицу измерения и я смогу измерить ничтожность и бесконечность. А компьютер мне в х... не упёрся. Мне штангенциркуля хватит.
И ещё. Учу пользоваться документацией
Искренне Ваш ﺗﺘﺮ
Последний раз редактировалось: zztatarin (Сб Ноя 22, 2008 15:15), всего редактировалось 1 раз |
|
Вернуться к началу |
|
Korwin

Репутация: +32
Зарегистрирован: 12.02.2007 Сообщения: 2657 Откуда: Севастополь / Санкт-Петербург
|
Добавлено: Пн Фев 04, 2008 15:30
|
|
|
zztatarin
Спасибо! Как раз начал изучение AppleScript. Буду повторять каждый ваш шаг!
_________________ Пожалуйста, воспользуйтесь поиском... |
|
Вернуться к началу |
|
zztatarin

Репутация: +34
Зарегистрирован: 04.08.2006 Сообщения: 4260
|
Добавлено: Пн Фев 11, 2008 13:59
|
|
|
Триединая Система. Finder, System Events и SystemUIServer.
Продолжаем. Что мы видим после загрузки системы? MenuBar, Desktop, Dock. Что мы можем сделать? Подвигать мышкой, кликнуть меню, открыть диск с названием "Macintosh HD".
Попробуем?
Код: |
tell application "Finder" to click at {15, 15}
|
Не получилось...
Но почему? Ведь в Finder-е мы кликаем Apple меню и оно открываются.
Дело в том, что Finder ничего не знает о мыши, ее положении и нажатии кнопки. Все это события, и обрабатывает их часть системы, которая называется System Events. Исправим эту ошибку.
Код: |
tell application "System Events" to click at {15, 15}
|
Опять ничего. Но уже нет сообщения об ошибке и это вселяет надежду.
System Events отрабатывает событие click, но у нас не указано приложение, которое должно среагировать на него. Исправляем.
Код: |
tell application "System Events" to tell application "Finder" to click at {15, 15}
|
Опять ошибка. Что-то не заладилось сегодня.
Одно важное правило. Любой объект в системе имеет свойства, и эти свойства можно прочитать-поменять. Если что-то не так, смотри свойства.
Где их смотреть? Ну например исполнить команду get properties. Но самым правильным будет открыть словарь интересующей нас программы. Выбираем меню File->Open Directory... Жмем кнопку Brouse и выбираем System:Library:CoreServices:System Events.app.
Подсказка:
_________________ Дайте мне единицу измерения и я смогу измерить ничтожность и бесконечность. А компьютер мне в х... не упёрся. Мне штангенциркуля хватит.
И ещё. Учу пользоваться документацией
Искренне Ваш ﺗﺘﺮ
Последний раз редактировалось: zztatarin (Вт Ноя 25, 2008 12:19), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
zztatarin

Репутация: +34
Зарегистрирован: 04.08.2006 Сообщения: 4260
|
Добавлено: Вс Июн 29, 2008 16:53
|
|
|
Тяжела и неказиста жизнь простого программиста.
Не так сложно код писать, как ходы записывать.
Некто, всем известный Steps , попросил меня автоматизировать хорошо знакомую всем пепрессникам задачу упаковки коллектов в ахив (на вывод). Вроде задача простая. Чего там, взял коллект, кинул на его на пластинку и записал. Но...
1. Если коллект по обьему превышает 4,3 ГБайт?
2. Если его объем меньше 1 ГБайт, но больше 700 МБайт? И таких коллектов с десяток?
3. Если надо найти картинку с позапрошлогоднего архива?
Как говорится флаг в руки, транспарант на спину и дудку в рот...
Собственно ТЗ:
На десктопе лежит папка, назовем ее "ToArchive", куда мы сбрасываем то, что нам надо поместить в ахив. При достижении размера ее содежимого некоторого заранее определенного предела (например размера DVD-диска) выкидывается предложение подготовить диск для записи и записать его. Точнее от папки "отпочковывается" папка типа "ReadyToBurn" Если содержимое не помещается на диск, то оно делится на две (три,.. двадцать и так далее) части.
Для ускорения работы скрипта и исключения фризов я решил использовать служебный файл типа index, который в последующем очень пригодился.
Итак поехали...
Сначала необходимо узнать, есть ли такая папка на десктопе и каков ее размер. Если ее нет, то ее надо создать.
Для этого идем в домашнюю папочку юзера AppleScript...
Код: |
get every item of "Tiger:Users:applescript:Desktop"
|
Что переводится как взять каждый элемент объекта Цитата: |
{"T", "i", "g", "e", "r", ":", "U", "s", "e", "r", "s", ":", "a", "p", "p", "l", "e", "s", "c", "r", "i", "p", "t", ":", "D", "e", "s", "k", "t", "o", "p"}
|
Упс..., что-то не так.
А, ну конечно, объект у нас строка, а ее элементы буквы (литеры).
А нам нужен объект-папка. Исправляем ошибочку.
Код: |
get every item of "Tiger:Users:applescript:Desktop" as alias
|
Цитата: | Can't make {"T", "i", "g", "e", "r", ":", "U", "s", "e", "r", "s", ":", "a", "p", "p", "l", "e", "s", "c", "r", "i", "p", "t", ":", "D", "e", "s", "k", "t", "o", "p"} into type alias.
|
Опять не то...
Ах ну да. "as alias" действует на всю команду "get every item of...", а нам надо на "Tiger:Users:applescript:Desktop". Т.е. необходимо тип string преобразовать к типу alias ДО выполнения команды get. Как это сделать? Как в математике, с помощью скобок.
Код: |
get every item of ("Tiger:Users:applescript:Desktop" as alias)
|
Цитата: | Can't get every item of alias "Tiger:Users:applescript:Desktop" |
Опс...
Что же не так?
Конечно, ScriptEditor не Finder, он не может работать с файлами. Он работает с переменными и типами. Если в начале скрипта или строки отсутствует конструкция
tell application ""
--
end tell
или tell application "" to --, то подразумевается tell me. И мы пытаемся заставить ScriptEditor сделать то, чего он не умеет. Если чуть чуть изменить строку, то все получится. Код: | tell application "Finder" to get every item of ("Tiger:Users:applescript:Desktop" as alias)
|
Цитата: | {folder "My Folder" of folder "Desktop" of folder "applescript" of folder "Users" of startup disk of application "Finder"} |
Еще чуть чуть изменим код, чтобы сделать результат более читабельным.
Код: |
tell application "Finder" to get every item of ("Tiger:Users:applescript:Desktop" as alias) as alias |
Цитата: | alias "Tiger:Users:applescript:Desktop:My Folder:" |
Уф-ф... Сохраняемся и перекур.
--------------------------------------------------
Итак покурили, отдохнули, продолжем.
Я думаю все понимают, что указанные выше ошибки я совершал преднамеренно, дабы обьяснить как с ними бороться.Перечислю их поименно:
1. Неправильный тип данных, передаваемый команде.
2. Неправильное (не вовремя) преобразование типа.
3. Не верная TargetApplication. (Неверное адресование команды.)
Теперь, после исправления этих трех ошибок все работает...
Упс... Не работает.
Цитата: | Can't make {alias "Tiger:Users:applescript:Desktop:My Folder:", alias "Tiger:Users:applescript:Desktop:My Script.scpt"} into type alias. |
Это четвертая ошбка. Неверное предположение о возвращаемом типе. Скрипт мы сохранили на десктоп, и у нас изменилось количество параметров, возвращаемых командой get. Обращаю внимание на то, что в последнем случае данные, которые пытается возвратить команда заключены в фигурные скобки. Это список (list). Известная "ошибка???" Finder Scripting, называемая Radar problem 2741967. Суть ее заключается в том, что Finder при возврате одной ссылки на объект возвращает именно ссылку, а не список ссылок из одного элемента. Хотя правильнее (по моему) последнее. Мораль такова: желательно преобразовывать тип перед использованием переменной. Итак:
Код: |
tell application "Finder" to get every item of ("Tiger:Users:applescript:Desktop" as alias) --as alias
|
Что Вы говорите? У Вас нет диска "Tiger" ? И пользователь называется подругому?
Нет проблем, сейчас доработаем.
Код: |
set tStartUpDisk to "Tiger"
set tUser to "applescript"
tell application "Finder" to get every item of (tStartUpDisk & ":Users:" & tUser & ":Desktop" as alias) --as alias
|
В двух первых строках в начале скрипта поменяйте "Tiger" и "applescript" на Ваши диск и Short Name и все Ok!
Однако скрипт можно заставить делать это автоматически. Например вот так:
Код: | --set tStartUpDisk to "Tiger"
--set tUser to "applescript"
set tHome to home directory of application "Finder" --as alias
tell application "Finder" to get every item of ((tHome as text) & "Desktop" as alias) --as alias |
Цитата: | {alias "Tiger:Users:applescript:Desktop:My Folder:", alias "Tiger:Users:applescript:Desktop:My Script.scpt"} |
Или так:
Код: | tell application "Finder" to set tDesktop to desktop --as alias
tell application "Finder" to get every item of (tDesktop as alias) --as alias |
Цитата: | {alias "Tiger:Users:applescript:Desktop:My Folder:", alias "Tiger:Users:applescript:Desktop:My Script.scpt"} |
И даже так:
Код: | tell application "Finder" to get every item of (desktop of application "Finder" as alias) |
Цитата: | {alias "Tiger:Users:applescript:Desktop:My Folder:", alias "Tiger:Users:applescript:Desktop:My Script.scpt"} |
И так:
Код: | tell application "Finder" to get every item of (desktop as alias) |
Цитата: | {alias "Tiger:Users:applescript:Desktop:My Folder:", alias "Tiger:Users:applescript:Desktop:My Script.scpt"} |
Но!:
Код: |
tell application "Finder" to get every item of desktop
|
Цитата: | {alias "Tiger:", alias "Tiger:Users:applescript:Desktop:My Folder:", alias "Tiger:Users:applescript:Desktop:My Script.scpt"} |
Разница в том, что в последнем случае у нас появился alias диска....
Хм... а если так: Код: | tell application "Finder" to get every disk of desktop |
Цитата: | startup disk of application "Finder" |
А так? Код: | tell application "Finder" to get every folder of desktop |
Цитата: | startup disk of application "Finder", folder "My Folder" of desktop of application "Finder" | Неужели диск считается папкой? Вообще-то правильно, свойства у них похожи.
Собственно все это расказывалось с единственной целью. Показать, что одинаковый результат можно получить с помощью различного кода и с помощью практически одинокового кода можно получить различный результат. Все зависит от того, с помощью какого механизма мы обращаемся к объекту и какие свойства запрашиваем.
_________________ Дайте мне единицу измерения и я смогу измерить ничтожность и бесконечность. А компьютер мне в х... не упёрся. Мне штангенциркуля хватит.
И ещё. Учу пользоваться документацией
Искренне Ваш ﺗﺘﺮ
Последний раз редактировалось: zztatarin (Сб Ноя 22, 2008 15:42), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
zztatarin

Репутация: +34
Зарегистрирован: 04.08.2006 Сообщения: 4260
|
Добавлено: Вс Июн 29, 2008 18:40
|
|
|
2 Moders Не удаляйте. Это закладка для будущих "глав".
_________________ Дайте мне единицу измерения и я смогу измерить ничтожность и бесконечность. А компьютер мне в х... не упёрся. Мне штангенциркуля хватит.
И ещё. Учу пользоваться документацией
Искренне Ваш ﺗﺘﺮ
Последний раз редактировалось: zztatarin (Сб Ноя 22, 2008 15:40), всего редактировалось 1 раз |
|
Вернуться к началу |
|
Slava Ryabinin
Репутация: 0
Зарегистрирован: 30.04.2008 Сообщения: 2
|
Добавлено: Вс Авг 10, 2008 15:14
|
|
|
А нет ли форумов или книжек на русском по AppleScript?
|
|
Вернуться к началу |
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
Powered by phpBB © 2001, 2005 phpBB Group
|