Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];

Вниз

Проблема с офисом 2000   Найти похожие ветки 

 
nickmas   (2006-04-08 02:53) [0]

Уважаемые мастера! Помогите разобраться в следующей проблеме:

Используя позднее связывание, создаю график в Excel-e:

...
Excel.Charts.Add;
Excel.Charts[1].ChartType:=xlXYScatterSmooth;

Добавляю данные в график:

Excel.Charts[1].SeriesCollection.NewSeries;
Excel.Charts[1].SeriesCollection[1].XValues:=VarArrayOf([xsr1,xsr2,xsr3]);
Excel.Charts[1].SeriesCollection[1].Values:=VarArrayOf([ysr1,ysr2,ysr3]);

И теперь привязываю данный график к листу с названием "Результат":

Excel.ActiveChart.Location(xlLocationAsObject,"Результат");

Так вот проблема в том, что у меня стоит 2003 офис и все нормально работает. Но..., как выяснилось позже, не работает на 2000 офисе. А именно: не хочет привязывать график к данному листу.

Может кто укажет, в чем тут моя ошибка?

Заранее благодарен!!!


 
balepa ©   (2006-04-08 06:59) [1]

Ошибка втом что ты пользуешся MS Office 2000


 
nickmas   (2006-04-08 16:06) [2]

Я пользуюсь MS Office 2003. Но меня также интересует, чтобы это приложение работало с любым офисом.


 
YurikGL ©   (2006-04-08 17:46) [3]

Посмотри на соответсвующие макросы 2000-го и 2003-го офисов... возможно, они разные...


 
nickmas   (2006-04-08 20:28) [4]

Дело в том, что одинаковые - я об этом тоже думал!?


 
nickmas   (2006-04-09 20:02) [5]

Кстати, ошибку выдает программа, когда я обращаюсь к графику после его создания:

Excel.Sheets[2].ChartObjects[1].Height:=139;
Excel.Sheets[2].ChartObjects[1].Width:=239;

А строку

Excel.ActiveChart.Location(xlLocationAsObject,"Результат");

видимо проходит, но не выполняет.

(Sheets[2] = "Результат")


 
nickmas   (2006-04-10 04:15) [6]

Не ужели нет ни у кого никаких мыслей?


 
ЮЮ ©   (2006-04-10 06:28) [7]

Excel.Charts[1]
Excel.ActiveChart
Excel.Sheets[2].ChartObjects[1]

Может не стоит работать с объектом с трех разных сторон, а остановиться на одной, успешно работающей?


 
sniknik ©   (2006-04-10 08:38) [8]

> Не ужели нет ни у кого никаких мыслей?
правильная мысль... поставь себе "офис 2000" и отлаживай/работай с ним если хочеш чтобы с ним тоже работало, и это не только иза данного конкретного глюка, а изза принципа поддерживаемости продуктов, сверху вниз она есть, а снизу вверх еще не придумали как.

кстати какого типа у тебя переменная Excel? вариант, или конкретного? если конкретного то какой модуль используется ExcelXP или Excel2000, и если взять 2000 то в нем у интерфейсов вообще есть те методы что ты используеш (на которых глюки)?


 
nickmas   (2006-04-10 08:47) [9]

Дело в том, что не со всеми свойствами объекта можно работать с трех сторон (по крайней мере у меня не получалось). Вот, например, чтобы изменить размер диаграммы, получилось только таким способом

Excel.Sheets[2].ChartObjects[1].Height:=139;
Excel.Sheets[2].ChartObjects[1].Width:=239;

а также изменить положение - тоже таким же способом

Excel.Sheets[2].ChartObjects[1].Left:=99;
Excel.Sheets[2].ChartObjects[1].Top:=14;

Да и, как мне кажется, не в этом дело. Лишь бы обращение к объекту было верным (для офиса 2003 верно - проверено).

А для офиса 2000... Может там нужно по другому как-то обращаться к данному объекту (хотя макросы пишутся одинаково, что в 2000, что в 2003). Или нужно подключить чего? (Excel2000 у меня подключен, а также ExcelXP и Excel97)

В общем жду совета, мастера!


 
nickmas   (2006-04-10 08:50) [10]

Excel у меня Variant


 
nickmas   (2006-04-10 08:55) [11]

Отлаживал, работал на другой машине правда, от туда и узнал, что глюк здесь

Excel.ActiveChart.Location(xlLocationAsObject,"Результат");

