EComponent exception, A component named x already exists.

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

EComponent exception, A component named x already exists.

Mesaj gönderen akipek »

Şimdi bu sorunu VCL bir Parent componentin içine bir child componenti create ettiğim zaman vermekte. Parent componentin create i çalışıyor ve child component create ediliyor, sonra yanlış düşünmüyorsam child componentin create i de çalışıyor fakat zaten kendisi create edilmiş durumda ve böyle bir hata veriyor. Bu hatayı hem design time da hem run time da projeyi açtığım anda alıyorum.

Nasıl çözebilirim acaba ?
akipek
Üye
Mesajlar: 254
Kayıt: 24 Haz 2005 01:28

Mesaj gönderen akipek »

Sorunumu güncelleyerek tekrar yazıyorum, sorunu daha iyi analiz ettim fakat hala çözüm bulamadım.

Şimdi bir Parent component yarattım bu componentin contructorunun içinde iki tane child component yaratılıyo. Şu şekilde

Kod: Tümünü seç

FSQLQuery:=TSQLQuery.Create(aowner);
FDataSetProvider:=TDataSetProvider.Create(aowner);
Bu ikisi child componentlerim, parentin construtorunun içindeler

Bu parent componenti bir form a ekliyorum ve direk childler da otomatik olarak ekleniyolar. Buraya kadar hata yok, şimdi formu save edip kapatıyorum. Tekrar açıyorum. Şimdi form save edilenşeyleri tekrardan create edicek

Save edilenler

A) 1 tane Parent component
B) 2 tane child component

bunları sırayla create edersek

A) 1 tane parent componentin create edilmesi bana şunları verir

2 tane child component

B) 2 tane child componentin create edilmesi ise yapılamaz ve exception verir. Bunlar zaten A) şıkkında yaratıldılar, form bunları otomatik tekrar yaratmaya çalışıyor.

Çözüm denemesi 1: aowner yerine nil verdiğim zaman, bu componentleri object inspector kısmından erişemiyorum yani kısaca aynı form üzerinde olmalılar. Çözüm denemesi 1 başarız.


Çözüm denemesi 2: Fikri olan ?
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

Bileşencleri create ederken birden fazla create için componentname kısmını ne yapıyorsun.
akipek
Üye
Mesajlar: 254
Kayıt: 24 Haz 2005 01:28

Mesaj gönderen akipek »

Olayın componentname ile alakalı olduğunu sanmıyorum. Olayın form un kendisinin üzerindekileri create ederken sorun çıkarması. Sonuçta ismi x yerine y yapsam. Bu sefer y olarak tekrar yaratmak istiyecek ve aynı sorunu y already exist olarak vericek, eğer senin demek istediğini yanlış anlamadıysam. Ama yinede söyleyim en aşağıda componentimin source kodu. İsim değiştirme bu büyük kodun içindeki şu kodlar.

Kod: Tümünü seç

  SqlQueryName:=aOwner.Name+'_'+self.name+'_SQLQuery';
  DataSetProviderName:=aOwner.Name+'_'+self.name+'_DataSetProvider';


Source kodun tamamı:

Kod: Tümünü seç

unit ClientDataSet1;

interface

uses
  SysUtils, Classes, DB, DBClient,Provider,SqlExpr,Dialogs;

type
  TClientDataSetOzi = class(TClientDataSet)

  private
    { Private declarations }
   //Created components
   FDataSetProvider:TDataSetProvider;
   FSQLQuery:TSQLQuery;
   //Created property
   FSQLConnection:TSQLConnection;

   procedure SetSqlConnection(aSQLConnection:TSQlConnection);
   procedure SetDataSetProvider(aDataSetProvider:TDataSetProvider);
   procedure SetSQLQuery(aSQLQuery:TSQLQuery);

  protected
    { Protected declarations }

  public
    { Public declarations }
   constructor Create(aOwner:TComponent);override;
   destructor Destroy; override;
  published
    property SQLConnection:TSQLConnection read FSQLConnection write SetSqlConnection;
    property DataSetProvider:TDataSetProvider read FDataSetProvider write SetDataSetProvider;
    property SQLQuery:TSQLQuery read FSQLQuery write SetSQLQuery;
    { Published declarations }
  end;

procedure Register;

implementation

constructor TClientDataSetOzi.Create(aOwner:TComponent);
var SqlQueryName:string;
    DataSetProviderName:string;
    aComponent:TComponent;
begin
  inherited Create(Aowner);
  SqlQueryName:=aOwner.Name+'_'+self.name+'_SQLQuery';
  DataSetProviderName:=aOwner.Name+'_'+self.name+'_DataSetProvider';
  aComponent:=aowner.FindComponent(SqlQueryName);
  if(aComponent = nil) then
  begin
  //showmessage(self.FSQLQuery.Text);
  showmessage('SQLQuery yaratiliyor...1');
  FSQLQuery:=TSQLQuery.Create(aowner);
  FSQLQuery.Name:=SqlQueryName;
  showmessage('SQLQuery yaratildi.2');
  end
  else
   FSQLQuery:=TSQLQuery(aComponent);


  aComponent:=aowner.FindComponent(DataSetProviderName);
  if(aComponent = nil) then
  begin
  FDataSetProvider:=TDataSetProvider.Create(aowner);
  FDataSetProvider.Name:=DataSetProviderName;
  FDataSetProvider.Options:=[poAllowCommandText];
  showmessage('DataProvider yaratildi.3');
  end
  else
  FDataSetProvider:=TDataSetProvider(aComponent);

  self.SetProvider(FDataSetProvider);
  FDataSetProvider.DataSet:=(FSQLQuery);


end;

destructor TClientDataSetOzi.Destroy;
begin

  try
  FreeAndNil(FDataSetProvider);
  FreeAndNil(FSQLQuery);
  except
  end;
  

  showmessage('Destructor icinde. 4');
  inherited Destroy;
  end;


//--------------------------------------------
procedure TClientDataSetOzi.SetSqlConnection(aSQLConnection:TSQlConnection);
begin
 FSQLConnection:=aSQLConnection;
 self.FSQLQuery.SQLConnection:=FSQLConnection;
 showmessage('setSQLConnection 5');
end;



procedure TClientDataSetOzi.SetDataSetProvider(aDataSetProvider:TDataSetProvider);
begin
  FDataSetProvider:= aDataSetProvider;
  showmessage('setDataSetProvider 6');
end;



procedure TClientDataSetOzi.SetSQLQuery(aSQLQuery:TSQLQuery);
begin
  FSQLQuery:= aSQLQuery;
  showmessage('setSQLQuery 7');
end;



//--------------------------------------------


procedure Register;
begin
  RegisterComponents('Samples', [TClientDataSetOzi]);
  showmessage('Register Done 8');
  end;

end.
akipek
Üye
Mesajlar: 254
Kayıt: 24 Haz 2005 01:28

Mesaj gönderen akipek »

Kod: Tümünü seç

  FreeAndNil(FDataSetProvider); 
  FreeAndNil(FSQLQuery); 
  except 
  end; 
Destructorun içine yukarda görüldüğü gibi bunu yazarak form u kapatmadan önce formun üzerinden kaldırmak istiyorum bu ikisini ama işe yaramadı. Form un üzerinden silme konusunda bir yanlışım mı var acaba?
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

constructor da nesne ismini belirtirken

kodları şimdi tam hatırlamıyorum ama

Kod: Tümünü seç

benimNesne.Name:=benimnesne+inttostr(TForm(Owner).ComponentCount)
gibi bi isimlendirme vermeyi dene.


kod belki yanlış olabilir işin türkçesi nesnelerine isim verirken nesnenin konulduğu formu ve form üzerindeki toplam bileşen sayısını bulup bu sayıyıyı Create etmeden önce nesne isminin sonuna ekle. :)
akipek
Üye
Mesajlar: 254
Kayıt: 24 Haz 2005 01:28

Mesaj gönderen akipek »

Güzel bi deneme yöntemi bu kesin işe yarar diye düşündüm ama yaramadı neden dersen.

Formun üzerine 1 tane parent componentimi koyduğumda. Formda 6 tane component bulunmakta, childlerin nameleri _SQLQuery 6 olarak DataProvider componentimi de _DataProvider 7 olarak kaydediyor. Şimdi formun kapayıp açtığımda, Component sayımı gene eşit olarak görüyor ki eşit zaten. Parent yaratılmaya çalışırken _SQLQuery 6 already exists hatasını veriyor, çünkü form yaratılırken yani parentım form tarafından yaratırkenki component sayısı = ben formun üzerine parentı koyarken ki component sayısı :),
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

akipek yazdı:Güzel bi deneme yöntemi bu kesin işe yarar diye düşündüm ama yaramadı neden dersen.

Formun üzerine 1 tane parent componentimi koyduğumda. Formda 6 tane component bulunmakta, childlerin nameleri _SQLQuery 6 olarak DataProvider componentimi de _DataProvider 7 olarak kaydediyor. Şimdi formun kapayıp açtığımda, Component sayımı gene eşit olarak görüyor ki eşit zaten. Parent yaratılmaya çalışırken _SQLQuery 6 already exists hatasını veriyor, çünkü form yaratılırken yani parentım form tarafından yaratırkenki component sayısı = ben formun üzerine parentı koyarken ki component sayısı :),
eğer paren şeklinde kullanırsan form nesnesini değil de panel vb. nesneleri göz önünde tutabilir. direk olarak en üst parente yani forma erişmen lazım :)
bence bu konu üzerine gitmeye devam et.
akipek
Üye
Mesajlar: 254
Kayıt: 24 Haz 2005 01:28

Mesaj gönderen akipek »

Ne demek istedin anlayamadım biraz daha acıklayabilir misin :/
Cevapla