Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2010, 14:51   #1
SsdD
Пользователь
 
Регистрация: 06.05.2009
Сообщений: 17
Восклицание Рисуем график в Chart - Delphi

Вот у меня такой примерчик: нужно построить график, используя значения x, y - из СтрингГрида. График у меня построился, но теперь мне нужно, чтобы ось ОХ как бы была выделенной, а она у меня ничем не выделяется.

И еще 1 вопрос: в Chart`е есть такая функция, чтобы график рисовался не весь сразу, а с неким интервалом, допустим 1 точка за 1 сек?

Вот код:

Код:
procedure TForm1.Button2Click(Sender: TObject);
var i,j:longint;
begin
Series1.Clear;
for i:=1 to StringGrid1.RowCount-1 do
Series1.AddXY(StrToFloat(StringGrid1.Cells[0,i]),
StrToFloat(StringGrid1.Cells[1,i]),
'',clGreen);
Chart1.Title.Text.Clear;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked=true then Series1.Pointer.Visible:=true
else Series1.Pointer.Visible:=false;
end;

Последний раз редактировалось Stilet; 26.04.2010 в 16:09.
SsdD вне форума Ответить с цитированием
Старый 25.04.2010, 19:32   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
нужно, чтобы ось ОХ как бы была выделенной
можно сместить, можно толщину оси менять chart1.BottomAxis.Axis.Width:= 4
Цитата:
в Chart`е есть такая функция, чтобы график рисовался не весь сразу, а с неким интервалом
нет такой функи, но у себя в цикле поставьте
Код:
application.processmessages; sleep(1000);
// или по таймеру
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 25.04.2010, 21:12   #3
SsdD
Пользователь
 
Регистрация: 06.05.2009
Сообщений: 17
По умолчанию

Спасибо дружище, выручил.
Цитата:
можно сместить, можно толщину оси менять chart1.BottomAxis.Axis.Width:= 4
- эээ или я немнога неправильно выразился, или ты не так понял, вобщем вот я тут подумал и надумал, что мне нужно просто создать линию, черного цвета, чтобы были координаты (х,0)
Пробовал написать так:
PHP код:
Series1.AddXY(StrToFloat(StringGrid1.Cells[0,i]),0,'',clBlack); 
но он немнога не такой эффект делает. мне бы просто создать линию, которая начнется на минимальном значении x в таблице СГ, и закончится на макс значении х.
Цитата:
application.processmessages; sleep(1000);
// или по таймеру
Это как раз то, что мне и нужно было.

И вот еще один вопросик:
Нужно, чтобы допустим когда график возрастал, допустим горел СкрулЛок, допустим когда убывал - горел НумЛок, а когда график пересекал ось ОХ, то загорелся КапсЛок.
ЗЫ. Есть кусочек одного кода, где это реализовано, но там используется Имаге.

Последний раз редактировалось Stilet; 26.04.2010 в 16:10.
SsdD вне форума Ответить с цитированием
Старый 25.04.2010, 23:27   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...я тут тоже немного подумал и надумал: а не почитать ли вам delphi-world и встроенную справку в delphi по нажатию <F1>/

