Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi enum-Typ und array (https://www.delphipraxis.net/192679-enum-typ-und-array.html)

p80286 10. Mai 2017 11:35

enum-Typ und array
 
hallo zusammen,
ich steh mir gerade selbst auf den Füßen.
Für einen Enum-Typen möchte ich auch gleich den Klartext zur Hand haben:
Delphi-Quellcode:
type
 tEVType = (EVUndef,EVAusz,EVPausch,EVProduct);

const
  cEVType:array [min(tEVType)..max(tEVType)]=('EVundef','EVAusz','EVPausch','EVProduct');

var
  myev : tEVType;

....

 writeln(cEVTYPE[myEV]);
.....
Geht das überhaupt?

Gruß
K-H

Ghostwalker 10. Mai 2017 11:43

AW: enum-Typ und array
 
jap:

Delphi-Quellcode:
  const cEvType : array[TevType] of String = ('EVundef','EVAusz','EVPausch','EVProduct');

p80286 10. Mai 2017 11:51

AW: enum-Typ und array
 
Danke!

Gruß
K-H

SneakyBagels 10. Mai 2017 11:55

AW: enum-Typ und array
 
Zitat:

Für einen Enum-Typen möchte ich auch gleich den Klartext zur Hand haben:
Wieso wandelst du den Enum nicht in einen String um? Das vermeidet doppelte "Buchführung"

Ghostwalker 10. Mai 2017 12:09

AW: enum-Typ und array
 
Weil man den String im Regelfall nur zur Ausgabe hin benötigt. Wenn man das ganze z.B. in einer DB speichern möchte, reicht ein Byte (oder Integer)-Feld.

Alles eine Frage der Effizients :)

SneakyBagels 10. Mai 2017 12:30

AW: enum-Typ und array
 
Zitat:

Wenn man das ganze z.B. in einer DB speichern möchte, reicht ein Byte (oder Integer)-Feld.
Nirgendwo steht aber, dass er in eine Datenbank schreiben möchte.

Ghostwalker 10. Mai 2017 12:38

AW: enum-Typ und array
 
Richtig, das war aber auch nur ein Beispiel.

Es ging aber auch nicht darum den Enum zu elemenieren.

himitsu 10. Mai 2017 12:48

AW: enum-Typ und array
 
Und warum nicht Delphi das in einen String umwandeln lassen?

Delphi-Referenz durchsuchenGetEnumName / Delphi-Referenz durchsuchenGetEnumValue (TypInfo)
TRttiEnumerationType.GetName / TRttiEnumerationType.GetValue (RTTI, allerding ist das in XE private, aber klang so, als wenn sich das geändert hat ... ist eh eine saudumme Idee und ich hab sowas schon seit Jahren für mich selbst gebaut ... die ollen Nachmacher :stupid:)

Solange keiner auf die doofe Idee kommt und den Enum manuell indiziert, gibt es auch die nötigen RTTI-Infos.
Also nicht bei
Delphi-Quellcode:
type tEVType = (EVUndef=123,EVAusz,EVPausch,EVProduct);
.

Ghostwalker 10. Mai 2017 12:55

AW: enum-Typ und array
 
Stimmt...is sogar einfacher :)

p80286 10. Mai 2017 17:45

AW: enum-Typ und array
 
Gute Idee!
Da ich aber an z.B "EVAusZ" noch weitere Strings hängen habe, u.a. SQL-Abfragen, ist die erstgenannte Lösung genau das richtige.

Gruß
K-H

haentschman 10. Mai 2017 17:57

AW: enum-Typ und array
 
Hallöle...:P
Zitat:

SQL-Abfragen
...das will ich sehen. :shock: ...mit 300 Statements incl. kompletter Scripte. Imho ist ein Enum/Array denkbar ungeeignet zum "Speichern" von SQL.

Wenn du die SQL extern lagern willst schau das das Tutorial an. :thumb: http://www.delphipraxis.net/49505-sq...einbinden.html
Vom mir aus könntest du auch den Ressorcenname des SQL im Enum/Array hinterlegen. Die eigentlichen Statements liegen extern in der Ressource.

p80286 10. Mai 2017 18:18

AW: enum-Typ und array
 
Wie kommst Du auf 300?
:shock:

Gruß
K-H

haentschman 10. Mai 2017 18:36

AW: enum-Typ und array
 
:P Scherz...
Aber bei einem Statement wird es nicht bleiben. :wink: Je komplizierter die Statements werden, umso unübersichtlicher wird der QT. :? Ab wann entscheidest du dich dann für eine andere Lösung weil die Aktuelle nicht mehr reicht? Warum sich nicht gleich für eine Lösung entscheiden die sowohl mit einem Statement als auch mit 300 (:wink:) klar kommt? Der einmalige zusätzliche Aufwand ist in max. 2 Stunden erledigt und hat ca. 20 Zeilen. :wink:
Delphi-Quellcode:
function TDatabase.GetSQLByName(SQLName: string): string;
var
  SQLStream: TResourceStream;
  SQLStrings: TStringList;
begin
  Result := '';
  SQLStrings := TStringList.Create;
  try
    SQLStream := TResourceStream.Create(HInstance, SQLName, PWideChar(Ord(DatabaseTyp)));
    try
      try
        SQLStrings.LoadFromStream(SQLStream);
        Result := SQLStrings.Text;
      except
        Result := '';
      end;
    finally
      SQLStream.Free;
    end;
  finally
    SQLStrings.Free;
  end;
end;
Name rein...Statement raus. :thumb:

himitsu 11. Mai 2017 19:02

AW: enum-Typ und array
 
Ach ja, dann gibt es auch noch Delphi-Referenz durchsuchenIntToIdent und Delphi-Referenz durchsuchenIdentToInt,
was z.B. für die Umwandulng von TColor <-> Integer verwendet wird, also in Delphi-Referenz durchsuchenColorToString und Delphi-Referenz durchsuchenStringToColor,
oder als Delphi-Referenz durchsuchenIdentToCursor.

Falls sich schon mal jemand gefragt hat, wie die Farbnamen und Cursornamen in den OI und die DFM kommen.


Delphi-Quellcode:
if IdentToInt(VonString, AlsInteger, DasMapping) then
  AlsEnum := TDeinEnum(AlsInteger) // geht auch direkt, wenn der Enum 4 Byte groß ist, also genug Werte enthält (ab 16.777.215) oder siehe {$MINENUMSIZE 4}
else
  AlsEnum := ...; // oder eine Exception


if not IntToIdent(Ord(VonEnum), AlsString, DasMapping) then
  AlsString := 'nö'; // oder eine Exception

freimatz 12. Mai 2017 14:05

AW: enum-Typ und array
 
Zitat:

Zitat von himitsu (Beitrag 1370896)
Und warum nicht Delphi das in einen String umwandeln lassen?
Delphi-Referenz durchsuchenGetEnumName / Delphi-Referenz durchsuchenGetEnumValue (TypInfo)

Weil das extrem gefährlich ist. Wenn man den String z.B. in eine Configurationsdatei schreibt und wieder einliest
und dazu noch den Aufzählungstyp umbenannt ist die Software nicht mehr kompatibel.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 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