Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизExcel Найти похожие ветки
← →
nickmas (2006-01-29 22:59) [0]Помогите разобраться с графиком: как из Delphi изменить размер и положение графика в Excel-e?
На VBA это выглядит так:
ActiveSheet.Shapes("Диагр. 1").ScaleWidth 0.78, msoFalse, msoScaleFromTopLeft
ActiveSheet.Shapes("Диагр. 1").ScaleHeight 0.7, msoFalse, msoScaleFromTopLeft
ActiveSheet.Shapes("Диагр. 1").IncrementLeft 117#
ActiveSheet.Shapes("Диагр. 1").IncrementTop -69#
А вот как из Delphi реализовать подобное - не соображу.
← →
nickmas (2006-01-30 08:31) [1]Пробовал следующим образом:
Var
Excel: Variant;
...
Excel:=CreateOleObject("Excel.Application");
Excel.Sheets[1].Shapes[1].ScaleWidth(1,"msoFalse","msoScaleFromTopLeft");
...
Пишет "Член группы не наден", т.е. не может найти мой график. Почему? - тоже не пойму!
← →
EvS (2006-01-30 09:02) [2]А где Workbook? Открой книгу а уже потом обращайся к листам.
← →
nickmas (2006-01-30 10:59) [3]Так книгу я открываю, просто не указал эту строчку в предидущем посте:
Var
WBk: OleVariant;
Excel: Variant;
...
Excel:=CreateOleObject("Excel.Application");
WBk:= Excel.WorkBooks.Open("C:\Temp\output.xls");
... //здесь создается диаграмма - работает нормально
Excel.Sheets[1].Shapes[1].ScaleWidth(1,"msoFalse","msoScaleFromTopLeft");
...
← →
nickmas (2006-01-30 11:01) [4]А проблема осталась та же...
← →
Digitman © (2006-01-30 11:07) [5]http://articles.org.ru/cfaq/index.php?qid=1793&frommostrecent=yes
← →
nickmas (2006-01-30 12:05) [6]Спасибо Digitman!
Очень интересная и позновательная информация (особенно с сайта "Королевство Делфи"), но ответа на свой вопрос я пока еще не нашел.
← →
Digitman © (2006-01-30 12:40) [7]
> nickmas (30.01.06 12:05) [6]
> Очень интересная и позновательная информация
... и дана она тебе не для развлечения и не для общего, тэкскэть, развития, а для самостоятельного получения ответа на свой вопрос.
У тебя используется позднее связывание, вот и смотри там примеры обращения к объектам-коллекциям и их элементам для этого типа связывания.
Пример оттуда (обращение к рабочему листу как к 1-му элементу коллекции Worksheets некоей книги Workbook, которая сама является элементом коллекции ExcelApp.Workbooks):
var
Worksheet: OLEVariant;
...
Worksheet := Workbook.Worksheets.Item(1);
← →
nickmas (2006-01-31 12:12) [8]
> Digitman © (30.01.06 12:40) [7]
> var
> Worksheet: OLEVariant;
> ...
> Worksheet := Workbook.Worksheets.Item(1);
Та же ошибка - "Член группы не наден". А вот если заменить круглые скобки на квадратные
var
Worksheet: OLEVariant;
...
Worksheet := Workbook.Worksheets.Item[1];
и указанный выше рабочий лист стал находить.
Но подобные видоизменения не помогли моему случаю с диаграммой - "Член группы не наден"!
Предложенную статью почитал, изучил - синтаксис вроде оформлен у меня так как надо, также перепробовал другие способы - все тоже: "Член группы не наден"!
Вылаживаю полностью процедуру, может кто конкретно укажет на мою ошибку:
procedure TForm1.Button1Click(Sender: TObject);
var
WBk: OleVariant;
Excel: Variant;
FilePath: string;
Worksheet: OLEVariant;
begin
FilePath:="C:\Temp\output.xls";
if FileExists(FilePath) then
try
Excel:=CreateOleObject("Excel.Application");
WBk:= Excel.WorkBooks.Open(FilePath);
Excel.Sheets["Массив X-ов"].Cells.Clear;
//Создаем график
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([1,3,2]);
//Привязываем график
Excel.ActiveChart.Location(xlLocationAsObject,"Массив X-ов");
//Настраиваем график
Excel.ActiveChart.SeriesCollection[1].Border.ColorIndex:=3;
Excel.ActiveChart.SeriesCollection[1].Border.Weight:=xlThin;
Excel.ActiveChart.SeriesCollection[1].Border.LineStyle:=xlContinuous;
Excel.ActiveChart.SeriesCollection[1].MarkerBackgroundColorIndex:=3;
Excel.ActiveChart.SeriesCollection[1].MarkerForegroundColorIndex:=1;
Excel.ActiveChart.SeriesCollection[1].MarkerStyle:=xlCircle;
Excel.ActiveChart.SeriesCollection[1].Smooth:=True;
Excel.ActiveChart.SeriesCollection[1].MarkerSize:=3;
Excel.ActiveChart.SeriesCollection[1].Shadow:=False;
//Изменяем размеры графика - !ошибка здесь!
Worksheet:=WBk.Worksheets.Item[1];
Worksheet.Shapes["Chart 1"].ScaleWidth(1,"msoFalse","msoScaleFromTopLeft");
//или
//Excel.Sheets["Массив X-ов"].Shapes["Chart 1"].ScaleWidth(1,"msoFalse","msoScaleFromTopLeft");
WBk.Close(SaveChanges:= True);
Excel.Quit;
except
WBk.Close(SaveChanges:= False);
Excel.Quit;
MessageBox(Handle,"Не могу сохранить экспериментальные данные в Excel!","Ошибка",16);
end;
end;
← →
Digitman © (2006-01-31 12:24) [9]Ты, чудо, откуда взял определение ид-ра xlXYScatterSmooth ?
Подключил в USES некий Excel_XXX_TLB.pas ?
Если да , то накой тебе позднее связывание с его геморроем, скажи на милость ?
← →
nickmas (2006-01-31 12:33) [10]xlXYScatterSmooth я взял из конструктора макросов на Excel:
Charts(1).ChartType = xlXYScatterSmooth
А в uses я ничего подобного не подключал.
← →
Digitman © (2006-01-31 12:39) [11]
> nickmas (31.01.06 12:33) [10]
> xlXYScatterSmooth я взял из конструктора макросов на Excel:
Чем же тебе раннее связывание не угодило ?
← →
nickmas (2006-01-31 12:48) [12]Да по одно лишь причине: мне оно показалось проще для понимания, а вот с "ранним" я так и не разобрался (много там нюансов, которые не могу понять как они работают).
← →
Digitman © (2006-01-31 12:50) [13]показывай-рассказывай, какие такие "нюансы" .. в коде ..
← →
nickmas (2006-01-31 12:56) [14]Вот к примеру
{$J+}
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
{$J-}
Что значит $204? И зачем подключают и отключают $J?
← →
nickmas (2006-01-31 12:59) [15]Это я взял этот пример, который вобще не могу понять
procedure TForm1.XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
const AValue: string);
var
L: Word;
z: integer;
const
{$J+}
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
{$J-}
begin
L := Length(AValue);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := ARow;
CXlsLabel[3] := ACol;
CXlsLabel[5] := L;
XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
XlsStream.WriteBuffer(Pointer(AValue)^, L);
end;
function TForm1.SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean;
const
{$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-}
CXlsEof: array[0..1] of Word = ($0A, 00);
var
FStream: TFileStream;
I, J: Integer;
begin
Result := False;
FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
try
CXlsBof[4] := 0;
FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
for i := 1 to AGrid.ColCount - 1 do
for j := 1 to AGrid.RowCount - 1 do
XlsWriteCellLabel(FStream, I-1, J-1, AGrid.cells[i, j]);
FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
Result := True;
finally
FStream.Free;
end;
end;
← →
nickmas (2006-01-31 13:04) [16]Работают в данном примере черезз потоки, буфер - от этого, честно признаться, я далек.
Вот поэтому я с поздним связыванием и начал работать.
Может проще подсказать с поздним связыванием - ведь там надо пару строчек верного кода. У меня из-за этой проблемы вся дипломная стала.
← →
Digitman © (2006-01-31 13:09) [17]
> Что значит $204?
Это число 260., представленное в hex-формате.
> зачем подключают и отключают $J?
Да мало ли зачем ..
В ЭТОМ ли нюанс ?
Описание директив Делфи-компайлера есть в стандартной справке к нему ..
> не могу понять
Вот и рассказывай, ЧТО конкретно не можешь .. понять ..
← →
nickmas (2006-01-31 14:42) [18]Это хорошо, что есть кому помочь разобраться. Но как реализовать при позднем связывании? Этот вопрос уже становится принципиальным.
А с помощью раннего связывания буду пытаться выполнять свою задачу и что не понятно - буду спаршивать, т.е. уже на конкретно моем примере.
← →
nickmas (2006-01-31 15:28) [19]А вот уже появились вопросы:
1. Где взять библиотеку типов Excel и как ее импортировать?
← →
EvS (2006-01-31 18:42) [20]nickmas (31.01.06 12:12)[8]
>Worksheet.Shapes["Chart 1"].ScaleWidth(1,"msoFalse","msoScaleFromTopLeft");
"msoFalse","msoScaleFromTopLeft"- это что?
← →
nickmas (2006-01-31 21:26) [21]Это мне так выдал конструктор макросов в Excel-e. Вот так выглядит на VBA:
ActiveSheet.Shapes("Диагр. 1").ScaleWidth 1, msoFalse, msoScaleFromTopLeft
Это на вопрос: "откуда они взялись".
А вот для чего они - я думаю так:
1 - это сдвиг на единицу
msoFalse - не знаю
msoScaleFromTopLeft - а это, наверное, в какое направление сдвигать или откуда производить отсчет сдвига
В общем это необходимые параметры - это я так понял.
← →
EvS (2006-01-31 22:04) [22]Это константы определенные в Excele, а в том виде как у тебя передаются просто строки, которые для Excelя ничего не значат. Найди в справке значения констант и эти значения передавай.
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/office97/html/output/F1/D3/S5A780.asp
← →
Digitman © (2006-02-01 09:12) [23]
> nickmas (31.01.06 21:26) [21]
В редакторе ExcelVBA жмешь CTRL-G, появляется окно интерактивной отладки.
Вводишь туда ?msoScaleFromTopLeft, жмешь ENTER - получаешь численное значение указанного тобой идентификатора константы msoScaleFromTopLeft (оно равно 0)
У себя в программе пишешь
const msoScaleFromTopLeft = 0;
Отныне Делфи-компилятор будет подставлять 0 везде где ты упомянешь ид-р msoScaleFromTopLeft.
> Где взять библиотеку типов Excel и как ее импортировать?
Она уже импортирована и поставляется вместе с Делфи для ранних версий Офиса и ХР-офиса.
Но ничто не мешает выполнить импорт явно.
Библ-ка типов размещается в файле Excel.olb, его и следует указать в меню Import Type Library ... В рез-те импорта ты получишь файл Excel_TLB.pas, который можно пользовать для работы с Excel и при раннем и при позднем связывании.
← →
nickmas (2006-02-01 14:26) [24]Вашу поправку с передачей параметров учту, но эта ошибка, как мне кажется, даст о себе знать чуть позже. Т.е. не из-за нее я не могу найти объект-диаграмму. Тут видимо еще есть где-то недочет.
Хотя, сейчас попробую... может что и получится.
← →
nickmas (2006-02-01 19:27) [25]Да, так и есть, ошибка "Член группы не наден" не исчезла.
Может все-таки кто знает в чем тут дело?
← →
umbra © (2006-02-01 20:11) [26]2 nickmas (01.02.06 19:27) [25]
дело, похоже, в том, что к диаграмме, помещенной на лист надо обращаиться не как кWorksheet.Shapes["Chart 1"]
, а как кWorksheet.CHartObjects["Chart 1"]
.
2 EvS (31.01.06 22:04) [22]
все эти константы уже описаны в модуле Office97.pas (Office2000.pas и т.д.), который надо просто подключить к проекту
← →
EvS (2006-02-01 20:14) [27]> //Привязываем график
> Excel.ActiveChart.Location(xlLocationAsObject,"Массив X-ов");
> //Изменяем размеры графика - !ошибка здесь!
> Worksheet:=WBk.Worksheets.Item[1];
А откуда известно что это один и тот же лист.
Если разместил график на листе "Массив X-ов", так и обращайся к листу по имени.
WorkSheet:=Wbk.WorkSheets["Массив X-ов"];
← →
nickmas (2006-02-02 02:24) [28]Спасибо всем! С размером я разобрался. Вот эти 2 заветные строчки:
Excel.Sheets[1].ChartObjects[1].Height:=140;
Excel.Sheets[1].ChartObjects[1].Width:=260;
Теперь стоит еще найти, как позицию менять. Может, кто знает - скажет?
← →
КаПиБаРа © (2006-02-02 06:44) [29]nickmas (02.02.06 2:24) [28]
Теперь стоит еще найти, как позицию менять.
Очевидно свойствами Left и Top
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.048 c