powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / DDE
29 сообщений из 29, показаны все 2 страниц
DDE
    #32743968
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто нибудь пользуется DDE если да, то расскажите пожалуйста по подробнее.

То что написано в Help'е

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
long handle
string s_regiondata[ 3 ]

handle = OpenChannel("Excel", "REGION.XLS", Handle(w_ddewin))
GetRemote("R1C2", s_regiondata[ 1 ], handle, Handle(w_ddewin))
GetRemote("R1C3", s_regiondata[ 2 ], handle, Handle(w_ddewin))
GetRemote("R1C4", s_regiondata[ 3 ], handle, Handle(w_ddewin))
CloseChannel(handle, Handle(w_ddewin))

Вообщем не вижу ни какого результата.

Что на самом деле хотел бы увидеть.
Допустим создать файл C:\Test.xls, добавить в 1строку и 1 столб. значение 100 используя DDE
После чего открыть этот файл.

Такое возможно
...
Рейтинг: 0 / 0
DDE
    #32743987
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что такое DDE и почему нельзя использовать OLE?
...
Рейтинг: 0 / 0
DDE
    #32744011
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот - пример, как использую 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 Калверта :)
...
Рейтинг: 0 / 0
DDE
    #32744025
Enlighten me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте
long c
c = OpenChannel("Excel","System")
Messagebox("Hello, DDE!",string(c))

В качестве первого шага.

Excel должен быть запущен.

Невредно эмулировать DDE-диалог c офисным клиентом из C или Delphi - больше диагностики. А потом перенести на PB.

А вообще, всё вроде работает через DDE... Ищите ошибку.

Ну и... Automation тоже годится.... :-))
...
Рейтинг: 0 / 0
DDE
    #32744043
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут вот кстати меня просветили, что вроде как DDE давно устарело и вообще глючный ацтой, а OLE - самое то, что надо :) Что, вроде как, тоже не свежачок... Но с одним могу согласиться на 100%: отлаживаться при обработке данных на стыке PB-Excel - то еще невеселое занятие...
...
Рейтинг: 0 / 0
DDE
    #32744094
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoТут вот кстати меня просветили, что вроде как DDE давно устарело и вообще глючный ацтой, а OLE - самое то, что надо :)
Проблема с DDE в том, что его могут в любой момент выкинуть.

Но с одним могу согласиться на 100%: отлаживаться при обработке данных на стыке PB-Excel - то еще невеселое занятие...
Я бы сказал - довольно нудное... Но если не пихать в Word или Excel NULL-ы - особых неожиданностей не будет.
...
Рейтинг: 0 / 0
DDE
    #32744137
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если уж речь зашла про 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 :).
...
Рейтинг: 0 / 0
DDE
    #32744154
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000Но если не пихать в Word или Excel NULL-ы - особых неожиданностей не будет.

Ага... А еще: не запускать макросы нетривиальные, не использовать всякие низкоуровневые свойства объектов (когда идет длинное описание вызываемого свойства или функции через много точек), не переходить с аглицкого офиса на русский и обратно, тогда наверное да ;) Если честно, то свой опыт в использовании ВБА вспоминаю как страшный сон!!! Особенно если у клиента есть офисы версии меньше 2000... Это вообще жуть на городском кладбище!!

Не, если особо не ковыряться с макросами - то все конечно просто. Но когда доходит дело до генерации чего-либо по исходным данным... Но это, как говорится, совсем другая история :)
...
Рейтинг: 0 / 0
DDE
    #32744166
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoАга... А еще: не запускать макросы нетривиальные, не использовать всякие низкоуровневые свойства объектов (когда идет длинное описание вызываемого свойства или функции через много точек), не переходить с аглицкого офиса на русский и обратно, тогда наверное да ;) Если честно, то свой опыт в использовании ВБА вспоминаю как страшный сон!!! Особенно если у клиента есть офисы версии меньше 2000... Это вообще жуть на городском кладбище!!
Тссс... совсем народ распугаешь .
...
Рейтинг: 0 / 0
DDE
    #32744389
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000

Код: plaintext
1.
// здесь напихиваем данные
...

Можно примерчик, т.е. допустим в А1 = 100 B3 = Тест
...
Рейтинг: 0 / 0
DDE
    #32744450
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример:

//Установка формата ячейки
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. - и готово! НО! Совет: любое форматирование лучше вынести в макрос, и после заполнения данными листа запускать ентот макрос. НО! С этим советом кто-то может и не согласиться ;) Это лично мое, как говорится, ИМХО. Полученное на основе печального (-ых) опыта (-ов)
...
Рейтинг: 0 / 0
DDE
    #32744469
Zmiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
...
Рейтинг: 0 / 0
DDE
    #32744471
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много работал с PB-OLE-Excel но вот с макросами не сталкивался, как его собственно запустить?
...
Рейтинг: 0 / 0
DDE
    #32744477
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoА вообще - можно посмотреть, как это делается в макросах, и заметить закономерность ;) Обычно нужно перед командой на ВБА добавить ole_excel.Object. - и готово!
Ну, конечно, главный источник информации - это "Сервис -> Макрос -> Начать запись", делаем то, что нужно, давим на "Остановить запись", смотрим, что получилось. Правда, ещё нужно менять Excel-евские внутренние константы типа xlLeft на что-то, более знакомое Повербилдеру.

Совет: любое форматирование лучше вынести в макрос, и после заполнения данными листа запускать ентот макрос. НО! С этим советом кто-то может и не согласиться ;) Это лично мое, как говорится, ИМХО. Полученное на основе печального (-ых) опыта (-ов)
Пока что печального опыта не приобрёл. Что нужно сделать, чтобы он появился :)?
...
Рейтинг: 0 / 0
DDE
    #32744499
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko

Код: plaintext
1.
//Установка значения в ячейке на странице DataList
oExcel.Object.Worksheets("DataList").Cells( 2 ,  3 ).Value = 'Тест'

Ошибочка выходит. Что не так?

===============================
PB 9.0.1 (7236) ASA 9.0.0 (1312)
...
Рейтинг: 0 / 0
DDE
    #32744517
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIGITALPROОшибочка выходит. Что не так?
Какая именно? Или это викторина ?

По существу вопроса: у тебя есть лист с названием "DataList"? Если нет - поставь, что есть, или напиши ActiveSheet. И не забудь Workbooks(1), т.е.:

Код: plaintext
1.
2.
3.
oExcel.Object.Workbooks( 1 ).ActiveSheet.Cells( 2 ,  3 ).Value = 'Тест'
// или так, если тебе нужно записать в  1 -й лист
oExcel.Object.Workbooks( 1 ).Worksheets( 1 ).Cells( 2 ,  3 ).Value = 'Тест'
...
Рейтинг: 0 / 0
DDE
    #32744720
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Балин! Народ! Ну вы даете!! Я ж специально вырезал кусок исходника с комментами!!! Ну прочитали бы, что-ли...

ЗАПУСК МАКРОСА:
//Запуск макроса
ole_excel.object.Application.Run("BeforeRetrieve")

А насчет замечания ув. Dim2000 по поводу записи макроса а потом просмотра исходника - ооооочень важное, особенно для начинающих ;) И не знающих объектов ВБА для Excel.

ПС: Чтоб посмотреть сформированный макрос - можно нажать Ctrl+F12 и появится что-то вроде среды разработчика. Кстати, с баггером, что немаловажно ;)

ППС: Если вдруг ПБ упадет, и покажется, что начались глюеи - стоит посмотреть в процессах процесс с именем EXCEL и снять его. Почему-то при смерти Excel не умирает до конца и может пакостить новым окошкам :(

ПППС: У меня глюки пошли при работе с макросами, когда начал работать с более-менее навороченным шаблоном, с необходимостью продолжения генерации отчета. Т.е. - например, отчет имеет переменное число строк/столбцов, по всей это беде надо еще и диаграмму построить. Глюки поперли на этапе попытки установки цветов/прозрачностей/свойств диаграммы. Просто одно и то же можно сделать несколькими способами, и в run-time почему-то методы, выдаваемые при записи моих действий в виде макроса, не подходили и приводили к падению приложения.
...
Рейтинг: 0 / 0
DDE
    #32744756
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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.Add()

// здесь напихиваем данные
...
oExcel.Object.Workbooks(1).ActiveSheet.Cells(2, 3).Value = 'TEST'
Здесь ругается (после запуска) Name no found

Код: plaintext
1.
2.
oExcel.Workbooks( 1 ).Save() //oExcel.Workbooks( 1 ).SaveAs(ls_named) если мы создали новую книгу и хотим автоматом сохранить
oExcel.DisconnectObject()
DESTROY oExcel

Это весь мой скирп, что не так??? вчем ошиба?
...
Рейтинг: 0 / 0
DDE
    #32744799
Enlighten me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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...

Что-то типа этого...
...
Рейтинг: 0 / 0
DDE
    #32744805
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIGITALPROЭто весь мой скирп, что не так??? вчем ошиба?
Object - лишний. Вот точно работающий вариант (проверено на PB6.5 и Excel2000):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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.Add()

oExcel.Workbooks( 1 ).ActiveSheet.Cells( 2 ,  3 ).Value = 'TEST'

oExcel.Workbooks( 1 ).Save() //oExcel.Workbooks( 1 ).SaveAs(ls_named) если мы создали новую книгу и хотим автоматом сохранить
oExcel.DisconnectObject()
DESTROY oExcel
...
Рейтинг: 0 / 0
DDE
    #32744812
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совет: из Билдера со всякими ActiveXXX стремно как-то работать... Лучше работать с абсолютными номерами. Вот так должно работать:

oExcel.Object.Workbooks(1).Worksheets(1).Cells(5, 5) = "Test"

Попробуй. С ActiveSheet нужно было по идее сначала нужному Activate() сделать, иначе возможны глюки... Вроде так.
...
Рейтинг: 0 / 0
DDE
    #32744819
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совет: из Билдера со всякими ActiveXXX стремно как-то работать... Лучше работать с абсолютными номерами. Вот так должно работать:

oExcel.Object.Workbooks(1).Worksheets(1).Cells(5, 5) = "Test"

Попробуй. С ActiveSheet нужно было по идее сначала нужному Activate() сделать, иначе возможны глюки... Вроде так.
...
Рейтинг: 0 / 0
DDE
    #32744826
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoПС: Чтоб посмотреть сформированный макрос - можно нажать Ctrl+F12 и появится что-то вроде среды разработчика. Кстати, с баггером, что немаловажно ;)
В котором можно на скорую руку подсмотреть Excel-евские константы :).

