powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / MS Chart Control (не через dbf ;-) )
11 сообщений из 11, страница 1 из 1
MS Chart Control (не через dbf ;-) )
    #33497079
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не самая удобная штука, но тем не менее...
В документации и многочисленных samples по VB описано как в качестве источника данных использовать массив (точнее коллекцию) заданного вида:

&&пустой элемент
ochartdata(1,1)=""
&&название столбцов таблицы данных
ochartdata(1,2)="C1"
aChartData(1,3)="C2"
aChartData(1,4)="C3"
aChartData(1,5)="C4"
&&название ряда данных и сами данные
ochartdata(2,1)="R1"
aChartData(2,2)=1.11
aChartData(2,3)=1.4
aChartData(2,4)=1.12
achartData(2,5)=2.5

aChartData(2,1)="R2"
aChartData(2,2)=2.5
aChartData(2,3)=1.1
aChartData(2,4)=1.4
aChartData(2,5)=1.7
...........................

Для передачи данных в Chart имеется свойство объекта Chart:
Property ChartData Type Variant
Returns/sets the data to chart as a 2D array

Однако попытки присвоения:

oChart=thisform.Olecontrol1 &&вставленный в форму Chart
oChart.ChartData=aChartData &&объявленный ранее public массив

приводят к ошибке "Bad function argument".

Так где же проблема в аргументах функции ?!
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33498680
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да сколько сочувствующих ;-) , но свою стенку разбивай своей головой...

Как ни странно, но в других контролах иногда были проблемы с передачей параметров по ссылке. Но в данном случае изменение типа передачи параметров не прошло ;-(
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33498687
S866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри Samples идущие с VFP - там есть использование MS Chart - и код как присваивать массив данных
вот примерный код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
CRLF=CHR( 13 )+CHR( 10 )
TAB=CHR( 9 )
DOGS_LOC="Dogs"
CATS_LOC="Изменение структуры"
bartype=	- 4099 
coltype=	- 4100 
pietype=	- 4102 
C_GRAPHTITLE_LOC="Анализ наличия, состава и структуры активов предприятия"

cGdata=""+tab+Cats_loc+tab+crlf

sele t1
go top
do while not eof()
cGdata=cGdata+alltrim(name)+tab+str(is)+crlf
skip
enddo

tipgraph=coltype

do form graph1

init graph1


*	THISFORM.OleBoundControl1.autoformat(bartype, 1 )
*	THISFORM.OleBoundControl1.autoformat(coltype, 1 )
*	THISFORM.OleBoundControl1.autoformat(pietype, 7 )
*   THISFORM.OleBoundControl1.HasTitle = !THISFORM.OleBoundControl1.HasTitle
*IF THISFORM.OleBoundControl1.HasTitle = .T.
*	THISFORM.OleBoundControl1.ChartTitle.Caption = C_GRAPHTITLE_LOC
*ENDIF
*THISFORM.OleBoundControl1.HasLegend = !THISFORM.OleBoundControl1.HasLegend


SET SAFETY OFF
*create table foo (gen1 g)
sele foo
zap
SET SAFETY ON
append blank
*cGData = ""+TAB+CATS_LOC +TAB+DOGS_LOC +CRLF+;
*		 "1994"+TAB+"11"+TAB+"22"+CRLF+;
*		 "1995"+TAB+"33"+TAB+"44"+CRLF+;
*		 "1996"+TAB+"55"+TAB+"55"+CRLF

THIS.LockScreen = .T.
append general gen1 class "msgraph.chart" DATA m.cGData
THIS.OleBoundControl1.ControlSource = "Gen1"
THIS.OleBoundControl1.HasLegend = .T.
THIS.OleBoundControl1.Hastitle = .T.
THISFORM.OleBoundControl1.Axes( 1 ).TickLabels.font.size= 9 
THISFORM.OleBoundControl1.Axes( 2 ).TickLabels.font.size= 9 
THISFORM.OleBoundControl1.ChartTitle.Caption = C_GRAPHTITLE_LOC
THISFORM.OleBoundControl1.ChartTitle.font.size= 10 
THISFORM.OleBoundControl1.LEGEND.font.size= 8 
THIS.OleBoundControl1.autoformat(tipgraph, 1 )
THIS.LockScreen = .F.
переделан из примера
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33498767
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уважаемый, без обид, но внимательно прочтите тему и первый пост.
манипуляции вида:
*cGData = ""+TAB+CATS_LOC +TAB+DOGS_LOC +CRLF+;
* "1994"+TAB+"11"+TAB+"22"+CRLF+;
* "1995"+TAB+"33"+TAB+"44"+CRLF+;
* "1996"+TAB+"55"+TAB+"55"+CRLF

есть ни что иное, как заполнение таблицы-коллекции определенного вида:
A B C D
R1 R2 R3 R4
Ряд1 1 3 3 5
Ряд2 2 3 1 9
Ряд3 3 8 4 2
Ряд4 4 4 9 3

вопрос в том, почему передача приведенного в первом посте массива не проходит ...
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33498791
S866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы знаете я Help по Visual Basic не читал - может там и через двумерный массив (кстати организация в нем двумерного массива может и отличаться от организации двумерного массива в VFP) - но из примера фокса видно что передаются данные в виде строки - и все данные в ней приведены к строковому виду . может быть вам привести к строковому виду
т.е.
Код: plaintext
1.
2.
ochartdata( 2 , 1 )="R1"
aChartData( 2 , 2 )=str( 1 . 11 , 5 , 2 )
aChartData( 2 , 3 )=str( 1 . 4 , 5 , 2 ) и т.д.
а может передавать в виде строки - она у меня например формируется так.
Код: plaintext
1.
2.
3.
do while not eof()
cGdata=cGdata+alltrim(name)+tab+str(is)+crlf
skip
enddo
Меня например формирование строки данных устраивает.
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33500441
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to S866:
в общем позиция "у вас" понятна. на поставленный вопрос она не отвечает.

собссно, еще раз о проблеме:
передача коллекции в ActiveX control из программы на фоксе. может кто-то сталкивался. очень интересно мнение по сути вопроса.

p.s.: можно конечно поюзать и другие chart-компоненты, но сам подход с передачей параметров интересует.
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33501115
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Guest12345!

> собссно, еще раз о проблеме:
> передача коллекции в ActiveX control из программы на фоксе. Может кто-то
> сталкивался. очень интересно мнение по сути вопроса.

Никаких проблем. В Excel например я передаю массивы - как одномерные (в
соответствующие методы, где нужны массивы),так и двумерные - в свои макросы,
и для присвоения его СВОЙСТВУ Range(...).Value
Причём НАПРЯМУЮ присвоить массив свойству в фоксе нельзя. А вот через
процедуру (или метод) - посредник - начиная с VFP7 (или 8 точно не помню)
которая "возвращает масив" (т.е. у который внутри стоит RETURN @aData) всё
работает.

> p.s.: можно конечно поюзать и другие chart-компоненты

IMHO нужно а не только "можно" - на редкость "нехороший" и главное
уже давно устаревший компонент :( Я диаграммы все вывожу в Excel (как для
размещения на формах, так и просто как выходные отчёты).

> но сам подход с передачей параметров интересует.

Похвальный интерес - если бы ещё был подкреплён усилиями по поиску
информации, например по теме "массив+свойство"... Наверняка сам бы уже давно
нашёл подробное описание метода с примерами кода...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33501357
S866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа - я понял что чего то недопонимаю в связи с этим вопросы:

1. Разве компонент ActiveX - MSchart - не является диаграммой самого Excel и не идет с ним в комплекте?
2. Какие компоненты кроме:
a)MSchart,
b)построения диаграммы в Excel (путем передачи туда данных через команды самого Excel),
c)написания своего класса - построителя диаграмм

