Большой Воронежский Форум

Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел.
Вернуться   Большой Воронежский Форум » Компьютеры и все, что с ними связано » » Программирование
Философия, технологии, алгоритмы!

Ответ
 
Опции темы
Старый 31.07.2014, 18:45   #1   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Что-то поменялось или в XE6 или в Word2013 не могу понять что.

Вот код, рабочий в XE2 и на word2010
Цитата:
VWord=CreateOleObject("Word.Application");
VWord.OlePropertyGet("Documents").OleProcedure("Ad d");

VDoc=VWord.OlePropertyGet("Documents").OleFunction ("Item",1);
VDoc.OlePropertyGet("Paragraphs").OleProcedure("Ad d");

VDoc.OlePropertyGet("Paragraphs").OleFunction("Ite m",1).OlePropertyGet("Range").OlePropertyGet("Font ").OlePropertySet("Bold",1);
VDoc.OlePropertyGet("Paragraphs").OleFunction("Ite m",1).OlePropertyGet("Range").OlePropertyGet("Font ").OlePropertySet("Size",29);
VDoc.OlePropertyGet("Paragraphs").OleFunction("Ite m",1).OlePropertyGet("Range").OlePropertySet("Text ","Таблица");
Поставил XE6 и Office 2013 - на последней строке, там где пишется слово "Таблица", стало вылетать с ошибкой "неверный тип переменной".
Это лишь фрагмент, в полной программе приходится комментировать строки, содержащие обращение к OlePropertySet("Text"..... чтобы ворд не выдавал ошибку.

В Ворде поменялось название свойства "Text" ? Как уже в самом ворде посмотреть, на что он ругается?

Последний раз редактировалось Eвгений; 01.08.2014 в 00:03.
  Ответить с цитированием
Старый 31.07.2014, 19:08   #2   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
сделай

VDoc.OlePropertyGet("Paragraphs").OleFunction("Ite m",1).OlePropertyGet("Range").OlePropertyGet("Text ");

и посмотри ТИП возвращаемой переменной. Там вариант, кажется возвращается, это класс, у него есть тип.
Потом добейся чтобы у тебя передаваемое значение в Set было того же типа. Для этого заведи переменную, ее присвой перед передачей, и проверь тип. Если не совпадает - добейся чтобы совпал.
  Ответить с цитированием
Старый 31.07.2014, 19:10   #3   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Цитата:
и посмотри ТИП возвращаемой переменной.
Как именно это сделать?
  Ответить с цитированием
Старый 31.07.2014, 19:15   #4   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Eвгений Посмотреть сообщение
Как именно это сделать?
присвой переменную того типа, который возвращает эта функция.
тип можно поcмотреть как минимум в Help, поставив курсор на функцию, и нажав F1.
это будет что-то типа TVariant (или просто Variant)
заведи переменную такого типа, присвой и в отладчике посмотри на содержимое. должен разобраться. там среди пропертей (свойств) будет ТИП ЗНАЧЕНИЯ.
  Ответить с цитированием
Старый 31.07.2014, 19:24   #5   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Вот что у меня в начале
Цитата:
Variant VWord;
Variant VDoc;
Variant VTable;
А если просто переменную VDoc добавить в watch list - покажет тип переменной?
Я-то попробовал, добавил, в watch list VDoc появился, но пишет "process ot accessible"
  Ответить с цитированием
Старый 31.07.2014, 19:31   #6   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
тебе нужно САМОМУ завести НОВУЮ переменнуюб типа Variant

Variant eugeny;

потом написать строку типа

eugeny = VDoc.OlePropertyGet("Paragraphs").OleFunction("Ite m",1).OlePropertyGet("Range").OlePropertyGet("T ext ");

ПЕРЕД тем присвоением, которое не работает.

поставить на нее Breakpoint, запустить программу, остановиться на нем, ВЫПОЛНИТЬ ЭТУ СТРОКУ (с OlePropertyGet ) и после этого посмотреть содержимое eugeny в Watch List, разверни, там будет в том числе тип.
  Ответить с цитированием
Старый 31.07.2014, 19:43   #7   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Eвгений Посмотреть сообщение
на
выдает
значит там этот вариант надо передать в Get, вторым параметром, так же как и в Set.
но Get в эту переменную запишет значение, то, тип которого тебе надо проверить.
  Ответить с цитированием
Старый 31.07.2014, 19:44   #8   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Сделал. Та же петрушка
Может я как-то не так добавляю в watch list?
В лист переменная добавляется, но в поле value написано "process not accessible"
  Ответить с цитированием
Старый 31.07.2014, 19:50   #9   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Eвгений Посмотреть сообщение
Сделал. Та же петрушка
Может я как-то не так добавляю в watch list?
В лист переменная добавляется, но в поле value написано "process not accessible"
подождать попробуй. как остановится, пойди покури. если не поможет, попробуй полный ребилд сделать.
  Ответить с цитированием
Старый 31.07.2014, 19:55   #10   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
простая int i, объявленная глобально - недоступна.
Навожу курсор, Debug->Add watch at cursor... Что-то не так делаю?
  Ответить с цитированием
Старый 31.07.2014, 19:58   #11   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Я уже между делом и так и так попробовал вместо temp_text.c_str() - просто temp_text, AnsiString(temp_text), IntToStr(I), в двойных и одинарных кавычках текст печатал - одно и то же.
Какие еще варианты обращения к свойству можно попробовать, чтобы ворд схавал?
  Ответить с цитированием
Старый 31.07.2014, 20:04   #12   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
смотри, ты наверное указатель объявил, на вариант.
поэтому он и не может обратиться к другому процессу, когда упал на бряке.
тебе нужно именно значение получить.
посмотри, там у варианта должна быть функция. которая возвращает тип, как строку.
сохрани ее В ОТДЕЛЬНОЙ ПЕРЕМЕННОЙ (строковой, string, а не вариант), и ПОСЛЕ присвоения посмотри тип (значение этой строковой переменной).
т.е. breakpoint должен стоять после этого присвоения.
  Ответить с цитированием
Старый 31.07.2014, 20:07   #13   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
а почему у меня int i может не мониториться? ЗАпускаю по F9, то есть с отладкой.
  Ответить с цитированием
Старый 31.07.2014, 21:10   #14   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Eвгений Посмотреть сообщение
а почему у меня int i может не мониториться? ЗАпускаю по F9, то есть с отладкой.
потому что он пытается получить значение другой переменной. и пока не получит, не отобразит и int. очисть список и добавь туда один int, скорее всего будет показан нормально.
только если это именно локальная переменная типа int (Integer кажется в паскале, давно уже не брал в руки шашек), а не хитрая пропертя какого класса, которая маскируется под обычную переменную.
так что если пропертя, то поступи с ней так же, как и с типом варианта - присвой значение в локальную переменную простого типа.
  Ответить с цитированием
Старый 31.07.2014, 21:21   #15   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
не помогает...
  Ответить с цитированием
Старый 31.07.2014, 21:23   #16   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Ладно, вернемся к методу тыка - как еще можно передать строку? Может быть данные то упаковываются правильно, а на самом деле "курсор" не там стоит?
  Ответить с цитированием
Старый 31.07.2014, 21:34   #17   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Метод тыка дал вот что:
Если обратиться через одинарные кавычки
Цитата:
OlePropertySet("Text",'222');
то в ворде пишется строка 3289650
То есть курсор на месте, но какая-то лажа с упаковкой данных
  Ответить с цитированием
Старый 31.07.2014, 22:06   #18   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Eвгений Посмотреть сообщение
Метод тыка дал вот что:
Если обратиться через одинарные кавычки

то в ворде пишется строка 3289650
То есть курсор на месте, но какая-то лажа с упаковкой данных
3289650 = 0x323232

0x32 - это код символа '2'

т.е. кривое преобразование строки в инт.

UPD: кавычки двойные попробуй. сраный ваш паскаль...
  Ответить с цитированием
Старый 31.07.2014, 22:22   #19   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

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

Нет ли каких-либо глобальных настроек работы со строками? Например как _TCHAR maps to ?
  Ответить с цитированием
Старый 31.07.2014, 22:27   #20   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Eвгений Посмотреть сообщение
Да, но оно кривое при кривом написании - кавычки одинарные, если подставлять строковую переменную - то ругается уже ворд.

Нет ли каких-либо глобальных настроек работы со строками? Например как _TCHAR maps to ?
1) создай строковую переменную.
присвой ей значение, которое хочешь передать.
проверь в отладчике значение.
2) создай переменную типа вариант, присвой ей строковую переменную из шага 1.
проверь в отладчике значение и тип.
3) передай эту переменную в Ole-функцию.

