Помощь - Поиск - Пользователи - Календарь
Полная версия: График Chart
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Mr.Dmitry
Подскажите пожалуйсто как пользоваться графиком Chart.
И возможно ли связать StringGrid с этим графиком.
Если можно то напишите хотябы примерно как это зделать!
Reptile
Цитата
возможно ли связать StringGrid с этим графиком

Береш в цикле значения из StringGrid и вставляеш в

function AddXY(Const AXValue, AYValue: Double; Const AXLabel: String; AColor: TColor) : Longint;


Вот пример заполнения графика:
Создай Chart, добавь серию и

for i := 0 to 10 do
begin
Chart1.Series[0].AddXY(i,i*2,'Text',clRed);
end;


Цитата
Declaration
function AddXY(Const AXValue, AYValue: Double; Const AXLabel: String; AColor: TColor) : Longint;
Description
This function inserts a new point in the Series. The new point has X and Y values. The AXLabel parameter is optional (can be empty ''). The AColor parameter is optional (can be clTeeColor). The function returns the new point position in the Values list.
Mr.Dmitry
Вот как я пытался написать
Код
Chart1.Series[0].AddXY(k,i,' ',clGreen)


где i это сумма элементов 1 столбца поля StringGrid

Вот какая ошибка появляеться
Код
[Error] Unit1.pas(43): Incompatible types: 'Double' and 'String'
Reptile
Ты не правильно настроил Chart, а точнее выбрал не подходящий график.
Добавь серию Line, убери 3D.
Если не получится покажи код.
Mr.Dmitry
Цитата(Reptile @ 8.11.2006 18:59) *

Ты не правильно настроил Chart, а точнее выбрал не подходящий график.
Добавь серию Line, убери 3D.
Если не получится покажи код.

