線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2431
推到 Plurk!
推到 Facebook!

Tchar 上的點如何拖拉呢?

答題得分者是:ikk
maped
一般會員


發表:13
回覆:19
積分:6
註冊:2008-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-18 14:34:42 IP:210.243.xxx.xxx 訂閱
Dear all,
如果我建立一個 Tchar的點圖,然後增加4個點,
Series1->AddXY(2, 10,"",clBlue);
Series1->AddXY(5, 20,"",clBlue);
Series1->AddXY(8, 30,"",clBlue);
Series1->AddXY(12, 40,"",clBlue);

那我要如何才能拖拉這些點到新的位置上呢?
是要到哪個事件裡寫程式呢?
謝謝大家。

ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-18 16:35:57 IP:140.116.xxx.xxx 訂閱
可以利用OnClickSeries()
取得被點選的點,
再利用OnMouseDown, OnMouseMove, OnMouseUp
實現點的移動.
------
FPGA驗證, FPGA開發平台, http://smims.com
maped
一般會員


發表:13
回覆:19
積分:6
註冊:2008-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-18 16:59:56 IP:210.243.xxx.xxx 訂閱
感謝 ikk 大大的回答,

不過我不是很懂要如何實作?
我現在有在
Series1ClickPointer事件中加了參數,這樣我只要
滑鼠點以上的點時,就會在一個Label XMargin 顯示點的一些數值
void __fastcall TForm1::Series1ClickPointer(TCustomSeries *Sender,
int ValueIndex, int X, int Y)
{
XMargin->Caption="T=" String(ValueIndex) ", Value=" String(Series1->YValue[ValueIndex]);
}


至於你說的利用Mouse來達成移動的效果,可以舉些範例程式嗎?
因為我的點是在Tchart 內,不曉得可不可以達成,我先來試試看好了
謝謝。





===================引 用 ikk 文 章===================
可以利用OnClickSeries()
取得被點選的點,
再利用OnMouseDown, OnMouseMove, OnMouseUp
實現點的移動.
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-18 17:19:36 IP:163.28.xxx.xxx 訂閱
之前的文字被網站篩選掉了...

可以利用Chart1ClickSeries()
取得被點選的點,
再利用Chart1MouseDown, Chart1MouseMove, Chart1MouseUp
實現點的移動.


[code cpp]
void __fastcall TForm1::Chart1ClickSeries(TCustomChart *Sender,
TChartSeries *Series, int ValueIndex, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
char msg[128];
double SerialX, SerialY;
Series->GetCursorValues(SerialX, SerialY);

sprintf(msg,"ValueIndex = %d, SerialX = %f, SerialY = %f", ValueIndex, SerialX, SerialY );
Memo2->Lines->Add(msg);

bGotSerialPoint = true;
}
void __fastcall TForm1::Chart1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
bGotSerialPoint = false;
}

