Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Anzahl der Elemente einer Menge

  Alt 3. Mär 2007, 15:10
Hallo,

leider gibt es in Delphi nicht jeden denkbaren Mengen-Operator. Insbesondere die Anzahl der Elemente kann nur durch Tests festgestellt werden. SizeOf() ermittelt den belegten Speicher, was zwischen einem und 32 Byte sein können, je nachdem für wieviele Elemente die Menge maximal ausgelegt ist.

Durch Ausnutzung von Implementierungswissen funktioniert das hier:

Delphi-Quellcode:
function MemberCount(const ASet; const ASize: Byte): Integer;
type
  TByteArray = array [0..31] of Byte;
  PByteArray = ^TByteArray;
var
  iByte: Integer;
  pba: PByteArray;
begin
  pba := @ASet;
  Result := 0;
  for iByte := 0 to Pred(ASize) do
  begin
    case pba[iByte] and 15 of
      1,2,4,8: Inc(Result);
      3,5,6,9,10,12: Inc(Result, 2);
      7,11,13,14: Inc(Result, 3);
      15: Inc(Result, 4);
    end;
    case pba[iByte] shr 4 of
      1,2,4,8: Inc(Result);
      3,5,6,9,10,12: Inc(Result, 2);
      7,11,13,14: Inc(Result, 3);
      15: Inc(Result, 4);
    end;
  end;
end;

procedure TMainForm.ButtonClick(Sender: TObject);
begin
  ShowMessage(IntToStr(MemberCount(StringGrid.Options, SizeOf(StringGrid.Options))));
end;
Ist aber nicht wirklich zu empfehlen, da sich die Implementierung theoretisch jederzeit ändern könnte.

Freundliche Grüße
  Mit Zitat antworten Zitat