Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Excel [D7, XP]


Страницы:   1 2

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 я ничего подобного не подключал.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо