Runtime asamasinda Tlabel olusturma uzerine yazi yazma

Başlatan bunalmis, 21 Mayıs 2011, 16:13:19

z

Bugune kadar hep kod tasarim  asamasinda ihtiyacim olan komponentleri form uzerine yerlestirip gerekli kodlari yaziyordum.

Simdi ise run asamasinda forumda 4 tane label olusturmak daha sonrada bunlari istedigim koordinatlara tasimak ardindan da uzerlerine yazi yazmak istiyorum.
Bu labellar uzerinde islem yapmak icin  index kullanmak istiyorum.

Ornegin label[1].left =i; label[1].caption:='Dikkat' gibi.

Yardimci olabilirmisiniz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

#1
var
MyLabels: array [0..3] of TLabel;
..
begin

.. Oncreate .. // illaki oncreate de olacak diye birşey yok. Delphi de hiç form kullanmadan da formlar oluşturaiblirsiniz. Bir butona basıldığında v.s. gibi.
begin
for sayac:=0 to 3 do
  if MyLabels[sayac]=nil then
    begin
        MyLabels[sayac]:=TLabel.Create(self)  //Kendisinin atası değilse handle gösterin.
    else assert.... ;

/*bu kısım döngüye sokulaiblir v.s.*/
  MyLabels[0].parent:=self; //Kendisinin atası değilse handle gösterin. 
  MyLabels[0].left:=10;
  MyLabels[0].caption:='Merhaba!!';


end;

Not: işiniz bittiğinde dizideki TLabelları free yada destroy etmeyi unutmayın.

Delphide bu tarz bir kod işinizi görecektir hocam. Kodlama hataları olabilir. Fikir versin diye yazdım.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

Tesekkur ederim. Peki labellari form uzerine degil de ornegin Tpanel uzerinde olusturmak icin ne yapmaliyim

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
        for i:=0 to 10 do
           begin
              if (MyLabels[i]=nil) then MyLabels[i]:=TLabel.Create(self);
              MyLabels[i].parent:=self; 
              Mylabels[i].Font.Size:=12;
              MyLabels[i].left:=50*i;
              MyLabels[i].top:=50*i;
              MyLabels[i].caption:='Merhaba';
           end;
end;
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

#3
Çok kafa karştırmadan. Basitçe sizin kodunuzda şu şekilde kullanabilirsiniz;
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
        for i:=0 to 10 do
           begin
              if (MyLabels[i]=nil) then MyLabels[i]:=TLabel.Create(MyPanel);
              MyLabels[i].parent:=MyPanel; 
              Mylabels[i].Font.Size:=12;
              MyLabels[i].left:=50*i;
              MyLabels[i].top:=50*i;
              MyLabels[i].caption:='Merhaba';
           end;
end;



Şunu unutmayın TPanel' iniz TLabel' larınızdan önce türetilmiş olmalıdır. Yoksa program izinsiz bellek bölgesi erişimi nedeniyle hata üretir. Bunun kontrolünü yapmak size bir zarar sağlamaz.  Yani TForm1.FormCreate işleminde TPaneliniz türetilmiş midir? Büyük ihtimalle hayır! Bu nedenle TForm1.FormCreate yerine MyPanel.OnCreate olayında bu işlemi yapmanız daha doğru olacaktır. Veya TPanel de runtime olarak TForm1.FormCreate içerisinde türetilmeli ve TForm1' e bağlanmalıdır.

Mesajımı tırpanladım kısaca yukarıdaki işlemler doğrudur.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

Oldu olacak programi soyleyeyim bana yazarmisiniz diyecegim.

Peki, program calisti ve ekranimda labellarim olustu.

Bu labellardan herhangi birisi tiklandiginda event olussun istiyorum.

Ilgili tek bir event rutininde ise hangi label tiklandi bilgisini ogrenebileyim. Bunu nasil yaparim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

#5
@bunalmis hocam siz subclassinge doğru gidiyorsunuz.   ;D

Şimdi şöyle anlatayım bu iş derinleştikce karmaşıklaşır. En basit haliyle örnek vermek acısından öncelikle TForm nesnenizin üzerinde bazı değişiklikler gerekir.

type
  TForm1 = class(TForm)
..
    procedure MyEvent(Sender: TObject);
..
  private
..
  public
..
  end;


Bu tanımlamanın ardından;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
        for i:=0 to 10 do
           begin
              if (MyLabels[i]=nil) then MyLabels[i]:=TLabel.Create(MyPanel);
              MyLabels[i].parent:=MyPanel; 

              MyLabels[i].OnClick:=MyEvent;

              Mylabels[i].Font.Size:=12;
              MyLabels[i].left:=50*i;
              MyLabels[i].top:=50*i;
              MyLabels[i].caption:='Merhaba';
           end;
end;


şeklinde TLabel kodumuzu da güncelledikten sonra event fonksiyonumuzu yazalım;

procedure TForm1.MyEvent(Sender: TObject);
begin
  if (Sender is TLabel) then
      with (Sender as Tlabel) do
         ShowMessage(Caption); //Burada (Sender as Tlabel).Caption demek istiyoruz.
         
         // Bu noktadan sonra TLabellarınızı ayırt edebilmek için yazacağınız kod size kalmış.
// Bir ipucu vermek gerekirse eğer MyLabels global ve/veya erişilebilir bir dizi ise
// MyLabels[i].Handle  ile Sender.Handle kıyaslaması yapılabilir.
// Tabi bu sadece bir örnek. Başka yöntemlerde türetmek mümkün.
end;

"... a healthy dose of paranoia leads to better systems." Jack Ganssle