Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi

Модерирует : ShIvADeSt

ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
moonrise
Ну дык то что ты описал, если я правильно понял, достигается просто соответствующими пересчетами получаемых координат мыши из серии (LineSeries1.GetCursorValues(tmpX,tmpY)) относительно твоих диапазонов по х и у. И выводом перерасчитанных координат. Само же перекрестие рисовать по реальным координатам в серии.
 
Добавлено:
я имею ввиду вариант б)

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 19:04 18-02-2005
HelL_Doctor



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, есть ли функция (в Delphi) копирования файлов.

Всего записей: 67 | Зарегистр. 30-11-2004 | Отправлено: 20:05 18-02-2005
c0r0ner



злобный доктор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
HelL_Doctor
а очевидную функцию CopyFile слабо посмотреть, или хелп по file operations?

----------
Я - сущий ангел. Только крылья в стирке, а нимб на подзарядке.

Всего записей: 742 | Зарегистр. 09-12-2001 | Отправлено: 20:21 18-02-2005 | Исправлено: c0r0ner, 20:21 18-02-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
EZH
плохо понимаю как это реализовать.
т.е. как XY получить под мышью - в примере доступно написано, а вот как Y "вниз опустить" ?
 
или на движение мыши делать пробег по всей серии на наличие ближайшего Х и соотв. Y ?
 
будет ли успевать то?

----------
Истина внимательно выслушивает спорящих... вздыхает и уходит.

Всего записей: 1987 | Зарегистр. 19-09-2001 | Отправлено: 21:08 18-02-2005 | Исправлено: moonrise, 21:51 18-02-2005
Tema



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
moonrise
Чтобы не мусолить давай сначала расскажи, что ты уже САМ ПОПРОБОВАЛ сделать для решения этой проблемы.

Всего записей: 125 | Зарегистр. 10-11-2003 | Отправлено: 02:16 19-02-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
итоговый. РАБОЧИЙ вариант
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart;
 