Не знаю как решить эту проблему. Вот и спрашиваю вас всех.


 
sniknik ©   (2006-04-10 09:02) [12]

> Excel2000 у меня подключен
просто подключить мало, надо им пользоваться (обьявить Excel: _Workbook; создавать Excel:= CoExcelWorkbook; ...)  тогда тебе будут доступны только его методы уже на этапе компиляции, лишнего не добавиш...
остальные (ExcelXP и Excel97) лишние, к тому же у тебя все одно только переменные(описания) из него используются.

> Excel у меня Variant
а вот у варианта проверка только на выполнении идет.


 
nickmas   (2006-04-10 14:02) [13]

Так ты мне предлагаешь полностью перейти с позднего связывания на раннее? Во-первых там достаточно много переделывать, а во-вторых - я с ранним связыванием так толком и не разобрался, хотя знаю, что оно предпочтительнее. Да и времени не так уж много, чтобы разбираться и все переделывать - эта программа - дипломная, и она уже готова, вопрос только в этом. Как найду решение, исправлю и все, готово.

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

В общем, меня интересует решение данной проблемы при позднем связывании. Есть еще какие мысли по этому поводу?


 
EvS ©   (2006-04-10 14:31) [14]

>Excel.ActiveChart.Location(xlLocationAsObject,"Результат");
 
Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets("Результат"));
 или что-то в этом духе. Вобщем надо лист указать, а не его имя


 
sniknik ©   (2006-04-10 14:59) [15]

> Так ты мне предлагаешь полностью перейти с позднего связывания на раннее?
хотябы проверить то что у тебя не идет, методов может не быть.

и то только после того как ты фактически проигнорировал "правильную мысль... " ([8]) писать и отлаживать с установленной минимальной версией того, что хочеш поддерживать.

> В общем, меня интересует решение данной проблемы при позднем связывании.
используя один продукт искать проблемы другого... это на сайт ясновидящих надо.


 
sniknik ©   (2006-04-10 15:02) [16]

> эта программа - дипломная, и она уже готова, вопрос только в этом. Как найду решение, исправлю и все, готово.
зачем вообще править? не проще ли показывать на установленной 2003 версии офиса, и все.


 
nickmas   (2006-04-10 16:53) [17]


> Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets("Результат"));
>   или что-то в этом духе. Вобщем надо лист указать, а не
> его имя


Пробовал я по разному при офисе 2000: и так

Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets("Результат"));

и так

Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets[2]);

не идет.


 
nickmas   (2006-04-10 17:31) [18]


> хотябы проверить то что у тебя не идет, методов может не
> быть.


Согласен, но это приведет к тому (если при раннем связывании найду решение), что опять таки придется переделывать все на раннее связывание. А по этому поводу я уже высказывал свою ситуацию.

А делать прогу смешанную, т.е. с ранним и поздним связыванием одновременно, - я вообще не представляю что из этого получится. Думаю из этого ничего хорошего не выйдет.


> зачем вообще править? не проще ли показывать на установленной
> 2003 версии офиса, и все.


Дело в том, что у препода дома на компе стоит 2000-й офис, и естественно у него возник вопрос: "Почему программа не работает?". А это для него важно, чтобы дома работала, т.к. сейчас все стараются давать темы дипломных с корысными целями, чтобы он в данном случае мог пользоваться этой программой и в дальнешем. И еще немаловажный факт - попробуй докажи пожилому человеку, да еще и проофессору-математику, что у него софт, включая офис, древний. Естественно он скажет, что это программа плохо написана, что не работает у него на компьютере. В общем бесполезно и пытаться его заставить переустановить у себя офис.


 
sniknik ©   (2006-04-10 17:39) [19]

> Согласен, но это приведет к тому ...
ни к чему это не приведет, если сделаеш отдельную програмку тест, и будеш проверять нужные тебе методы на присутствие.


 
nickmas   (2006-04-10 19:13) [20]

To sniknik

Например, какие методы?


 
sniknik ©   (2006-04-10 20:20) [21]

> Например, какие методы?
а я знаю? смотри что ты там используеш, проверяй...
например
> Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets("Результат"));
Excel - я, может не быть обьекта ActiveChart, у ActiveChart функции Location, Location может иметь не 2 параметра, не в том порядке и т.д.