_TCHAR - это тип одинарных / двойных чаров, а у тебя идет преобразование строкового типа в целочисленный, но возможно кривизна и потому что надо передавать другой тип строк (чаров).
  Ответить с цитированием
Старый 31.07.2014, 22:37   #21   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Цитата:
Сообщение от Eвгений Посмотреть сообщение
Метод тыка дал вот что:
Если обратиться через одинарные кавычки

то в ворде пишется строка 3289650
То есть курсор на месте, но какая-то лажа с упаковкой данных
Вот нагуглил: http://stackoverflow.com/questions/7...ple-characters. Это не баг, это фича.

Цитата:
Сообщение от Spectator Посмотреть сообщение
UPD: кавычки двойные попробуй. сраный ваш паскаль...
Паскаль?
  Ответить с цитированием
Старый 31.07.2014, 22:40   #22   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Блин, а не проще ли отчёты FastReport использовать. Он кстати, может в Word переконвертировать созданный отчёт.
  Ответить с цитированием
Старый 31.07.2014, 22:41   #23   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Цитата:
проверь в отладчике значение.
Дык с этим -то и проблема.
Кавычки одинарные я из интереса поставил.
  Ответить с цитированием
Старый 31.07.2014, 22:42   #24   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
Блин, а не проще ли отчёты FastReport использовать. Он кстати, может в Word переконвертировать созданный отчёт.
Кто их поймет, этих извращенцев… Вообще, для простых документов можно сохранить шаблон в ворде в docx, распаковать это дело (этож зип с эксемельками), и работать каким-нибудь текстовым шаблонизатором.
  Ответить с цитированием
