![]() |
Combobox mit tag
Hallo zusammen!
Ich würde gerne mit jedem Eintrag in einer Combobox einen Integerwert abspeichern. Mir ist klar, dass ich jedem Eintrag ein Objekt zuordnen kann. Da ich aber nur einen simplen Integerwert benötige, habe ich mir gedacht: Das Tolle an Objektorientierung ist, dass ich mir meine TaggedKombobox selbst bauen kann. :thumb: Ich hab dann mal mit so was
Delphi-Quellcode:
angefangen, aber leider fehlt mir der Plan, wie ich jetzt jedem String einen Integerwert (tag) anhängen kann.
TTaggedStrings = class (TStrings)
end; TTaggedComboBox = class(TComboBox) Items:TTaggedStrings; end; Natürlich kann ich doch auf die "Objektanhängvariante" ausweichen. Mich würde aber die Lösung auf diese Art interessieren. Kann mir da jemand auf die Sprünge helfen? Gruß, StTüff |
Re: Combobox mit tag
Delphi-Quellcode:
TTaggedStrings = class (TStrings)
private FTag: Integer; published Tag: Integer read FTag write FTag; public constructor Create; end; |
Re: Combobox mit tag
naja ich schätze er will die Strings der ComboBox durch seine Tag-Strings ersetzen so das er dann das ganze so aufrufen kann:
Delphi-Quellcode:
Ehm glaube ich zumindest.. Aber das dürfte unmöglich sein so wie ichs verstehe
Combobox.Strings[x].Tag
Gruß Neutral General |
Re: Combobox mit tag
Zitat:
Zitat:
|
Re: Combobox mit tag
Genau diese Zeile verstehe ich so wie ich schon gesagt habe :mrgreen:
|
Re: Combobox mit tag
Er wird sich sicherlich wieder melden und uns dann aufklären, wie er es gemeint hat ;-)
|
Re: Combobox mit tag
Zitat:
Delphi-Quellcode:
Das Problem bei deiner Idee ist, dass die ComboBox dir zwar ein TStrings-Interface gibt, intern aber eine eigene Implementierung dieser abstrakten Klasse verwendet. Die kannst du so einfach nicht erweitern. Komponenten, bei denen das vorgesehen ist, benutzen eine virtuelle Klassenfunktion zur Ermittlung der eigentlichen Klasse der nehmen ein Ereignis dafür (z.B. TTreeView.OnCreateNodeClass).
// Schreiben
Strings.Objects[idx] := Pointer(Wert); // Auslesen Wert := Integer(Strings.Objects[idx]); // NACHTRAG!!! Habe gerade gesehen, dass das bei TComboBox sogar schon vorgesehen ist! Du musst dafür GetItemsClass überschreiben:
Delphi-Quellcode:
protected
// ... function GetItemsClass: TCustomComboBoxStringsClass; virtual; abstract; |
Re: Combobox mit tag
Hallo,
Delphi-Quellcode:
So würde ich es programmieren.
procedure InsertData(const aStr : String; aValue : Integer);
begin ComboBox1.Items.AddObject(aStr, TObject(aValue)); end; function GetValue(aIdx : Integer) : Integer; begin Result := Integer(ComboBox1.Items.Objects[aIdx]); end; Gruß, pszopp |
Re: Combobox mit tag
Hallo @all!
Erst mal vielen Dank für die vielen Antworten! Noch mal zur Erklärung: Ich hatte mir den Zugriff so vorgestellt:
Delphi-Quellcode:
Da "MyCombobox.Itemx[x]" aber vom Typ TStrings ist, dachte ich, dass ich hier ansetzen und einfach für jeden enthaltenen String noch einen "Tag" hinzufügen kann.
MyCombobox.Items[X].tag := EinIntegerWert;
Zunächst ein mal habe ich jetzt aber registriert, dass die meisten es über die "Objektlösung" versuchen würden. Ich habe es auch so gelöst. Ich würde aber gerne noch mal den Ansatz von Volker weiterverfolgen, da ich so was noch nie gemacht habe und gerne an diesem Beispiel etwas dazulernen möchte. Volker schreibt: Zitat:
Wenn mir zwischenzeitlich jemand einen Vorschlag für die Unsetzung machen möchte - Ich höre gerne zu ;-) Gruß und noch mal vielen Dank an alle! StTüff |
Re: Combobox mit tag
....so, ich möchte gerne über meine ersten Schritte berichten, damit Ihr mich gleich bremsen könnt, wenn ich was falsch mache.
So weit bin ich bis jetzt gekommen:
Delphi-Quellcode:
OK, da steckt inhaltlich noch nicht viel drin, ich bin mir aber trotzdem schon unsicher, ob das alles so passt. :gruebel:
unit TaggedCoBo;
interface uses Windows, Messages, SysUtils, Classes, Controls, StdCtrls; type TTaggedComboBox = class(TComboBox) private { Private declarations } protected { Protected declarations } function GetItemsClass: TCustomComboBoxStringsClass; override; public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('My_Components', [TTaggedComboBox]); end; function TTaggedComboBox.GetItemsClass: TCustomComboBoxStringsClass; begin //Hier sollte ich jetzt wohl was machen ;-) inherited; end; end. Gruß, StTüff |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 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-2025 by Thomas Breitkreuz