Component Yaratmada component.Name sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
akipek
Üye
Mesajlar: 254
Kayıt: 24 Haz 2005 01:28

Component Yaratmada component.Name sorunu

Mesaj gönderen akipek »

Yapmak istediğim şey 3 componenti birleştirip tek component yapmak.

Componentlerim : TClientDataSet, TDataSetProvider, TSQLQuery

şimdi bunları tek bir ClientDataSetX componentinde birleştirme aşamasında şöyle bir sorunla karşılaştım. ClientDataSetX in içine diğer ikisini property olarak koyuyorum ve constructor u şu şekilde override ediyorum.

FSQLQuery:=TSQLQuery.Create(aowner);
FSQLQuery.Name:=aOwner.Name+'_SQLQuery';

FDataSetProvider:=TDataSetProvider.Create(aowner);
FDataSetProvider.Name:=aOwner.Name+'_DataSetProvider';

bu şekilde isim veriyorum. Oluşturduğum ClientDataSetX componenti active ini true yaparak databaseden yolladığım sql query nin sonucunu DBGrid componentime getirebiliyor. Fakat bunu run ederek çalıştırdığımda ise, şu şu mesajla bir exception vermekte."A component named Form1_SQLQuery already exists", continue diyince aynısını dataSetProvider in ismi içinde vermekte.

Sorunu nasıl halledebilirim ?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Aslında bileşenlere isim vermek zorunda değilsin. İllaki isim vereceksen o zaman Create ederken .Create(aowner) yerine .Create(Self) şeklinde de tasarlayabilirsin. Ben yine de owner olarak aynı form vb. bileşeni tutacağanı düşünerek aşağıdaki yöntemi öneririm.

Bileşen oluşturma işleminden sonra isim verildiği için, bunu yapmak ancak isim verme işlemi sırasında yapmak mantıklı olacaktır.

Kod: Tümünü seç

type
  TClientDataSetX=class(TClientDataSet)
    .
    .
    procedure SetName(const NewName: TComponentName); override;
    .
    .
  end;
.
.
.

procedure TClientDataSetX.SetName(const NewName:TComponentName);
begin
  inherited SetName(NewName);
  FSQLQuery.Name:=aOwner.Name+'_SQLQuery';
  FDataSetProvider.Name:=aOwner.Name+'_DataSetProvider';
end;
Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla