Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Verwendung von Aufzählungstypen (https://www.delphipraxis.net/158396-verwendung-von-aufzaehlungstypen.html)

OsCor 15. Feb 2011 21:51

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

Mike_ 15. Feb 2011 22:16

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

Sir Rufo 15. Feb 2011 23:11

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 Delphi-Referenz durchsuchenGetEnumValue um.
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

stahli 15. Feb 2011 23:37

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:
function IsTypeA(S: String): Boolean;
begin
  Result := (S = 'Allgemein') or (S = 'Status') or (S = 'Befund');
end;
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.

OsCor 16. Feb 2011 07:30

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

Bummi 16. Feb 2011 07:52

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.

OsCor 16. Feb 2011 08:44

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

Bummi 16. Feb 2011 09:34

AW: Verwendung von Aufzählungstypen
 
Du könntest die Arrays dynamisch gestalten und die Werte z.B. in einer INI-Datei ablegen....

OsCor 16. Feb 2011 10:18

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

Bummi 16. Feb 2011 10:30

AW: Verwendung von Aufzählungstypen
 
Du könntest Die Listen auch in der Art anlegen
Code:
Kath1=U1K1
Kath1=U1K2
Kath1=U1K3
Kath1=U1K4
Kath1=U1K5
Kath2=U2K1
Kath2=U2K2
Kath3=U3K3
Kath3=U3K4
Kath3=U3K5
und entsprechend auslesen, oder
Code:
[Kath1]
U1k1=
U1k2=
U1k3=
U1k4=
[Kath2]
U2k1=
U2k2=
per ini (Sections lesen und über die Sections iterieren)

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 02:15 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