enumarations에서 memtable을 채우는 방법은 무엇입니까?

에두아르도 엘리아스

memtables를 사용하여 LiveBinding을 사용하여 콤보 상자와 열거 형을 연결합니다.

그러나 나는 그것들이 많고 내가하는 방식이 너무 나쁘다 (복사 / 붙여 넣기)

예를 들어, 다음 열거 형이 있습니다.

 TEnumResourceType        = (trtApp, trtTab, trtSection, trtField, trtCommand, trtOther);

이를 위해 동일한 문자열을 제공하는 함수를 만들었습니다.

function EnumResourceTypeToStr(AEnum: TNaharEnumResourceType): string;
begin
  case AEnum of
    trtApp     : result := 'Aplicação';
    trtTab     : result := 'Pagina (Tab)';
    trtSection : result := 'Secção';
    trtField   : result := 'Campo';
    trtCommand : result := 'Comando';
    trtOther   : result := 'Outro';
  end;
end;

데이터 모듈에서 memtable을 배치하고이를 채워야합니다. 다음 코드와 함께 테이블의 AFTEROPEN 이벤트를 사용하고 있습니다.

procedure TDMGlobalSystem.vtResourceTypeAfterOpen(DataSet: TDataSet);
var
  enum : TEnumResourceType;
begin
  inherited;

  for enum := Low(TEnumResourceType) to High(TEnumResourceType) do
    DataSet.InsertRecord([EnumResourceTypeToStr(enum), Ord(enum)]);
end;

모든 것이 작동하지만 새로운 enumaration마다 그렇게해야하며 수십 가지가 있습니다. 결국에는 현재 memtable을 다른 것으로 변경해야하며 이는 프로세스를 자동화하기위한 추가 관심사입니다. 현재 memtable은 때때로 Android에서 작동하지 않습니다.

이 프로세스를 자동화하거나 제네릭을 사용하는 방법을 찾고 있습니다. DataModule에서 다음과 같은 것만 필요합니다. PopulateEnum (Table, Enum);

가장 좋은 해결책은이 memtable에서 상속 된 구성 요소를 만들고 어떻게 든 필요한 열거 형이 무엇인지 정의하고 모든 마법이 발생합니다 (enumtostr 선택 포함).

루 포경

열거가 배열 취득하는 다음 일반 랩퍼는 integer, string열거 형에 대한 순서 값과 이름을 나타내는 한쌍.

약간의 테스트

program so_24955704;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  EnumValueStore in 'EnumValueStore.pas';

type
  TEnumResourceType = ( trtApp, trtTab, trtSection, trtField, trtCommand, trtOther );

procedure PrintEnumValueStore( AEnumValueStore : TEnumValueStore );
var
  LEnumValuePair : TEnumValuePair;
begin
  for LEnumValuePair in AEnumValueStore.GetKeyValues do
    begin
      Writeln( LEnumValuePair.Key, '-', LEnumValuePair.Value );
    end;
end;

procedure TestEnum;
var
  LEnumValueStore : TEnumValueStore<TEnumResourceType>;
begin
  LEnumValueStore := TEnumValueStore<TEnumResourceType>.Create;
  try
    // print default names
    PrintEnumValueStore( LEnumValueStore );

    WriteLn;

    // set the custom names
    LEnumValueStore.SetValue( trtApp, 'Aplicação' );
    LEnumValueStore.SetValue( trtTab, 'Pagina (Tab)' );
    LEnumValueStore.SetValue( trtSection, 'Secção' );
    LEnumValueStore.SetValue( trtField, 'Campo' );
    LEnumValueStore.SetValue( trtCommand, 'Comando' );
    LEnumValueStore.SetValue( trtOther, 'Outro' );

    // print the default values
    PrintEnumValueStore( LEnumValueStore );
  finally
    LEnumValueStore.Free;
  end;
end;

begin
  try
    TestEnum;
  except
    on E : Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;
  ReadLn;

end.

다음 출력을 생성합니다.

0- 앱 
1- 탭 
2- 섹션 
3- 필드 
4- 명령 
5- 기타 

0- 애플리케이션 
1- 페이지 (탭) 
2- 섹션 
3- 필드 
4- 명령 
5- 기타

여기에 작업을 수행 할 단위가 있습니다.

unit EnumValueStore;

interface

uses
  System.Generics.Collections;

