0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

c++ builder XE4, 10.2 Tokyo > Hint > クリック時に一覧を表示する

Last updated at Posted at 2016-08-12
動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
  - code v0.3は動作確認済

gmailでは「To」の送信先名の一番右端にある「下矢印」を押すことで送信先アドレスリストなどが表示される。

これに近いUIを実装できないだろうか。

C++ Builderでクリック時にHintを表示するようにしてみた。

code v0.1

Unit1.cpp
//---------------------------------------------------------------------------

# include <vcl.h>
# pragma hdrstop

# include "Unit1.h"
//---------------------------------------------------------------------------
# pragma package(smart_init)
# pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

static const String kDummyList = L"lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	;


__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
	Memo1->Clear();
	Memo1->Lines->Add(kDummyList);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Memo1Click(TObject *Sender)
{
	Memo1->ShowHint = true;

	String msg = Memo1->Lines->Text;
	msg = StringReplace(msg, L",", L",\r\n", TReplaceFlags()<<rfReplaceAll);
	Memo1->Hint = msg;
}
//---------------------------------------------------------------------------

Memo1上でクリックするたびに一覧が表示される。

qiita.png

閲覧性は上がった。

編集しやすいかというとそうでもない。1アドレスの削除、追加は実施しづらい。

code v0.2 > MouseLeave()追加

v0.1のコードの場合、Memo1から離れて再度Memo1上に来たときにHintが表示される。これを回避するため、MouseLeave()を追加してみた。

Unit1.cpp
//---------------------------------------------------------------------------

# include <vcl.h>
# pragma hdrstop

# include "Unit1.h"
//---------------------------------------------------------------------------
# pragma package(smart_init)
# pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

static const String kDummyList = L"lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	;


__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
	Memo1->Clear();
	Memo1->Lines->Add(kDummyList);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Memo1Click(TObject *Sender)
{
	Memo1->ShowHint = true;

	String msg = Memo1->Lines->Text;
	msg = StringReplace(msg, L",", L",\r\n", TReplaceFlags()<<rfReplaceAll);
	Memo1->Hint = msg;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Memo1MouseLeave(TObject *Sender)
{
	Memo1->ShowHint = false;
}
//---------------------------------------------------------------------------

Memo1から離れたときにMouseLeave()が実行されてShowHintがfalseになる。再度Memo1上に来たときにはクリックするまではHintは表示されない。

Memo1のスクロールバークリック時はHintが表示されないので邪魔にはならない。

code v0.3 > コンポーネント可変対応 (Sender使用)

Memo1Click()やMemo1MouseLeave()の処理にて「Memo1」のように固定のコンポーネントにすると他のコンポーネントで使用できない。

Senderを使うように変更した。

Unit1.cpp
//---------------------------------------------------------------------------

# include <vcl.h>
# pragma hdrstop

# include "Unit1.h"
//---------------------------------------------------------------------------
# pragma package(smart_init)
# pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

static const String kDummyList = L"lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	L",lastname@www.software.com"
	;


__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
	Memo1->Clear();
	Memo1->Lines->Add(L"1\r\n" + kDummyList);

	Memo2->Clear();
	Memo2->Lines->Add(L"2\r\n" + kDummyList);

	Memo3->Clear();
	Memo3->Lines->Add(L"3\r\n" + kDummyList);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Memo1Click(TObject *Sender)
{
	if (dynamic_cast<TMemo *>(Sender) == NULL) {
		return;
	}

	TMemo *dstPtr = (TMemo *)Sender;

	dstPtr->ShowHint = true;

	String msg = dstPtr->Lines->Text;
	msg = StringReplace(msg, L",", L",\r\n", TReplaceFlags()<<rfReplaceAll);
	dstPtr->Hint = msg;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Memo1MouseLeave(TObject *Sender)
{

	if (dynamic_cast<TMemo *>(Sender) == NULL) {
		return;
	}

	TMemo *dstPtr = (TMemo *)Sender;

	dstPtr->ShowHint = false;
}
//---------------------------------------------------------------------------

qiita.png

あとはMemo1Click()やMemo1MouseLeave()を違う名前にして、OnClick, OnMouseLaveにその関数を使うことで共通化する。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?