자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi RTTI로 집합 타입의 내용을 출력하고 싶어요.
2019.01.08 11:00
Q.
안녕하세요. 리오 10.3 사용중 해결 못하고 있는 부분이 있어서 부탁 드려요. ㅠㅠ
열거형 타입
TBorderIcon = (biSystemMenu, biMinimize, biMaximize, biHelp);
set 타입
TBorderIcons = set of TBorderIcon;
set 타입인 TBorderIcons 을 파라미터로 주었을 때
biSystemMenu, biMinimize, biMaximize, biHelp 을 프린트 하려고하는데요
열거형은 처리했는데 set 타입은 어떻게 프린트해야 할지 아무리 구글링해봐도
해결방법이 보이지 않습니다. ㅠㅠ
procedure PrintSetType(TypeInfo: PTypeInfo);
begin
// 이걸 못 만들겠어요 ㅠㅠ
end;
그러니까
TMyEnum = (etOne, etTwo, etThree, etFour, etFive);
TMySets = set of TMyEnum;
이 있을 때
procedure Form1.Button1Click(Sender: TObject);
begin
PrintSetType(System.TypeInfo(TMySets));
end;
set 타입인 TMySets 를 파라미터로 주면
etOne, etTwo, etThree, etFour, etFive 을 메모장에 프린트 하는 거에요
델파이 고수분 좀 도와주세요 ㅠㅠ
http://delphi.borlandforum.com/impboard/impboard.dll?action=read&db=del_qna&no=15999
A.
TMySets 즉, 집합의 열거형 타입(TMyEnum) 정보만 알아오면 되네요?
TypeInfo.TypeData.CompType^; 으로 집합의 열거형 타입 정보를 알아올 수 있습니다.
System.TypInfo.pas 소스코드의 TTypeData 선언부를 보면 아래와 같은 코드가 있습니다.
...
tkSet: (
SetTypeOrSize: UInt8;
CompType: PPTypeInfo;
{SetAttrData: TAttrData;
SetLoByte: UInt8;
SetSize: UInt8});
...
TTypeData는 tkSet(집합)인 경우 CompType을 제공합니다.
여기에 열거형의 타입정보가 담겨져 있습니다.
전체적인 코드는 다음과 같이 작성하면 되겠네요.
procedure TForm1.PrintSetType(TypeInfo: PTypeInfo);
var
I, Min, Max: Integer;
SetName: string;
EnumType: PTypeInfo;
begin
if TypeInfo.Kind = tkSet then
begin
// 기본 값
Min := 0;
Max := 255;
// 집합(set of)의 타입(열거형) 정보
// 열거형의 갯수 파악
EnumType := TypeInfo.TypeData.CompType^;
if EnumType.Kind = tkEnumeration then
begin
Min := EnumType.TypeData.MinValue;
Max := EnumType.TypeData.MaxValue;
end;
for I := Min to Max do
begin
SetName := GetSetElementName(TypeInfo.TypeData.CompType^, I);
Memo1.Lines.Add(SetName);
end;
end;
end;
Delphi RTTI로 집합 타입의 내용을 출력하고 싶어요.
2019.01.08 11:00
Q.
안녕하세요. 리오 10.3 사용중 해결 못하고 있는 부분이 있어서 부탁 드려요. ㅠㅠ
열거형 타입
TBorderIcon = (biSystemMenu, biMinimize, biMaximize, biHelp);
set 타입
TBorderIcons = set of TBorderIcon;
set 타입인 TBorderIcons 을 파라미터로 주었을 때
biSystemMenu, biMinimize, biMaximize, biHelp 을 프린트 하려고하는데요
열거형은 처리했는데 set 타입은 어떻게 프린트해야 할지 아무리 구글링해봐도
해결방법이 보이지 않습니다. ㅠㅠ
procedure PrintSetType(TypeInfo: PTypeInfo);
begin
// 이걸 못 만들겠어요 ㅠㅠ
end;
그러니까
TMyEnum = (etOne, etTwo, etThree, etFour, etFive);
TMySets = set of TMyEnum;
이 있을 때
procedure Form1.Button1Click(Sender: TObject);
begin
PrintSetType(System.TypeInfo(TMySets));
end;
set 타입인 TMySets 를 파라미터로 주면
etOne, etTwo, etThree, etFour, etFive 을 메모장에 프린트 하는 거에요
델파이 고수분 좀 도와주세요 ㅠㅠ
http://delphi.borlandforum.com/impboard/impboard.dll?action=read&db=del_qna&no=15999
A.
TMySets 즉, 집합의 열거형 타입(TMyEnum) 정보만 알아오면 되네요?
TypeInfo.TypeData.CompType^; 으로 집합의 열거형 타입 정보를 알아올 수 있습니다.
System.TypInfo.pas 소스코드의 TTypeData 선언부를 보면 아래와 같은 코드가 있습니다.
...
tkSet: (
SetTypeOrSize: UInt8;
CompType: PPTypeInfo;
{SetAttrData: TAttrData;
SetLoByte: UInt8;
SetSize: UInt8});
...
TTypeData는 tkSet(집합)인 경우 CompType을 제공합니다.
여기에 열거형의 타입정보가 담겨져 있습니다.
전체적인 코드는 다음과 같이 작성하면 되겠네요.
procedure TForm1.PrintSetType(TypeInfo: PTypeInfo);
var
I, Min, Max: Integer;
SetName: string;
EnumType: PTypeInfo;
begin
if TypeInfo.Kind = tkSet then
begin
// 기본 값
Min := 0;
Max := 255;
// 집합(set of)의 타입(열거형) 정보
// 열거형의 갯수 파악
EnumType := TypeInfo.TypeData.CompType^;
if EnumType.Kind = tkEnumeration then
begin
Min := EnumType.TypeData.MinValue;
Max := EnumType.TypeData.MaxValue;
end;
for I := Min to Max do
begin
SetName := GetSetElementName(TypeInfo.TypeData.CompType^, I);
Memo1.Lines.Add(SetName);
end;
end;
end;
딱 필요한내용이였는데 감사합니다.