|
|
|
DDE
|
|||
|---|---|---|---|
|
#18+
Кто нибудь пользуется DDE если да, то расскажите пожалуйста по подробнее. То что написано в Help'е Код: plaintext 1. 2. 3. 4. 5. 6. 7. Вообщем не вижу ни какого результата. Что на самом деле хотел бы увидеть. Допустим создать файл C:\Test.xls, добавить в 1строку и 1 столб. значение 100 используя DDE После чего открыть этот файл. Такое возможно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 11:09 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
А что такое DDE и почему нельзя использовать OLE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 11:15 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Вот - пример, как использую Excel я при построении отчетов (ole_excel - объект PFC u_oc): if isValid(ole_excel) then closeUserObject(ole_excel) end if OpenUserObject(ole_excel) //Активация не-OffSite почему-то глючит нереально. Со способом активации OffSite Excel открывается за пределами приложения. ll_ret = ole_excel.Activate(OffSite!) ole_excel.setRedraw(False) //Запуск макроса ole_excel.object.Application.Run("BeforeRetrieve") if ll_ret < 0 then return -1 ll_count = ole_excel.Object.Charts(1).SeriesCollection.Count For i = 1 to ll_Count //Работа с объектом График в документе Excel ole_excel.Object.Charts(1).SeriesCollection(1).Delete Next ll_dataCount = dw_sf.rowCount() For j = 1 to ll_dataCount //Установка формата ячейки ole_excel.Object.Worksheets("DataList").Cells(j + 1, 1).NumberFormat = "@" //Установка значения в ячейке на странице DataList ole_excel.Object.Worksheets("DataList").Cells(j + 1, 1).Value = dw_sf.getItemString(j, 'vdate') Next //Переход на страницу №1 ole_excel.Object.Sheets(1).Activate .......................... В этом примере в ОЛЕ-контейнере уже назначен документ excel. Но наверняка ж есть команды по открытию документа ;) Наверняка есть и другие способы, но все это было накопано на собственных шишках и с использованием книги Delphi 4 Калверта :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 11:23 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Попробуйте long c c = OpenChannel("Excel","System") Messagebox("Hello, DDE!",string(c)) В качестве первого шага. Excel должен быть запущен. Невредно эмулировать DDE-диалог c офисным клиентом из C или Delphi - больше диагностики. А потом перенести на PB. А вообще, всё вроде работает через DDE... Ищите ошибку. Ну и... Automation тоже годится.... :-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 11:27 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Тут вот кстати меня просветили, что вроде как DDE давно устарело и вообще глючный ацтой, а OLE - самое то, что надо :) Что, вроде как, тоже не свежачок... Но с одним могу согласиться на 100%: отлаживаться при обработке данных на стыке PB-Excel - то еще невеселое занятие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 11:32 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Vadim RomanenkoТут вот кстати меня просветили, что вроде как DDE давно устарело и вообще глючный ацтой, а OLE - самое то, что надо :) Проблема с DDE в том, что его могут в любой момент выкинуть. Но с одним могу согласиться на 100%: отлаживаться при обработке данных на стыке PB-Excel - то еще невеселое занятие... Я бы сказал - довольно нудное... Но если не пихать в Word или Excel NULL-ы - особых неожиданностей не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 11:47 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Кстати, если уж речь зашла про OLE, то я пишу примерно так: //------------------------------------------------------------ OleObject oExcel oExcel = CREATE oleobject if oExcel.ConnectToNewObject("Excel.Application") <> 0 then MessageBox('Error', 'Невозможно запустить Excel', Stopsign!) Return end if oExcel.Visible = TRUE // перенести в конец, если не хотите, чтобы всё рисовалось на глазах у пользователя oExcel.DisplayAlerts = False oExcel.Workbooks.Open(ls_named) // oExcel.Workbooks.Add() для создания новой книги // здесь напихиваем данные ... oExcel.Workbooks(1).Save() //oExcel.Workbooks(1).SaveAs(ls_named) если мы создали новую книгу и хотим автоматом сохранить oExcel.DisconnectObject() DESTROY oExcel //------------------------------------------------------------ Рекомендованная литература: справка по VBA для Excel :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 11:58 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Dim2000Но если не пихать в Word или Excel NULL-ы - особых неожиданностей не будет. Ага... А еще: не запускать макросы нетривиальные, не использовать всякие низкоуровневые свойства объектов (когда идет длинное описание вызываемого свойства или функции через много точек), не переходить с аглицкого офиса на русский и обратно, тогда наверное да ;) Если честно, то свой опыт в использовании ВБА вспоминаю как страшный сон!!! Особенно если у клиента есть офисы версии меньше 2000... Это вообще жуть на городском кладбище!! Не, если особо не ковыряться с макросами - то все конечно просто. Но когда доходит дело до генерации чего-либо по исходным данным... Но это, как говорится, совсем другая история :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 12:03 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Vadim RomanenkoАга... А еще: не запускать макросы нетривиальные, не использовать всякие низкоуровневые свойства объектов (когда идет длинное описание вызываемого свойства или функции через много точек), не переходить с аглицкого офиса на русский и обратно, тогда наверное да ;) Если честно, то свой опыт в использовании ВБА вспоминаю как страшный сон!!! Особенно если у клиента есть офисы версии меньше 2000... Это вообще жуть на городском кладбище!! Тссс... совсем народ распугаешь . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 12:05 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Dim2000 Код: plaintext 1. Можно примерчик, т.е. допустим в А1 = 100 B3 = Тест ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 13:29 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Вот пример: //Установка формата ячейки ole_excel.Object.Worksheets("DataList").Cells(1, 1).NumberFormat = "@" //Установка значения в ячейке на странице DataList ole_excel.Object.Worksheets("DataList").Cells(1, 1).Value = 1000 //Установка значения в ячейке на странице DataList ole_excel.Object.Worksheets("DataList").Cells(2, 3).Value = 'Тест' Для перехода на пример от Dim2000 меняем ole_excel на oExcel. А вообще - можно посмотреть, как это делается в макросах, и заметить закономерность ;) Обычно нужно перед командой на ВБА добавить ole_excel.Object. - и готово! НО! Совет: любое форматирование лучше вынести в макрос, и после заполнения данными листа запускать ентот макрос. НО! С этим советом кто-то может и не согласиться ;) Это лично мое, как говорится, ИМХО. Полученное на основе печального (-ых) опыта (-ов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 13:59 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
TO DIGITALPRO Что бы что то передать нужно установить закладку в документе. Ставишь в своём документе закладку в нужно ячейке, называешь её R1C2 и т.д. long handle string s_regiondata[3] handle = OpenChannel("Excel", "REGION.XLS") SETRemote("R1C2", s_regiondata[1], handle,) SETRemote("R1C3", s_regiondata[2], handle,) SETRemote("R1C4", s_regiondata[3], handle,) CloseChannel(handle) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 14:07 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Много работал с PB-OLE-Excel но вот с макросами не сталкивался, как его собственно запустить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 14:09 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Vadim RomanenkoА вообще - можно посмотреть, как это делается в макросах, и заметить закономерность ;) Обычно нужно перед командой на ВБА добавить ole_excel.Object. - и готово! Ну, конечно, главный источник информации - это "Сервис -> Макрос -> Начать запись", делаем то, что нужно, давим на "Остановить запись", смотрим, что получилось. Правда, ещё нужно менять Excel-евские внутренние константы типа xlLeft на что-то, более знакомое Повербилдеру. Совет: любое форматирование лучше вынести в макрос, и после заполнения данными листа запускать ентот макрос. НО! С этим советом кто-то может и не согласиться ;) Это лично мое, как говорится, ИМХО. Полученное на основе печального (-ых) опыта (-ов) Пока что печального опыта не приобрёл. Что нужно сделать, чтобы он появился :)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 14:11 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Vadim Romanenko Код: plaintext 1. Ошибочка выходит. Что не так? =============================== PB 9.0.1 (7236) ASA 9.0.0 (1312) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 14:20 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
DIGITALPROОшибочка выходит. Что не так? Какая именно? Или это викторина ? По существу вопроса: у тебя есть лист с названием "DataList"? Если нет - поставь, что есть, или напиши ActiveSheet. И не забудь Workbooks(1), т.е.: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 14:28 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Балин! Народ! Ну вы даете!! Я ж специально вырезал кусок исходника с комментами!!! Ну прочитали бы, что-ли... ЗАПУСК МАКРОСА: //Запуск макроса ole_excel.object.Application.Run("BeforeRetrieve") А насчет замечания ув. Dim2000 по поводу записи макроса а потом просмотра исходника - ооооочень важное, особенно для начинающих ;) И не знающих объектов ВБА для Excel. ПС: Чтоб посмотреть сформированный макрос - можно нажать Ctrl+F12 и появится что-то вроде среды разработчика. Кстати, с баггером, что немаловажно ;) ППС: Если вдруг ПБ упадет, и покажется, что начались глюеи - стоит посмотреть в процессах процесс с именем EXCEL и снять его. Почему-то при смерти Excel не умирает до конца и может пакостить новым окошкам :( ПППС: У меня глюки пошли при работе с макросами, когда начал работать с более-менее навороченным шаблоном, с необходимостью продолжения генерации отчета. Т.е. - например, отчет имеет переменное число строк/столбцов, по всей это беде надо еще и диаграмму построить. Глюки поперли на этапе попытки установки цветов/прозрачностей/свойств диаграммы. Просто одно и то же можно сделать несколькими способами, и в run-time почему-то методы, выдаваемые при записи моих действий в виде макроса, не подходили и приводили к падению приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 16:16 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Dim2000 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Здесь ругается (после запуска) Name no found Код: plaintext 1. 2. Это весь мой скирп, что не так??? вчем ошиба? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 16:25 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
C IDL знакомы? Если да, то получите исходник библиотеки типов Excel - снимает вопросы как рукой. Если глючат длинные выражения, подвергните их анализу: //oExcel.Object.Workbooks(1).ActiveSheet.Cells(2, 3).Value = 'TEST' OleObject book,sheet,cell test = oExcel.Workbooks.Items(1) sheet = test.ActiveSheet() //So on... Что-то типа этого... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 16:38 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
DIGITALPROЭто весь мой скирп, что не так??? вчем ошиба? Object - лишний. Вот точно работающий вариант (проверено на PB6.5 и Excel2000): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 16:39 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Совет: из Билдера со всякими ActiveXXX стремно как-то работать... Лучше работать с абсолютными номерами. Вот так должно работать: oExcel.Object.Workbooks(1).Worksheets(1).Cells(5, 5) = "Test" Попробуй. С ActiveSheet нужно было по идее сначала нужному Activate() сделать, иначе возможны глюки... Вроде так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 16:41 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Совет: из Билдера со всякими ActiveXXX стремно как-то работать... Лучше работать с абсолютными номерами. Вот так должно работать: oExcel.Object.Workbooks(1).Worksheets(1).Cells(5, 5) = "Test" Попробуй. С ActiveSheet нужно было по идее сначала нужному Activate() сделать, иначе возможны глюки... Вроде так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 16:42 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Vadim RomanenkoПС: Чтоб посмотреть сформированный макрос - можно нажать Ctrl+F12 и появится что-то вроде среды разработчика. Кстати, с баггером, что немаловажно ;) В котором можно на скорую руку подсмотреть Excel-евские константы :). ППС: Если вдруг ПБ упадет, и покажется, что начались глюеи - стоит посмотреть в процессах процесс с именем EXCEL и снять его. Почему-то при смерти Excel не умирает до конца и может пакостить новым окошкам :( Угумс. И при вылете по Runtime Error, кстати. С Word-ом то же самое, как мне имхается, это из-за того, что они считают себя самостоятельными приложениями и до команды "Закройся" закрываться не желают. Поэтому обычно отлаживаюсь с видимым Excel-ем - в случае чего, его не нужно искать в таскменеджере. ПППС: У меня глюки пошли при работе с макросами, когда начал работать с более-менее навороченным шаблоном, с необходимостью продолжения генерации отчета. Т.е. - например, отчет имеет переменное число строк/столбцов, по всей это беде надо еще и диаграмму построить. Глюки поперли на этапе попытки установки цветов/прозрачностей/свойств диаграммы. Просто одно и то же можно сделать несколькими способами, и в run-time почему-то методы, выдаваемые при записи моих действий в виде макроса, не подходили и приводили к падению приложения. Не, Excel я так сильно не мучил, а с Word-ом было нечто подобное :(. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 16:45 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
:) Вот значит где разница между oleObject и u_oc :) Под u_oc обязательно нужно Object. Вот так вот. Так что получается, чтоб было точно, в моем примере нужно было бы поменять на такое: ole_excel.Object.Workbooks(1).Worksheets(1).Cells(5, 5) = "Test" ПыСы: Но с ActiveSheet все равно по-моему не очень неудобно работать... Особенно если несколько Sheets. Можно между ними запутаться... Вот. И действительно бывали глюки с ActiveSheet. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 16:48 |
|
||
|
DDE
|
|||
|---|---|---|---|
|
#18+
Vadim RomanenkoВот так должно работать: oExcel.Object.Workbooks(1).Worksheets(1).Cells(5, 5) = "Test" Object. - лишний, Value - добавить. В общем, вот это сработало: Код: plaintext С ActiveSheet нужно было по идее сначала нужному Activate() сделать, иначе возможны глюки... Вроде так. Никогда не делал, так что дело вряд ли в этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2004, 16:49 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=32743968&tid=1338796]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
168ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 286ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...