![]() |
Delphi-Version: XE
Set Konstanten einen Wert zuweisen
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:
Das geht ja noch.
function getPotenz(von:tdockopt_UA);
begin result:=TagOpts2hochX_UA[von] end; 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:
in eine durchzählbare Struktur zu packen?
const
DockBasicSize_UA=1; DockAuto_UA=2; DockHori_UA=4; //Anordnung von in horizontaler Reihenfolge sonst vertiKal Grüße Uwe |
AW: Set Konstanten einen Wert zuweisen
TL;DR aber ich hab noch nie explizit Zweierpotenzen von Enumeratoren gebraucht. Wofür brauchst du sie denn? :pale:
EDIT:Willst du einen Zahlenwert aus einem Set machen? Dann musst du casten:
Delphi-Quellcode:
MyInt := Byte(opts);
|
AW: Set Konstanten einen Wert zuweisen
Statt
Delphi-Quellcode:
würde ich eine passend typisierte Schleifenvariable nehmen, also:
var i:integer;
begin for I := integer(Low(tDockopt_UA)) to integer(High(tDockopt_UA)) do begin if tDockopt_UA(i) in opts then
Delphi-Quellcode:
var
opt: tDockopt_UA; begin for opt := Low(tDockopt_UA) to High(tDockopt_UA) do begin if opt in opts then |
AW: Set Konstanten einen Wert zuweisen
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:
kann ich dann die einzelnen Flags auslesen und Reaktionen auslösen.
function FlagIsOn_UA(Awhere,aflag:integer):boolean;
begin result:= aWhere and aflag=aflag; end; gruß Uwe |
AW: Set Konstanten einen Wert zuweisen
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:
Edit: Vielleicht
opts := tDockOpts_UA(RichEdit1.Tag);
if DockBasicSize_UA in opts then ...
Delphi-Quellcode:
, wenn du mehr als 8 Enumeratoren hast.
Word(opts)
|
AW: Set Konstanten einen Wert zuweisen
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 |
AW: Set Konstanten einen Wert zuweisen
Zitat:
Zu #3: Es müsste sogar
Delphi-Quellcode:
gehen.
for opt in opts do
|
AW: Set Konstanten einen Wert zuweisen
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? |
AW: Set Konstanten einen Wert zuweisen
Zitat:
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
Delphi-Quellcode:
für 1-8 ENUM-Werte = 2 Byte im SET.
{$MinEnumSize 2}
|
AW: Set Konstanten einen Wert zuweisen
Zitat:
Delphi-Quellcode:
geschrieben (oder für
TRichEdit
Delphi-Quellcode:
oder
TWinControl
Delphi-Quellcode:
, je nachdem was gebraucht wird):
TComponents
Delphi-Quellcode:
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.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz