Announcement

Collapse
No announcement yet.

String in Wertemenge

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • String in Wertemenge

    Hallo Leute,

    ich habe folgendes Problem. Ich habe einen String und möchte wissen, ob er zu einer vorher definierten Wertemenge gehört.
    Wertemenge:
    TN
    SP
    1M
    3M

    Ist der String nun in der Wertemenge definiert, so soll True herauskommen. Wie bekomme ich sowas hin?

    Ich habe zuerst an den Type-Befehl gedacht. Aber
    <PRE>
    sowohl
    TYPE TBucket = (TN, SP, SN, 1M);
    als auch
    IF sBucket IN Tbucket THEN True
    </PRE>
    führen zu einer Fehlermeldung.

    Vielleicht hat jemand einen guten Tip auf Lager?

    Grüsse,
    Carsten

  • #2
    Da hast du aber ein massives Verstaendnisproblem.<br>
    TYPE ist kein Befehl.<br>
    Eine Wertemenge von Strings kann doch nur aus Strings bestehen.<br><br>
    Du moechstes also prüfen ob ein String in einer Liste von Strings enthalten ist.<br>
    Ich glaube du solltest erst mehr über Pascal lernen, damit du ein Beispiel auch vollständig inhaltlich verstehen kannst

    Comment


    • #3
      Vielleicht habe ich mich da etwas falsch ausgedrückt.
      Mit Type wollte ich den Datentyp definieren, also meine Stringliste, wenn möglich.

      Ja, Ziel ist es, zu prüfen, ob ein String in einer Liste von Strings enthalten ist.

      Hast Du da eine gute Idee ?

      Grüße,
      Carste

      Comment


      • #4
        Hallo,

        man könnte objektorientiert herangehen auf auf die Methode <b>IndexOf</b> von <b>TStringList</b> zurückgreifen. Dies hätte zudem den Vorteil, dass der Inhalt der Stringliste zur Laufzeit variieren kann:
        <pre>
        unit Unit1;

        interface

        uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls;

        type
        TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        private
        { Private-Deklarationen }
        FSL : TStringList;
        public
        { Public-Deklarationen }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.dfm}

        procedure TForm1.FormCreate(Sender: TObject);
        begin
        FSL := TStringList.Create;
        FSL.Add('Eins');
        FSL.Add('Zwei');
        FSL.Add('Drei');
        end;

        procedure TForm1.Button1Click(Sender: TObject);
        var
        sTest : String;
        begin
        sTest := 'Zwei';
        if FSL.IndexOf(sTest) > 0 then
        ShowMessage('Gefunden.');
        end;

        end.
        </pre&gt

        Comment


        • #5
          Hi Carsten,<br>
          mir fallen zwei Möglichkeiten ein: Entweder<pre>
          const
          MeineStrings: array[0..3] of string = ('TN', 'SP', 'SN', '1M');
          </pre>
          plus eine Funktion, die einen String in diesem Array sucht und ggfs. den Index zurückliefert. <b>ODER</b><pre>
          var
          sl: TStringList;
          idx: Integer;
          begin
          sl := TStringList.Create;
          sl.Add('TN');
          sl.Add('SP');
          sl.Add('SN');
          sl.Add('1M');
          idx := sl.IndexOf(SuchString);
          sl.Free;
          end;
          </pre>
          Beide Varianten sind natürlich hochgradig ungetestet! :-)
          <br>HTH, Uli

          Comment


          • #6
            Ulrich, das ist es was er wohl haben will.<br>
            Kleiner Tipp am Rande: "array[0..3] of PChar" ist funktionell identisch und hat ein paar nicht so offensichtliche Vorteile.<br>
            Bei string legt der Compiler eine heimliche initialization und finalization Sektion an, in der die Strings dynamisch alloziiert bzw freigegeben werden

            Comment


            • #7
              <pre>

              <code><font size=2 face="Courier New"><b>uses </b>TypInfo;
              <br>
              <b>type
              </b>TMyEnum = (Red, Green, Blue);
              <br>
              <b>function </b>StringToMyEnum(<b>const </b>Value: <b>String</b>): TMyEnum;
              <b>begin
              </b>Result := TMyEnum(GetEnumValue(TypeInfo(TMyEnum), Value));
              <b>end</b>;
              <br>
              <b>function </b>MyEnumToString(Value: TMyEnum): <b>String</b>;
              <b>begin
              </b>Result := GetEnumName(TypeInfo(TMyEnum), Integer(Value));
              <b>end</b>;
              <br>
              <b>function </b>StringInMyEnum(<b>const </b>Value: <b>String</b>): Boolean;
              <b>var
              </b>Enum: Integer;
              <b>begin
              </b>Enum := GetEnumValue(TypeInfo(TMyEnum), Value);
              <b>with </b>GetTypeData(TypeInfo(TMyEnum))^ <b>do
              </b>Result := (Enum &gt;= MinValue) <b>and </b>(Enum &lt;= MaxValue);
              <b>end</b>;
              <br>
              <b>procedure </b>Test;
              <b>begin
              </b>WriteLn( MyEnumToString(StringToMyEnum('Red')) );
              WriteLn( MyEnumToString(StringToMyEnum('Green')) );
              WriteLn( MyEnumToString(StringToMyEnum('Blue')) );
              WriteLn( MyEnumToString(StringToMyEnum('BLUE')) );
              <br>
              WriteLn( StringInMyEnum('GrEeN') );
              WriteLn( StringInMyEnum('Cyan') );
              <br>
              <i>// d.h. ersetze alle TMyEnum mit TBucket und fertig ist es
              </i><b>if </b>StringInMyEnum(Value) <b>then </b>...
              <b>end</b>;
              </font>
              </code></pre>
              &#10

              Comment


              • #8
                Super, das ist genau das, was ich brauch und man ist sehr flexibel.

                Ein kleiner Schönheitsfehler noch:
                <PRE>
                if FSL.IndexOf(sTest) >= 0 then // der erste Eintrag hat den Index 0
                ShowMessage('Gefunden.');
                </PRE&gt

                Comment


                • #9
                  <pre>

                  <code><font size=2 face="Courier New"><i>// nochmal eine flexiblere Kurzform
                  <br>
                  </i><b>uses </b>TypeInfo;
                  <br>
                  <br>
                  <b>function </b>StringInEnum(<b>const </b>Value: <b>String</b>; TypeInfo: PTypeInfo): Boolean;
                  <b>var
                  </b>Enum: Integer;
                  <b>begin
                  </b>Enum := GetEnumValue(TypeInfo, Value);
                  <b>with </b>GetTypeData(TypeInfo)^ <b>do
                  </b>Result := (Enum &gt;= MinValue) <b>and </b>(Enum &lt;= MaxValue);
                  <b>end</b>;
                  <br>
                  <b>type
                  </b>TBucket = (TN, SP, SN, OM);
                  <br>
                  <b>procedure </b>Test;
                  <b>begin
                  if </b>StringInEnum('TN', TypeInfo(TBucket)) <b>then
                  end</b>;
                  </font>
                  </code></pre&gt

                  Comment

                  Working...
                  X