EComponent exception, A component named x already exists.
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
EComponent exception, A component named x already exists.
Ş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 ?
Nasıl çözebilirim acaba ?
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
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 ?
Ş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 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 ?
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.
Source kodun tamamı:
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.
Kod: Tümünü seç
FreeAndNil(FDataSetProvider);
FreeAndNil(FSQLQuery);
except
end;
constructor da nesne ismini belirtirken
kodları şimdi tam hatırlamıyorum ama
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.
kodları şimdi tam hatırlamıyorum ama
Kod: Tümünü seç
benimNesne.Name:=benimnesne+inttostr(TForm(Owner).ComponentCount)
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.

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ı
,
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ımakipek 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ı,

bence bu konu üzerine gitmeye devam et.