Q&A

  • [re] RTTI를 이용해서 ItemIndex와 같은 속성에 접근할려면 어떻게 하나요?

참고하세요. 델파이 2009에서 동작하는 소스입니다.

<!--CodeS-->
unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

type

TCountryLocale = (Croatia, Germany, Denmark, Norway, Sweden, USA);

TFolioType = (ftNotDefined, ftSales, ftInvoice, ftRoom, ftHall, ftTable);

TMainForm = class(TForm)

    lbEnumTypes: TListBox;

    MemoInfo: TMemo;

    procedure FormCreate(Sender: TObject);

    procedure lbEnumTypesClick(Sender: TObject);

end;



var

  MainForm: TMainForm;


implementation

uses TypeInfo, Buttons;

{$R *.DFM}

function EnumToString(const TypeInfo: pTypeInfo; Ix: Integer): string;

begin

     Result := GetEnumName(TypeInfo, ix);

end;


procedure TMainForm.FormCreate(Sender: TObject);

begin

    with lbEnumTypes.Items do

    begin

        AddObject('TCountryLocale', TypeInfo(TCountryLocale));

        AddObject('TFolioType', TypeInfo(TFolioType)) ;

        AddObject('Boolean', TypeInfo(Boolean)) ;

        AddObject('TPenStyl', TypeInfo(TPenStyle)) ;

    end;

    lbEnumTypes.ItemIndex := 0;

    lbEnumTypesClick(Self);

    Caption := EnumToString(TypeInfo(TCountryLocale), Integer(Denmark));


end;

procedure TMainForm.lbEnumTypesClick(Sender: TObject);

var

   OrdTypeInfo: PTypeInfo;

   OrdTypeData: PTypeData;

  
   TypeNameStr: string;

   TypeKindStr: string;

   MinVal, MaxVal: Integer;

    ix: Integer;

begin

    MemoInfo.Lines.Clear;


    with lbEnumTypes do

    begin

         {- Get the TTypeInfo pointer }

         OrdTypeInfo := PTypeInfo(Items.Objects[itemindex]);

         {- Get the TTypeData pointer }

         OrdTypeData := GetTypeData(OrdTypeInfo);

         {- Get the type name string }

         TypeNameStr := OrdTypeInfo.Name;

         {- Get the type kind string }

         TypeKindStr := GetEnumName(TypeInfo(TTypeKind), Integer(OrdTypeInfo^.Kind));

         {- Get the minimum and maximum values for the type }

         MainVal := OrdTypeData^.MinValue;

         MaxVal := OrdTypeData^.MaxValue;

         {- Add the information to the memo }

         with MemoInfo.Lines do
  
         begin

             Add('Type Name: ' + TypeNameStr) ;

             Add('Type Kind: ' + TypeKindStr);

             Add('Min Val: ' + IntoToStr(MinVal));

             Add('Max Val: ' + IntoToStr(MaxVal));

             {- Show the values and names of the enumerated types }

             if OrdTypeInfo^.Kind = tkEnumeration then

               for ix := MinVal to MaxVal do

                  Add(Format('  Value  %d   Name: %s', [ix, GetEnumName(OrdTypeInfo, ix)]));

         end;

    end;