type
  TEnumValuePair = TPair<Integer, string>;

  TEnumValueStore = class abstract
  public
    function GetKeyValues : TArray<TEnumValuePair>; virtual; abstract;
  end;

  TEnumValueStore<TEnumKey> = class( TEnumValueStore )
  private
    FValueDict : TDictionary<TEnumKey, string>;
  public
    constructor Create;
    destructor Destroy; override;
    procedure SetValue( AKey : TEnumKey; const AValue : string );
    function GetKeyValues : TArray<TEnumValuePair>; override;
  end;

implementation

uses
  SimpleGenericEnum;

{ TEnumValueStore<TEnumKey> }

constructor TEnumValueStore<TEnumKey>.Create;
begin
  inherited Create;
  FValueDict := TDictionary<TEnumKey, string>.Create;
end;

destructor TEnumValueStore<TEnumKey>.Destroy;
begin
  FValueDict.Free;
  inherited;
end;

function TEnumValueStore<TEnumKey>.GetKeyValues : TArray<TEnumValuePair>;
var
  LEnum : TEnum<TEnumKey>;
  LMin, LMax : Integer;
  LCount : Integer;
  LIdx : Integer;
  LStr : string;
begin
  LMin := LEnum.Ord( LEnum.Low );
  LMax := LEnum.Ord( LEnum.High );
  LCount := LMax - LMin + 1;
  SetLength( Result, LCount );

  LCount := 0;
  for LIdx := LMin to LMax do
    begin
      LEnum := LIdx;
      if FValueDict.ContainsKey( LEnum )
      then
        LStr := FValueDict[LEnum]
      else
        LStr := LEnum;
      Result[LCount] := TEnumValuePair.Create( LEnum, LStr );
      Inc( LCount );
    end;
end;

procedure TEnumValueStore<TEnumKey>.SetValue( AKey : TEnumKey; const AValue : string );
begin
  FValueDict.AddOrSetValue( AKey, AValue );
end;

end.

장치를 사용 SimpleGenericEnum하지만 내부에 수정해야하는 작은 버그가 있습니다.

class function TEnum<T>.High: T;
begin
  // original code
  // Result := Cast(_TypeData.MaxValue);
  Result := Cast(GetTypeData.MaxValue);
end;

class function TEnum<T>.Low: T;
begin
  // original code
  // Result := Cast(_TypeData.MinValue);
  Result := Cast(GetTypeData.MinValue);
end;

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

뷰에서 점을 채우는 방법은 무엇입니까?

C ++에서 std :: string을 채우고 채우는 방법은 무엇입니까?

열에 기간을 채우는 방법은 무엇입니까?

특정 조건에서 열을 채우는 방법은 무엇입니까?

C #에서 튜플을 채우는 방법은 무엇입니까?

String [] 배열에서 Point [] 배열을 채우는 방법은 무엇입니까?

Twig에서 배열 배열을 채우는 방법은 무엇입니까?

UIBezierPath에서 겹친 부분을 채우는 방법은 무엇입니까?

UILabel을 하단에서 "채우기"하는 방법은 무엇입니까?

MS Access에서 동적 배열을 채우는 방법은 무엇입니까?

Django 보기에서 양식을 채우는 방법은 무엇입니까?

SequelizeJs에서 외래 키 열을 채우는 방법은 무엇입니까?

SataFrame에서 누락 된 값을 채우는 방법은 무엇입니까?

Firebase에서 목록을 채우는 올바른 방법은 무엇입니까?

VBA에서 셀의 색상을 채우는 방법은 무엇입니까?

R에서 루프로 행렬을 채우는 방법은 무엇입니까?

튜플에서 QTreeWidget을 채우는 방법은 무엇입니까?

Julia에서 튜플을 채우는 방법은 무엇입니까?

특정 영역에서 색상을 채우는 방법은 무엇입니까?

OpenCV에서 폴리 라인을 채우는 방법은 무엇입니까?

RelativeLayout에서 빈 공간을 채우는 방법은 무엇입니까?

TextView에서 알림을 채우는 방법은 무엇입니까?

Java에서 다각형을 채우는 방법은 무엇입니까?

C #에서 배열을 채우는 방법은 무엇입니까?

MYSQL C #에서 DataGridView 셀을 채우는 방법은 무엇입니까?

문자열 내용에서 개체를 채우고 목록을 채우는 방법은 무엇입니까?

C에서 0으로 2D 행렬을 채우고 채우는 방법은 무엇입니까?

배열을 순서대로 채우는 방법은 무엇입니까?

문자열에 0을 채우는 방법은 무엇입니까?