Announcement

Collapse
No announcement yet.

TComboBox - Dem Eintrag einem Wert hinterlegen

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

  • TComboBox - Dem Eintrag einem Wert hinterlegen

    Hallo,<p>
    es ist manchmal schon verrückt, die kompliziertesten Sachen programmiert man, aber an den einfachen Dingen scheitert man. Nun zum Problem.<p>Ich kenne den es von Scriptsprachen so, dass man man einem Texteintrag einen Wert hinterlegen kann. Also z.B.: man listet sortiert alle Dateien auf und als Wert hinterlegt man das Verzeichnis. Klickt der Anwender auf einen Eintrag, kann der dazugehörige hinterlegte Wert abgerufen werden. Irgendwie habe ich in Delphi noch nichts passendes gefunden. Wie gesagt, ich benötige das ganze für die ComboBox (TComboBox).

  • #2
    Hallo Elmar,

    hier mal eine Möglichkeit aus dem Swiss-Delphi-Center:
    <pre>
    Autor:
    Thomas Greiner <[email protected]>
    http://www.economx.com

    -------------
    ...Assoziative Arrays erzeugen
    -------------

    Oft möchte man statt einfachen Arrays assoziative Arrays benutzen. Um davon Gebrauch zu machen, bedienen wir uns einfach des Format Befehls.

    ...
    var
    DataField:Tstrings;
    ...

    procedure TForm1.Button1Click(Sender:TObject);
    begin
    DataField := TStringList.Create;
    DataField.Add(Format('%s=%s',['Jonas','15.03.1980']));
    ShowMessage(DataField.Values['Jonas'])
    // will print the Birthday of Jonas
    DataField.Free
    end;
    </pre>

    mfg Klaus-Pete

    Comment


    • #3
      Hallo Elmar,<br><br>

      Du kannst an die einzelnen Einträge einer Combobox nicht nur Werte, sondern ganze Objekte anhängen. In etwa so:<br>
      ComboBox1.Items.AddObject('1. Zeile', TObject(1));<br>
      Damit hast Du neben dem String auch noch die Zahl 1 (als Zeiger) angehängt.<br>
      Wenn Du die 1 wieder auslesen willst, dann so:<br>
      Wert := Integer(ComboBox1.Objects[ZeilenNr]);<br>
      Ist zwar nicht getestet, aber so ähnlich müßte es gehen.<br><br>

      Gruß Dagmar

      Comment


      • #4
        Hallo,<P>
        <b>@Klaus-Peter:</b><br>Jo, an so was hatte ich schon gedacht, funktioniert auch ganz gut, hat aber einen keinen Nachteil, sobald "Value" mehrmals mit dem gleichen Bezeichner auftritt, funktioniert das ganze so einfach nicht mehr. Also so in etwas:
        <pre>
        ....Add(Format('%s=%s',['Zahl','0']));
        ....Add(Format('%s=%s',['Text','Text1']));
        ....Add(Format('%s=%s',['Text','Text2']));
        usw.
        </pre>
        Ich kann nicht ausschliessen in der Liste, dass der Bezeichner mehrmals auftreten kann.<p>
        <b>@Dagmar:</b><br>
        An diese Möglichkeit habe ich auch schon gedacht, mit <b>AddObject</b> zu arbeiten. Halte ich bei langen Listen nicht gerade für sinnvoll. Ausserdem erscheint mir diese Möglickeit zu speicherfressend, da jedesmal ein neuer Zeiger angelegt werden muss

        Comment


        • #5
          Hallo Elmar<br>ich halte Dagmar's Vorschlag für genau den richtigen Vorschlag. Der "Zeiger" wird sowieso von TComboBox mitgeführt (egal wie lang die Liste ist). Dabei handelt es sich um ein Feld vom Type TObject. Wenn in diesem Feld ein Objekt abgelegt wird, befindet sich dort wirklich ein Zeiger auf ein Objekt. Da aber ein Zeiger auch nur ein 32 Bit Wert ist, kann man dieses Feld "mißbrauchen", um dort einen Integer Wert zu hinterlegen.
          TObject(1) erzeugt kein neues Objekt, sondern gaukelt dem Compiler vor, daß man ein Objekt hinzufügt. Auslesen kannst Du den Wert folgendermaßen:<br>
          aInt : Integer<br>
          aInt:=Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);<br>Jens Schuman

          Comment


          • #6
            Hallo Jens,

            ich habe Deinen Vorschlag aufgegriffen und in mein Programm eingebaut. Das spart mir eine zusätzliche ListBox pro ComboBox. Vorausgesetzt Du kannst mir sagen wie ich auf den "Zeiger" suchen kann.

            i:=ComboBox1.Items.IndexOfObject(1);

            geht nicht.

            Gruss Klau

            Comment


            • #7
              Hallo Klaus,<br>so sollte es klappen:<br>i:=Integer(ComboBox1.Items.IndexOfObje ct(TObject(1)));<br>Jens Schuman

              Comment


              • #8
                Hallo,<p>
                alles soweit schön und gut, hat jemand noch einen vernünftigen Idee, wie sich das ganze mit einer String-Zeichenkette relisieren lässt, also anstatt einer Zahl, eine Zeichenkette

                Comment


                • #9
                  Moin Elmar<br><br>

                  wenn Du neben dem eigentlichen (sichtbaren) Eintrag in der Combobox noch einen anderen String zu jeder Zeile unterbringen willst, dann wandelst Du den mit PChar(...) in einen Zeiger auf einen nullterminierten String um. In etwa so: <br><br>

                  ComboBox1.Items.AddObject('1. Zeile', PChar('Mein Zusatztext'));<br><br>´

                  Die Anweisung zum Auslesen hab' ich grad nicht zur Hand, müsste aber so ähnlich wie beim Integer sein. Vielleicht kann Jens noch weiterhelfen.

                  Gruß Dagmar

                  Comment


                  • #10
                    Nein. So geht das nicht. Der Typ muß TObject sein, also:<br>ComboBox1.Items.AddObject('2. Zeile', TObject(PChar('adsdas')));<br>Und zum Auslesen: aStr:= PChar(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
                    Showmessage((aStr));<br><br>Gruß Ale

                    Comment


                    • #11
                      Hallo,<p>
                      seltsam, genau so wie Alex beschrieben, hatte ich das ganze auch schon (dachte schon ich bin ganz doof), aber aus irgendeinem Grund beschwert sich der Debugger in dieser Zeile.<br>
                      Irgendwie kriege ich das Gefühl nicht los, dieses Programm verar.... mich

                      Comment

                      Working...
                      X