>파라미터로 넘어 온 컴포넌트의 속성을 검사해서 어떤 값이 들어 있는지 체크하려고 하는데요.
>TListBox나 TCombobox와 같이 object inspector에 안보이는 ItemIndex와 같은 값에 접근할 수 있는 방법이 있는지요?
0  COMMENTS
    • 땅콩맨
      2010.03.23 08:43
      제 생각에는 윈도우7에서 클래스가 호환이 안되서 그러는것 같은데요 새로운api가 있는지 살펴봐야될 것...
    • 홍성락
      2010.03.23 00:15
      Longint(A)로 하시면 되는데 이건 어떤 헤더의 주소라서 나중에 주소연산으로 구할때 많이 사용하는건데 ...
    • 땅콩맨
      2010.03.23 08:00
      Pbyte가 바이트를 포인터로 사용하는 거 맞나요?
    • 홍성락
      2010.03.23 21:54
      예 Pbyte는 byte값을가진 장소의 integer형 주소값만 있구요. 값을 참조시나 정렬등시 빠른 연산을 위해 ...
    • 땅콩맨
      2010.03.24 08:02
      아. 좋은 내용 감사드립니다. 위의 Comment중 일반 값을 넘기도 → 일반 값과 비교하여 아닌가요? ㅋ...
    • 홍성락
      2010.03.24 18:51
      ^^오타입니다. 일반 값을 (파라메터로)넘기거나, (값을) 복사하여 옮기는....
    • 땅콩맨
      2010.03.25 04:36
      일반 값과 비교하여 ㅋㅋ 제가 적은글을 다시 보니 웃음이... ^^;;
    • phono
      2010.03.22 21:37
      Active X가 있긴한데.., 하도 요즘 Active X를 까는 추세라..
    • 최진영
    • 2010.03.20 10:34
    • 4 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.03.21 02:26
      해당 데이터 셋의 프로퍼티에 보믄 AutoReflash 라는게 있을 겁니다. 사용해 보셨는지요?
    • 땅콩맨
      2010.03.21 05:13
      바로 업데이트가 이루어지는게 아니라면 타이머 컴포넌트를 이용하여 dbgrid의 refresh속성을 활성화 해...
    • 조용환
      2010.04.16 17:50
      UpdateSql을 사용해 보세요. tquery와 updatesql을 사용하여 디비그리드상에서 직접 데이타를 편집할...
    • 김용일
      2010.04.19 22:51
      이런 방법이 있었군요. 바쁘다보니 이런방법을 찾아보지도 못했는데 한 번 해 봐야겠네요.
    • 김동식
    • 2010.03.20 03:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2010.03.20 03:51
      같은 값입니다. 델파이에서 $20이하의 값은 표시안합니다. 실제적으로 아스키값 $20는 특수한 용도로 쓰...
    • 최용일
      2010.03.20 00:16
      Chr($1C) ShowMessage(Chr($1C));
    • 최용일
      2010.03.20 00:14
      콜백함수를 메소드에서 일반함수로 바꾸세요. procedure FrameDisplayProc(uID : UINT; uMessage : UI...
    • 헤메는별
      2010.03.22 21:54
      항상 감사드립니다. ^^
    • 땅콩맨
      2010.03.20 09:02
      delph 2010을 사용하지 않아서 자세한 답변은 힘들다고 생각이 들지만 그 아랫버저에서 다뤘던 subverso...
    • 치꼬
    • 2010.03.19 02:42
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.19 19:59
      에러가 발생되는 소스를 첨부해주세요. 그래야 에러가 발생되는 원인을 알수있을테니깐요... 아니면...
    • 치꼬
      2010.03.19 23:18
      오류내용은 아래와 같습니다. Error:130 Failed to Retrieve Error Message from Print Engine. ...
    • 땅콩맨
      2010.03.20 07:57
      에러를 해결할 생각이 있으시다면 서점쯤 가는것이야 일이 되서는 안되겠죠?
    • 치꼬
      2010.03.22 18:18
      뭐.. 서점에 가는것이 무슨일이겠습니까... 문제는 그렇게하지 않도록 해결할수있는 방법이 있다면 더 ...
    • 최용일
      2010.03.18 01:10
      제대로 하신것 같은데요. BYTE *는 PByte를 쓰시면 됩니다. m_RecFile.Write((@(frame_rate1))^,4); ...
    • 헤메는별
      2010.03.18 01:51
      정말 감사드립니다...^^;;
    • 땅콩맨
      2010.03.18 06:54
      오래간만에 C언어 소스를 보니깐 감회가 남다르네요... C <-> Delphi 포팅! 재미있겠어요... 헤매...
    • 헤메는별
      2010.03.18 22:32
      예... 지금 네트웍 카메라 관련된... ㄷㄷㄷㄷㄷㄷㄷㄷ ^^;;
    • 땅콩맨
      2010.03.19 18:49
      와.. 네트웍 카메라라... 좀 자세히 알려주세욤... ^^ 회사기밀인가요? ㅋㅋㅋㅋ
    • 헤메는별
      2010.03.19 19:55
      기밀은요.. 무슨.. ^^ 자동차 검사와 관련된 솔루션을 만들고 있는 회사구요... 검사시에 카메라로 사진...
    • 땅콩맨
      2010.03.20 07:57
      아. 그렇구나... 자동차검사라... 멋있으시네요!!! ^^
    • 땅콩맨
    • 2010.03.17 09:21
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.16 09:46
      http://bluexmas.tistory.com/20 [SOAP강좌] Java 서버 - Delphi 클라이언트 참고하세요!
    • 유옥난
      2010.03.23 03:18
      너무초보라 보고도 잘 몰겠어요 ㅡㅡㅋ 보내주신 소스를 책보고 연구해야 할라나봐요! 답변 너무 너무 ...
    • 땅콩맨
      2010.03.23 07:45
      쑥스럽게 ㄳ는요? ㅎㅎ 암튼 꼭 성공하시길 바랄께요. 성공하시면 또 알려주세요~
    • 유옥난
      2010.04.15 21:01
      성공했어요~ ^^ 닷넷쪽 서버에서 수정해야 하네요~ ㅋ 뭔지 잘 몰르지만 서버쪽에서 도큐먼트 방식으로...
    • 땅콩맨
      2010.04.16 10:04
      해결하셨다니 다행이네요. ^^
    • 조희정
    • 2010.03.13 03:37
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.13 10:12
      if ping_test < timeout query end if 하나마나한 답변이겠지만 몇자 끄저역 봅니다...
    • KDDG_Hit
      2010.03.15 20:37
      보통 서버 프로그램이 종료될 경우는 연결되어 있는 클라이언트 소켓을 끊지 않나요?? 이때 클라이언트에...
    • 땅콩맨
      2010.03.17 09:23
      아 그렇게 하면 되겠네요...
    • 낭낭
    • 2010.03.13 03:12
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.14 10:06
      제 생각에는 if length(Adata) < 1310 then exit; 이 부분이 의심이 가네요. 1310이 1310 byte를 의...
    • phono
      2010.03.19 02:01
      AData 타입이 TByte 네요.. 이러면 AData 타입이 일반 byte 형태는 아닐듯 하군요. AData.xxxx ...
    • 최용일
      2010.03.12 21:08
      그런 방법은 불가능합니다. 델파이의 폼객체와 C++의 윈도우객체가 근본적으로 다르기 때문이죠. MS Win...
    • KDDG_Hit
      2010.03.12 21:26
      답변 감사합니다.. 몇일동안 이것저것 다 찾아봤었는데. ㅠ.ㅠ 음.. 그러면 역시 Windows API 를 이용해...
    • KDDG_Hit
      2010.03.12 22:28
      SetWindowLong, SetWindowPos 함수로 해결했습니다~~
    • 땅콩맨
      2010.03.14 10:16
      오~ 이방법 알아두면 나중에 유용할때가 있겠는걸요? ^^
    • 송창열
    • 2010.03.12 20:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.17 09:32
      저같은 경우는 시작프로그램에 프로그램이 등록되어있다면 이를 최소화하고 또 리소스를 많이잡아먹는 ...
    • mook
    • 2010.03.11 02:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.12 09:47
      mook님의 문제를 함께 해결해보고 싶었는데 뭣미... 퀀텀그리드가 안깔려있다는... ^^;;