Форум: "Начинающим";
Текущий архив: 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