type
  TForm1 = class(TForm)
    Chart1: TChart;
    Series1: TFastLineSeries;
    procedure FormCreate(Sender: TObject);
    procedure Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Series1AfterDrawValues(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    OldX,OldY:Longint;
    CrossHairColor:TColor;
    CrossHairStyle:TPenStyle;
  end;
 
var
  Form1: TForm1;
  eps :real;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to 100 do    // Iterate
  begin
    Form1.Series1.AddXY(i,Random(100));
  end;    // for
  OldX:=-1;                          { initialize variables }
  CrossHairColor:=clYellow;
  CrossHairStyle:=psSolid;
  eps := abs((Form1.Series1.XValues[2]-Form1.Series1.XValues[1])/2);
end;
 
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  { This procedure draws the crosshair lines }
  Procedure DrawCross(AX,AY:Integer);
  begin
    With Chart1,Canvas do
    begin
      Pen.Color:=CrossHairColor;
      Pen.Style:=CrossHairStyle;
      Pen.Mode:=pmXor;
      Pen.Width:=1;
      MoveTo(ax,ChartRect.Top-Height3D);
      LineTo(ax,ChartRect.Bottom-Height3D);
      MoveTo(ChartRect.Left+Width3D,ay);
      LineTo(ChartRect.Right+Width3D,ay);
    end;
  end;
 
Var
tmpX,tmpY:Double;
i: Integer;
begin
  if (OldX<>-1) then
  begin
    DrawCross(OldX,OldY);  { draw old crosshair }
    OldX:=-1;
  end;
 
  { check if mouse is inside Chart rectangle }
  if PtInRect( Chart1.ChartRect, Point(X-Chart1.Width3D,Y+Chart1.Height3D)  ) then
  begin
 
    { set label text }
    With Series1 do
    begin
        GetCursorValues(tmpX,tmpY);  { <-- get values under mouse cursor }
        i:= 0;
        while ((XValue[i]-tmpX) < eps) do
        begin
          i:=i+1;
        end;    // while
        Form1.Caption:=FloatToStr(XValue[i])+
                      ' |'+
                      FloatToStr(YValue[i]) ;
        DrawCross(Series1.CalcXPos(i),Series1.CalcYPos(i));  { draw crosshair at current position }
 
    end;
    { store old position }
    OldX:=Series1.CalcXPos(i);
    OldY:=Series1.CalcYPos(i);
 
  end;
end;
 
procedure TForm1.Series1AfterDrawValues(Sender: TObject);
begin
  OldX:=-1;  { Reset old mouse position }
end;
 
end.

 
Добавлено:
PS скорее всего перекрестие надо рисовать не по i, а по i-1

----------
Истина внимательно выслушивает спорящих... вздыхает и уходит.

Всего записей: 1987 | Зарегистр. 19-09-2001 | Отправлено: 02:20 19-02-2005 | Исправлено: moonrise, 03:14 19-02-2005
Commandos



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста, как можно получить заголовак html файла.
В html он идёт как <title> Тут заголовок </title>
Так вот как можно получить только Тут заголовок?

Всего записей: 71 | Зарегистр. 17-08-2002 | Отправлено: 09:56 19-02-2005
YurikGL



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
>Так вот как можно получить только Тут заголовок?
 
Читаем файл, ищем позиции подстрок "<title>" и "</title>" (функция pos) дальше выбираем текст между соответвующими символами.

Всего записей: 308 | Зарегистр. 02-09-2004 | Отправлено: 10:16 19-02-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
moonrise
Ну смотри....
 
У тебя функция y=x*x - парабола
Диапазон по оси X - [-2;2]   (A)
Диапазон по оси Y - [0;5]     (B)
 
В событии Chart1MouseMove получаешь координаты X,Y мыши внутри компонента графика.
Определяешь попадание курсора в область рисования внутри компонента графика с учётом его псевдо-3D глубины:
 
  { check if mouse is inside Chart rectangle }
  if PtInRect( Chart1.ChartRect, Point(X-Chart1.Width3D,Y+Chart1.Height3D)  ) then ...
 
Эта область рисования графика в координатах компонента:
 
по оси X - [Chart1.ChartRect.Left;Chart1.ChartRect.Right]      (C)
по оси Y - [Chart1.ChartRect.Top;Chart1.ChartRect.Bottom]    (D)
 
для диапазона D надо учитывать, что он в отличие от В - возрастает сверху вниз.
 
Перекрестие курсора рисуется с помощью координат графика X,Y из диапазонов С и D
 
Твоя задача, имея X и Y как параметры функции, проецировать их в диапазоны A и B соответственно.
 
пусть xf и yf - координаты X и Y, но спроецированные в A и B
 
kx = 4/(Chart1.ChartRect.Right-Chart1.ChartRect.Left) - коэф соотношения диапазонов A и С.
4 = ширина от -2 до 2 диапазона A
 
если X >= (Chart1.ChartRect.Right-Chart1.ChartRect.Left)/2 - проецируем X в диапазон [0;2]
иначе в диапазон [-2;0)
 
формула пересчета xf = X*kx, но тут надо учитывать знак по условую выше ^.
 
Когда ты получишь xf, то можешь по формуле yf=xf*xf расчитать y и вывести лэйбл значения xf и это расчитанное yf как значения под курсором.
 
Далее задача нарисовать сам курсор с пом.  DrawCross - координаты нужны уже из С и D.
 
Переводить xf в С не надо, оно и так у нас есть - это X. У нас Y не тот. Поэтому надо пересчитать полученный yf в D.
 
ky = 5/(Chart1.ChartRect.Bottom-Chart1.ChartRect.Top) - коэф соотношения диапазонов B и D.
5 = ширина от 0 до 5 диапазона B
 
формула пересчета Y = yf/ky, но тут не забываем, что в B у нас координаты растут снизу вверх, а в D - сверху вниз. Надо результат отнимать от Chart1.ChartRect.Bottom:  
Y = Chart1.ChartRect.Bottom - Y
 
По этим X и Y рисуем перекрестие и запоминаем в OldX и OldY.... ну и т.д.
 
Вот такой вот алгоритм...

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 15:20 19-02-2005
HelL_Doctor



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Опишите пожалуйста синтаксис функции CopyFile
 
Добавлено:
А то я за_ался уже...

Всего записей: 67 | Зарегистр. 30-11-2004 | Отправлено: 19:33 19-02-2005
c0r0ner



злобный доктор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
HelL_Doctor
у тебя хелпа нет чтоли. Это самая простая функция. Есть везде. Ctrl+Shift+пробел - выплывающая подсказка по параметрам функции.
CopyFile(имя_фала_который_нужно_скопировать,имя_файла_куда_скопировать, если_существует_не_копировать)

----------
Я - сущий ангел. Только крылья в стирке, а нимб на подзарядке.

Всего записей: 742 | Зарегистр. 09-12-2001 | Отправлено: 21:02 19-02-2005
HelL_Doctor



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
c0r0ner
Нет хэлп есть только эта ф-ция не описанна.

Всего записей: 67 | Зарегистр. 30-11-2004 | Отправлено: 21:21 19-02-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
EZH
я уже сделал написал же
 
Добавлено:
зы. имхо все "красивее"

----------
Истина внимательно выслушивает спорящих... вздыхает и уходит.

Всего записей: 1987 | Зарегистр. 19-09-2001 | Отправлено: 21:50 19-02-2005
YurikGL



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
HelL_Doctor
 
У меня тоже в хелпе этого нет, но
 
 
copyfile+ctrl_пробел и на экран все выводит
 
copyfile+ctrl+клик:  получаем
 
function CopyFile(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL; stdcall;
 

Всего записей: 308 | Зарегистр. 02-09-2004 | Отправлено: 09:33 20-02-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
moonrise
давай я тебя покритикую?
 
как это планирую сделать я...
имхо, лучше устраивать сканирование по точкам -- по индексу i -- мало ли какие данные будут в Х. Сейчас у тебя (х,у) = (i, random(100)) -- т.е. целые и при этом Х-данные еще и эквидистантные, а если будут вещественные или "время"?
думаю, что положу все это хозяйство на клавиатуру или мышь с небольшой панелькой в виде навигатора (вперед/назад/первая/последняя/"скакать" через 10/100 точек), не нравится -- отключил...
 
если же ты хочешь развивать свой подход, тогда посоветую
 
1) завести какой-нибудь переключатель на кнопке (у меня CrossOnChart: boolean)
чтобы прицел не всегда прыгал по графику, а только по желанию...
 
2) для этого надо делать динамическое подключение разработчика (у меня Chart1.OnMouseMove := nil/Chart1MouseMove)
 

