Консультация № 109298
13.11.2007, 22:37
0.00 руб.
0 2 2
Ждравствуйте уважаемые эксперты!!!
У меня вопрос?
Как сделать, чтобы компонент(Tchart) показывал график путем ввода данных в строку(Tedit)?
Не могу хочу написать прогу для расчета переодичности технического обслуживания с выводом графика переодичности ТО за год, а в интернете мало что есть. Ах да строк(Tedit) должно быть 12 шт, т.к. месяцев в году 12!!!!
За ранеее благодарю!!!!!

Обсуждение

Неизвестный
14.11.2007, 00:18
общий
это ответ
Здравствуйте, Семенов Владимир Леонидович!

Вам достаточно на форму разместить Ваши 12 TEdit-ы, непосредственно сам TСhart и кнопку (TButton).
Далее создаем новую серию - контекстное меню на <b>TСhart</b>, пункт <b>Edit Chart...</b>, нажимаете кнопку <b>Add</b> и выбираете тип серии.

После этого достаточно в обработчик по нажатии конопки прописать такой код:
<code><b>procedure</b> TForm1.Button1Click(Sender: TObject);
<b>var</b> k: Integer;
vv:real;
<b>begin</b>
<b>with</b> Chart1 <b>do</b>
<b>begin</b>
LeftAxis.Automatic:=true;
BottomAxis.Automatic:=True;
<b>end</b>;

Chart1.Series[<font color=purple>0</font>].Marks.Visible:=true;
<b>for</b> k := <font color=purple>1</font> <b>to</b> <font color=purple>5</font> <b>do</b>
<b>begin</b>
vv:=StrToFloat(TEdit(FindComponent(format(<font color=blue>‘Edit%d‘</font>,[k]))).Text);
Chart1.SeriesList[<font color=purple>0</font>].AddXY(k,vv,<font color=blue>‘‘</font>,clRed);
<b>end</b>;
<b>end</b>;</code>

Замечание в строке
vv:=StrToFloat(TEdit(FindComponent(format(<font color=blue>‘Edit%d‘</font>,[k]))).Text);
желательно делать еще и проверку на то, что объект существует, а также на правильность конвертирования из строки в вещественное число при использовании StrToFloat(). Для этого рекомендую использовать защищенный блок:
<code><b>try</b>
...
<b>except</b>
...
<b>end;</b></code>

Good Luck!!!
Неизвестный
14.11.2007, 12:20
общий
это ответ
Здравствуйте, Семенов Владимир Леонидович!

Предлагаю вам свое решение может черезчур раздутое

Эдиты создаю динамически им присваивается один обработчик опускания клавиши
и при каждом наступлении данного события заново перестраиваем график
по коду много примеров если что непонятно пишите в Аську

Приложение:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls;type TForm1 = class(TForm) Chart1: TChart; Series1: TLineSeries; procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } //îáðàáîò÷èê íàæàòèÿ êëàâèøè (åå îïóñêàíèÿ) îáùèé äëÿ âñåõ ýäèòîâ procedure KeyUpEdit(Sender: TObject; var Key: Word; Shift: TShiftState); end;var Form1: TForm1; Edit: array[0..11] of TEdit; //Ìàññèâ Edit áóäåì ñîçäàâàòü èõ äèíàìè÷åñêè Handl: array[0..11] of HWND;//Ìàññèâ õåíäëîâ ýäèòîâ Graf: array[0..11] of Double = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); //ìàññèâ êîòîðûé ìû áóäåì ïåðåäîâàòü â ÷àðòimplementation{$R *.dfm}{ TForm1 }procedure TForm1.FormCreate(Sender: TObject);var i: Integer;begin //çäåñü âñå ïðîñòî for i:= 0 to 11 do begin Edit[i]:= TEdit.Create(Form1); //âûçûâàåì êîíñòðóêòîð Edit[i].Parent:= Form1; //íà âñÿêèé ïîæàðíûé óêàçûâàåì ðîäèòåëÿ Edit[i].Left:= 20; //çàäàåì ìåñòî ïîëîæåíèå íà ôîðìå Edit[i].Top:= 20 * i + 20; Edit[i].OnKeyUp:= KeyUpEdit; //ïðèñâàåâàååì îáðàáîò÷èê íàæàòèÿ êëàâèøè Handl[i]:= Edit[i].Handle; //çàïîëíÿåì ìàññèâ õýíäëîâ end;end;procedure TForm1.FormDestroy(Sender: TObject);var i: Integer;begin for i:= 0 to 11 do //îñâîáîæäàåì ðåñóðñû Edit[i].Free;end;procedure TForm1.KeyUpEdit(Sender: TObject; var Key: Word; Shift: TShiftState);var i: Integer; _str: String;beginForm1.Caption:= IntToStr(Key);(*íàì íàäî îòñåèâàòü âñå íåëåãàëüíûå íàæàòèÿ êëàâèø188 - ýòî çàïÿòàÿ òàêèå íàñòðîéêè â ìîåé Windowsåñëè ìû íå íàæàëè öèôðû îò 0 äî 9 òî ìû óäàëÿåìïîñëåäíèé ñèìâîë â ñòðîêå åñëè íàæàëè Backspace èëè Deleteòî ïðîïóñêàåì íà ñëó÷àé åñëè ïðèäåòñÿ óäàëèòü ëèøíèå öèôðûíå ðåàãèðóåì íà ñòðåëêè Home, End, Pg Up, Pg Dn*) if (Key > 32)and(Key < 41) then Exit; if (Key <> 188) then if ((Key < 48)or(Key > 57))and((Key <> 8)and(Key <> 46)) then begin (*âýòîì öèêëå ïðîñòî îïðåäåëÿåì â êàêîì ýäèòå ïðîèçîøëî íàæàòèå èçâèíÿþñü çà êîä íè÷åãî ëó÷øåãî íå ïðèäóìàë *) for i:= 0 to 11 do if TEdit(Sender).Handle = Handl[i] then begin _str:= Edit[i].Text; Delete(_str, Length(_str), 1); Edit[i].Text:= _str; end; end; if Key = 188 then //åñëè íàæàëè çàïÿòóþ ïðîïóñêàåì õîä Exit; (*çäåñü îïÿòü îïðåäåëÿåì ãäå ââîäèì ïðèñâàèâàåì ýëåìåíòó ìàññèâà èçìåíåííîå çíà÷åíèå î÷èùàåì ×àðò è çàíîâî ñòðîèì ãðàôèê åñëè ÷àðò íå ÷èñòèòü òî çíà÷åíèÿ ïîñòîÿííî äîáàâëÿþòñÿ*) for i:= 0 to 11 do if TEdit(Sender).Handle = Handl[i] then begin if Edit[i].Text <> ‘‘ then Graf[i]:= StrToFloat(Edit[i].Text) else Graf[i]:= 0; Chart1.Series[0].Clear; Chart1.Series[0].AddArray(Graf); end;end;end.
Форма ответа