Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi enum und Strings (https://www.delphipraxis.net/110008-enum-und-strings.html)

oki 11. Mär 2008 16:17


enum und Strings
 
Sorry,

meine Suche ging ins leere und ein ordentlicher Titel ist mir auch nicht eingefallen. Ich erkläre erst mal wie ich es sonnst mache und dann die neue Aufgabenstellung. Es soll ja auch noch jemand durchsehen. :lol:

Ich habe eine Reihe von Fehlercodes die ich als Resourcestrings definiere. Dann einen Aufzählungstyp für meine Fehlercodes und zum Schluss ein Array mit den Strings.

Delphi-Quellcode:
resourcestring
  rs_Error1 = 'Error 1';
  rs_Error2 = 'Error 2';
  rs_Error3 = 'Error 3';
  rs_Error4 = 'Error 4';


type
  TMyErrors = (
  me_Error1,
  me_Error2,
  me_Error3,
  me_Error4
  );

const
  MyErrorStrings : Array[TMyErrors] of String = (
  rs_Error1,
  rs_Error2,
  rs_Error3,
  rs_Error4
  )
Taucht im Programmablauf ein Fehler auf und ich will diesen Anzeigen, so kann ich diesen wie folgt ausgeben:

Delphi-Quellcode:
procedure AddErrorString(Error : TMyError)
begin
  Memo.Lines.Add(MyErrorString[Error]);
end;
Das ist als Beispiel gedacht, sollte aber genügen.

Jetzt das Problem:
Ich bekomme Errors als Integer-Wert geliefert. Diese sind aber leider etwas aus der Reihe. Es gibt die Errors 1 und 2 und dann zum Bsp. 30 und 41(und ne Menge mehr). Mit dem Aufzählungstyp ist das ja noch hin zu bekommen:

Delphi-Quellcode:
type
  TMyErrors = (
  me_Error1,
  me_Error2,
  me_Error30 = 30,
  me_Error41 = 41
  );
aber dann ist bei mir Schluss. Muß ich jetzt wirklich eine eigene Function für meine Errorcodes schreiben wie:

Delphi-Quellcode:
function GetErrorString(Error : TMyError) : String;
begin
  case Error of
    me_Error1 : Result := rs_Error1;
    me_Error2 : Result := rs_Error2;
    me_Error30 : Result := rs_Error30;
    me_Error41 : Result := rs_Error40;
  end;
end;
oder gibt es einen Deklarationsweg wie oben?

Ich hoffe, ich hab mich jetzt nicht zu sehr geoutet, aber es gibt ja nur dumme Antworten und keine dummen Fragen. :)

Gruß oki

Dax 11. Mär 2008 16:20

Re: enum und Strings
 
Eigentlich müsste Delphi doch mit lückenhaften Enums klarkommen und automatisch ein Array mit nil-Einträgen anlegen?

Apollonius 11. Mär 2008 16:23

Re: enum und Strings
 
Das wäre aber recht ineffektiv, wenn die Fehlercodes einen großen Bereich abdecken.

oki 11. Mär 2008 16:24

Re: enum und Strings
 
Ähmmm,

lückenhafte Enums sind kein Problem, aber wie deklariert man dann das Array? Entweder man füllt die Lücken mit Leerstrings ( :kotz: dann lieber eine Function) oder ....???

Gruß

marabu 11. Mär 2008 17:27

Re: enum und Strings
 
Hallo oki,

mag sein, dass mir die Feinheiten deines Ansatzes gerade entgehen, aber ich würde anders vorgehen. Wenn du mit externen String-Ressourcen arbeitest, dann bekommst du die Abbildung von Fehlercodes auf Fehlermeldungen quasi geschenkt.

Füge dein Resource-Script dem Projekt hinzu:

Code:
/* ErrMsg.rc */

STRINGTABLE
BEGIN
  1,  "Error#1"
  2,  "Error#2"
  31, "Error#31"
  41, "Error#41"
END
In deinem Programm funktioniert dann das hier:

Delphi-Quellcode:
function AppErrorMessage(msgid: Integer): string;
begin
  Result := LoadStr(msgid);
  if Result = '' then
    Result := 'Application Error #' + IntToStr(msgId);
end;
Empfehlenswert sind noch Konstanten für die Fehlercodes.

Freundliche Grüße

oki 11. Mär 2008 19:27

Re: enum und Strings
 
Hi Marabu,

das mit der Stringtable kenne ich so nicht. Aber da sollte mir die OH weiterhelfen. Leider sind das was ich brauche Fehlermeldungen eines GSM-Modems, also CME und CMS-Fehlercodes. Somit sehe ich für externe Stringressourcen die quasi mit benutzen kann schwarz.

Wie gesagt, ich schau mich mal zu dem Thema Stringtable um und melde mich noch mal.

Dank und Gruß
oki

oki 11. Mär 2008 19:41

Re: enum und Strings
 
Jo,

so wie es aussieht läuft das auf die Verwendung von Ressourcestrings hinaus. Da ich aber diverse Ressourcestrings verwende (wegen Übersetzung in mehrere Sprachen) sehe ich da einige Probleme; besser gesagt keinen rechten Ansatz wie ich das bewerkstelligen soll. Das Thema Stringtable glaub ich aber verstanden zu haben. In meinem ersten Beispiel erstellt die IDE aus meinen als Ressourcestring deklarierten Stringkonstanten genau so eine Stringtable - glaube ich -.

Imho kann ich dann auch eine entsprechende Function GetErrorStr schreiben. Läuft somit aufs gleiche raus.

Damit setze ich den Thread auf beantwortet und danke allen für die Hilfe,

Gruß oki

bluesbear 11. Mär 2008 20:45

Re: enum und Strings
 
Zitat:

Zitat von oki
Imho kann ich dann auch eine entsprechende Function GetErrorStr schreiben. Läuft somit aufs gleiche raus.

Ich finde das ist sowieso die als Quellcode am einfachsten zu lesende und am besten zu wartende Variante. Insbesondere in Bezug auf Mehrsprachigkeit. Also nach meiner Erfahrung mit einem Monsterprojekt. Jfyi...
Ok, diese Forumsmessage war vermutlich nicht besonders hilfreich, aber ich wollte auch nochmal was schreiben hier :stupid:

oki 11. Mär 2008 20:57

Re: enum und Strings
 
Hi bluesbear,
wenn du gerne was schreiben willst; darfst du in meinem Thread. :lol:

Aber zurück zum Thema. Ja, an vielen stellen ist eine Function angebracht. Auch gerade bei großen Projekten hab ich es mir teilweise angewöhnt solche Konstanten und Typen an einer Stelle zu definieren. Das scheint dann wieder übersichtlicher. Manchmal ist es aber auch nur Geschmackssache.

Gruß oki

bluesbear 11. Mär 2008 21:23

Re: enum und Strings
 
Zitat:

Zitat von oki
Manchmal ist es aber auch nur Geschmackssache.Gruß oki

Ja, wenn ich mich z.B. nach 8 Jahren oder so erinnern soll, was ich damals eigentlich da gemacht habe, find ich das einfach einfacher, wenn das da mit sonem schönen case Konstrukt da steht. Da brauch ich nicht soviel zu erinnern und denken <g>. Das wollte ich nur mal so dazusagen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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 by Thomas Breitkreuz