Enums
spacer
Autor Nachricht
exec
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 22.12.11 00:05 
Hallo zusammen.
Ich habe vor kurzem angefangen mich in Delphi einzuarbeiten, und muss mich fragen, ob ich bei der Verwendung von Enums irgendetwas falsch mache... Wenn ich zB folgenden Code habe, sagt der Compiler mir dass das nicht geht, weil foo und bar schon definiert sind.
ausblenden Delphi-Quelltext markieren
1:
2:
3:
type
TTest1 = (FOO, BAR);
TTest2 = (FOO, BAR);

Dies ergibt für mich keinen Sinn, es sei denn die Enums haben keinen eigenen Namensraum.
Das nächste wäre dann dies:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
type
TTest1 = (FOO, BAR);
TTest2 = (FOO_, BAR_);

Meine IDE gibt mir bei der Autovervollständigung nun bei TTest1 nicht nur die eigenen Werte vor, sondern listet auch die Werte aller folgenden Enums auf. Packe ich den zweiten in einen eigenen type-Bereich funktioniert die Autovervollständigung normal.
Daher wundere ich mich, ob ich irgendetwas falsch mache, ob das ein Bug ist, oder ob Delphi was dies angeht einfach ein bisschen seltsam ist (in meinen Augen). Ich konnte bisher leider keine Antwort hierauf finden.
Ich benutze Embarcadero RAD Studio 2010.

Gruß,
exec
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15840
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Do 22.12.11 00:10 
Hallo und :welcome: im Forum!

Doch, das ist schon richtig so. Anders als bei z.B. Prism müssen auch die Werte der Enumeration eindeutig sein.
ausblenden Delphi-Quelltext markieren
1:
2:
3:
type
TConnectionKindCategories = (ckcFast, ckcSlow, ckcUnknown);
TCarSpeeds = (csFast, csSlow, csUnknown);
Das ist eine Möglichkeit damit umzugehen, so wird es auch intern in Delphi gemacht. Zum Beispiel bei TBrushStyle --> bsClear, ... oder TFontStyle --> fsBold, ...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
exec Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 22.12.11 00:20 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Hallo und :welcome: im Forum!

Danke^^

Und auch danke für die schnelle Antwort. Gut, dann muss ich das so akzeptieren.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Teekeks
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 204
Erhaltene Danke: 22

OpenSUSE 11.4
Lazarus 0.9.31
BeitragVerfasst: Do 22.12.11 11:36 
hat aber den Vorteil dass du dann nicht avar:=MyRealyLongEnum.Cool; schreiben musst, sondern nur avar:=rleCool;
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 452
Erhaltene Danke: 10

Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
BeitragVerfasst: Do 22.12.11 12:37 
Und immerhin meckert der Compiler, bei der Zuweisung.

Ich hatte letztens auch gerade den Fall, dass in zwei Enums die Werte gleich hießen. Da die Enums in verschiedenen Units waren, scheint das für Delphi kein Problem gewesen zu sein, aber Delphi meckerte dann bei meiner Zuweisung dass TTest1 und TTest2 nicht zusammenpassen.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15840
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Do 22.12.11 17:27 
user profile iconbaka0815 hat folgendes geschrieben Zum zitierten Posting springen:
Da die Enums in verschiedenen Units waren, scheint das für Delphi kein Problem gewesen zu sein
Ist es dann auch nicht. Auch Variablen und gleichnamige Klassen kannst du ja in unterschiedlichen Units problemlos deklarieren, da diese im Namespace der Unit existieren. (Sollte man nicht, klar, passiert aber bei fremden Komponenten.) Du kannst zur Klarstellung dann immer den Unitnamen davorsetzen. Das gilt auch für Werte in Enumerationen.
ausblenden UnitA.pas markieren
1:
2:
3:
4:
5:
6:
7:
type
TDemo = (MyValue, YourValue);

var
Demo: TDemo1;
begin
Demo := UnitB.MyValue;
ausblenden UnitB.pas markieren
1:
2:
type
TDemo1 = (MyValue, YourValue);
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15840
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: So 12.02.12 19:36 
Ich habe übrigens gerade den Compilerschalter gefunden, der das von dir gewünschte Verhalten herstellt:
ausblenden Delphi-Quelltext markieren
1:
{$SCOPEDENUMS ON}
Dann kannst du deine Deklaration benutzen und musst immer schreiben:
ausblenden Delphi-Quelltext markieren
1:
2:
TTest1.FOO
TTest2.FOO
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 308
Erhaltene Danke: 22

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mo 13.02.12 06:11 
Das ist leider auch das Problem bei einigen systemeigenen Prozeduren wie

Delete, eof ....

Leider ist - wahrscheinlich aus Lesbarkeitsgründen - das bei Prozeduren nicht umgesetzt worden. Wenn ich schon eine System.delete prozedur habe, wäre eine TTable.delete möglicherweise dann eine TTable.ttdelete gewesen oder ähnlich, dann hätte es keine Verwechslung gegeben und man müsste nicht System.delete schreiben.

Aber es ist ja nur ein kleines Problem. Zum Glück.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15840
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mo 13.02.12 07:04 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Leider ist - wahrscheinlich aus Lesbarkeitsgründen - das bei Prozeduren nicht umgesetzt worden.
Es wurde z.B. bei den neuen Firemonkey-Units umgesetzt. Bei den alten konnte man es aus Kompatibilitätsgründen nicht machen. Und natürlich bleibt das Präfix dabei. Man muss nur zusätzlich den Typ davorschreiben. Beispiel:
ausblenden Delphi-Quelltext markieren
1:
  Canvas.Stroke.Kind := TBrushKind.bkSolid;
Ohne Präfix wäre es ja auch absolut unübersichtlich, eben z.B. auf Grund der von dir genannten Verwechslungsgefahr bei Klassenmethoden, die ja ebenfalls den Typ davor stehen haben.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home