Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi

Автор: EZH
Дата сообщения: 18.02.2005 18:04
moonrise
Ну дык то что ты описал, если я правильно понял, достигается просто соответствующими пересчетами получаемых координат мыши из серии (LineSeries1.GetCursorValues(tmpX,tmpY)) относительно твоих диапазонов по х и у. И выводом перерасчитанных координат. Само же перекрестие рисовать по реальным координатам в серии.

Добавлено:
я имею ввиду вариант б)
Автор: HelL_Doctor
Дата сообщения: 18.02.2005 19:05
Подскажите, есть ли функция (в Delphi) копирования файлов.
Автор: c0r0ner
Дата сообщения: 18.02.2005 19:21
HelL_Doctor
а очевидную функцию CopyFile слабо посмотреть, или хелп по file operations?
Автор: moonrise
Дата сообщения: 18.02.2005 20:08
EZH
плохо понимаю как это реализовать.
т.е. как XY получить под мышью - в примере доступно написано, а вот как Y "вниз опустить" ?

или на движение мыши делать пробег по всей серии на наличие ближайшего Х и соотв. Y ?

будет ли успевать то?
Автор: Tema
Дата сообщения: 19.02.2005 01:16
moonrise
Чтобы не мусолить давай сначала расскажи, что ты уже САМ ПОПРОБОВАЛ сделать для решения этой проблемы.
Автор: moonrise
Дата сообщения: 19.02.2005 01:20
итоговый. РАБОЧИЙ вариант
Код: 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.
Автор: Commandos
Дата сообщения: 19.02.2005 08:56
Подскажите пожалуйста, как можно получить заголовак html файла.
В html он идёт как <title> Тут заголовок </title>
Так вот как можно получить только Тут заголовок?
Автор: YurikGL
Дата сообщения: 19.02.2005 09:16
>Так вот как можно получить только Тут заголовок?

Читаем файл, ищем позиции подстрок "<title>" и "</title>" (функция pos) дальше выбираем текст между соответвующими символами.
Автор: EZH
Дата сообщения: 19.02.2005 14:20
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.... ну и т.д.

Вот такой вот алгоритм...
Автор: HelL_Doctor
Дата сообщения: 19.02.2005 18:33
Опишите пожалуйста синтаксис функции CopyFile

Добавлено:
А то я за_ался уже...
Автор: c0r0ner
Дата сообщения: 19.02.2005 20:02
HelL_Doctor
у тебя хелпа нет чтоли. Это самая простая функция. Есть везде. Ctrl+Shift+пробел - выплывающая подсказка по параметрам функции.
CopyFile(имя_фала_который_нужно_скопировать,имя_файла_куда_скопировать, если_существует_не_копировать)
Автор: HelL_Doctor
Дата сообщения: 19.02.2005 20:21
c0r0ner
Нет хэлп есть только эта ф-ция не описанна.
Автор: moonrise
Дата сообщения: 19.02.2005 20:50
EZH
я уже сделал написал же

Добавлено:
зы. имхо все "красивее"
Автор: YurikGL
Дата сообщения: 20.02.2005 08:33
HelL_Doctor

У меня тоже в хелпе этого нет, но


copyfile+ctrl_пробел и на экран все выводит

copyfile+ctrl+клик: получаем