Даже если я пытаюсь выводить не сумму в линейном графике без 3д все равно не пашет!! (
пофигу на сумму можно хотябы графически вивыести хотябы один эелемент

вот код:

Код
for k:=1 to 10 do
Chart1.Series[0].AddXY(k,Form1.StringGrid1.Cells[8,1],' ',clREd);


Так тош не катит ((

Вобщем мне нужно зделать вот что!
Отобразить на этом графике как изменялись ячейки 7 и 8 столбцов поля стринг грид (тоесть увеличивылись или нет) вот!
Reptile
Цитата
Так тош не катит ((

И не будет cool.gif
Цитата
function AddXY(Const AXValue, AYValue: Double; Const AXLabel: String; AColor: TColor) : Longint;

В
Form1.StringGrid1.Cells[8,1]

строка, а нужно Double.
Нужно

for k:=1 to 10 do
Chart1.Series[0].AddXY(k,StrToFloat(Form1.StringGrid1.Cells[8,1]),' ',clREd);


И убедись что не вылазиш за пределы StringGrid.
P.S. Проверил, у меня работает.
Mr.Dmitry
Цитата(Reptile @ 9.11.2006 10:26) *

И не будет cool.gif

В
Form1.StringGrid1.Cells[8,1]

строка, а нужно Double.
Нужно

for k:=1 to 10 do
Chart1.Series[0].AddXY(k,StrToFloat(Form1.StringGrid1.Cells[8,1]),' ',clREd);


И убедись что не вылазиш за пределы StringGrid.
P.S. Проверил, у меня работает.


А у меня не работает пишет:

Project Project1.exe raised exeption Class EconvertError With Message "' is not a valid Floating value Process stoped
.Use Step or run to continue
Reptile
Цитата
Project Project1.exe raised exeption Class EconvertError With Message "' is not a valid Floating value Process stoped
.Use Step or run to continue

Наверное вылазиш за пределы StringGrid.
Покажы всю функцию.
мисс_граффити
Цитата
Project Project1.exe raised exeption Class EconvertError With Message "' is not a valid Floating value Process stoped
.Use Step or run to continue

Проект прерван с сообщением "' не является действительным числом.

Начинаем гадать на кофейной гуще (за неимением использую пакетик чая). Что у тебя в стринггриде записано?
Reptile
Вот:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, StdCtrls, ExtCtrls, TeeProcs, Chart, Grids;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Chart1: TChart;
Button1: TButton;
Series1: TLineSeries;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
k : Integer;
begin
for k := 1 to 7 do
Chart1.Series[0].AddXY(k,StrToFloat(Form1.StringGrid1.Cells[k,1]),' ',clREd);
end;

end.

Вот скрин
Нажмите для просмотра прикрепленного файла

P.S. Дробные числа должны быть через запятую "4,231".
мисс_граффити
Цитата(Reptile @ 9.11.2006 19:03) *

P.S. Дробные числа должны быть через запятую "4,231".

Дробные числа должны быть через указанный в Панель инструментов->Языки и региональные стандарты разделитель. У тебя там ",", а у кого-то точка.

Кстати, при "вылазении" за пределы стринггрида была бы Access Violation Error, а не Convert Error.
Reptile
мисс_граффити, спасибо за поправку give_rose.gif
Mr.Dmitry
короч вот что в стрингриде:

Код
i:=i+1;
Kol:=kol+1;
Naimenovanie:=ComboBox1.Text;
Data:=DateTimePicker1.date;
Data_oplati:=DateTimePicker2.date;
Data_Prihoda:=DateTimePicker3.date;
Nomer:=LabeledEdit1.text;
Inn_posyavshika:=LabeledEdit2.Text;
stoimost:=StrToFloat(LabeledEdit3.text);
Kol_Vo_Pokupok:=StrToInt(LabeledEdit4.text);
{-----------------------------------------------------------}
form1.stringgrid1.cells[0,i]:=IntToStr(Kol);
form1.stringgrid1.cells[1,i]:=DateToStr(data);
form1.stringgrid1.cells[2,i]:=DateToStr(data_Oplati);
form1.stringgrid1.cells[3,i]:=DateToStr(data_Prihoda);
form1.stringgrid1.cells[4,i]:=Nomer;
form1.stringgrid1.cells[5,i]:=Naimenovanie;
form1.stringgrid1.cells[6,i]:=Inn_posyavshika;
form1.stringgrid1.cells[7,I]:=FloatToStr(stoimost);
form1.stringgrid1.cells[8,I]:=IntToStr(Kol_Vo_pokupok);
form1.StringGrid1.RowCount:=Kol+1;
{----------------------------------------------------------}
form2.Visible:=false;
LabeledEdit1.Clear;
LabeledEdit2.Clear;
LabeledEdit3.Clear;
LabeledEdit4.Clear
end;


График я пытался построить по примеру Reptile Вот он:
Код
var
i:Integer;
bez : Integer;
begin
    Chart1.Series[0].Clear;
   for i := 1 to StringGrid1.RowCount-1 do
   begin
      bez := 0;
          bez := bez + StrToInt(StringGrid1.Cells[7,i]); // это я так понимаю сумма элементов нужного столбца
     Chart1.Series[0].AddXY(i,bez,'',clRed);
   end;
end;


столбец по которому я строю график имеет тип Real.
Reptile
Вообще не знаю как Ты хотел чтобы этот код работал??? blink.gif

for i := 1 to StringGrid1.RowCount-1 do
begin
bez := 0;
bez := bez + StrToInt(StringGrid1.Cells[7,i]); // это я так понимаю сумма элементов нужного столбца
Chart1.Series[0].AddXY(i,bez,'',clRed);
end;


1.Переменную суммы нужно обнулять не в теле цыкла, иначе в bez Ты просто получаеш текущий элемент.
2.Если тип Real пиши
bez := bez + StrToFloat(StringGrid1.Cells[7,i]);

Если нужно вывести сумму элементов только одного столбца то:

Chart1.Series[0].Clear;
bez := 0;
for j := 1 to StringGrid1.RowCount-1 do
begin
bez := bez + StrToFloat(StringGrid1.Cells[7,j]);//подсчитываем сумму элементов
end;
Chart1.Series[0].AddXY(1,bez,' ',clRed);//Выводим один столбец с суммой


Если снова вылезет
Цитата
Project Project1.exe raised exeption Class EconvertError With Message "' is not a valid Floating value Process stoped
.Use Step or run to continue

то
Цитата

Дробные числа должны быть через указанный в Панель инструментов->Языки и региональные стандарты разделитель.


volvo
Цитата
Если снова вылезет
вообще-то лучше сделать вот так:
for j := 1 to StringGrid1.RowCount-1 do
begin
bez := bez + StrToFloat(
StringReplace(
StringReplace(StringGrid1.Cells[7, j], '.', DecimalSeparator, [rfReplaceAll]),
',', DecimalSeparator, [rfReplaceAll]
) // подсчитываем сумму элементов

); // Независимо от того, точка или запятая стоит в StringGrid
end;

, чем заставлять пользователя вводить данные заново...
Mr.Dmitry
Все равно не рабоатет (((

Project Project1.exe raised exeption Class EconvertError With Message "' is not a valid Floating value Process stoped
.Use Step or run to continue
volvo
Скриншот, в котором видно StringGrid с данными, выдающими этот Exception приведи... Что ты там в него понабросал, интересно?
Mr.Dmitry
Цитата(volvo @ 13.11.2006 12:35) *

Скриншот, в котором видно StringGrid с данными, выдающими этот Exception приведи... Что ты там в него понабросал, интересно?

Вот вся задача полностью!
Нажмите для просмотра прикрепленного файла
volvo
Да не интересует меня полностью проект! Я просил привести снимок экрана с теми ДАННЫМИ, которые ты вводишь, и у тебя возникает исключение. Неужели не понятно, что если я введу правильные данные, зная, какой DecimalSeparator у меня установлен, то ни о каком исключении не может быть и речи?

Ну, как хочешь... Я предложил тебе помощь - ты отказался, дело твоё...
Mr.Dmitry
Цитата(volvo @ 13.11.2006 21:58) *

Да не интересует меня полностью проект! Я просил привести снимок экрана с теми ДАННЫМИ, которые ты вводишь, и у тебя возникает исключение. Неужели не понятно, что если я введу правильные данные, зная, какой DecimalSeparator у меня установлен, то ни о каком исключении не может быть и речи?

Ну, как хочешь... Я предложил тебе помощь - ты отказался, дело твоё...

Просто я не смог вставить скрин! при попытки добавить не че не происходло и щас не происходит! вот я и выложил весь проект!

Вот зделал с 10 раза появилось! Сорри
Нажмите для просмотра прикрепленного файла
Reptile
Сбрось мне проект на мыло.
Reptile
И так скажу сразу Твой подход очень НЕ хороший.
1. Ты вызываеш
Form6.Show;
Хотя отрисовку графика навешал на Create
И вообще что за???
procedure Create
Удали ее!
Сделай так на событие TForm6.FormShow
var
Bez:Real;
j:integer;
begin
Chart1.Visible := true;
Chart1.Series[0].Clear;
bez := 0;
for j := 1 to Form1.StringGrid1.RowCount-1 do
begin
if not(Length(Form1.StringGrid1.Cells[7,j]) = 0) then //Если ячейка не пуста
bez := bez + StrToFloat(Form1.StringGrid1.Cells[7,j]);//подсчитываем сумму элементов
end;
Chart1.Series[0].AddXY(1,bez,' ',clRed);//Выводим один столбец с суммой


2.1. В форме 2 переменная
stoimost:integer
Как Ты хочеш занести в нее дорби???
Смени на real.
2.2 В тойже форме советую на LabeledEdit3 навешать событие
procedure TForm2.LabeledEdit3KeyPress(Sender: TObject; var Key: Char);
var
Not_DESIMAL : string;
begin
if DecimalSeparator = ',' then
Not_DESIMAL := '.'
else
Not_DESIMAL := ',';

if Key = Not_DESIMAL then
Key := DecimalSeparator;
if ((Key in ['0' .. '9']))OR(Key = DecimalSeparator) then begin
if (Key = DecimalSeparator) AND (Pos(DecimalSeparator,(Sender AS TLabeledEdit).Text) > 0) then begin
Key := Chr(0);
end;
end else if (Key=Chr(VK_RETURN))OR (Key=Chr(VK_BACK)) then begin

end
else Key := Chr(0);
end;

Тогда пользователь не сможет вводить в это поле ничего кроме цыфр, а разделитель будет ставится автоматически такой, кокой стоит в системе пользователя. И такой же код сделай на остальные TLabeledEdit в которых не должно быть букв, напр. кол. покупок
begin
if not(Key in ['0' .. '9']) then begin
Key := Chr(0);
end;
end else if (Key=Chr(VK_RETURN))OR (Key=Chr(VK_BACK)) then begin
end
else Key := Chr(0);
end;

3. Измени вид графика из Line на Bar и убери 3D.
P.S. Само решение проблемы мне не понравилось no1.gif , при первом запуске уже номер записи = 5, после ввода 1-ой записи появилась куча строк зачем??? wacko.gif а номер записи уже 6??? Позволяет редактировать если выбрать пустую строку и тд и тп. Но это не мое дело. Чем смог, тем помог. Работы у Тебя еще много yes2.gif , так что дерзай smile.gif
P.S.S. Сперва реши проблему с вводом чисел, а потом решай проблему сохранения в файл.
Mr.Dmitry
Спасибо чел! п насчет сохронения фалов я знаю! раньше все работало а щас глюк какойто! stoimost
я описал как integer ради эксперемента! все остальное учту! спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.