при "моем" варианте тебе не правильно даже скомпилить не даст, а при "простановке" точки у обьекта будет список доступных методов предлагать. посмотриш кикие нужны (менно для 2000го) да и вставиш себе в позднее связывание.


 
nickmas   (2006-04-12 11:48) [22]

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


 
nickmas   (2006-04-15 13:37) [23]

Вот код маленькой программки "Тест", которая не работает с офисом 2000 имено из-за этой проблемы. Может так будет проще вам разобраться, в чем тут "бок".

...

uses ComObj, OleServer, Excel2000, ...;

...

procedure TForm1.Button1Click(Sender: TObject);
var
 Path, PathTemp: string;
 Excel: Variant;
begin
 Path:=Application.ExeName;
 PathTemp:="";
 While (Pos("\",Path)>0) do
   begin
     PathTemp:=PathTemp+Copy(Path,1,Pos("\",Path));
     Delete(Path,1,Pos("\",Path));
   end;
 Path:=PathTemp+"Data.xls";
 if FileExists(Path) then
   DeleteFile(Path);
 try
   Excel:=CreateOleObject("Excel.Application");
   Excel.WorkBooks.Add;
   Excel.Sheets[2].Activate;
   Excel.Sheets[2].Name:="График";
   Excel.Charts.Add;
   Excel.Charts[1].ChartType:=xlXYScatterSmooth;
   Excel.Charts[1].SeriesCollection.NewSeries;
   Excel.Charts[1].SeriesCollection[1].XValues:=VarArrayOf([1,2,3]);
   Excel.Charts[1].SeriesCollection[1].Values:=VarArrayOf([2,1,3]);
   Excel.ActiveChart.Location(xlLocationAsObject,"График");
   Excel.Sheets[2].ChartObjects[1].Height:=165;
   Excel.Sheets[2].ChartObjects[1].Width:=288;
   Excel.Sheets[2].ChartObjects[1].Left:=48;
   Excel.Sheets[2].ChartObjects[1].Top:=14;
   Excel.ActiveWorkbook.Close(SaveChanges:=True, Filename:=Path);
   Excel.Quit;
 except
   Excel.ActiveWorkbook.Close(SaveChanges:=False);
   Excel.Quit;
   MessageBox(Handle,"Не могу сохранить экспериментальные данные в Excel!","Информация",48);
 end;
end;


 
sniknik ©   (2006-04-15 15:15) [24]

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

кто тебя так писать учил? найди и дай пару раз в рожу... если сам додумался то на полгода без сладкого... (и это еще мягко, если бы работал то за это увольняют... не все к жалению, но тем не менее.)

переписывай этот кусок вот так, и иди снова проверять на машину с 2000м офисом, то что там выдаст, к этому надо будет прислушатся...  
procedure TForm1.Button1Click(Sender: TObject);
var
 FileName: string;
 Excel: OleVariant;
begin
 FileName:= ExtractFilePath(Application.ExeName)+"Data.xls";
 DeleteFile(FileName);
 Excel:= CreateOleObject("Excel.Application");
 try
   try
     Excel.WorkBooks.Add;
     Excel.Sheets[2].Activate;
     Excel.Sheets[2].Name:= "График";
     Excel.Charts.Add;
     Excel.Charts[1].ChartType:= xlXYScatterSmooth;
     Excel.Charts[1].SeriesCollection.NewSeries;
     Excel.Charts[1].SeriesCollection[1].XValues:= VarArrayOf([1,2,3]);
     Excel.Charts[1].SeriesCollection[1].Values:= VarArrayOf([2,1,3]);
     Excel.ActiveChart.Location(xlLocationAsObject, "График");
     Excel.Sheets[2].ChartObjects[1].Height:=165;
     Excel.Sheets[2].ChartObjects[1].Width:=288;
     Excel.Sheets[2].ChartObjects[1].Left:=48;
     Excel.Sheets[2].ChartObjects[1].Top:=14;
     Excel.ActiveWorkbook.Close(SaveChanges:=True, Filename:= FileName);
     Excel.Quit;
   except
     on E: Exception do
       Application.MessageBox(PChar("Не могу сохранить экспериментальные данные в Excel!"#10#13+
                                    "По причине ошибки :"#10#13#10#13+E.Message),"Ошибка!", MB_OK or MB_ICONERROR);

   end;
 finally
   Excel:= NULL;
 end;
end;


 
sniknik ©   (2006-04-15 15:54) [25]

тат подумал... первые две строки тоже бы надо внести внутрь try, особенно удаление, с небольшой добавкой, т.к. посмотрел оно делает только вызов виндовой процедуры, ексепта не выдает... поэтому

...
    try
      FileName:= ExtractFilePath(Application.ExeName)+"Data.xls";
      {$WARN SYMBOL_PLATFORM OFF}
      Win32Check(DeleteFile(FileName));
      {$WARN SYMBOL_PLATFORM ON}

      Excel.WorkBooks.Add;
...


 
nickmas   (2006-04-16 03:11) [26]

To sniknik:

Спасибо за совет, но там выдало следующее

Невозможно получить свойство ChartObjects класса Worksheet

т.е. то, о чем я и раньше твердил: не может найти график на втором листе, т.к. его ко второму листу не привязал.

Когда меняю второй лист на превый

Excel.Sheets[1].ChartObjects[1].Height:=165;
Excel.Sheets[1].ChartObjects[1].Width:=288;
Excel.Sheets[1].ChartObjects[1].Left:=48;
Excel.Sheets[1].ChartObjects[1].Top:=14;


то работает все нормально. Это говорит о том, что график не привязывается ко второму листу, а "ложится" по умолчанию на превый лист.

Кстати, об этом
Невозможно получить свойство ChartObjects класса Worksheet
пишет и в Делфи, когда запускаешь проект на выполнение в самом Делфи.

Но вот это тоже прикольно
on E: Exception do
Application.MessageBox(PChar("Не могу сохранить экспериментальные данные в Excel!"#10#13+"По причине ошибки :"#10#13#10#13+E.Message),"Ошибка!", MB_OK or MB_ICONERROR);

я просто не знал как это делается, да и до сих пор не совсем понял, как оно так работает:

что значит on E: Exception?
и #10#13#10#13+E.Message?

И вот этот случай
{$WARN SYMBOL_PLATFORM OFF}
Win32Check(DeleteFile(FileName));
{$WARN SYMBOL_PLATFORM ON}

"ругается"
Не удается найти указанный файл,
когда файла "Data.xls" не существует.
Чем это решение в данном случае плохое
if FileExists(FileName) then
  DeleteFile(FileName);
?


> иди снова проверять на машину с 2000м офисом

Задолбался я бегать - поставил себе вторую ОС и на нее офис 2000.

А вобще, спасибо за помощь!!!


 
sniknik ©   (2006-04-16 08:39) [27]

> Невозможно получить свойство ChartObjects класса Worksheet
это как раз то о чем я тебе "твердил"... нет обьекта/метода/... в старой версии (возможно есть аналог, но он не от листа идет а например обший от книги... ну там варианты возможны) т.е. то что я говорил предположительно то в ошибке указано явно (и не нужны долгие разговоры об этом, привел сообщение и все ясно).

> что значит on E: Exception?
> и #10#13#10#13+E.Message?
значит "при получении любого исключения после пустой строки показать оригинальный месайдж этого исключения"

> Не удается найти указанный файл,
д, это я не учел. когда убрал проверку if FileExists(FileName) then как раз подумал нафиг не нужна т.к. нет там ексептов, потом добавил уже в свой код возбуждение исключения но не вернул проверку, забыл.
правильнее так
{$WARN SYMBOL_PLATFORM OFF}
if FileExists(FileName) then Win32Check(DeleteFile(FileName));
{$WARN SYMBOL_PLATFORM ON}
и правильность не в только в этой конструкции а и в том что она внутри try except  см. [25]
нужна если по какойто причине старый файл не удается удалить... значит и ексель его переписать не сможет возможно (ну открыт уже ексклюзивно и т.д.) тогда причина будет в том же общем сообщении "Не могу сохранить ..." (т.е. неважно по какой причине не удалось, обработчик ексепта один на все получится)

> Задолбался я бегать - поставил себе вторую ОС и на нее офис 2000.
см. [8], с этого начал.  но ты посчитал тогда установку такогоже офиса как у препода слишком сложным (?) и искал обходные пути... теперь понял что на самом деле сложно? ;о))


 
nickmas   (2006-04-16 18:18) [28]


> это как раз то о чем я тебе "твердил"... нет обьекта/метода/.
> .. в старой версии (возможно есть аналог, но он не от листа
> идет а например обший от книги... ну там варианты возможны)
> т.е. то что я говорил предположительно то в ошибке указано
> явно


Хорошо, но почему, когда я ставлю первы лист
Excel.Sheets[1].ChartObjects[1].Height:=165;
Excel.Sheets[1].ChartObjects[1].Width:=288;
Excel.Sheets[1].ChartObjects[1].Left:=48;
Excel.Sheets[1].ChartObjects[1].Top:=14;

он находит этот объект?

И еще, если не трудно, подскажи пожалуйста, какие модули надо подключить для использования раннего связывания или еще чего там надо сделать (для того, чтобы после точки выскакивало меню с методами). А то я первы раз пытаюсь попробовать поработать с ранним связыванием, и... не получается. За основу взял пример

...
uses
 windows, sysutils, excel_tlb;
...
procedure CreateSpreadsheet(filename: string);
var
 xla: _Application;
 xlw: _Workbook;
 LCID: integer;
begin
 xla := CoApplication.Create;
 LCID := GetUserDefaultLCID;
 try
   xla.Visible[LCID] := true;
   // пустая книга
   //xlw := xla.Workbooks.Add(xlWBATWorksheet, LCID);
   // новая книга на основе шаблона
   xlw := xla.Workbooks.Add(
     "c:\delphi\excel\sample\demo.xlt",
     LCID);
   xla.Range["A1", "A1"].Value := "Date";
   xla.Cells[1, 2].Value := FormatDateTime("dd-mmm-yyyy", Now);
   xla.Cells[3, 1].Value := "Numbers";
   xla.Range["B3", "E3"].Value := VarArrayOf([1, 10, 100, 1000]);
   xla.Range["F3", "F3"].Formula := "=Sum(B3:E3)";
   OLEVariant(xla).Run(
     "Demo",
     FormatDateTime("dd-mmm-yyyy", Now)
     );
   xlw.SaveAs(
     filename,
     xlWorkbookNormal,
     "", "", False, False,
     xlNoChange,
     xlLocalSessionChanges,
     true, 0, 0, LCID);
 finally
   xla.Quit;
 end;
end;


импортировал EXCEL9.OLB, как там было рекомендовано. После чего подключил excel_TLB - нормально. Но не хочет понимать эту команду
CoApplication.Create
Почему? Или может пример я взял для изучения неудачный?


 
sniknik ©   (2006-04-16 19:30) [29]

> Хорошо, но почему, когда я ставлю первы лист
> ...
> он находит этот объект?
у меня нет 2000го (и ставить не собираюсь ;), предположить можно (в очередной раз ;), к примеру самой страницы нет... ну ты же не указываеш книге сколько страниц должно быть перед созданием, значит берет из дефаултных настроек. вполне может быть одна.
или в 2000м графики только на первой странице возможны ... (бред), либо еще чего.

> Но не хочет понимать эту команду
> CoApplication.Create
> Почему? Или может пример я взял для изучения неудачный?
старый возможно, посмотри в получившемся excel_TLB (это тоже что ранее упроминавшиеся Excel2000/ExcelXP) там скорее всего определена CoExcelApplication, ее и надо/можно использовать. а можно из нее CreateComObject вынести, то же самое будет.


 
nickmas   (2006-04-26 04:43) [30]

В общем я так и не понял почему оно не работает, но зато нашел другой выход, который меня устраивает.

Вместо следующих строчек кода

...
Excel.Charts.Add;
...
Excel.ActiveChart.Location(xlLocationAsObject, "График");
Excel.Sheets[2].ChartObjects[1].Height:=165;
Excel.Sheets[2].ChartObjects[1].Width:=288;
Excel.Sheets[2].ChartObjects[1].Left:=48;
Excel.Sheets[2].ChartObjects[1].Top:=14;
...


я использовал следующее:

...
Excel.Sheets[2].ChartObjects.Add(48,14,288,165);
Excel.Sheets[2].ChartObjects[1].Activate;
...


И все теперь работает, как в 2003, так и в 2000 офисе.

В общем проблема решена.

Отдельное спасибо sniknik!!!



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.011 c
2-1145793355
inri13666
2006-04-23 15:55
2006.05.14
System menu


2-1145964823
ttt_111
2006-04-25 15:33
2006.05.14
Вопрос пл SQL запросу.


2-1145637868
Uriy
2006-04-21 20:44
2006.05.14
Вопрос по VCL


15-1145038495
tesseract
2006-04-14 22:14
2006.05.14
ReactOS News - ReactOS is dead, Welcome to ReactOS !:


15-1145527072
kilkennyCat
2006-04-20 13:57
2006.05.14
О морфемах, русском языке и школе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский