TComoboxdan Yeni bir combo oluşturma sorunu.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

TComoboxdan Yeni bir combo oluşturma sorunu.

Mesaj gönderen seho »

TComboboxdan türeterek bir combo yapmak istiyorum. Yeni yapacağım comboda FieldValues isminde bir property olcak. Bu property items gibi birden fazla string girmek istiyorum dizi şeklinde.

Yaptığım kadarı ile kodu aşağıda veriyorum.

Kod: Tümünü seç

unit YGCombo;

interface

uses
  Windows, SysUtils, Classes, Controls, StdCtrls, Dialogs;

type
  TYGCombo = class(TComboBox)
  private
    { Private declarations }
    FFieldValues : TStrings;
    procedure SetFieldValues(const Value: TStrings);
  protected
    { Protected declarations }

  public
    { Public declarations }
  published
    { Published declarations }
    Property  FieldValues :  TStrings read FFieldValues Write SetFieldValues;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('YG', [TYGCombo]);
end;

procedure TYGCombo.SetFieldValues(const Value: TStrings);
begin
  FFieldValues:=Value;
end;

end.
Takıldığım nokto StringListi nerede create etmem gerekiyor.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: TComoboxdan Yeni bir combo oluşturma sorunu.

Mesaj gönderen Lost Soul »

Kod: Tümünü seç

unit YGCombo;

interface

uses
  Windows, SysUtils, Classes, Controls, StdCtrls, Dialogs;

type
  TYGCombo = class(TComboBox)
  private
    { Private declarations }
    FFieldValues : TStrings;
    procedure SetFieldValues(const Value: TStrings);
  protected
    { Protected declarations }

  public
    { Public declarations }
    constructor   Create(AOwner : TComponent); override;
    destructor    Destroy; override;
  published
    { Published declarations }
    Property  FieldValues :  TStrings read FFieldValues Write SetFieldValues;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('YG', [TYGCombo]);
end;

constructor TYGCombo.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FFieldValues := TStringList.Create;
end;
{=====================}
destructor TYGCombo.Destroy;
begin
  FFieldValues.Free;
  inherited Destroy;
end;

procedure TYGCombo.SetFieldValues(const Value: TStrings);
begin
  FFieldValues:=Value;
end;

end.
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: TComoboxdan Yeni bir combo oluşturma sorunu.

Mesaj gönderen seho »

S.A
Verdiğiniz örnekteki gibi constructor,destructor fonksiyonlarını ekledim şu anda sorunsuz çalışıyor. Yapmak istediğim son bir şey var Field'Value' isminde bir property ekleyeceğim. Comboda da seçilen seçeneğin "FieldValues' deki değerini alarak "FieldValue" özelliğine yazdıracağım. Ayrıca Value kısmına bir değer yazdırdığımda da bu değeri "FieldValues" deki değere bakarakak eşit olan değerin index numarasını alarak combobxda seçili hale gitirecek.

2. kısmı yani "FieldValue" ye yazılan değeri "FiledValues' de bulup seçili hale getirmesini yaptım. Bunun için

Kod: Tümünü seç

Property  FieldValue :  String read FValue Write DegerOku;
Bu propertiyi ekledim. Burdaki "DegerOku" fonksyonunu FieldValue ye değer girdiğimizde çalışacak olan fonksiyon. Bunuda aşağıda veriyorum.

Kod: Tümünü seç

procedure TYGCombo.DegerOku(const Value: String);
begin
  ItemIndex:=FieldValues.IndexOf(Value);  
  FValue := Value;
end;
Bu kısımda görüldüğü gibi girien değeri "indexOf" komutu ile "FieldValues" deki index numarasını alıyorum aldığım index numarasınıda "itemindex" e eşitleyerek comboyu seçili hala getiriyorum.

Şindi takıldığım nokta bunum tam tersi olarak Comboboxda bir seçeneği seçtiğimizde bu seçeneğin "FieldValues" deki değerini bularak "FieldValue" ye aktarmak.

Kodun son halini aşağıda veriyorum. Tşler İyi çalışmalar.

Kod: Tümünü seç

unit YGCombo;

interface

uses
  Windows, SysUtils, Classes, Controls, StdCtrls, Dialogs;

type
  TYGCombo = class(TComboBox)
  private
    { Private declarations }
    FValue      : String;
    FFieldValues : TStrings;
    procedure DegerOku(const Value: String);
    procedure SetFieldValues(const Value: TStrings);
  protected
    { Protected declarations }

  public
    { Public declarations }
    constructor   Create(AOwner : TComponent); override;
    destructor    Destroy; override;
  published
    { Published declarations }
    Property  FieldValue :  String read FValue Write DegerOku;
    Property  FieldValues :  TStrings read FFieldValues Write SetFieldValues;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('YG', [TYGCombo]);
end;

constructor TYGCombo.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FFieldValues := TStringList.Create;
end;

procedure TYGCombo.DegerOku(const Value: String);
begin
  ItemIndex:=FieldValues.IndexOf(Value);  //Items.IndexOf(Value);
  FValue := Value;
end;

{=====================}
destructor TYGCombo.Destroy;
begin
  FFieldValues.Free;
  inherited Destroy;
end;

procedure TYGCombo.SetFieldValues(const Value: TStrings);
begin
  FFieldValues.Assign(Value);
end;

end.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: TComoboxdan Yeni bir combo oluşturma sorunu.

Mesaj gönderen vkamadan »

Merhaba ,
Combobox ın itemi değiştiğinde FieldValue e değer aktarmak yerine , FieldValue özelliğini okumak istediğinizde değeri almak daha mantıklı bir yaklaşım olacaktır.

Kod: Tümünü seç

unit YGCombo;

interface

uses
  Windows, SysUtils, Classes, Controls, StdCtrls, Dialogs;

type
  TYGCombo = class(TComboBox)
  private
    { Private declarations }
    FValue      : String;
    FFieldValues : TStrings;
    procedure DegerOku(const Value: String);
    procedure SetFieldValues(const Value: TStrings);
   function GetFieldValue : String;
  protected
    { Protected declarations }

  public
    { Public declarations }
    constructor   Create(AOwner : TComponent); override;
    destructor    Destroy; override;
  published
    { Published declarations }
    Property  FieldValue :  String read GetFieldValue Write DegerOku;
    Property  FieldValues :  TStrings read FFieldValues Write SetFieldValues;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('YG', [TYGCombo]);
end;

constructor TYGCombo.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FFieldValues := TStringList.Create;
end;

procedure TYGCombo.DegerOku(const Value: String);
begin
  ItemIndex:=FieldValues.IndexOf(Value);  //Items.IndexOf(Value);
  FValue := Value;
end;

function TYGCombo.GetFieldValue : String;
begin
  FValue := FFieldValues[self.Itemindex];
  Result := FValue; 
end;

Kolay gelsin.
Volkan KAMADAN
www.polisoft.com.tr
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: TComoboxdan Yeni bir combo oluşturma sorunu.

Mesaj gönderen seho »

Merhaba.

Üstat ben onu yapmak istemişdim kullandığım ifadece yanlış olmuş demekki :). Yalnız GetFieldValue fonksiyonunda sıkıntı var. Kodu

Kod: Tümünü seç

 FValue := FFieldValues[self.Itemindex];
bu şekilde kullandığımızda. "FieldValue" nin tipini TStrins olarak görüyor Object Inspector penceresinde.
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: TComoboxdan Yeni bir combo oluşturma sorunu.

Mesaj gönderen seho »

Üstat sorunu şu şekilde çözdük bi arkadaşın yardımı ile.

Kod: Tümünü seç

f (ItemIndex>-1) and (FFieldValues.Count>0) then 
Result:=FFieldValues[self.Itemindex];
Yardımlarınız için tş ederim. İyi çalışmalar.
Cevapla