Component adını string olarak belirtme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
akgun83
Üye
Mesajlar: 106
Kayıt: 26 Eyl 2003 11:34

Component adını string olarak belirtme

Mesaj gönderen akgun83 »

merhaba,
kod içerisinde özelliklerine erişeceğim componentin adını string olarak belirtebilirmiyiz? Yani şöyle ki;

Kod: Tümünü seç

Edit1.Caption:='Deneme'
yerine

Kod: Tümünü seç

('Edit'+inttostr(i)).Caption:='Deneme' //i=1
gibi bir kullanım var mıdır?
Teşekkürler, Kolay Gelsin.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

cık yok, vb'de var o :)

delpide şu var arama : tag yazıp ara onlarca örnek çıkıcak karşına :)

kolay gelsin
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Formun, panelin yada bilesen tasıyabilen pencereli kontrollerin FindComponents seklinde bir metodları var
donus degeri TComponent oldugu icin Caption vs. ust ozelliklere erismek icin Tip donusumu yapmalısın

TLabel(FindComponent('Benim_edit')).Caption:='cxcdsfds';
En son gkimirti tarafından 28 Tem 2004 04:05 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

direk olarak öyle yapamazsın, çok çeşitli yolları var ama, aklıma gelen 2 yöntem, Editlerin ponterlarını TList içine alıp burdan ister index leri ile istersen TEdit le kart edip döngü kurarak isimle bulup değişikliği yaparsın, yada components kullanarak yapabilirsin
tabi bu yapmak istediğin işe vs değişik alternatifler çıkabilir

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

@freeman35 inn dediği gibi yapıyorum bende. formumnda yüzlerce :) shape var. bunlara sırayla birer tag verdim. programın creatinde bi fonksiyona gidip döngü ile bu shapelerin taglarından shapei bi değişkene bağlayıp sonra makina[10].visible := şeklinde buluyorum. biraz zahmetli gibi gelsede alışınca bi problem olmuyor..


i ve tler local tree'ler ise global değişkenler.
Tree1 : array[1..40] of integer;

Kod: Tümünü seç

for i:=0 to ComponentCount-1 do
    begin
    if Components[i] is TShape then
       begin
       if (TShape(Components[i]).Tag > 100) AND (TShape(Components[i]).Tag < 121) then
          begin
          Tree1[t1] := i;
          inc(t1);
          end
       else....
       end;
    end;
sonracığıma
TShape(Components[Tree1]).Brush.Color := clRed;
:)
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
akgun83
Üye
Mesajlar: 106
Kayıt: 26 Eyl 2003 11:34

Mesaj gönderen akgun83 »

Kod: Tümünü seç

TEdit(FindComponent('Benim_edit')).Captipn:='cxcdsfds';
kodu ve delphi helpteki

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);

var
  i: Integer;
const
  NamePrefix = 'MyEdit';
begin
  for i := 1 to 20 dobegin
    TEdit.Create(Self).Name := NamePrefix + IntToStr(i);
    with TEdit(FindComponent(NamePrefix + IntToStr(i))) do
    begin
      Left := 10;
      Top := i * 20;
      Parent := self;
    end;
  end;
end;
örnekleri işimi gördü teşekkürler.
Arifceylan28
Üye
Mesajlar: 298
Kayıt: 19 Tem 2004 01:45
Konum: Giresun/Samsun

Mesaj gönderen Arifceylan28 »

gkimirti yazdı:TEdit(FindComponent('Benim_edit')).Captipn:='cxcdsfds';
Bende bu kodda undeclared identifier diyor.Örneğin şöyle yapıyorum

TEdit(FindComponent('edit1')).Caption:='cxcdsfds';
Arifceylan28
Üye
Mesajlar: 298
Kayıt: 19 Tem 2004 01:45
Konum: Giresun/Samsun

Mesaj gönderen Arifceylan28 »

Tamam şimdi oldu .
i:=1;
TEdit(FindComponent('edit'+inttostr(i))).text:='cxcdsfds';

Bunu kullandım.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

@Mege yazdığın kod mantığı doğru ve güzel, ama maalesef bug ın var. Şöyleki, Eğer Runtime create ettiğin bir component yoksa, free lediğin bir component yoksa mantığın doğru çalışır. Aksi halde dağılır, nedeni şu, Bir component list var yani formun, sen bunların içindeki ItemIndex tutuyorsun, eğer bunların aradan biri eksilirse,yada artarsa ItemIndex değişir, gerçi artmasında sorun olmıyabilir, tabi kodun mantığına göre değişir.
Sürekli söylediğim TList i kullan, Bu pointer ları tutabileceğin bir array gibi düşün

Kod: Tümünü seç

Tree1 : TList;
.....
Tree1 := TList.Create;
for i:=0 to ComponentCount-1 do
    begin
    if Components[i] is TShape then
       begin
       if (TShape(Components[i]).Tag > 100) AND (TShape(Components[i]).Tag < 121) then
          begin
            Tree1.Add(Components[i]);
          end
       else....
       end;
    end; 
Kullanırkende, Tabi burda I değerini yani component ı bulmak gerek

Kod: Tümünü seç

TShape(Tree1.Item[I]).Brush.Color := clRed; 
Kolay Gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

@freeman35 abi :) uyardığın için teşekkürler. hiç dikkat etmemişim.
ama dediğin gibi runtime create yok formda hepsi zaten olan shapeler sadece kolay ulşamka için böyle tag kullanıyorum.

teşekkürler :D
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
DarkEternal
Üye
Mesajlar: 158
Kayıt: 19 Eki 2005 11:00

Mesaj gönderen DarkEternal »

akgun83 yazdı:

Kod: Tümünü seç

TEdit(FindComponent('Benim_edit')).Captipn:='cxcdsfds';
kodu ve delphi helpteki

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);

var
  i: Integer;
const
  NamePrefix = 'MyEdit';
begin
  for i := 1 to 20 dobegin
    TEdit.Create(Self).Name := NamePrefix + IntToStr(i);
    with TEdit(FindComponent(NamePrefix + IntToStr(i))) do
    begin
      Left := 10;
      Top := i * 20;
      Parent := self;
    end;
  end;
end;
örnekleri işimi gördü teşekkürler.
Peki event a kod yazabiliyor muyuz runtime da oluşturulan componente?
Örneğin "OnEnter" ında "SelectAll" yapmak istiyorum?
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 »

Sen kodu önceden yazarsın daha sonra bu kodu atayarak işlemini gerçekleştirirsin. Kendi örneğinle birlikte uygulamalı bir örnek:

Kod: Tümünü seç

TForm1=class(TForm)
.
.
  Button1Click(Sender: TObject);
.
.
private
  procedure GenelEditEnter(Sender:TObject);
pubic
end;

procedure TForm1.GenelEditEnter(Sender:TObject);
begin
  if Sender is TEdit then TEdit(Sender).SelectAll;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
const
  NamePrefix = 'MyEdit';
begin
  for i := 1 to 20 dobegin
    TEdit.Create(Self).Name := NamePrefix + IntToStr(i);
    with TEdit(FindComponent(NamePrefix + IntToStr(i))) do
    begin
      Left := 10;
      Top := i * 20;
      Parent := self;
      OnEnter:=GenelEditEnter;//<-bu satır eklendi
    end;
  end;
end; 
Eklediğim satırla birlikte bu örnekte oluşturulan Edit nesnelerinin onEnter olayında daima GenelEditEnter olayı çalışacaktır. Bunu private alana yazmamın özel bir maksatı yok. Hangi bölgeye yazarsan yaz çalışır ama diğerlerinden ayrı bulunsun diye orada yazdım :) . İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
DarkEternal
Üye
Mesajlar: 158
Kayıt: 19 Eki 2005 11:00

Mesaj gönderen DarkEternal »

Peki geri dönen değeri nasıl alabilirim?
Örneğin "OnKeyPress" te ShowMessage(key) gibi?
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 »

Örneği keypress le genişletmek gerekirse:

Kod: Tümünü seç

TForm1=class(TForm)
.
.
  Button1Click(Sender: TObject);
.
.
private
  procedure GenelEditEnter(Sender:TObject);
  procedure GenelEditKeyPress(Sender: TObject; var Key: Char);
pubic
end;

procedure TForm1.GenelEditEnter(Sender:TObject);
begin
  if Sender is TEdit then TEdit(Sender).SelectAll;
end;

procedure TForm1.GenelEditKeyPress(Sender: TObject; var Key: Char);
begin
  //burada key değeri elinde zaten...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
const
  NamePrefix = 'MyEdit';
begin
  for i := 1 to 20 dobegin
    TEdit.Create(Self).Name := NamePrefix + IntToStr(i);
    with TEdit(FindComponent(NamePrefix + IntToStr(i))) do
    begin
      Left := 10;
      Top := i * 20;
      Parent := self;
      OnEnter:=GenelEditEnter;//<-bu satır eklendi
      OnKeyPress:=GenelEditKeyPress;//<-bu satır da eklendi
    end;
  end;
end;
Buradan çıkarman gereken mantık, o edit nesnelerine hangi olayı atamak istiyorsan o olay için parametre yapısına aynen sahip bir prosedür oluşturmak. Mesele onMouseDown olayına ihtiyacın varsa o zaman o olay için gereken (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); parametresine sahip olması gerekmektedir. Bunu elde etmek konusunda bir fikrin yoksa form üzerine bir Edit koy ve onun gereken olayını oluştur. Oluşacak kodlarda istediğin karşında olacaktır. Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
DarkEternal
Üye
Mesajlar: 158
Kayıt: 19 Eki 2005 11:00

Mesaj gönderen DarkEternal »

Çok çok teşekkürler...
Cevapla