AGB  ·  Datenschutz  ·  Impressum  







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

Set Konstanten einen Wert zuweisen

Ein Thema von DrUArn · begonnen am 21. Feb 2018 · letzter Beitrag vom 22. Feb 2018
Antwort Antwort
Seite 1 von 2  1 2      
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#1

Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 12:14
Delphi-Version: XE
Hi Comm,
Delphi-Quellcode:
type


tdockopt_UA=( DockBasicSize_UA, //gehört bei der Größenbestimmung dazu
              DockAuto_UA, //soll von self angedockt werden
              DockHori_UA) //Anordnung von in horizontaler Reihenfolge sonst vertiKal


tDockOpts_UA =set of tdockOpt_UA;

const


TagOpts2hochX_UA:array [tdockopt_UA]of integer = (1,2,4);//16,32,64,128,256,512,1024);

der Zugriff auf die Potenzen von 2 in TagOpts2hochX_UA ist umständlich:

Delphi-Quellcode:
function getPotenz(von:tdockopt_UA);
begin
result:=TagOpts2hochX_UA[von]
end;
Das geht ja noch.
Noch umständlicher wird es, wenn ich iterieren muß:

Delphi-Quellcode:
Procedure settag;
var i:integer;
    opts: tDockOpts_UA
begin
for I := integer(Low(tDockopt_UA)) to integer(High(tDockopt_UA)) do
opts:=opts +[tDockopt_UA(i)];
tag:=0;

for I := integer(Low(tDockopt_UA)) to integer(High(tDockopt_UA)) do
begin
  if tDockopt_UA(i) in opts then
     Tag:=Tag or TagOpts2hochX_UA[tDockOpt_UA(i)];//Bitweise Zuordnung für Tag

//oder fest codiert ... und da gäbe es noch mehr Eigenschaften
        tag:=FlagOn_UA(tag,TagOpts2hochX_UA[DockBasicSize_UA] or TagOpts2hochX_UA[DockAuto_UA]
                         or TagOpts2hochX_UA[DockHori_UA]);



end;

Nun die Frage:
Gibt es eine Möglichkeit, ein set oder Array zu schaffen,
in welchem sowohl die Bezeichner als auch die zugehörigen Potenzen vereinigt sind.

also im Prinzip
Delphi-Quellcode:
const
DockBasicSize_UA=1;
DockAuto_UA=2;
DockHori_UA=4; //Anordnung von in horizontaler Reihenfolge sonst vertiKal
in eine durchzählbare Struktur zu packen?

Grüße Uwe
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 12:18
TL;DR aber ich hab noch nie explizit Zweierpotenzen von Enumeratoren gebraucht. Wofür brauchst du sie denn?

EDIT:Willst du einen Zahlenwert aus einem Set machen? Dann musst du casten:
MyInt := Byte(opts);
Uli Gerhardt

