Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.052 c
2-1138464552
Гаврилов В.А.
2006-01-28 19:09
2006.02.19
Как получить значение arccos


15-1138314009
Petr V. Abramov
2006-01-27 01:20
2006.02.19
А читаете ли Вы...


15-1138815520
Serg1981
2006-02-01 20:38
2006.02.19
RichEdit


15-1138301130
Nikolay M.
2006-01-26 21:45
2006.02.19
Подработать никто не хочет?


2-1138628408
Scavenger
2006-01-30 16:40
2006.02.19
Возвратить системное время.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский