yavaş çalışna with ve Findcomponent çağrıları için çözüm

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
incal99
Üye
Mesajlar: 23
Kayıt: 20 Eki 2005 02:33

yavaş çalışna with ve Findcomponent çağrıları için çözüm

Mesaj gönderen incal99 »

Aşağıdaki kodu kullanarak, oluşturmuş olduğum nesnelerin ekrandaki yerlerini değiştiriyorum, Fakat 26 çevrimlik 1 döngünün bitip 4 çevrimlik 2. döngünün işlemesine kadar en az 500-600ms geçiyor ve özellikle alt kısımdaki ekran güncellemeleri aksıyor.

acaba Shape, Button gibi componentleri bir dizi şeklinde create edip Findcomponent kullanmadan çağırsam çok daha hızlı olur mu?. Bu şekilde Shape[1], Button[1] gibi oluşması için nasıl bir kod kullanmalıyım. Sanıtım IDE den değilde runtime sırasında oluşturmalıyım. Örnek kod olan arkadaş var mı?

İyi çalışmalar

incal99

Kod: Tümünü seç

For tamburno:=1 to 26 do begin

 If TamburPosition[tamburno,1]<33 Then
                                  begin
                                  grid1:=36+(TamburPosition[tamburno,1]-1)*24;
                                  with TBitBtn(Form2.FindComponent('BitBtn' + IntToStr(tamburno))) do Left := grid1;
                                  with TShape(Form2.FindComponent('Shape' + IntToStr(tamburno+131))) do Left := grid1+4;
                                  with TBitBtn(Form2.FindComponent('BitBtn' + IntToStr(tamburno))) do Top := 142-(TamburPosition[tamburno,2]-1)*50;
                                  with TShape(Form2.FindComponent('Shape' + IntToStr(tamburno+131))) do Top := 157-(TamburPosition[tamburno,2]-1)*50;
                                  end;
  If TamburPosition[tamburno,1]>=33 Then
                                  begin
                                  grid1:=756-((TamburPosition[tamburno,1]-33)-1)*24;
                                  with TBitBtn(Form2.FindComponent('BitBtn' + IntToStr(tamburno))) do Left := grid1;
                                  with TShape(Form2.FindComponent('Shape' + IntToStr(tamburno+131))) do Left := grid1+4;
                                  with TBitBtn(Form2.FindComponent('BitBtn' + IntToStr(tamburno))) do Top := 370-(TamburPosition[tamburno,2]-1)*50;
                                  with TShape(Form2.FindComponent('Shape' + IntToStr(tamburno+131))) do Top := 388-(TamburPosition[tamburno,2]-1)*50;
                                  end;



  end;


For robotno:=1 to 4  do begin
 If RobotPosition[robotno,1]<33 Then
                                  begin
                                  grid1:=32+(RobotPosition[robotno,1]-1)*24;
                                  with TShape(Form2.FindComponent('Robot'+IntToStr(robotno)+'Shape1')) do Left := grid1;
                                  with TShape(Form2.FindComponent('Robot' + IntToStr(robotno)+'Shape2')) do Left := grid1;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonLeft')) do Left :=grid1-40+15;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonRight')) do Left := grid1+15;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonUpDown')) do Left := grid1-20+15;


                                  with TShape(Form2.FindComponent('Robot' + IntToStr(robotno)+'Shape1')) do Top := 50;
                                  with TShape(Form2.FindComponent('Robot' + IntToStr(robotno)+'Shape2')) do Top := 120;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonLeft')) do Top := 40;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonRight')) do Top := 40;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonUpDown')) do Top := 40;

                                  end;
  If RobotPosition[robotno,1]>=33 Then
                                  begin
                                  grid1:=775-((RobotPosition[robotno,1]-32)-1)*24;
                                   with TShape(Form2.FindComponent('Robot'+IntToStr(robotno)+'Shape1')) do Left := grid1;
                                  with TShape(Form2.FindComponent('Robot' + IntToStr(robotno)+'Shape2')) do Left := grid1;
                                   with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonLeft')) do Left := grid1-40+15;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonRight')) do Left := grid1+15;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonUpDown')) do Left := grid1-20+15;
                                  with TShape(Form2.FindComponent('Robot' + IntToStr(robotno)+'Shape1')) do Top := 280;
                                  with TShape(Form2.FindComponent('Robot' + IntToStr(robotno)+'Shape2')) do Top := 350;
                                   with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonLeft')) do Top := 260;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonRight')) do Top := 260;
                                  with TButton(Form2.FindComponent('Robot' + IntToStr(robotno)+'ButtonUpDown')) do Top := 260;

                                  end;

                           end;




Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: yavaş çalışna with ve Findcomponent çağrıları için çözüm

Mesaj gönderen Battosai »

Niye her satırı with içine aldın bi kere bu gereksiz with kullanım mantığına aykırı zaten...
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: yavaş çalışna with ve Findcomponent çağrıları için çözüm

Mesaj gönderen aslangeri »

s.a.
dinamik diziler üzerine biraz araştırma yap.
istediğin şeyi o şekilde halledebilirsin.
yada
döngünün içine

Kod: Tümünü seç

application.processmessages;
yaz. sanırım buda sorununu halleder.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: yavaş çalışna with ve Findcomponent çağrıları için çözüm

Mesaj gönderen Hakan Can »

FindComponent fonksiyonu çok zaman alıyor. ComponentCount ve Components property'lerini kullanarak sorununu halledebilirsin.

Kodunu şundan faydalanarak düzenleyebilirsin:

Kod: Tümünü seç

var
  I: Integer;
  aName: string;
  .
  .
  .
  for I := 0 to Form2.ComponentCount - 1 do
  begin
    aName := Form2.Components[I].Name;

    for TamburNo := 1 to 26 do
    begin
      if TamburPosition[TamburNo, 1] < 33 then
      begin
        grid1 := 36 + (TamburPosition[TamburNo, 1] - 1) * 24;
        if aName = 'BitBtn' + IntToStr(TamburNo) then TBitBtn(Form2.Components[I]).Left := grid1;
        .
        .
        .
      end;

      if TamburPosition[TamburNo, 1] >= 33 then
      begin
        grid1 := 756 - ((TamburPosition[TamburNo, 1] - 33) - 1) * 24;
        if aName = 'BitBtn' + IntToStr(TamburNo) then TBitBtn(Form2.Components[I]).Left := grid1;
        .
        .
        .
      end;
  end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: yavaş çalışna with ve Findcomponent çağrıları için çözüm

Mesaj gönderen freeman35 »

Whit kullanımı oldum olası sevememişimdir :) debug ederken hint leri göstermiyor IDE. dinamic array de olabilr ama ben TList class ını tercih ederim. çoğu kotrolü benim yerime yapıyor. Hız içinse en genel ve en basit söylemek gerekirse, gereksiz ne varsa kaldırın, iki nokta arasında en kısa yol doğrudur findcomponent yerine Tlist içine atılmış olan componentlar erişmek çok daha hızlı olacaktır.
Ayrıca komutu aklıma gelmedi bu ekrana basma işini senin yapacağın değişiklikler bitene kadar durdurup edip bittikten sonra tekrar açmakta hız kazandırır sanırım. beginupdate - endupdate olabilir, emin değilim
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 !!!
incal99
Üye
Mesajlar: 23
Kayıt: 20 Eki 2005 02:33

Re: yavaş çalışna with ve Findcomponent çağrıları için çözüm

Mesaj gönderen incal99 »

Arkadaşlar çok teşekkürler,

Tavsiyenizdeki gibi with olayını komple kaldırdım ve tüm nesneleri runtime içinde create edip oluşturdum ve hepsini bir diziye endeksledim. Birtek runtime sırasında oluşturduğum buttonların üzerine tıklanonca açılacak fonksionları dizisel olarak indeksleyemedim.

İyi çalışmalar.

Kod: Tümünü seç

For n:=1 to 4 do
begin
RobotShape[n,1]:=TShape.Create(Self);
RobotShape[n,1].Parent := Self;
RobotShape[n,1].Shape:=stRectangle;
RobotShape[n,1].Width:=9;
RobotShape[n,1].Height:=72;
RobotShape[n,1].visible:=TRUE;
RobotShape[n,1].Enabled:=TRUE;
RobotShape[n,1].Brush.Color:=clYellow;

IF (n<=2) THEN RobotShape[n,1].Top:=50;
IF (n>=3) THEN RobotShape[n,1].Top:=280;




RobotShape[n,2]:=TShape.Create(Self);
RobotShape[n,2].Parent := Self;
RobotShape[n,2].Shape:=stRectangle;
RobotShape[n,2].Width:=19;
RobotShape[n,2].Height:=12;
RobotShape[n,2].visible:=TRUE;
RobotShape[n,2].Enabled:=TRUE;
RobotShape[n,2].Brush.Color:=clYellow;

IF (n<=2) THEN RobotShape[n,2].Top:=120;
IF (n>=3) THEN RobotShape[n,2].Top:=350;



RobotButton[n,1]:=TButton.Create(Self);
RobotButton[n,1].Parent := Self;
RobotButton[n,1].Caption:='<';
RobotButton[n,1].Width:=19;
RobotButton[n,1].Height:=25;
RobotButton[n,1].visible:=TRUE;
RobotButton[n,1].Enabled:=TRUE;


IF (n<=2) THEN RobotButton[n,1].Top:= 40;
IF (n>=3) THEN RobotButton[n,1].Top:= 260;




RobotButton[n,2]:=TButton.Create(Self);
RobotButton[n,2].Parent := Self;
RobotButton[n,2].Caption:='>';
RobotButton[n,2].Width:=19;
RobotButton[n,2].Height:=25;
RobotButton[n,2].visible:=TRUE;
RobotButton[n,2].Enabled:=TRUE;
IF (n<=2) THEN RobotButton[n,2].Top:= 40;
IF (n>=3) THEN RobotButton[n,2].Top:= 260;




RobotButton[n,3]:=TButton.Create(Self);
RobotButton[n,3].Parent := Self;
RobotButton[n,3].Caption:=INTTOSTR(n);
RobotButton[n,3].Width:=19;
RobotButton[n,3].Height:=25;
RobotButton[n,3].visible:=TRUE;
RobotButton[n,3].Enabled:=TRUE;
IF (n<=2) THEN RobotButton[n,3].Top:= 40;
IF (n>=2) THEN RobotButton[n,3].Top:= 260;



end;

 RobotButton[1,1].OnClick:=Robot1ButtonLeftClick;
 RobotButton[1,2].OnClick:=Robot1ButtonRightClick;
 RobotButton[1,3].OnClick:=Robot1ButtonUpDownClick;

   RobotButton[2,1].OnClick:=Robot2ButtonLeftClick;
 RobotButton[2,2].OnClick:=Robot2ButtonRightClick;
 RobotButton[2,3].OnClick:=Robot2ButtonUpDownClick;

  RobotButton[3,1].OnClick:=Robot3ButtonLeftClick;
 RobotButton[3,2].OnClick:=Robot3ButtonRightClick;
 RobotButton[3,3].OnClick:=Robot3ButtonUpDownClick;

   RobotButton[4,1].OnClick:=Robot4ButtonLeftClick;
 RobotButton[4,2].OnClick:=Robot4ButtonRightClick;
 RobotButton[4,3].OnClick:=Robot4ButtonUpDownClick;





end;


Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: yavaş çalışna with ve Findcomponent çağrıları için çözüm

Mesaj gönderen freeman35 »

RobotButton[1,1].OnClick:=Robot1ButtonLeftClick; haletmişsin sanırım ? yanlız anlamadığım her buttona ayrı event yazıyorsan bunları runtime da ayrı ayrı create etmene gerek yok bence. tam olarak yapmaya çalıştığını anlamadım
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 !!!
incal99
Üye
Mesajlar: 23
Kayıt: 20 Eki 2005 02:33

Re: yavaş çalışna with ve Findcomponent çağrıları için çözüm

Mesaj gönderen incal99 »

Tam olarak ,ilerletmeye çalıştığım:

RobotButton[1,1].OnClick:=Robot1ButtonLeftClick; yerine şu tarz birşey yapabilmek:

RobotButton[1,1].OnClick:=RobotButtonLeftClick[1],

yada döngü içinde düşünürsek:

RobotButton[n,1].OnClick:=RobotButtonLeftClick[n] veya
RobotButton[1,1].OnClick:=Robot1ButtonLeftClick(n) En sondaki n parametreside genel RobotButtonLeftClick procedurüne
iletilerek aynı rutini copy paste yaparak birsürü procedrürün altına kopyalamamı ortadan kaldıracak.

Mesela
Robot1ButtonLeftClick
Robot2ButtonLeftClick
Robot3ButtonLeftClick
....,
....
Robot56ButtonLeftClick


yerine

RobotButtonLeftClick(n)
begin
içeride n e bağlı bir algoritmayla tüm durumlara hitap eden bir yapı)
end;


Fakat bu tür runtimeda yapılan OnClick procedure ilişkilendirmelerinde
nasıl oluşturulan procedüre parametre atanabileceğini tam çözemedim;

RobotButton[n,1].OnClick:=RobotButtonLeftClick(n:integer)



İyi çalışmalar.

İncal99
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: yavaş çalışna with ve Findcomponent çağrıları için çözüm

Mesaj gönderen freeman35 »

Tam olarak senin istediğini yapamazsın, Yani component ın event ini değişik kullanamazsın. 2 şekilde halledebilirsin. 1. O buttondan bir component türetip onclik event ini overwrite edersen olur bence buna gerek yok :) 2. ise birtane onclick event ini kullan tümü için. Anahtar "Sender" class ı. Buradan o event içinde gereken işlemleri if lerle yönlendirebilirsin. TSape(Sender ).Tag olabilir TSape(Sender ).ComponentName (yanılmıyorsam) gibi cast edip kırıter oluşturabilirsin
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 !!!
Cevapla