![]() |
Verwendung von Aufzählungstypen
Hallo Foristen,
ich habe eine Protokolldatei auszuwerten, in der Kategorien eingetragen wurden. Ich möchte also etwa die Häufigkeit einer Sammelkategorie „Auskunft” herausbekommen, die aus den (8) Unterkategorien 'Allgemein', 'Status', 'Befund' etc. besteht (und noch einige andere Sammelkategorien). Spontan schien mir die Verwendung von Aufzählungstypen eine Möglichkeit; nach Lektüre von Handbüchern und der Onlinehilfe stehe ich aber vor einer Wand: Ich erhalte eine Unterkategorie als String. Wie muß ich vorgehen, um etwa mit case die Zugehörigkeit einer Unterkategorie zu bestimmen, wenn ich mit set of die Unterkategorien gruppiere? Oswald |
AW: Verwendung von Aufzählungstypen
Guten Abend OsCor,
ich würde dir gerne helfen, jedoch erfasse ich die Aufgabenstellung nicht vollständig. Post doch bitte ein Stück der ini und beschreibe genau, was das Programm tun soll bzw welche Ausgabe du dir wünscht. Mike |
AW: Verwendung von Aufzählungstypen
Welche Ini-Datei? Er spricht doch von einer Protokoll-Datei.
Ein alternativer Ansatz wäre die Protokoll-Daten in eine DB zu importieren. Dort hat man sehr viele Möglichkeiten der Auswertung. Ansonsten wandelt man einen String in einen Enum mit dem Befehl ![]() Wie dir ein Set aber bei der Gruppierung der Unterkategorien helfen soll? Das kann man nur beantworten, wenn man die Daten bzw. alle möglichen Kombinationen kennt. Pauschal würde ich aber sagen, das geht so nicht |
AW: Verwendung von Aufzählungstypen
Case kann nur mit Ordinalwerten verwendet werden.
Das Umwandeln von Texten in ordinale Typen ist möglich (siehe Sir Rufo), aber rel. aufwendig. Wenn es nur um das einmalige Prüfen geht, würde ich einfach eine Funktion basteln:
Delphi-Quellcode:
Wenn Du "richtige Enum-Werte" hast (z.B. "alClient" o.ä.) und diese entsprechenden Typvariablen zuweisen willst um damit weiter zu arbeiten, ist das natürlich etwas anderes.
function IsTypeA(S: String): Boolean;
begin Result := (S = 'Allgemein') or (S = 'Status') or (S = 'Befund'); end; |
AW: Verwendung von Aufzählungstypen
Tut mir leid, dass ich das gestern zu ungenau ausgedrückt habe. Es soll die Häufigkeit des Auftretens von Mitgliedern der Kategorien A, B etc. herausgefunden werden.
KategorieA - Unterkategorie Aa - Unterkategorie Ab - Unterkategorie Ac ... KategorieB - Unterkategorie Ba - Unterkategorie Bb - Unterkategorie Bc ... Tritt also Unterkategorie Ba auf, soll die Häufigkeit der Kategorie B um 1 erhöht werden usw. Lösen wollte ich so: type TUnterA = (Unterkategorie Aa, Unterkategorie Ab, Unterkategorie Ac); type TUnterB = (Unterkategorie Ba, Unterkategorie Bb, Unterkategorie Bc); . . case KatString of Unterkategorie Aa, Unterkategorie Ab… : Inc(Häufigkeit KategorieA); Unterkategorie Ba, Unterkategorie Bb… : Inc(Häufigkeit KategorieB); @Sir Rufo GetEnumValue war mir noch nicht bekannt. Die Anzahl der möglichen Kombinationen ist übrigens bekannt. Ich möchte einfach eine unübersichtliche If...then-Orgie vermeiden. Ich hoffe, es ist jetzt klarer. Oswald |
AW: Verwendung von Aufzählungstypen
nur als Vorschlag:
in FUeberKathArray wäre nach Abarbeitung der Schleife die jeweilige Anzahl der Überkathegorien, der Rückgabewert von GetUeber ist eigenlich nur Debugkram.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,StrUtils, StdCtrls; type TUeberKathArray=Array[0..1] of Integer; TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private FUeberKathArray:TUeberKathArray; function GetUeber(UKath: String): String; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} Function TForm1.GetUeber(UKath:String):String; Const KArray:Array[0..7] of String=('K1','K1','K1','K1','K2','K2','K2','K2'); var index, KathIndex:Integer; begin index := AnsiIndexText(UKath,['UA1','UA2','UA3','UA4','UB1','UB2','UB3','UB4']); if (Index>-1) and (Index<=High(KArray)) then begin Result := KArray[index]; KathIndex := AnsiIndexText(Result,['K1','K2']); if (KathIndex>-1) and (KathIndex<=High(FUeberKathArray)) then inc(FUeberKathArray[KathIndex]); end else Result := 'KEINE AHNUNG'; end; procedure TForm1.Button1Click(Sender: TObject); begin Caption := GetUeber('ua1'); end; end. |
AW: Verwendung von Aufzählungstypen
Klasse! Die Lösung steckt also in der Verwendung der Funktionen AnsiIndexStr oder AnsiIndexText.
Jetzt muss ich nur noch schauen, wie die „Begleitmusik” für mich angepasst werden muss. Ich dachte daran, alle möglichen 35 Unterkategorien in ein einziges Array zu stecken und nach der Bestimmung des Index einfach zu sagen: 0-9 entspricht Kategorie A, 10-15 entspricht Kategorie B usw. Allerdings - eine allgemeinere Nutzungsmöglichkeit im Hinterkopf - kann man wohl die Entscheidungskriterien, also bei „case ... of 0..9: Do something” den Bereich vor dem Doppelpunkt nicht variabel gestalten. Oder doch? Oswald |
AW: Verwendung von Aufzählungstypen
Du könntest die Arrays dynamisch gestalten und die Werte z.B. in einer INI-Datei ablegen....
|
AW: Verwendung von Aufzählungstypen
Das habe ich verstanden, muß es aber ausprobieren, wie dynamisch man so etwas gestalten kann, ohne den Überblick zu verlieren.
Vielen Dank auf jeden Fall Oswald |
AW: Verwendung von Aufzählungstypen
Du könntest Die Listen auch in der Art anlegen
Code:
und entsprechend auslesen, oder
Kath1=U1K1
Kath1=U1K2 Kath1=U1K3 Kath1=U1K4 Kath1=U1K5 Kath2=U2K1 Kath2=U2K2 Kath3=U3K3 Kath3=U3K4 Kath3=U3K5
Code:
per ini (Sections lesen und über die Sections iterieren)
[Kath1]
U1k1= U1k2= U1k3= U1k4= [Kath2] U2k1= U2k2= oder, oder wobei Sir Rufo freilich recht hat, daß eine Datenbank mit Kath,Count(*) Group by Kath mit 2 gejointen Tabellen der beste Ansatz wäre. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:10 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