Старый 31.07.2014, 23:00   #25   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от silly Посмотреть сообщение
Паскаль?
а, это он в сях пытался строки в одинарных кавычках записать?
за хреном человеку с такими знаниями в си то лезть...
  Ответить с цитированием
Старый 31.07.2014, 23:11   #26   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Spectator,
Цитата:
а, это он в сях пытался строки в одинарных кавычках записать?
за хреном человеку с такими знаниями в си то лезть...
Вот ты смешной!!!
То есть одинарные кавычки, которые я чисто от нечего делать (А Я ПИСАЛ ОБ ЭТОМ В ПОСТЕ №11) один раз поставил, это для тебя признак паскаля, а целый кусок кода в самом начале ты не идентифицировал как Си?
И после этого ты мне будешь о знаниях говорить? Битый час (даже два) пытаюсь добиться от него помощи, а он со мной на паскале разговаривает...
  Ответить с цитированием
Старый 31.07.2014, 23:26   #27   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Все-таки, это косяк не ворда, а билдера - запустил программку на компе, где старый ворд - та же ошибка
  Ответить с цитированием
Старый 31.07.2014, 23:30   #28   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,997
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Eвгений Посмотреть сообщение
Все-таки, это косяк не ворда, а билдера - запустил программку на компе, где старый ворд - та же ошибка
ты не умничай. я паскаль уже 10 лет в глаза не видел и видеть не хочу. поэтому строки в одинарных кавычках - для меня уже признак паскаля. то что это глюк твой, а не ворда или билдера, это однозначно, у тебя криво преобразуется строка в число.
  Ответить с цитированием
Старый 31.07.2014, 23:39   #29   
Форумец
 
Сообщений: 6,813
Регистрация: 26.04.2006
Возраст: 44

Eвгений вне форума Не в сети
Spectator,
Сделал отладку. Записал в переменную vvv (тип Variant)
Цитата:
vvv=VDoc.OlePropertyGet("Paragraphs").OleFunction( "Item",1).OlePropertyGet("Range").OlePropertyGet(" Text");
Результат в отладчике на картинке
Миниатюры
Нажмите на изображение для увеличения
Название: 111111.gif
Просмотров: 14
Размер:	18.5 Кб
ID:	2528982  

Последний раз редактировалось Eвгений; 01.08.2014 в 00:10.
  Ответить с цитированием
Старый 31.07.2014, 23:52   #30   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Ну и кто тебе после этой картинки помогать будет?
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind