create edilen componentin ismi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
estemacan
Üye
Mesajlar: 17
Kayıt: 01 Eki 2007 09:12

create edilen componentin ismi

Mesaj gönderen estemacan »

arkadaşlar component create ederken component ismini component oluşturdukca 1 artırarak veriyorum ama benim istediğim misal 5 tane panel oluşturup ilk ikisini sildiğimde yeni oluşturduğum componentlerin tekrar 1, 2, 6.. olarak isim alması ama başaramadım, biraz uğraştım kodlar aşağıda

Kod: Tümünü seç

  setlength(mycomp,form1.ComponentCount);
  for i:= 0 to form1.ComponentCount -1 do
  begin
    myComp[i] := Form1.Components[i].Name;
  end;
  begin
      repeat
        begin
          isim:='Panel'+inttostr(sayı);
          inc(sayı);
        end;
      until isim<>mycomp[i];
      showmessage(isim);
burada component sayısı kadar dizi oluşturup mevcut component isimlerini alıyorum, şart kısmında oluşturduğum isim mevcut isimlerin içinde yoksa o ismi vermeye çalıştım. create butonuna her bastığımda sayı değişkeni 1 den başlıyor.

bu haliyle untilden sonraki

Kod: Tümünü seç

isim<>mycomp[i]
kısmı çalışmıyor, yanlışım nerede acaba yardımcı olan arkadaşlara şimdiden teşekkürler.
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: create edilen componentin ismi

Mesaj gönderen Battosai »

silme işleminden sonra aşağıdaki kodları çalıştır. create ederken diziye ihtiyacın yok çünkü sıralı adlandırma yapıyorsun...panel cinsi elemanların sayısını alan ayrı bir fonksiyon yaz aşağıdaki örneğe bakarak yazabilirsin...yeni bir panel oluşturacağın zaman.... panel.name='panel'+inttostr(panelSayisi+1); şeklinde adlandırma yapabilirsin...
var
i:integer;
begin
with form1 do begin
for i:=0 to componentcount-1 do
Begin
if components is Tpanel then
components.name='panel'+inttostr(i+1);
end;

end;
end;
[/code]
estemacan
Üye
Mesajlar: 17
Kayıt: 01 Eki 2007 09:12

Re: create edilen componentin ismi

Mesaj gönderen estemacan »

cevap için teşekkürler Battosai

yazmış olduğun kodda component ismini bir artırarak yazıyor ama benim istediğim ilk mesajımdaki gibi, misal 5 tane panel oluşturup ilk ikisini sildiğimde yeni oluşturduğum componentlerin tekrar silinenlerin yerine panel1, panel2, ve sonra panel6.. olarak devam etmesi. bende component sayısı kadar dizi oluşturarak component isimlerini aldım oluşturduğum component ismini bunlarla karşılaştırdım, aynı isimde varsa 1 artırdım, aynı isimden component yoksa o ismi vermek istedim ama koda dökemedim bunu, kodun tamamı burda

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
isim:string;
i:integer;
mycomp: array of string;
begin
  sayı:=1;
  pan := tpanel.Create(form1);
  pan.Parent:=form1;
  pan.Width:=120;
  pan.Height:=75;
  pan.OnMouseMove:=aracı.OnMouseMove;
  setlength(mycomp,form1.ComponentCount);
  for i:= 0 to form1.ComponentCount -1 do
  begin
    myComp[i] := Form1.Components[i].Name;
  end;
  begin
      repeat
        begin
          isim:='Panel'+inttostr(sayı);
          inc(sayı);
        end;
      until (isim<>mycomp[i]);
      //showmessage(isim);
    pan.Name:=isim;
  end;
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: create edilen componentin ismi

Mesaj gönderen qamyoncu »

Merhaba, çok zamanım yok kod olarak yardımcı olamayacağım fakat:

-boolean tipte bi dizi değişken tanımlarsın. ilk değerleri False olur. her eklediğin veya sildiğin bileşende değeri değiştirirsin.

Panel1 eklemiş isen değişkeninin 1. elemanı True olur, Panel1 silindiğinde tekrar False yaparsın. Yeni bileşen eklerken de False değeri bulana kadar baştan sona gidersin.

Minik örnekle daha açıklayıcı olur:

1 1 1 1 1 --> dizi değişkenin
1 2 3 4 5 --> 1den 5e kadar paneller var.

1 ve 2yi sildin:

0 0 1 1 1 --> değişkenin.

Yeni bileşen eklerken de 0'ı(False) araman yeterli.

İyi günler.
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
estemacan
Üye
Mesajlar: 17
Kayıt: 01 Eki 2007 09:12

Re: create edilen componentin ismi

Mesaj gönderen estemacan »

teşekkür ederim qamyoncu
henüz deneyemedim ama yazdığın mantıklı geldi, bir deneyim bakalım inşallah bir sıkıntı çıkmadan hallederim.
Kullanıcı avatarı
dabaddah
Üye
Mesajlar: 167
Kayıt: 13 Mar 2008 04:42
Konum: istanbul

Re: create edilen componentin ismi

Mesaj gönderen dabaddah »

sevgili estemacan kardeşim

Kod: Tümünü seç

isim<>mycomp[i]
kısmı çalışmıyor, yanlışım nerede acaba yardımcı olan arkadaşlara şimdiden teşekkürler.
çünkü i değişkeninin son hali neyse ona göre karşılaştırma yapıyorsun.

for döngüsünün içinde kaç defa döndüyse sonuncu değer i değişkeninde sen

Kod: Tümünü seç

  for i:= 0 to form1.ComponentCount -1 do
  begin
    myComp[i] := Form1.Components[i].Name;
  end;
burada sadece

Kod: Tümünü seç

myComp[i] := Form1.Components[i].Name;
bu satırı begin end arasına almışsın. dolayısıyla döngü burada dönüp bitiyor.
ve son değeri i ye yazıyor sen son yaratılan panel ile karşılaştırma yapıyorsun çalışmıyor dediğin satırda.

herkese iyi çalışmalar....
insanın özü tanımasına engel olan perdeleri;
1.kendini beden sanma
2.vehmî benlik
3.beş duyu blokajları
4.toplumsal şartlanmalar ve şartlanmaların oluşturduğu değer yargıları ve değer yargılarından gelen duygular
kişi bu perdelerden arınmadıkça göresel kozasında yaşar ve bir ipek böceği gibi kaynar kazana atılır.
Kullanıcı avatarı
The_aLiEn
Üye
Mesajlar: 28
Kayıt: 09 Kas 2010 02:35
Konum: Trabzon
İletişim:

Re: create edilen componentin ismi

Mesaj gönderen The_aLiEn »

TQueue sınıfını kullanmanızı tavsiye ediyorum. Paneli sildirmek istediğinizde panelin tag inde tutabileceğiniz ya da isimden alabileceğiniz panel"1" -> "1" verisini kuyruğa atarsınız. Her silme işlemini gerçekleştirdiğinizde bu kuyruğa ilgili isim indexini gönderirsiniz. Kuyruktan her çekişinizde ise ilk ittiğiniz geleceğinden yeni oluşturacak olduğunuz panelin ismini isteğinize uygun şekilde düzenleyebilirsiniz ( TQueue FIFO [first in first out] mantığı ile çalışan bir veri yapısıdır. FIFO mantığından faydalanmanızı şiddetle tavsiye ediyorum. ).

Mantığın devamı olarak, oluşturulan son index i bir değişken içinde tutup, kuyruk boşaldıktan sonra isimlendirmenin kalan indexten devam etmesini sağlayabilirsiniz.
estemacan
Üye
Mesajlar: 17
Kayıt: 01 Eki 2007 09:12

Re: create edilen componentin ismi

Mesaj gönderen estemacan »

Arkadaşlar sorunu hallettim.

Sıkıntı until de for ve if komutlarını kullanmama izin vermediği için string ile arrayofstring yapıyı karşılaştırmamdan kaynaklanıyordu, bende karşılaştırmayı repeat içinde bir döngü açıp componentlerin isimlerini tek tek yeni oluşturduğum isimle karşılaştırarak yaptım. uzun bir kod oldu, daha kısa yazılabilir belki ama en azından çalıştırabildim :). Kodlar aşağıda , emeği geçen herkese teşekkür ederim.

Kod: Tümünü seç

procedure TForm1.ComponentCreate(Sender: TObject);
var
isim:string;
i,s:integer;
bool:boolean;
mycomp: array of string;
begin
  sayı:=1;
  pan := tpanel.Create(form1);
  pan.Parent:=form1;
  pan.Width:=120;
  pan.Height:=75;
  pan.OnMouseMove:=aracı.OnMouseMove;
  setlength(mycomp,form1.ComponentCount);
  for i:= 0 to form1.ComponentCount -1 do
  begin
    myComp[i] := Form1.Components[i].Name;
  end;
  begin
    repeat
      begin
        bool:=false;
        isim:='Panel'+inttostr(sayı);
        inc(sayı);
        for s := 0 to i - 1 do
          if mycomp[s]=isim then
          bool:=true;
      end;
    until bool=false;
      pan.Name:=isim;
  end;
Cevapla