Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Combobox mit tag (https://www.delphipraxis.net/76151-combobox-mit-tag.html)

Flocke 31. Aug 2006 07:57

Re: Combobox mit tag
 
Zitat:

Zitat von StTüff
Ich werde das mal versuchen (auch wenn ich noch keinen Plan habe wie das geht) und mich dann noch mal melden.

Wenn mir zwischenzeitlich jemand einen Vorschlag für die Unsetzung machen möchte - Ich höre gerne zu ;-)

Du solltest dir in der Datei StdCtrls.pas die Klassen TCustomComboBoxStrings und TComboBoxStrings ansehen (sofern du ein Delphi mit Quelltexten hast). Die müsstest du nach deinen Wünschen erweitern und dann diese Klasse in TTaggedComboBox.GetItemsClass zurückgeben.

Allerdings solltest du bedenken, dass TComboBox nur eine objektorientierte Kapselung für die normale Windows-ComboBox ist und ein TCustomComboBoxStrings-Objekt die Elemente nicht beinhaltet sondern nur verwaltet. Dazu gehört auch ein 32-Bit-Wert mit anwendungsspezifischen Daten je Eintrag, und der wird von Delphi eben für die Eigenschaft Objects "missbraucht".

StTüff 31. Aug 2006 08:03

Re: Combobox mit tag
 
Hallo Volker!

Ich habe eben schon den StdCtrls durchsucht. Das mit dem Erweitern von TComboBoxStrings war nun der entscheidende Hinweis. Ich glaube jetzt komme ich weiter.

Vielen Dank!

StTüff

StTüff 31. Aug 2006 08:33

Re: Combobox mit tag
 
Was meint Ihr dazu:

Delphi-Quellcode:
unit TaggedCoBo;

interface

uses
  Windows, Messages, SysUtils, Consts, Classes, Controls, StdCtrls;

type
  TTaggedComboBox = class(TComboBox)
  private
    { Private declarations }
  protected
    { Protected declarations }
    function GetItemsClass: TCustomComboBoxStringsClass; override;
  public
    { Public declarations }
  published
    { Published declarations }
  end;

  TTaggedComboBoxStrings = class (TCustomComboBoxStrings)
  public
    function Addnew(const S: string; tag: integer): Integer;
    //Insert ist noch nicht berücksichtigt....
    procedure Insert(Index: Integer; const S: string); override;
    function GetTag (idx: integer): integer;
  private
    TagArray: array of integer;
    function Add(const S: string): Integer; override;
  end;


procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyComponents', [TTaggedComboBox]);
end;

function TTaggedComboBox.GetItemsClass: TCustomComboBoxStringsClass;
begin
  //Hier die Modifizierte Stringklasse zurückgeben
  Result := TTaggedComboBoxStrings;
  //inherited;
end;

function TTaggedComboBoxStrings.Addnew(const S: string; tag: integer): Integer;
begin
  //Den Tag verwalten
  //String in das Array an der letzten Position einfügen
  SetLength(TagArray, high(TagArray)+1);
  TagArray[high(TagArray)];
  //Das eigentliche Add aufrufen
  Result:=Add(S);
end;

function TTaggedComboBoxStrings.GetTag (idx: integer): integer;
begin
  if idx <= high(TagArray) then
    Result:=TagArray[idx];
end;

function TTaggedComboBoxStrings.Add(const S: string): Integer;
begin
  Result := SendMessage(ComboBox.Handle, CB_ADDSTRING, 0, Longint(PChar(S)));
  if Result < 0 then
    raise EOutOfResources.Create(SInsertLineError);
end;

procedure TTaggedComboBoxStrings.Insert(Index: Integer; const S: string);
begin
  if SendMessage(ComboBox.Handle, CB_INSERTSTRING, Index,
    Longint(PChar(S))) < 0 then
    raise EOutOfResources.Create(SInsertLineError);
end;

end.
Mal abgesehen davon, dass "Insert" noch nicht berücksichtigt ist, könnte es doch in der Art gehen, oder?
(Ist noch nicht getestet...)

Gruß,

StTüff


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 Uhr.
Seite 2 von 2     12   

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