滑鼠事件 OnMouseDown 參數 Shift: TShiftState 即為集合型別:
enum TShiftStateEnum { ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble };
typedef Set TShiftState;
void CheckState(TShiftState Shift) {
ShiftKey->Checked = Shift.Contains(ssShift);
ControlKey->Checked = Shift.Contains(ssCtrl);
LeftButton->Checked = Shift.Contains(ssLeft);
RightButton->Checked= Shift.Contains(ssRight);
}
TShiftState LeftShift;
LeftShift << ssLeft << ssShift; // 插入元素(運算子 <<)
// 集合運算
TShiftState LeftCtrl;
LeftCtrl << ssLeft << ssCtrl;
TShiftState UnionSet = LeftShift + LeftCtrl; // 聯集 {ssLeft, ssShift, ssCtrl}
TShiftState IntersectSet = LeftShift * LeftCtrl; // 交集 {ssLeft}
TShiftState DiffSet = LeftShift - LeftCtrl; // 差集 {ssShift}
+、-、* 回傳新集合。Contains() 回傳 bool。#include
#pragma hdrstop
#include "Main.h"
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {}
void TForm1::CheckState(TShiftState Shift) {
ShiftKey->Checked = Shift.Contains(ssShift);
ControlKey->Checked = Shift.Contains(ssCtrl);
LeftButton->Checked = Shift.Contains(ssLeft);
RightButton->Checked= Shift.Contains(ssRight);
}
void __fastcall TForm1::UnionClick(TObject *Sender) {
AnsiString Ops[3] = {"+", "*", "-"};
TShiftState FinalSet, LeftShift, LeftCtrl;
LeftShift << ssLeft << ssShift;
LeftCtrl << ssLeft << ssCtrl;
switch (TOptType(dynamic_cast(Sender)->Tag)) {
case otUnion: FinalSet = LeftShift + LeftCtrl; break;
case otIntersection: FinalSet = LeftShift * LeftCtrl; break;
case otDifference: FinalSet = LeftShift - LeftCtrl; break;
}
CheckState(FinalSet);
Label2->Caption = Ops[dynamic_cast(Sender)->Tag];
}
void __fastcall TForm1::Label4MouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y) {
CheckState(Shift); // 即時顯示鍵盤/滑鼠狀態
}
TCheckBox(ShiftKey, ControlKey, LeftButton, RightButton)置於 TPanel1。TPanel2 上放 TLabel4(接收 OnMouseDown)。TBitBtn(Tag 分別 0/1/2 對應聯集/交集/差集),共用 UnionClick。TLabel2 顯示目前運算子符號。| 操作 | 語法 | 說明 |
|---|---|---|
| 插入元素 | set << elem | 編譯期/運行期皆可 |
| 移除元素 | set >> elem | 較少用 |
| 檢查成員 | set.Contains(elem) | 回傳 bool |
| 聯集 | set1 + set2 | 回傳新集合 |
| 交集 | set1 * set2 | 回傳新集合 |
| 差集 | set1 - set2 | 回傳新集合 |