void __fastcall TForm1::Chart1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
int ValueIndex;
if ( bGotSerialPoint )
{
ValueIndex = Series1->GetCursorValueIndex();
if ( ValueIndex < 0 )
{
return;
}
Series1->XValues->Value[ValueIndex] = 0.1;
Series1->YValues->Value[ValueIndex] = 0.1;
}

}
[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
編輯記錄
ikk 重新編輯於 2009-03-18 17:22:24, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-18 18:28:57 IP:122.116.xxx.xxx 未訂閱
您好,
我用 delphi 試了一下, 沒有寫得很精確, 只是想測一下是否可行,
結果, (我是用線圖測, 比較明顯), 線會隨 mouse 移動重繪
(把 . 改成 -> 例如 series1.addxy(...) 改成 series1->addxy(...) 應該就看得懂了)
算我雞婆, 參考一下囉.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart;
type
TForm1 = class(TForm)
Button1: TButton;
Chart1: TChart;
Series1: TFastLineSeries;
procedure Button1Click(Sender: TObject);
procedure Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Chart1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
dodrag : boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
series1.AddXY(10,10);
series1.AddXY(20,30);
series1.AddXY(30,20);
end;
procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if series1.Clicked(x,y)>-1 then
dodrag := true
else begin
dodrag := false;
end;
end;
procedure TForm1.Chart1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
dodrag := false;
end;
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if dodrag then begin
series1.XValue[0] :=x;
series1.YValue[0] :=y;
end;
end;
end.
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
maped
一般會員


發表:13
回覆:19
積分:6
註冊:2008-10-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-19 10:04:43 IP:210.243.xxx.xxx 訂閱
感謝 ikk 大大的回復,試了一下有個函數常常回復 -1(Series1->GetCursorValueIndex();)
,不曉得是我移動太快嗎?
而且常常要移第三次或第四次點才會移動,
所以我把要得到 ValueIndex 改到 Series1ClickPointer()去抓,
所以我稍微改一下程式,但是還是碰到要移動兩次,點才會過去,
我把程式post出來,請大家看看有什麼問題,本來想把全部的程式打包給大家test,
但是找不到上傳檔案的按鍵,


[code cpp]

#include
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool bGotSerialPoint;
double SerialX, SerialY;
int idx = -1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Series1->AddXY(2, 10,"",clBlue);
Series1->AddXY(5, 20,"",clBlue);
Series1->AddXY(8, 30,"",clBlue);
Series1->AddXY(12, 40,"",clBlue);
}
void __fastcall TForm1::Series1ClickPointer(TCustomSeries *Sender,
int ValueIndex, int X, int Y)
{
idx = ValueIndex;
}
void __fastcall TForm1::Chart1ClickSeries(TCustomChart *Sender,
TChartSeries *Series, int ValueIndex, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
char msg[128];
double SerialX, SerialY;
Series->GetCursorValues(SerialX, SerialY);
sprintf(msg,"ValueIndex = %d, SerialX = %f, SerialY = %f", ValueIndex, SerialX, SerialY );
Memo2->Lines->Add(msg);
bGotSerialPoint = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Chart1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if( idx == -1 )
return;
Series1->GetCursorValues(SerialX, SerialY);
Series1->XValues->Value[idx] = SerialX;
Series1->YValues->Value[idx] = SerialY;
Series1->RefreshSeries();
bGotSerialPoint = false;
idx = -1;
}
[/code]


李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-19 10:07:47 IP:61.67.xxx.xxx 訂閱
我也來插花一下。參考看看。  

[code cpp]
TForm1 *Form1;
bool bGotSerialPoint= false;
int iValueIndex;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Series1->AddXY(2, 10,"",clBlue);
Series1->AddXY(5, 20,"",clBlue);
Series1->AddXY(8, 30,"",clBlue);
Series1->AddXY(12, 40,"",clBlue);
Series1->Pointer->Visible = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Chart1ClickSeries(TCustomChart *Sender,
TChartSeries *Series, int ValueIndex, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
char msg[128];
iValueIndex = ValueIndex;
bGotSerialPoint = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Chart1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
int ValueIndex;
double SerialX, SerialY;
if ( bGotSerialPoint )
{
Series1->GetCursorValues(SerialX, SerialY);
Series1->XValues->Value[iValueIndex] = SerialX;
Series1->YValues->Value[iValueIndex] = SerialY;
}
Chart1->Refresh();
bGotSerialPoint = false;
}
//---------------------------------------------------------------------------
[/code]
編輯記錄
李國維 重新編輯於 2009-03-19 10:08:49, 註解 無‧
李國維 重新編輯於 2009-03-19 10:09:53, 註解 無‧
李國維 重新編輯於 2009-03-19 10:10:21, 註解 無‧
李國維 重新編輯於 2009-03-19 10:10:57, 註解 無‧
maped
一般會員


發表:13
回覆:19
積分:6
註冊:2008-10-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-03-19 10:30:50 IP:210.243.xxx.xxx 訂閱
感謝 ikk, st33chen, 李國維 三位高手的支援,

我知道原因的出在哪裡了,
原本我 是用 Series1->RefreshSeries();
但是要用 Chart1->Refresh(); 這樣才能即時更新,

我想問題應該已經解決,我再測試一下,看看還有沒有問題,
感謝大家。

maped
一般會員


發表:13
回覆:19
積分:6
註冊:2008-10-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-03-19 11:43:12 IP:210.243.xxx.xxx 訂閱
再請問大家一下,就是我用滑鼠來放大時,不是都會有方框出現,
就是選定放大的範圍,就是那個方框的顏色要如何改變呢?
我把屬性中有關顏色的部分改過了,但是都沒有發現,
能告訴我改哪個屬性呢?
再次謝謝大家。
系統時間:2024-04-19 9:16:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!