ППС: Если вдруг ПБ упадет, и покажется, что начались глюеи - стоит посмотреть в процессах процесс с именем EXCEL и снять его. Почему-то при смерти Excel не умирает до конца и может пакостить новым окошкам :(
Угумс. И при вылете по Runtime Error, кстати. С Word-ом то же самое, как мне имхается, это из-за того, что они считают себя самостоятельными приложениями и до команды "Закройся" закрываться не желают. Поэтому обычно отлаживаюсь с видимым Excel-ем - в случае чего, его не нужно искать в таскменеджере.

ПППС: У меня глюки пошли при работе с макросами, когда начал работать с более-менее навороченным шаблоном, с необходимостью продолжения генерации отчета. Т.е. - например, отчет имеет переменное число строк/столбцов, по всей это беде надо еще и диаграмму построить. Глюки поперли на этапе попытки установки цветов/прозрачностей/свойств диаграммы. Просто одно и то же можно сделать несколькими способами, и в run-time почему-то методы, выдаваемые при записи моих действий в виде макроса, не подходили и приводили к падению приложения.
Не, Excel я так сильно не мучил, а с Word-ом было нечто подобное :(.
...
Рейтинг: 0 / 0
DDE
    #32744837
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) Вот значит где разница между oleObject и u_oc :) Под u_oc обязательно нужно Object. Вот так вот. Так что получается, чтоб было точно, в моем примере нужно было бы поменять на такое:
ole_excel.Object.Workbooks(1).Worksheets(1).Cells(5, 5) = "Test"

ПыСы: Но с ActiveSheet все равно по-моему не очень неудобно работать... Особенно если несколько Sheets. Можно между ними запутаться... Вот. И действительно бывали глюки с ActiveSheet.
...
Рейтинг: 0 / 0
DDE
    #32744842
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoВот так должно работать:

oExcel.Object.Workbooks(1).Worksheets(1).Cells(5, 5) = "Test"

Object. - лишний, Value - добавить. В общем, вот это сработало:

Код: plaintext
oExcel.Workbooks( 1 ).Worksheets( 1 ).Cells( 5 ,  5 ).Value = "Test"

С ActiveSheet нужно было по идее сначала нужному Activate() сделать, иначе возможны глюки... Вроде так.
Никогда не делал, так что дело вряд ли в этом.
...
Рейтинг: 0 / 0
DDE
    #32744858
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoНо с ActiveSheet все равно по-моему не очень неудобно работать... Особенно если несколько Sheets. Можно между ними запутаться... Вот. И действительно бывали глюки с ActiveSheet.
Если несколько листов - с ActiveSheet не то что неудобно, а просто гемор, поэтому я сам использую WorkSheets(n) в случае, если нужно распихивать данные по нескольким листам одновременно. А ActiveSheet - только там, где у меня в книге один и только один лист :).
...
Рейтинг: 0 / 0
DDE
    #32744868
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет .Value - согласен. Забыл. Просто тестил только под Excel. Не было под рукой ничего, где можно было быстро ковырнуть, а менять прожект - чего-т лень показалось :(
Насчет oExcel - тож согласен. Просто с PFC это выглядело бы так:
ole_excel.Object.Workbooks(1).Worksheets(1).Cells(5, 5).Value = "Test"
...
Рейтинг: 0 / 0
DDE
    #32744879
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно ошибка

===============================
PB 9.0.1 (7236) ASA 9.0.0 (1312)
...
Рейтинг: 0 / 0
DDE
    #32744892
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВСЕ!!!!!
Всем большое спасибо!!!
oExcel.Workbooks(1).ActiveSheet.Cells(2 3).Value = 'TEST'
Работает!!!

===============================
PB 9.0.1 (7236) ASA 9.0.0 (1312)
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / DDE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]