Set Problem, Bug?



  • hi,

    wieso kann der Set-Typ nur 32 elemente aufnehmen?

    enum TestEnum {
    a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,
    a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,
    a27,a28,a29,a30,a31,a32,a33};
    
    typedef Set <TestEnum, a1, a33> TestSet;
    

    wenn ich diese deklaration in eine komponente verwende, zeigt er mir zwar alle elemente an, jedoch kann ich nur die ersten 8 verändern. wenn ich statt a33 den wert a32 nehme, zeigt er mir auch alle an, ich kann jedoch alle bis a32 bearbeiten im objektinspektor.

    wieso kann ich nicht alle, einschliesslich a33 bearbeiten, wenn ich das im Set angebe? hab die hilfe durchwühlt, aber keinen hinweis auf diese begrenzung gefunden.



  • also Set scheint nur 32bit zu unterstützen... sehr schade eigentlich... kennt jemand ne möglichkeit das auf 64bit zu erhöhen?



  • nimm ein Bitfeld 😉



  • Brauchst du das Feld im Objektinspector ?



  • ja, fürn objektinspektor



  • Hi,
    mach ne neue Klasse:

    class __declspec(delphireturn) int64_Set;
    

    und schreib dir ein neuen Propertyeditor. Die Methoden des TSetProperty- Editors sehen so aus:

    { TSetProperty }
    
    function TSetProperty.GetAttributes: TPropertyAttributes;
    begin
      Result := [paMultiSelect, paSubProperties, paReadOnly, paRevertable];
    end;
    
    procedure TSetProperty.GetProperties(Proc: TGetPropProc);
    var
      I: Integer;
    begin
      with GetTypeData(GetTypeData(GetPropType)^.CompType^)^ do
        for I := MinValue to MaxValue do
          Proc(TSetElementProperty.Create(Self, I));
    end;
    
    function TSetProperty.GetValue: string;
    var
      S: TIntegerSet;
      TypeInfo: PTypeInfo;
      I: Integer;
    begin
      Integer(S) := GetOrdValue;
      TypeInfo := GetTypeData(GetPropType)^.CompType^;
      Result := '[';
      for I := 0 to SizeOf(Integer) * 8 - 1 do
        if I in S then
        begin
          if Length(Result) <> 1 then Result := Result + ',';
          Result := Result + GetEnumName(TypeInfo, I);
        end;
      Result := Result + ']';
    end;
    

    Es sollte ein leichtes für dich sein, die Implementation für Tint64_SetProperty zu finden.

    eventuell musst du noch einen Editor für die Elemente erstellen ( ähnlich wie TSetElementProperty), wenn es nicht funzt. Ist aber unwahrscheinlich.


Anmelden zum Antworten