enum Strings



  • Hallo,

    ist wahrscheinlich ganz einfach, aber ich komm nicht drauf. Ich möchte zwecks besserer Lesbarkeit den String eines enum Wertes in ein Label schreiben.

    enum ePrinter {HP, Epson, Mimaki};
    
    ePrinter PrinterType;
    
    ....
    
    // PrinterType = 1 = Epson
    
    Label1->Caption = "Printer Typ = " + ???;
    // da sollte in Label1 stehen "Printer Typ = Epson"
    

    wie komme ich an den String "Epson" über PrinterType ?

    Danke und Gruß

    WoWe



  • enum ePrinter {HP, Epson, Mimaki};
    

    enums sind keine Strings sonder vom Prinzip her zahlen.

    HP ist hier =0;
    Epson=1;
    Mimaki=2;

    also nixs mit Strings, leider.



  • hab's jetzt so gemacht:

    enum ePrinter {HP, Epson, Mimaki}; 
    AnsiString sPrinter[] = {"HP","Epson","Mimaki"};
    
    ePrinter PrinterType; 
    
    .... 
    
    // PrinterType = 1 = Epson 
    
    Label1->Caption = "Printer Typ = " + sPrinter[PrinterType];
    

    Ich dachte das geht irgendwie einfacher ?!



  • geht das nicht irgendwie mit einem String-Replacement ?

    so funzt es jedenfalls nicht:

    #define Printer1 "HP"
    #define Printer2 "Epson"
    #define Printer3 "Mimaki"
    
    enum ePrinter {Printer1,Printer2,Printer3};  
    AnsiString sPrinter[] = {Printer1,Printer2,Printer3};
    


  • Dir ist doch auch klar, warum es nicht funktioniert?
    Was macht der Präprozessor nach den #defines aus dem Ausdruck

    enum ePrinter {Printer1,Printer2,Printer3}; ?
    

    ...Und wer oder was ist ein Mimaki?



  • Ja, ist mir schon klar dass das so nicht funktioniert, war auch nur ein Beispiel mit dem ich zeigen will was ich machen möchte. Vielleicht hat ja jemand noch eine Idee wie das geht. Ich möchte halt einfach vermeiden die "Drucker" zweimal einzugeben und so ein Tippfehler zuvermeiden.

    PS Mimaki ist auch ein Druckerhersteller.



  • Die variante mit dem Array ist doch sauber?

    Wenn du jetzt noch das erste Element explizit nullst

    enum
    {
        bla = 0,
        schwaetz,
        plauder
    }
    

    Dann ists perfekt (o;

    -junix

    [edit]Aus Erfahrung noch ein Tip mit für die Verwendung solcher enums: Mach noch den Eintrag "enum_bla_last" oder so, damit kast du dann auch automatisch immer einen Wert für die Anzahl Elemente im Enum.[/edit]



  • junix schrieb:

    Mach noch den Eintrag "enum_bla_last" oder so, damit kast du dann auch automatisch immer einen Wert für die Anzahl Elemente im Enum.

    Hi junix,

    dein Tip hab ich noch nicht verstanden. Wie meinst du das denn genau ?



  • Ok, also du hast z.B. folgenden Enum:

    enum EventHandles
    {
        COMPORT_OPEN = 0,
        COMPORT_CLOSED,
        COMPORT_WRITTEN,
        COMPORT_READ,
        COMPORT_LAST
    }
    

    Nun steht bei CLOSED implizit "= 1", bei Written "= 2", etc. bei Last steht entsprechend "= 4". Willst du nun z.B. ein handle-Array deklarieren, das du mit CreateEvent() befüllen willst, dann kannst du das folgendermassen machen:

    HANDLE MyComportEvents[COMPORT_LAST]
    /* und anschliessend befüllen */
    MyComportEvents[COMPORT_OPEN] = CreateEvent(...);
    

    Wieso das? COMPORT_LAST enthält (sofern du nicht irgndwo dazwischen was anderes zuweist und brav den Compiler numerieren lässt) immer die Anzahl der Elemente die du deklariert hast...

    Ich hoffe das war nu verständlicher (o:

    -junix



  • Ah, jetzt ja 🙂

    Danke !



  • Wenn du eine synchrone Liste von Konstanten und zugehörigen Strings haben möchtest, kannst du das so machen:

    1. du erzeugst eine Datei "printers.h"

    // printers.h:
      STRING(HP),
      STRING(Epson),
      STRING(Mimaki)
    

    2. Du verwendet die Liste mit verschiedenen Makrodefinitionen

    // .cpp - File:
      #define STRING(x) x      // Dummy Macro 
    
      enum ePrinter {
        #include "printers.h"  // hier werden die Worte als Symbole verwendet
      };
    
      #undef STRING
      #define STRING(x) #x     // Makroargument wird zum String
    
      AnsiString sPrinter[] = {
        #include "printers.h"  // hier werden die Worte als Strings verwendet
      };
    
      Label1->Caption = sPrinter[Epson]; // ergibt den String "Epson"
    

    (lohnt sich natürlich nur bei größeren Listen, die sonst leicht unübersichtlich werden)


Anmelden zum Antworten