Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.045 c
6-1131726960
jimmy
2005-11-11 19:36
2006.02.19
Игра под модем


9-1125474249
kyn66
2005-08-31 11:44
2006.02.19
Алгоритм проверки номеров в суперлото.


2-1138555979
з. танька
2006-01-29 20:32
2006.02.19
Учет траффика


15-1138263518
son_g
2006-01-26 11:18
2006.02.19
Как в делфе написать резидента


2-1138677721
Близнец
2006-01-31 06:22
2006.02.19
Большая степень числа