Geändert von uligerhardt (21. Feb 2018 um 12:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 12:22
Statt
Delphi-Quellcode:
var i:integer;
begin
for I := integer(Low(tDockopt_UA)) to integer(High(tDockopt_UA)) do
begin
  if tDockopt_UA(i) in opts then
würde ich eine passend typisierte Schleifenvariable nehmen, also:
Delphi-Quellcode:
var
  opt: tDockopt_UA;
begin
  for opt := Low(tDockopt_UA) to High(tDockopt_UA) do
  begin
    if opt in opts then
Uli Gerhardt
  Mit Zitat antworten Zitat
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 12:28
Hi Ulli Gerhardt,

Über tcomponent.TAG speichere ich verschieden Eigenschaften ines objects (hier ist's ein trichedit).

Den TAG gibt's bei allen Komponenten, ich brauche keine speziellen Kompententen entwickeln, deren Verhalten ich verändern will.
Stammt noch aus der Zeit, als man Speicherplatz sparen mußte. Und in Tqg kann mann viele Informationen unterbringen.

Delphi-Quellcode:
tDockOpt_UA=( DockBasicSize_UA, //gehört bei der Größenbestimmung dazu
              DockAuto_UA, //soll von self angedockt werden
              DockHori_UA, //Anordnung von in horizontaler Reihenfolge sonst vertiKal
              DockLeft_UA,//Docking-Site links -> also mit der linken Seite an etwas andocken, ansonsten mit der rechten Seite andocken
              DockTop_UA,//Docking-Site Top -> also mit der oberen Seite an etwas andocken, sonst mit der unteren
              DockDrop_UA, //wenn Owner ruft, dann andocken - sonst nicht
              DockAdaptSize_UA,//Position Größenanpassung an Basicsize //sonst so bleiben
              DockFollowSelf_UA,//Owner bei dessen Bewegungen folgen
              DockTakeOwnerPopupMenu_UA,//diese controls sollen das Owner Popupmenu übernehmen - sonst keinns oder eigene
              DockIAmATmpSpezialEditor_UA,//sind temporäre Editoren
              DockIAmVisible_UA);//sind tatsächlich sichtbar, sollen dargestellt werden z.B. bei show

und über
Delphi-Quellcode:
function FlagIsOn_UA(Awhere,aflag:integer):boolean;
begin
result:= aWhere and aflag=aflag;
end;
kann ich dann die einzelnen Flags auslesen und Reaktionen auslösen.

gruß Uwe
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 12:31
OK, dann schau mal meinen Edit in Post #2 an. Sowas müsste gehen:
Delphi-Quellcode:
opts := [DockBasicSize_UA];
RichEdit1.Tag := Byte(opts);

und umgedreht:
Delphi-Quellcode:
opts := tDockOpts_UA(RichEdit1.Tag);
if DockBasicSize_UA in opts then
  ...
Edit: Vielleicht Word(opts) , wenn du mehr als 8 Enumeratoren hast.
Uli Gerhardt

Geändert von uligerhardt (21. Feb 2018 um 12:39 Uhr)
  Mit Zitat antworten Zitat
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 12:42
Hallo Uli Gerhardt,

danke für die Hinweise.
#3 werde ich nutzen - das macht's bequemer.

#5 Tag:=byte(opts); ist eine ungültige Typumwandlung


Gruß Uwe
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 12:45
Hallo Uli Gerhardt,

danke für die Hinweise.
#3 werde ich nutzen - das macht's bequemer.

#5 Tag:=byte(opts); ist eine ungültige Typumwandlung


Gruß Uwe
Lies den editierten #5.

Zu #3: Es müsste sogar for opt in opts do gehen.
Uli Gerhardt
  Mit Zitat antworten Zitat
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 12:49
Hallo Uli Gerhardt,

stimmt - mit word(Opts) wird das ordnungsgemäß umgewandelt (Staun!).

Ich schaue mir das jetzt noch mal in Ruhe an und was es wo bringt und melde mich Morgen nochmal.

Danke für's Mitdenken.

Gruß Uwe

PS. Woher weiß den Word(Opts) mit OPts:=[DockAuto_UA,DockHori_UA], daß diese tdpockopt_ua eine Potenz von zwei ist?

Geändert von DrUArn (21. Feb 2018 um 12:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 13:04
daß diese tdpockopt_ua eine Potenz von zwei ist?
tDockOpt_UA Das ist der ENUM und der hat keine Zweierpotenz.
Da wird einfach nur blind hochgezählt.

Und bei dem SET tDockOpts_UA ist das immer so.
1 Bit = ein Wert aus dem ENUM

Und Bits in einem Byte/Word/LongWord sind zufällig Zweierpotenzen, weil das für solche ordinalen Typen so definiert ist.


1-8 ENUM-Werte = 1 Byte im SET
9-16 ENUM-Werte = 2 Byte im SET
17-32 ENUM-Werte = 4 Byte im SET
33-64 ENUM-Werte = 8 Byte im SET

Bei {$MinEnumSize 2} für 1-8 ENUM-Werte = 2 Byte im SET.
$2B or not $2B

Geändert von himitsu (21. Feb 2018 um 13:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.477 Beiträge
 
Delphi 12 Athens
 
#10

AW: Set Konstanten einen Wert zuweisen

  Alt 21. Feb 2018, 13:31
Über tcomponent.TAG speichere ich verschieden Eigenschaften ines objects (hier ist's ein trichedit).
In dem Fall hätte ich mir schon längst einen Class-Helper für TRichEdit geschrieben (oder für TWinControl oder TComponents , je nachdem was gebraucht wird):

Delphi-Quellcode:
type
  TRichEditHelper = class helper for TRichEdit
  private
    function GetDockOpts_UA: tDockOpts_UA;
    procedure SetDockOpts_UA(const Value: tDockOpts_UA);
  public
    property DockOpts_UA: tDockOpts_UA read GetDockOpts_UA write SetDockOpts_UA;
  end;

function TComponentsHelper.GetOpts: tDockOpts_UA;
begin
  Result := tDockOpts_UA(Tag);
end;

procedure TComponentsHelper.SetOpts(const Value: tDockOpts_UA);
begin
  Tag := Integer(Value);
end;
Was du mit den gezeigten Schleifen eigentlich erreichen willst, erschließt sich mir noch nicht. Wie ich das sehe, werden in SetTag immer alle Optionen gesetzt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 01:08 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