Код:
 
procedure TForm1.BitBtn1Click(Sender: TObject);
...
  if CrossOnChart then begin
    Chart1.OnMouseMove := nil;
    Chart1.Cursor := crDefault;
    CrossOnChart := False;
  end
  else begin
    Chart1.OnMouseMove := Chart1MouseMove;
    Chart1.Cursor := crCross;
    CrossOnChart := True;
  end;
  Chart1.OriginalCursor := Chart1.Cursor;
...
 

как-то вот так...

Всего записей: 25653 | Зарегистр. 06-12-2002 | Отправлено: 16:53 20-02-2005 | Исправлено: akaGM, 16:54 20-02-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
я как пример взял рендом.
это часть приложения. считается и выводится на график порядка 1000-10000 точек.
при правом клике на график создается/открывается новая форма, в которую передаются значения и т.д..  
на второй форме просто крупный чарт. т.к. на основной их несколько.
 
вот на второй форме акк раз это перекрестие и будет. т.к. точек много, что прыжков перекрестия не видно даже при жостаточно большом приблежении.
 
про сканированеи по индексу.. там же так и написано
 
 eps := abs((Form1.Series1.XValues[2]-Form1.Series1.XValues[1])/2);
...
 while ((XValue[i]-tmpX) < eps) do  
        begin  
          i:=i+1;  
        end;    // while  
        Form1.Caption:=FloatToStr(XValue[i])+  
                      ' |'+  
                      FloatToStr(YValue[i]) ;  
        DrawCross(Series1.CalcXPos(i),Series1.CalcYPos(i));  { draw crosshair at current position }  
 
про пункт 2 - не совсем понял
 
кстати.. рисование координат идет не в капшене. а на лейбле1, который находится радом с перекрестием (добавлены в функцию прорисовки крестика расчеты положения относилеьно центра чарта и изменение положения лейбла .. для того, что бы он не вылез за пределы).. ну и по клику координаты еще в буфер пишутся

----------
Истина внимательно выслушивает спорящих... вздыхает и уходит.

Всего записей: 1987 | Зарегистр. 19-09-2001 | Отправлено: 19:03 20-02-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
moonrise

Цитата:
про сканированеи по индексу.. там же так и написано

 
не...
это ты ищешь индекс от величины (index _зависит_ от величины)

Код:
 
while ((XValue[i]-tmpX) < eps) do begin
 inc(i)
 

я же в своем способе предлагаю "скакать" уже по индексам...
начало скана => i = 0
 
next => i=i+1
prev => i=i-1
last => i=N
start => i=0
итд
 
о величине вообще речь не идет...
 
к тому же

Код:
eps := abs((Form1.Series1.XValues[2]-Form1.Series1.XValues[1])/2);

а если величина XValues[1] = 1.e-12, a XValues[2] = 0.0?
почему точность зависит о первых двух точек? -- это особенность твоих входных данных?
 

Цитата:
про пункт 2 - не совсем понял

это обработчик кнопки, нажал -- скан активировался, еще раз нажал -- скан прекратился...
CrossOnChart -- переменная-"переключатель"...
можно даже дальше пойти:

Код:
 
var
CrossOnChart: boolean = False;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if CrossOnChart then begin
 Chart1.OnMouseMove := nil;
 Chart1.Cursor := crDefault;
 CrossOnChart := False;
 Button1.Caption := 'Start scan';
end
else begin
 Chart1.OnMouseMove := Chart1MouseMove;
 Chart1.Cursor := crCross;
 CrossOnChart := True;
 Button1.Caption := 'Stop scan';
end;
Chart1.OriginalCursor := Chart1.Cursor;  
end;
 

непонятно?

Всего записей: 25653 | Зарегистр. 06-12-2002 | Отправлено: 19:57 20-02-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите,к ак с помощью unrar.dll программно распаковать запароленный архив???

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 20:23 20-02-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Larry Laffer
http://delphi.icm.edu.pl/newl/d50/f039_002.htm

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 20:41 20-02-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
akaGM
Цитата:
а если величина XValues[1] = 1.e-12, a XValues[2] = 0.0?  
почему точность зависит о первых двух точек? -- это особенность твоих входных данных?  
угу. они дискретны
 
остальное - понятно.

Всего записей: 1987 | Зарегистр. 19-09-2001 | Отправлено: 20:44 20-02-2005
   

Страницы: 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi
ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru