Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DWORD Array... (https://www.delphipraxis.net/99899-dword-array.html)

moonwhaler 19. Sep 2007 11:17


DWORD Array...
 
Hallo zusammen!

Ich habe eine rein technische Frage: Ich schreibe an einem kleineren Logging Mechanismus, welcher auch Zustände, bzw. Typen einer Log-Meldung speichern soll. Ich habe mir deshalb "arrays" ausgesucht, welche ich in dieser Art schreibe:

Delphi-Quellcode:
type
  // Logging STYLE array. Add new types only at the end of the list!!
  // Defines the style, read: What kind of error / ... happened
  RLogStyle = ( LOGSTYLE_NULL,
                LOGSTYLE_ERROR,
                LOGSTYLE_ACTION,
                LOGSTYLE_INFO );

Das Vorteilhafte daran ist, dass ich jederzeit diese neuen "Array Typen" einer Variablen zuweisen kann, also zum Bleistift:

Delphi-Quellcode:
var LogStyle: RLogStyle;
Fein ist auch, dass ich dies einfach speichern und sogar später wieder einlesen und sogar in den ursprünglichen "Zustand" versetzen kann, durch simples Casting.

In eine Datei schreiben....

Delphi-Quellcode:
var LogStyle: RLogStyle;
begin
  LogStyle := LOGSTYLE_ERROR;
  SaveStringToFile( IntToStr( LogStyle ) );
end;
Aus einer Datei lesen....

Delphi-Quellcode:
var LogStyle: RLogStyle;
begin
  LogStyle := RLogStyle( StrToIntDef( ReadSomethingFromFile, 0 ) );
end;
"ReadSomethingFromFile" ist einfach nur eine Beispielfunktion, die Daten aus einer Datei liest. So toll alles ist, auch Einschränkungen (und die sind für mich eigentlich ausschlaggebend) gibt es: Definiere ich einen Array fest (wie oben), kann ich nachträglich nicht einfach "zwischendrin" neue Einträge einfügen, da sich dann (logischerweise) auch der Wert verschiebt, was bedeutet, dass auch einem "LOGSTYLE_ERROR" schnell ein "LOGSTYLE_NULL" werden könnte.

Eine andere Möglichkeit, die ich aufgeschnappt habe, wäre es Konstanten zu definieren und diese als DWORD zuzuweisen. Wobei ich aber auf ein einfaches Casting beim "Zurücklesen" verzichten und eine eigene Umwandlungsfunktion schreiben müsste. Was sicherlich nicht schlecht ist, jedoch doppelten Wartungsaufwand mit sich trägt:

Delphi-Quellcode:
const
  // Defines the style, read: What kind of error / ... happened
  LOGSTYLE_NULL = 9000;
  LOGSTYLE_ERROR = 9100;
  LOGSTYLE_ACTION = 9200;
  LOGSTYLE_INFO = 9300;
Einmal bei der Konstantendeklaration selbst und dann in der Umwandlungfunktion, von Integer zu DWORD-Konstante... :(

Jetzt meine Frage: Gibt es jemanden unter Euch, der ähnliches schonmal überlegt hat und eine optimale Lösung für diese Problematik (nenne ich sie jetzt einfach mal) gefunden hat? :stupid:


Viele Grüße,
moon

jbg 19. Sep 2007 11:26

Re: DWORD Array...
 
Zitat:

Zitat von moonwhaler
"arrays"

Das was du meinst sind Aufzählungen (Enumeration) und keine Arrays.

Das mit den DWORD Konstanten kannst du auch gleich beim deklarieren des Aufzählungstyps machen:
Delphi-Quellcode:
type
  TMyEnum = (meOne = 100, meTwo = 200);
Wieso möchtest du die neuen Werte dazwischen einfügen statt sie einfach anzuhängen?

moonwhaler 19. Sep 2007 11:33

Re: DWORD Array...
 
Hi,

schonmal danke für die Antwort. Man wird immer schlauer, "Enumeration" also.
Den Tipp mit dem direkten zuweisen innerhalb der Enumeration habe ich bereits getestet und wird nicht zugelassen:

Code:
[Fehler] logging.pas(11): ',' oder ')' erwartet, aber '=' gefunden
:(

jbg 19. Sep 2007 11:57

Re: DWORD Array...
 
Du hast ja auch kein Delphi 6 oder neuer (habe ich ganz übersehen).

moonwhaler 19. Sep 2007 12:01

Re: DWORD Array...
 
So ein Mist. :(

Leider kann ich das hier nicht updaten, da sehr viele Programme noch Verwurzelungen in das alte Delphi haben, sonst hätte ich schon längst ein neues angefordert...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz