Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ График Chart

Автор: Mr.Dmitry 8.11.2006 2:34

Подскажите пожалуйсто как пользоваться графиком Chart.
И возможно ли связать StringGrid с этим графиком.
Если можно то напишите хотябы примерно как это зделать!

Автор: Reptile 8.11.2006 14:25

Цитата
возможно ли связать 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 8.11.2006 19:59

Вот как я пытался написать

Код
Chart1.Series[0].AddXY(k,i,' ',clGreen)


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

Вот какая ошибка появляеться
Код
[Error] Unit1.pas(43): Incompatible types: 'Double' and 'String'

Автор: Reptile 8.11.2006 22:59

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

Автор: Mr.Dmitry 9.11.2006 1:12

Цитата(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 9.11.2006 14:26

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

И не будет 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 9.11.2006 19:19

Цитата(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 9.11.2006 19:33

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

Наверное вылазиш за пределы StringGrid.
Покажы всю функцию.

Автор: мисс_граффити 9.11.2006 22:29

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

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

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

Автор: Reptile 9.11.2006 23:03

Вот:


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".

Автор: мисс_граффити 9.11.2006 23:22

Цитата(Reptile @ 9.11.2006 19:03) *

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

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

Кстати, при "вылазении" за пределы стринггрида была бы Access Violation Error, а не Convert Error.

Автор: Reptile 9.11.2006 23:37

мисс_граффити, спасибо за поправку give_rose.gif

Автор: Mr.Dmitry 12.11.2006 1:39

короч вот что в стрингриде:

Код
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 13.11.2006 15:09

Вообще не знаю как Ты хотел чтобы этот код работал??? 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 13.11.2006 16:04

Цитата
Если снова вылезет
вообще-то лучше сделать вот так:
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 13.11.2006 16:30

Все равно не рабоатет (((


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

Автор: volvo 13.11.2006 16:35

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

Автор: Mr.Dmitry 13.11.2006 23:46

Цитата(volvo @ 13.11.2006 12:35) *

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

Вот вся задача полностью!
[attachmentid=4252]

Автор: volvo 14.11.2006 1:58

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

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

Автор: Mr.Dmitry 14.11.2006 18:19

Цитата(volvo @ 13.11.2006 21:58) *

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

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

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

Вот зделал с 10 раза появилось! Сорри
Прикрепленный файл  1.zip ( 12.2 килобайт ) Кол-во скачиваний: 322


Автор: Reptile 14.11.2006 19:52

Сбрось мне проект на мыло.

Автор: Reptile 15.11.2006 16:52

И так скажу сразу Твой подход очень НЕ хороший.
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 15.11.2006 21:24

Спасибо чел! п насчет сохронения фалов я знаю! раньше все работало а щас глюк какойто! stoimost
я описал как integer ради эксперемента! все остальное учту! спасибо!