Добавлено
Цитата:
Нужно, чтобы допустим когда график возрастал, допустим горел СкрулЛок, допустим когда убывал - горел НумЛок, а когда график пересекал ось ОХ, то загорелся КапсЛок
вот в цикле и сравнивайте текущеее значение с предыдущим по -Y-, если текущее больше предыдущего - зажигайте скролл, если меньше, то нумлок и т.д.
Код:
procedure SetNumLock(bState:Boolean); // ВЗЯТО ИЗ DELPHI-WORLD
var 
KeyState : TKeyboardState; 
begin 
GetKeyboardState(KeyState); 
if ( (bState) and (not ((KeyState[VK_NUMLOCK] and 1)=1) ) or 
( (not (bState)) and ((KeyState[VK_NUMLOCK] and 1)=// Simulate a key press 
keybd_event(VK_NUMLOCK, $45, (KEYEVENTF_EXTENDEDKEY or 0), 0); 
// Simulate a key release 
keybd_event( VK_NUMLOCK, $45, (KEYEVENTF_EXTENDEDKEY or 
KEYEVENTF_KEYUP), 0); 
end;
хотя правильнее экстремумы определять
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 26.04.2010 в 14:35.
raxp вне форума Ответить с цитированием
Старый 26.04.2010, 14:18   #5
SsdD
Пользователь
 
Регистрация: 06.05.2009
Сообщений: 17
По умолчанию

Вот тоже нашел код для Локов:
Цитата:
procedure SetLedState(KeyCode: TKeyType; bOn: Boolean);
var
KBState: TKeyboardState;
Code: Byte;
begin
case KeyCode of
ktScrollLock: Code := VK_SCROLL;
ktCapsLock: Code := VK_CAPITAL;
ktNumLock: Code := VK_NUMLOCK;
end;
GetKeyboardState(KBState);
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
begin
if Boolean(KBState[Code]) <> bOn then
begin
keybd_event(Code,
MapVirtualKey(Code, 0),
KEYEVENTF_EXTENDEDKEY,
0);

keybd_event(Code,
MapVirtualKey(Code, 0),
KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,
0);
end;
end
else
begin
KBState[Code] := Ord(bOn);
SetKeyboardState(KBState);
end;
end;
Теперь ставлю в какое время должен загореться:
Код:
if StringGrid1.Cells[1,abs(i)]>=StringGrid1.Cells[1,abs(i-1)] then
begin
SetLedState(ktScrollLock,true);
sleep(zad);
SetLedState(ktScrollLock,true);

//SetLedState(ktScrollLock,false);

end

else
begin

SetLedState(ktNumLock,true);
sleep(zad);
SetLedState(ktNumLock,true);
end;
Но тут неполучается, если у<0, то загорается не тот Лок. Может как нибудь без экстримумов получится?

Последний раз редактировалось Stilet; 26.04.2010 в 16:11.
SsdD вне форума Ответить с цитированием
Старый 26.04.2010, 14:38   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
то загорается не тот Лок
экспериментируйте получится
Цитата:
Может как нибудь без экстримумов получится...
все зависит от постановки задачи, если вам не задали интервал, делайте без него/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 26.04.2010, 14:48   #7
SsdD
Пользователь
 
Регистрация: 06.05.2009
Сообщений: 17
По умолчанию

Просто у меня форумала вида arctan(tan(x)) ну и сложнее есть.
Этот код рабочий
Код:
if StringGrid1.Cells[1,i]>=StringGrid1.Cells[1,i-1] then
begin
SetLedState(ktScrollLock,true);
sleep(zad);
SetLedState(ktScrollLock,true);
end

else
begin

SetLedState(ktNumLock,true);
sleep(zad);
SetLedState(ktNumLock,true);
end;
Вот только как доходит дело до у=-1, у=-6, по графику функция та убывает, но так та -1 больше -6 )
Интервал у меня задается из таблицы в СГ 0-ой столбец - х, 1-ый столбец - у.
SsdD вне форума Ответить с цитированием
Старый 26.04.2010, 14:51   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...ну, так учитывайте знак в условии убывания/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 26.04.2010, 15:16   #9
SsdD
Пользователь
 
Регистрация: 06.05.2009
Сообщений: 17
По умолчанию

Вот так уже получше, но всре равно в некоторых местах нетак работает:
Код:
if StrToFloat(StringGrid1.Cells[1,i])>=0 then
  if StringGrid1.Cells[1,i]>=StringGrid1.Cells[1,i-1] then
  begin
  SetLedState(ktScrollLock,false);
  SetLedState(ktNumLock,true);
  sleep(zad);
  SetLedState(ktNumLock,true);
  end

  else
  begin
  SetLedState(ktNumLock,false);
  SetLedState(ktScrollLock,true);
  sleep(zad);
  SetLedState(ktScrollLock,true);
  end

else
  if StringGrid1.Cells[1,i]<=StringGrid1.Cells[1,i-1] then
  begin
  SetLedState(ktScrollLock,false);
  SetLedState(ktNumLock,true);
  sleep(zad);
  SetLedState(ktNumLock,true);
  end

  else
  begin
  SetLedState(ktNumLock,false);
  SetLedState(ktScrollLock,true);
  sleep(zad);
  SetLedState(ktScrollLock,true);
  end;
end;
Может где нетам нето написал?
Хм интересно получается, возрастание проходит как по маслу, даже когда у<0, а вот на убывании какие та чудеса происходят )

Ааа нашел место, где чудит кодик:
когда допустим ф-ция убывает: у=1,26, а потом у=-3,66, вот тут он ошибочно зажигает не тот Лок. Но ведь когда ф-ция возрастает, и меняется допустим от у=-3,66, а потом у=1,26 - все нормально.

Последний раз редактировалось Stilet; 26.04.2010 в 16:11.
SsdD вне форума Ответить с цитированием
Старый 26.04.2010, 16:25   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
procedure SetLed(Keykode: string; bOn: Boolean);
var KBState: TKeyboardState;
    kode: Byte;
begin
 if keykode= 's' then kode := VK_SCROLL;
 if keykode= 'c' then kode := VK_CAPITAL;
 if keykode= 'n' then kode := VK_NUMLOCK;

 GetKeyboardState(KBState);
 if (Win32Platform = VER_PLATFORM_WIN32_NT) then begin
  if Boolean(KBState[kode]) <> bOn then begin

       keybd_event(kode,
                   MapVirtualKey(kode, 0),
                   KEYEVENTF_EXTENDEDKEY,
                   0);
       keybd_event(kode,
                   MapVirtualKey(kode, 0),
                   KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,
                   0);
  end;
 end else begin
  KBState[kode]:= Ord(bOn);
  SetKeyboardState(KBState)
 end
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  I, J: integer;
  temp,ax,ay: double;
begin
  GraphM1.Curves[0].ClearPoints;
  GraphM1.Curves[1].ClearPoints;  //очистка
  GraphM1.Scale := 100;
  GraphM1.MaxXValue := 50;
  GraphM1.MaxYValue := 10;
  for i := 0 to 50 do begin
    //сброс предыдущих состояний
    setled('c', false);
    //
    temp:= sin(i/5)*5;
    GraphM1.Curves[1].AddPoint(I, temp);

    GraphM1.Curves[1].GetPoint(i-1,ax,ay);
    if ay < temp then begin
     setled('s',true);
     setled('n', false)
    end else begin
     setled('n',true);
     setled('s', false)
    end;
    if temp=0 then setled('c',true);

    Application.ProcessMessages;
    sleep(500);
  end
end;
c одной оговоркой - сapslock будет зажигаться именно тогда, когда Y=0, а таких точек с этим шагом на данном интервале, что в примере может и не быть сделано на альтернативном фришном TAChart, но смысл от этого не меняется, все працюэ/
Изображения
Тип файла: png tachart.png (5.6 Кб, 448 просмотров)
Вложения
Тип файла: zip альтернатива_TAChart.zip (12.8 Кб, 92 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
график в Chart Анна2702 Помощь студентам 3 06.04.2010 19:00
График в Chart Lordigan Помощь студентам 0 15.12.2009 18:16
Рисуем крестик (Delphi 7) alxd Помощь студентам 4 09.09.2009 17:46
Нарисовать график в Chart Polotenchik Общие вопросы Delphi 0 08.08.2009 13:35
проблемы с chart, при внесении изменения данных график не хочет рисоваться Барби Помощь студентам 20 12.11.2008 15:58