You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

102 lines
2.3 KiB

  1. unit uutlEnumHelper;
  2. (* Package: Utils
  3. Prefix: utl - UTiLs
  4. Beschreibung: diese Unit stellt einen Mechanismus zur Verfügung, ohne viel Aufwand,
  5. Helper Klassen für Enums zu implementieren
  6. Verwendung:
  7. {$MACRO ON}
  8. interface
  9. {$define __ENUM_INTERFACE}
  10. {$define __ENUM_HELPER:=TSomeEnumH}{$define __ENUM_TYPE:=TSomeEnum}{$define __ENUM_LENGTH:=4}
  11. {$I uutlEnumHelper.inc}(
  12. E: (enVal1, enVal2, enVal3, enVal4);
  13. N: 'enVal1,enVal2,enVal3,enVal4';
  14. ); end;
  15. //... mehr davon
  16. {$undef __ENUM_INTERFACE}
  17. implementation
  18. {$define __ENUM_IMPLEMENTATION}
  19. {$define __ENUM_HELPER:=TSomeEnumH}{$define __ENUM_TYPE:=TSomeEnum}{$I uutlEnumHelper.inc}
  20. {$undef __ENUM_IMPLEMENTATION} *)
  21. interface
  22. uses
  23. SysUtils, StrUtils;
  24. type
  25. EConvertErrorAlias = SysUtils.EConvertError;
  26. function LookupString(const aStr, aTable: String; out found: integer): boolean;
  27. function PickString(const aTable: String; const aIndex: integer): string;
  28. function LookupVal(const aVal: Pointer; const aPtr: Pointer; const aStep, aCount: PtrInt; out found: integer): boolean;
  29. implementation
  30. function LookupString(const aStr, aTable: String; out found: integer): boolean;
  31. var
  32. tbl: string;
  33. i,p,k: integer;
  34. t: string;
  35. begin
  36. Result:= false;
  37. tbl:= aTable + ',';
  38. t:= '';
  39. k:= 0;
  40. i:= 1;
  41. while i < Length(tbl) do begin
  42. p:= PosEx(',',tbl,i);
  43. t:= Trim(Copy(tbl, i, p-i));
  44. i:= p+1;
  45. if CompareText(t, aStr)=0 then begin
  46. found:= k;
  47. Result:= true;
  48. exit;
  49. end else
  50. inc(k);
  51. end;
  52. end;
  53. function PickString(const aTable: String; const aIndex: integer): string;
  54. var
  55. tbl: String;
  56. k,i,p: integer;
  57. begin
  58. result:= '';
  59. tbl:= aTable + ',';
  60. i:= 1;
  61. k:= aIndex;
  62. while (k>0) and (i>0) do begin
  63. i:= PosEx(',',tbl, i) + 1;
  64. dec(k);
  65. end;
  66. p:= PosEx(',',tbl, i);
  67. if p<=0 then
  68. Result:= ''
  69. else
  70. Result:= Trim(Copy(tbl, i, p-i));
  71. end;
  72. function LookupVal(const aVal: Pointer; const aPtr: Pointer; const aStep, aCount: PtrInt; out found: integer): boolean;
  73. var
  74. pt: Pointer;
  75. i: integer;
  76. begin
  77. Result:= false;
  78. pt:= aPtr;
  79. for i:= 0 to aCount-1 do begin
  80. if CompareMem(pt, aVal, aStep) then begin
  81. Result:= true;
  82. found:= i;
  83. exit;
  84. end;
  85. inc(pt, aStep);
  86. end;
  87. end;
  88. end.