![]() |
boolean ohne variable?
hi,
Delphi-Quellcode:
ich habe 2 fragen hierzu, ersteinmal: wieso hat das "case" hier kein "end;" ? und zweitens wie funktioniert der boolean in dem case, er hat ja gar keine variable? O_o
procedure TForm1.Button1Click(Sender: TObject);
var fs : TFileStream; DataSize : Word; DataType : Word; CurEntry : record Header : record Tag : array[0..3] Of Char; EntryType : Word; Size : Word; end; case boolean of true: (Value : DWORD; Junk: array[0..1023] of Char); false : (Str : array[0..1023] of Char); end; CurInfo : String; CurJunk : array[0..1023] Of Char; begin //... end; |
Re: boolean ohne variable?
hi,
zwei gegenfargen: woher hast du das? und kompiliert es? Aenogym |
Re: boolean ohne variable?
ja, es kompiliert....
aber wundern tuts mich auch :gruebel: |
Re: boolean ohne variable?
es ist ein stück code den ich von SCP habe, ich versuche gerade den nach und nach nachzuvollziehn und scheitere bereits wie man sieht an den records ^^
ja es lässt sich kompilieren, wenn ich ein "end;" ans case ranfügen würde, würde es nichtmehr gehen. ich kann zwar ein b: vor dem "boolean" machen, aber das war nur als test, es lässt sich mit und ohne kompilieren, nur versteh ich nicht wie dieser bool dann funktioniert? |
Re: boolean ohne variable?
so,
delphi-hilfe bemüht: Zitat:
Aenogym edit: das nächste mal verwende ich die vorschau :roll: |
Re: boolean ohne variable?
Delphi-Quellcode:
damit kannst du in einem record mehrere variablen im selben speicher halten -> das ganze dient der übersicht wenn du ein record für 2 sachen verwenden willst und dadurch 2 ( hier 2 durch das boolean -> true/false ) verschieden bezeichnungen brauchst.
procedure TForm1.Button1Click(Sender: TObject);
var fs : TFileStream; DataSize : Word; DataType : Word; CurEntry : record Header : record Tag : array[0..3] Of Char; EntryType : Word; Size : Word; end; case boolean of true: (Value : DWORD; Junk: array[0..1023] of Char); false : (Str : array[0..1023] of Char); end; CurInfo : String; CurJunk : array[0..1023] Of Char; begin //... end; beispiel:
Delphi-Quellcode:
hier habe ich für jeden variablentyen einen eigenen namen mit verschiedenen typen (Boolean/Integer..). da das record je immer nur eine variabe annehmen kann muss ich ja nicht alle möglichkeiten im record gleichzeitig aufnehmen sondern nehme per case nur jeweils eins rein was mich an speicher nur soviel kostet wie der größte typ ( der compiler denkt da halt mit... und mir erspart es arbeit bzw arbeitsspeicher )
TIPSVarType = (vtBoolean, vtInteger, vtFloat, vtString);
TIPSVarTypes = set of TIPSVarType; PIPSVariable = ^TIPSVariable; TIPSVariable = record VarName : PChar; VarType : TIPSVarType; VarInfo : PChar; VarUpdated : TDateTime; case TIPSVarType of vtBoolean : (VarBoolean : Boolean); vtInteger : (VarInteger : Integer); vtFloat : (VarFloat : Single); vtString : (VarString : PChar); end; werd mal bei gelegenheit das topic aus der delphi help suchen.... da gabs was... |
Re: boolean ohne variable?
[ot]
"Junk" ist ein schöner Bezeichner :D. Das heisst so viel wie Müll/Schrott. "Chunk" ist mir in Verbindung mit binären Dateiformaten eher ein Begriff ;) (heisst ~Stück, im Sinne z.B. von "a chunk of meat") [/ot] Jö, wollt ich nur am Rande los werden :angel2: btw: DAS nenne ich mal nen Record! Record in Record, und dann noch mit variantem Teil und (verkappten) Strings. Is ja alles drin so :lol: |
Re: boolean ohne variable?
@Aenogym:
wenn ich keinen bezeichner habe für den boolean, wie spreche ich ihn dann an? @paresy: ich weiss schon wie variante records funktionieren, mir ist nur schleierhaft wieso da nach dem case kein "end;" kommt |
Re: boolean ohne variable?
Zitat:
|
Re: boolean ohne variable?
Ich darf?
Zitat:
Zitat:
|
Re: boolean ohne variable?
@paresy, das verstehe ich nicht, irgendwie muss doch entschieden werden welcher variante teil benutzt wird, in den beispiel, siehe ersten post, wann ist da true und wann false?
@dizzy, danke das erklärt das fehlende end; |
Re: boolean ohne variable?
benutz mal das auto completion feature von delphi... dann zeigt er dir folgende möglichkeiten an:
Header : record //true teil Value : DWORD; Junk: array[0..1023] of Char; //false teil Str : array[0..1023] of Char; d.h. -> du hast die wahl für welchen teil du dich entscheidest. du kannst auch beiden teilen was zuweisen, jedoch überschneiden sich die sachen dann im speicher was wahrscheinlich nicht sinn und zweck erfüllt... vllt jedoch auch mal nützlich sein kann ( hab nur grad keine idee ) |
Re: boolean ohne variable?
Angewandt wird das ganze z.B. bei Ip-Adressen: Dort gibt es die Möglichkeit, eine 32Bit-Zahl zu setzen oder aber 4 8Bit-Zahlen. Da die 4x8 Bit den gleichen Speicherbereich adressieren wie die 1x32 Bit, spielt das keine Rolle.
|
Re: boolean ohne variable?
Moin Mario,
Zitat:
Das entscheidest Du, indem Du das entsprechende Feld angibst. Vielleicht wird es mit einem Beispiel deutlicher:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type TcsMyVariant1 = record case boolean of true : (dwDWORD : DWORD); false : (bByte0 : Byte; bByte1 : Byte; bByte2 : Byte; bByte3 : Byte;) end; TcsMyVariant2 = record case byte of 8 : (dwDWORD : DWORD); 37 : (bByte0 : Byte; bByte1 : Byte; bByte2 : Byte; bByte3 : Byte;) end; var mvWork1 : TcsMyVariant1; mvWork2 : TcsMyVariant2; begin mvWork1.dwDWORD := $FFEEDDCC; ShowMessage(IntToHex(mvWork1.bByte3,2)+#13#10+ IntToHex(mvWork1.bByte2,2)+#13#10+ IntToHex(mvWork1.bByte1,2)+#13#10+ IntToHex(mvWork1.bByte0,2)); mvWork2.bByte0 := $CC; mvWork2.bByte1 := $DD; mvWork2.bByte2 := $EE; mvWork2.bByte3 := $FF; ShowMessage(IntToHex(mvWork2.dwDWORD,8)); end; |
Re: boolean ohne variable?
moin christian,
danke für dein beispiel :] was ich aber nun nicht verstehe ist "8" bzw "37" bei deinem 2ten rekord, irgendwie seh ich im code nirgends wo das eine bedeutung haette |
Re: boolean ohne variable?
Moin Mario,
Zitat:
Sie haben keine Bedeutung. Solange Du für jede Variante einen Wert angibst, der zum Wertebereich des Ordinaltyps im Case angibst, kannst Du Werte nehmen, wie Du gerade willst. Unter Umständen können die Werte auch der Dokumentation dienen, z.B.
Delphi-Quellcode:
Wenn Du nur zwei Varianten unterscheiden musst reicht boolean, bis zu 256 dann Byte usw.
type
TcsMyType = record bRecordType : Byte; case Byte of $AA : (.....); // Aufteilung, wenn bRecordType = $AA ist $BB : (.....); // Aufteilung, wenn bRecordType = $BB ist // ... end; Grösser schadet nicht. |
Re: boolean ohne variable?
danke christian, dann ist mir das nun klar =)
|
Re: boolean ohne variable?
nochmal ne frage...also so:
Delphi-Quellcode:
ist das so korrekt?
type
TTest = record Variable:Typ; case Typ of //bezieht sich auf die zuletzt genannte Variable des Typs 'Typ' Wert1: (a:Typa, b:Typb);//Fall 1 Wert2: (x:Typx, y:Typy);//Fall 2 end; mit kommentaren, ends und allem? |
Re: boolean ohne variable?
Ich empfehle, dieses Thema nicht zu vertiefen. :mrgreen:
Warum ? 1. wie man sieht, führen Varianten für ziemliche Verwirrung. :shock: 2. sie bringen keinen Vorteil. 3. Aus Sicht einer Datenbank ist es völliger Unsinn, es geht nämlich auch, einen Typ anzulegen, der in Abhängigkeit eines Wertes 1 Byte oder 10000 belegt. In diesem Falle müßten dann 10000 Byte belegt werden bei jedem Datensatz. Deshalb : Finger weg ! :warn: |
Re: boolean ohne variable?
Natürlich hat es einen Vorteil. Stell dir mal einen mathematischen Vektor vor. In manchen Fällen willst du, dass die Komponenten x, y und z sind. In anderen Fällen willst du x1, x2 und x3. In anderen vielleicht dann u, v, w. So kannst du alle Varianten in einem Vektortyp unterbringen.
|
Re: boolean ohne variable?
Es gibt schon Fälle wo es nett ist:
Delphi-Quellcode:
Und schon kann ich ganz elegant auf die einzelnene Anteile einer Farbe zuweisen :stupid:
type
TmyColor = record case boolean of true : (Color : TColor); false : (ColorR : Byte; ColorG : Byte; ColorB : Byte;) end; procedure TForm1.Button1Click(Sender: TObject); var myColor : TmyColor; begin myColor.Color := clLime; Label1.Caption := 'Rotanteil : ' + IntToStr(mycolor.ColorR); Label2.Caption := 'Grünanteil : ' + IntToStr(mycolor.ColorG); Label3.Caption := 'Blauanteil : ' + IntToStr(mycolor.ColorB); end; |
Re: boolean ohne variable?
Oder eine matrix, die man über feldnamen oder array-adressierung ansprechen will:
Delphi-Quellcode:
Also, nix da 'finger weg' ...wenn man weiß was man tut.
TD3DMatrix = packed record
case Integer of 0 : (_00, _01, _02, _03, _10, _11, _12, _13, _20, _21, _22, _23, _30, _31, _32, _33 : Single); 1 : (m : array [0..3, 0..3] of Single); end; |
Re: boolean ohne variable?
Zitat:
|
Re: boolean ohne variable?
Zitat:
Delphi-Quellcode:
type
TTest = record case Variable: Typ of // Gleich hier, statt davor (verdeutlicht besser die Bedeutung von 'Variable') Wert1: ( a: Typa; // Semilkolon b: Typb); Wert2: ( x: Typx; y: Typy); { end; } // unnötig, da variante Member ohnehin nur am Ende erlaubt end; |
Re: boolean ohne variable?
man könnte es auch einsetzen, um geziehlt bitmanipulation zu betrieben:
Delphi-Quellcode:
:mrgreen:
type
TFlags = record case boolean of TRUE: (Flags: Byte); FALSE: (F1, F2, F3, F4, F5, F6, F7: Boolean;) end; damit kann man beliebigs bits im byte ändern, aber auch das ganze byte mit einem wisch aus/einlesen stefan |
Re: boolean ohne variable?
Zitat:
(Bitte erst Testen, bevor man wilde Behauptungen aufstellt...) |
Re: boolean ohne variable?
Na ja, bei FreePascal könnte es so gehen (wenn ich mich richtig erinnere).
Da gibts sowas wie
Delphi-Quellcode:
Hab aber leider den FPC grad nicht zur Hand, kanns also nicht testen,
type TPackedBool = packed Array[0..7] of Boolean;
Ist außerdem eh ein andres Thema ;) |
Re: boolean ohne variable?
Zitat:
|
Re: boolean ohne variable?
Zitat:
Zitat:
Zitat:
da hast dich aber schnell rausgeredet :P :mrgreen: |
Re: boolean ohne variable?
Zitat:
Bzw., wer soll das verstehen ? Sagen wir mal nach 1 Jahr ? :shock: |
Re: boolean ohne variable?
Moin Hansa,
wenn Du, beispielsweise, einen Recordtypen zum Auslesen von Dateien mit Varianten Teilen versiehst, erhältst Du eine übersichtlichere Lese-/Schreibroutine für verschiedene Datensatztypen. Ausserdem schau Dir mal die Deklaration von TRect in der Hilfe an. |
Re: boolean ohne variable?
Nun denn, ich sage ja nicht, daß eine Variante absoluter Unfug ist. :mrgreen: Ich bezweifle nur den Nutzen für "normale" Programme. 8) Und die TRect-Hilfe ist die Bestätigung dafür, daß Delphi besser ist als C und Konsorten.
|
Re: boolean ohne variable?
Sry wenn ich einen alten Thread aufwärme :spin:
Hab grad das erste mal von dieser case-option gehört, ist dass dann sowas ähnliches für typen wie overload für methoden? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 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