существуют в природе ?
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33501631
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насчет "похвального интереса". так кроме вас, уважаемый, и хелпа ничего не нашел толкового ;-)

пробовал варианты через возврат ссылки из внешней функции и метода - не получилось (сам массив передается - проверял): снова пишет Bad function argument. Поигрался также с COMARRAY, хотя здесь ситуация несколько другая: в
COMARRAY предполагается передача массива как параметр метода, а в Chart control в качестве массива данных используется непосредственно объект-массив ChartData (методов для работы с ним как с массивом нет). В общем, наверное проще будет использовать альтернативу MS Chart...

to S866:
>1. Разве компонент ActiveX - MSchart - не является диаграммой самого Excel и не >идет с ним в комплекте?
Microsoft Chart Control 6.0 (SP4) не относится к MS Office, идет в поставке либо с фоксом, либо с MS бейсиком (либо можно просто отдельно скачать у MS).
С оффисом поставляется MS Graph.
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33501803
S866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял - а я то MSGraph и MSchart - считал одним и тем же - заблуждался.
...
Рейтинг: 0 / 0
MS Chart Control (не через dbf ;-) )
    #33603501
slogic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MSChart использует т.н. безопасные массивы.

В FoxPro должна быть функция, которая преобразует нативный массив в VB Safe Array. В противном случае, такой массив можно получить, читая соотв. свойство ActiveX объекта (предварительно заполнив его простыми методами - через соотв. свойства). :(

Обрывки сведения получены по справке из JScript, объект VBArray, с пом. которого выполняется обратное дейтсвие - преобразование безопасного массива VBScript в массив JScript.

Windows Script TechnologiesVBArrays are read-only, and cannot be created directly. The safeArray argument must have obtained a VBArray value before being passed to the VBArray constructor. This can only be done by retrieving the value from an existing ActiveX or other object .

VBArrays can have multiple dimensions. The indices of each dimension can be different. The dimensions method retrieves the number of dimensions in the array; the lbound and ubound methods retrieve the range of indices used by each dimension.


Так что в целом ничего хорошего я не вижу.

Есть идея: использовать Script Component File (.wsc) - COM объект на базе VBScript/JScript. В нем и будет реализована нужная трансляция пользовательского представления массива в safe array. Почитать можно в MSDN либо поставляется вместе с WScript 5.6.

PS. Создавать WSC лично не пробовал.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / MS Chart Control (не через dbf ;-) )
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]