Einzelnen Beitrag anzeigen

e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
156 Beiträge
 
Delphi 6 Enterprise
 
#1

ComboBox mit Integer-IDs

  Alt 9. Sep 2022, 12:30
Hallo zusammen,

ich arbeite gerne mit ComboBoxen. Allerdings stehe ich immer wieder vor dem Problem, dass ich nicht nur eine Sting-Liste benötige, sondern zusätzlich noch eine ID, die oft nicht mit ItemIndex übereinstimmt.

Wenn ich beispielsweise Daten sortiert aus einer Datenbank lese, wäre es oft praktisch mit dem Text auch gleich den Index des Datensatzes zu haben, statt diesen erst mit einer zusätzlichen Abfage über den Text zu ermitteln.

Deshalb schrieb ich diese eigene kleine Komponente:

Delphi-Quellcode:
unit BaBiCtrls2;

interface

  uses
    StdCtrls, Classes;

  type
  { TIdComboBox }

    TIdComboBox = class(TComboBox)
    private
      FIds: TList;
      procedure SetId(Index,Id: Integer);
      function GetId(Index: Integer): Integer;
    public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
      procedure AddIdItem(const s: string; const Id: Integer);
      property Id[Index: Integer]: Integer read GetId write SetId;
    end;


  procedure Register;


implementation

  procedure Register;
  begin
    RegisterComponents('BaBi', [TIdComboBox]);
  end;


  { TIdComboBox }

  constructor TIdComboBox.Create(AOwner: TComponent);
  begin
    inherited Create(AOwner);
    FIds:= TList.Create;
  end;

  destructor TIdComboBox.Destroy;
  begin
    FIds.Free;
    inherited;
  end;

  function TIdComboBox.GetID(Index: Integer): Integer;
  begin
    if Index<FIds.Count then
      Result:= Integer(FIds[Index])
    else
      Result:= 0;
  end;

  procedure TIdComboBox.SetId(Index: Integer; Id: Integer);
  begin
    while Index>=FIds.Count do FIds.Add(Pointer(0));

    if Id <> GetId(Index) then
    begin
      FIds[Index]:= Pointer(Id);
    end;
  end;

  procedure TIdComboBox.AddIdItem(const s: string; const Id: Integer);
  var Index: Integer;
  begin
    Index:= Items.Count;
    Items.AddObject(s,TObject(Self));
    SetId(Index,Id);
  end;

end.
Generell tut sie, was ich will. Allerdings habe ich das Problem, wenn direkte Operationen über die String-Liste (ComboBox1.Items) durchgeführt werden. Add ist ja kein Problem, aber Insert, Delete, Sort,... - eben alles, was die Reihenfolge beeinflusst.

Kann mir jemand sagen, wie ich diese Operationen abfangen kann oder zumindest mitbekomme, dass sowas ausgeführt wurde?

Gruß
e-gon
  Mit Zitat antworten Zitat