AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmasken prüfen

Ein Thema von Luckie · begonnen am 19. Mär 2006 · letzter Beitrag vom 20. Mär 2006
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Bitmasken prüfen

  Alt 19. Mär 2006, 22:50
Ich habe folgende Bitmasken:
Delphi-Quellcode:
const
  SV_TYPE_WORKSTATION = $00000001; // A LAN Manager workstation
  SV_TYPE_SERVER = $00000002; // A LAN Manager server
  SV_TYPE_SQLSERVER = $00000004; // Any server running with Microsoft SQL Server
  SV_TYPE_DOMAIN_CTRL = $00000008; // Primary domain controller
  SV_TYPE_DOMAIN_BAKCTRL = $00000010; // Backup domain controller
  SV_TYPE_TIME_SOURCE = $00000020; // Server running the Timesource service
  SV_TYPE_AFP = $00000040; // Apple File Protocol server
  SV_TYPE_NOVELL = $00000080; // Novell server
  SV_TYPE_DOMAIN_MEMBER = $00000100; // LAN Manager 2.x domain member
  SV_TYPE_PRINTQ_SERVER = $00000200; // Server sharing print queue
  SV_TYPE_DIALIN_SERVER = $00000400; // Server running dial-in service
  SV_TYPE_XENIX_SERVER = $00000800; // Xenix server
  SV_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER; //
  SV_TYPE_NT = $00001000; // Windows Server 2003, Windows XP, Windows 2000, or Windows NT
  SV_TYPE_WFW = $00002000; // Server running Windows for Workgroups
  SV_TYPE_SERVER_MFPN = $00004000; // Microsoft File and Print for NetWare
  SV_TYPE_SERVER_NT = $00008000; // Windows Server 2003, Windows 2000 server, or Windows NT server that is not a domain controller
  SV_TYPE_POTENTIAL_BROWSER = $00010000; // Server that can run the browser service
  SV_TYPE_BACKUP_BROWSER = $00020000; // Server running a browser service as backup
  SV_TYPE_MASTER_BROWSER = $00040000; // Server running the master browser service
  SV_TYPE_DOMAIN_MASTER = $00080000; // Server running the domain master browser
  SV_TYPE_SERVER_OSF = $00100000; //
  SV_TYPE_SERVER_VMS = $00200000;
  SV_TYPE_WINDOWS = $00400000; // Windows95 and above
  SV_TYPE_DFS = $00800000; // Root of a DFS tree
  SV_TYPE_CLUSTER_NT = $01000000; // NT Cluster
  SV_TYPE_TERMINALSERVER = $02000000; // Terminal Server(Hydra)
  SV_TYPE_CLUSTER_VS_NT = $04000000; // NT Cluster Virtual Server Name
  SV_TYPE_DCE = $10000000; // IBM DSS (Directory and Security Services) or equivalent
  SV_TYPE_ALTERNATE_XPORT = $20000000; // return list for alternate transport
  SV_TYPE_LOCAL_LIST_ONLY = $40000000; // Return local list only
  SV_TYPE_DOMAIN_ENUM = DWORD($80000000); // Primary domain
  SV_TYPE_ALL = DWORD($FFFFFFFF); // handy for NetServerEnum2
Wie kann ich die jetzt am cleversten zerlegen? Ich habe keine Lust 33 if-Abfragen à la:
Delphi-Quellcode:
function ServerTypeToStringArray(svType: DWORD): TStringDynArray;
begin
  if svType and SV_TYPE_WORKSTATION = 0 then
  begin
    setlength(result, length(result) + 1);
    result[High(result)] := 'Lan Manager Workstation';
  end;
  if svType and SV_TYPE_SERVER = 0 then
  begin
    setlength(result, length(result) + 1);
    result[High(result)] := 'LAN Manager server';
  end;
end;
zu schreiben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#2

Re: Bitmasken prüfen

  Alt 19. Mär 2006, 23:01
Ich würde 2 Arrays nehmen (oder ein 2 - dimensionales), einmal mit den Werten und einmal mit den Bezichnungen und das in einer Schleife abarbeiten.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Bitmasken prüfen

  Alt 19. Mär 2006, 23:04
Etwa so? (ungetestet!)

Delphi-Quellcode:
function ServerTypeToStringArray(svType: DWORD): TStringDynArray;
  const cStrings : array [0..31] of string
                 = ('LAN Manager workstation', 'LAN Manager server',...);
  var ii : Integer;
begin
  for ii := 0 to 31 do
  begin
    if Odd(svType) then
    begin
      setlength(result, length(result) + 1);
      result[High(result)] := cStrings[ii];
      svType := svType SHR 1;
    end;
  end;
end;
Das String-Array muß Du natürlich vollständig füllen und evtl. Sonderfälle (z.B. SV_TYPE_ALL) vorher abfangen.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Bitmasken prüfen

  Alt 19. Mär 2006, 23:09
@Hawkeye: Ja so hatte ich mir das ungefähr vorgestellt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#5

Re: Bitmasken prüfen

  Alt 20. Mär 2006, 05:46
leicht verbessert

Delphi-Quellcode:
function ServerTypeToStrings(const svType: DWord): TStringDynArray; overload;
const
  cStrings: array[0..31] of String = (
    'LAN Manager workstation', 'LAN Manager server', ...);
var
  I,J: Integer;
begin
  J := 0;
  SetLength(Result, 32);
  for I := 0 to 31 do
    if Odd(svType shr I) then
    begin
      Result[J] := cStrings[I];
      Inc(J);
    end;
  SetLength(Result, J);
end;

function ServerTypeToStrings(const svType: DWord; const Separator: String = ', '): String; overload;
const
  cStrings: array[0..31] of String = (
    'LAN Manager workstation', 'LAN Manager server', ...);
var
  I: Integer;
begin
  Result := '';
  for I := 0 to 31 do
    if Odd(svType shr I) then
      Result := Result + cStrings[I] + Separator;
  SetLength(Result, Length(Result) - Length(Separator));
end;


procedure Test;
begin
  ListBox.Items.Text := ServerTypeToStrings($12345678, #13#10);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Bitmasken prüfen

  Alt 20. Mär 2006, 07:29
Danke, werde ich so benutzen. Die Länge gleich am Anfang zu setzen ist natürlich günstiger.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#7

Re: Bitmasken prüfen

  Alt 20. Mär 2006, 10:36
Und wie wäre es hiermit,
Delphi-Quellcode:
function ServerTypeToStrings(const svType: DWord; const Separator: String = ', '): String; overload;
...
begin
  Result := '';
  for I := 0 to 31 do
    if Odd(svType shr I) then
      if Result = 'then Result := Result + cStrings[I]
      else Result := Result + Seperator + cStrings[i];
end;
wenn du es eh nicht magst, daß Strings unnötig in ihrer Länge geändert werden?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz