C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[76427] TChart 시리즈 순서 변경하는 방법에 관하여
rosaa [rosaaaa] 613 읽음    2023-02-08 09:40
현재 TChart에 2D Line 시리즈를 여러개 사용하고 있습니다.

시리즈가 여러개 있다보니 데이터 양이 많아지게 되면 데이터들이 겹쳐 원하는 데이터를 확인할 수 없는 상황입니다.

하여 제가 생각한 방법은 Chart Mouse Move를 사용하여 Chart1->Legend->Clicked(X,Y)를 통해 현재 마우스가 위치해 있는 시리즈를 불러온 후, 해당 시리즈를 맨 위로 올려 다른 데이터들과 겹치지 않고 확인할 수 있는 방법을 생각하고 있습니다.

시리즈를 맨 위에 올릴 수 있는 방법으로 마우스가 올라가 있을 경우에만 Chart의 ExchangeSeries 함수를 통해 가장 끝의 시리즈와 위치를 변경하고 마우스가 해당 시리즈를 벗어난다면 다시 돌아오도록 코드를 구성하였습니다.

하지만 이 방법으로 진행했을 때, Legend의 시리즈 체크박스(Visible을 컨트롤 해주는)를 클릭할 때, 무조건 기존에 가장 끝에 위치해 있던 시리즈만 체크박스 클릭이 가능한 문제점이 있었습니다.

하여 시리즈의 순서를 변경하지 않고 데이터가 다른 시리즈에 겹치지 않게 할 수 있는 다른 방법이나, 기존 저의 방법으로 진행했을 때 Legend의 원하는 체크박스를 클릭할 수 있는 방법을 찾고자 합니다.

고수분들 한번만 조언 해주시면 감사하겠습니다 ㅠㅠ 혹시 몰라 제가 사용한 코드는 아래에 첨부하겠습니다.

void __fastcall TMain_Form::Chart1MouseMove(TObject *Sender, TShiftState Shift, int X,
		  int Y)
{
	static int BeforeClickedIndex = -1;
	int ClickedIndex = ((TChart*)Sender)->Legend->Clicked(X,Y);

	if(BeforeClickedIndex == ClickedIndex)
	{
		BeforeClickedIndex = ClickedIndex;
		return;
	}

	int SeriesCount = ((TChart*)Sender)->SeriesCount();

	TLineSeries* line[18];

	int i;
	for(i = 0; i < SeriesCount; i++)
	{
		line[i] = (TLineSeries*)((TChart*)Sender)->SeriesList->Items[i];
	}

	// Bring To Front Part
	if(BeforeClickedIndex != -1)
	{
		if(line[SeriesCount-1]->LinePen->Width == 3)
		{
			line[SeriesCount-1]->LinePen->Width = 1;
			SeriesBringToFront(((TChart*)Sender), BeforeClickedIndex);
	//			BeforeClickedIndex = ClickedIndex;
			return;
		}
	}

	BeforeClickedIndex = ClickedIndex;

	for(i = 0; i < SeriesCount; i++)
	{
		if(ClickedIndex == -1)
		{
			line[i]->LinePen->Width = 1;
			continue;
		}
		if(ClickedIndex == i)
		{
			line[i]->LinePen->Width = 3;

			// Bring To Front Part
			SeriesBringToFront(((TChart*)Sender), i);
		}
		else
		{
			line[i]->LinePen->Width = 1;
		}
	}
}
//---------------------------------------------------------------------------

void TMain_Form::SeriesBringToFront(TChart* chart1, int SeriesNum)
{
	int SeriesCount = chart1->SeriesCount();

	chart1->ExchangeSeries(SeriesNum, SeriesCount-1);
}

+ -

관련 글 리스트
76427 TChart 시리즈 순서 변경하는 방법에 관하여 rosaa 613 2023/02/08
76428     Re:TChart 시리즈 순서 변경하는 방법에 관하여 지나다 635 2023/02/08
76429         Re:Re:TChart 시리즈 순서 변경하는 방법에 관하여 rosaa 707 2023/02/09
76433             Re:Re:Re:TChart 시리즈 순서 변경하는 방법에 관하여 빌더(TWx) 763 2023/02/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.