function CopyFile(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL; stdcall;

Автор: akaGM
Дата сообщения: 20.02.2005 15:53
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;
...
Автор: moonrise
Дата сообщения: 20.02.2005 18:03
я как пример взял рендом.
это часть приложения. считается и выводится на график порядка 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, который находится радом с перекрестием (добавлены в функцию прорисовки крестика расчеты положения относилеьно центра чарта и изменение положения лейбла .. для того, что бы он не вылез за пределы).. ну и по клику координаты еще в буфер пишутся
Автор: akaGM
Дата сообщения: 20.02.2005 18:57
moonrise

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


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

Код:
while ((XValue[i]-tmpX) < eps) do begin
inc(i)
Автор: Larry Laffer
Дата сообщения: 20.02.2005 19:23
Подскажите,к ак с помощью unrar.dll программно распаковать запароленный архив???
Автор: EZH
Дата сообщения: 20.02.2005 19:41
Larry Laffer
http://delphi.icm.edu.pl/newl/d50/f039_002.htm
Автор: moonrise
Дата сообщения: 20.02.2005 19:44
akaGM
Цитата:
а если величина XValues[1] = 1.e-12, a XValues[2] = 0.0?
почему точность зависит о первых двух точек? -- это особенность твоих входных данных?
угу. они дискретны

остальное - понятно.
Автор: FAngel
Дата сообщения: 21.02.2005 06:41
YurikGL
HelL_Doctor
А почему бы вам не воспользоватся SHFileOperation из ShellApi ? Получите красивое копирование а-ля проводник с летящими папочками и прогрессом ?
Автор: Larry Laffer
Дата сообщения: 21.02.2005 15:54
EZH, спасиб. Прикольные компоненты.
Автор: HelL_Doctor
Дата сообщения: 21.02.2005 18:09
Каким образом я могу поменять тип переменной не теряя данные хранящиеся в ней.

var
forma: String;
forms: Integer;
i: String;
begin
forms:=random(81);
i:=IntToStr(Forms);
forma:='SpeedButton'+i;
Label1.Caption:=forma;
forma.Glyph.loadFromFile('kot.bmp');
end;

Выдаётся ошибка 'Record, object or class type required'. Помогите, пожалуйста.
Автор: Dimonka
Дата сообщения: 21.02.2005 18:33
HelL_Doctor
Дельфи - это тебе не ПХП
Для того, чтобы обратиться к компоненту по его имени существуют специальные методы.
Например такой:
FindComponent(froma)

И всё вместе это будет звучать примерно так:
forma:='SpeedButton'+i;
TSpeedButton(FindComponent(froma)).Glyph.loadFromFile('kot.bmp');

А что, ты правда восемьдесят кнопок на форме создал? ))
Автор: STEEL
Дата сообщения: 21.02.2005 18:47
Как послать широковещательное сообщение BROADCAST ? Знаю, что нужно юзать ф-ю SendMessage, но из-за малоопытности чтоли, не догоняю. Пример если можно!

Добавлено:
В самом начале топика был вопрос касающийся моего, необходимо например из Edit1.Text вставить текст в место, где установлен курсор, причем здесь keybd_event я так и не разобрал.
Автор: HelL_Doctor
Дата сообщения: 21.02.2005 19:50
Dimonka
Ну
Автор: JustAMaaan
Дата сообщения: 22.02.2005 04:41
STEEL

Цитата:
Как послать широковещательное сообщение BROADCAST ? Знаю, что нужно юзать ф-ю SendMessage, но из-за малоопытности чтоли, не догоняю. Пример если можно!


Вместо хэндла окна напиши константу HWND_BROADCAST
Автор: ShIvADeSt
Дата сообщения: 22.02.2005 06:28
STEEL

Цитата:
В самом начале топика был вопрос касающийся моего, необходимо например из Edit1.Text вставить текст в место, где установлен курсор, причем здесь keybd_event я так и не разобрал.

Потому что keybd_event как раз эмулирует нажатие клавиш на клавиатуре. Если курсор стоит в стандартных виндовых контролах типа Мемо или едита то можно туда текст послать при помощи WM_SETTEXT а если курсор стоит в ричедите или Ворде, то только при помощи keybd_event. Поверь мне, я экспериментировал с разными способами.
Автор: Skipper
Дата сообщения: 03.03.2005 13:55
Подскажите, пожалуйста, как в Delphi 2005 можно установить KOL и MCK и можно ли устанавливать отдельные pas файлы, как это было в Delphi 6-7

Автор: dela
Дата сообщения: 03.03.2005 17:51
как постоянно (при запуске проекта) отследить что в буфер была помещена информация, точнее урл, и далее запустить процедуры?

Добавлено:
как постоянно (при запуске проекта) отследить что в буфер была помещена информация, точнее урл, и далее запустить процедуры?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Вероятность одинакового CRC32


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.