![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Excel [D7, XP]
nickmas © (2006-01-29 22:59:00)Помогите разобраться с графиком: как из 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 реализовать подобное - не соображу.
КаПиБаРа (2006-02-02 06:44:00) [1]nickmas (02.02.06 2:24) [28]
Теперь стоит еще найти, как позицию менять.
Очевидно свойствами Left и Top
nickmas (2006-02-02 02:24:00) [2]Спасибо всем! С размером я разобрался. Вот эти 2 заветные строчки:
Excel.Sheets[1].ChartObjects[1].Height:=140;
Excel.Sheets[1].ChartObjects[1].Width:=260;
Теперь стоит еще найти, как позицию менять. Может, кто знает - скажет?
EvS (2006-02-01 20:14:00) [3]> //Привязываем график
> Excel.ActiveChart.Location(xlLocationAsObject,'Массив X-ов');
> //Изменяем размеры графика - !ошибка здесь!
> Worksheet:=WBk.Worksheets.Item[1];
А откуда известно что это один и тот же лист.
Если разместил график на листе 'Массив X-ов', так и обращайся к листу по имени.
WorkSheet:=Wbk.WorkSheets['Массив X-ов'];
umbra (2006-02-01 20:11:00) [4]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 и т.д.), который надо просто подключить к проекту
nickmas (2006-02-01 19:27:00) [5]Да, так и есть, ошибка "Член группы не наден" не исчезла.
Может все-таки кто знает в чем тут дело?
nickmas (2006-02-01 14:26:00) [6]Вашу поправку с передачей параметров учту, но эта ошибка, как мне кажется, даст о себе знать чуть позже. Т.е. не из-за нее я не могу найти объект-диаграмму. Тут видимо еще есть где-то недочет.
Хотя, сейчас попробую... может что и получится.
Digitman (2006-02-01 09:12:00) [7]
> 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 и при раннем и при позднем связывании.
EvS (2006-01-31 22:04:00) [8]Это константы определенные в Excele, а в том виде как у тебя передаются просто строки, которые для Excelя ничего не значат. Найди в справке значения констант и эти значения передавай.
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/office97/html/output/F1/D3/S5A780.asp
nickmas (2006-01-31 21:26:00) [9]Это мне так выдал конструктор макросов в Excel-e. Вот так выглядит на VBA:
ActiveSheet.Shapes("Диагр. 1").ScaleWidth 1, msoFalse, msoScaleFromTopLeft
Это на вопрос: "откуда они взялись".
А вот для чего они - я думаю так:
1 - это сдвиг на единицу
msoFalse - не знаю
msoScaleFromTopLeft - а это, наверное, в какое направление сдвигать или откуда производить отсчет сдвига
В общем это необходимые параметры - это я так понял.
EvS (2006-01-31 18:42:00) [10]nickmas (31.01.06 12:12)[8]
>Worksheet.Shapes['Chart 1'].ScaleWidth(1,'msoFalse','msoScaleFromTopLeft');
'msoFalse','msoScaleFromTopLeft'- это что?
nickmas (2006-01-31 15:28:00) [11]А вот уже появились вопросы:
1. Где взять библиотеку типов Excel и как ее импортировать?
nickmas (2006-01-31 14:42:00) [12]Это хорошо, что есть кому помочь разобраться. Но как реализовать при позднем связывании? Этот вопрос уже становится принципиальным.
А с помощью раннего связывания буду пытаться выполнять свою задачу и что не понятно - буду спаршивать, т.е. уже на конкретно моем примере.
Digitman (2006-01-31 13:09:00) [13]
> Что значит $204?
Это число 260., представленное в hex-формате.
> зачем подключают и отключают $J?
Да мало ли зачем ..
В ЭТОМ ли нюанс ?
Описание директив Делфи-компайлера есть в стандартной справке к нему ..
> не могу понять
Вот и рассказывай, ЧТО конкретно не можешь .. понять ..
nickmas (2006-01-31 13:04:00) [14]Работают в данном примере черезз потоки, буфер - от этого, честно признаться, я далек.
Вот поэтому я с поздним связыванием и начал работать.
Может проще подсказать с поздним связыванием - ведь там надо пару строчек верного кода. У меня из-за этой проблемы вся дипломная стала.
nickmas (2006-01-31 12:59:00) [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 12:56:00) [16]Вот к примеру
{$J+}
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
{$J-}
Что значит $204? И зачем подключают и отключают $J?
Digitman (2006-01-31 12:50:00) [17]показывай-рассказывай, какие такие "нюансы" .. в коде ..
nickmas (2006-01-31 12:48:00) [18]Да по одно лишь причине: мне оно показалось проще для понимания, а вот с "ранним" я так и не разобрался (много там нюансов, которые не могу понять как они работают).
Digitman (2006-01-31 12:39:00) [19]
> nickmas (31.01.06 12:33) [10]
> xlXYScatterSmooth я взял из конструктора макросов на Excel:
Чем же тебе раннее связывание не угодило ?
nickmas (2006-01-31 12:33:00) [20]xlXYScatterSmooth я взял из конструктора макросов на Excel:
Charts(1).ChartType = xlXYScatterSmooth
А в uses я ничего подобного не подключал.