Dynamicznie = powoli. Czy musi tak byc?

0

Dlaczego dynamiczne tworzenie komponentow jest tak powolne?
czy da sie jakos przyspieszyc ten proces? (moze jakos przygotowac pamiec albo co?)

poza tym obsluga dynamicznie stowrzonych obiektow jest duzo wolniejsza
niz tych przygotowanych w designtime...

czy musi tak byc?

0

Zależy, jak to robisz. Z mojego doświadczenia wynika, że obsługa komponentów tworzonych dynamicznie jest równie szybka. Pokaż przykład, jak to wykonujesz.

//Dopisane:
Właśnie wygenerowałem sobie 32x32 przyciski TButton - czas tworzenia i rozmieszczenia właściwie niezauważalny.

0

No wiec ja to robie tak:

(tworzenie 32x32 TButton'ow i umieszczenie ich na formularzu)

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: Integer;
  start : TTime;
begin
  start := time;
  for i := 0 to 31 do begin
    for j := 0 to 31 do begin
      with TButton.Create(Form1) do begin
        parent := Form1;
        left := i*26+2;
        width := 25;
        top := j*26+2;
        height := 25;
      end;
    end;
  end;
  showmessage(TimeToStr(now-start));
end;

u mnie zajmuje to 9s! i zdecydowanie nie jest to niezauwazalne:/

//dopisane: ten sam kod ale zamiast TButton uzylem
//TSpeedButton -wykonalo sie w 2s
//TPanel - wykonalo sie w 13s

0
Johny_Morfina napisał(a)

Dlaczego dynamiczne tworzenie komponentow jest tak powolne?
czy da sie jakos przyspieszyc ten proces? (moze jakos przygotowac pamiec albo co?)

poza tym obsluga dynamicznie stowrzonych obiektow jest duzo wolniejsza
niz tych przygotowanych w designtime...

czy musi tak byc?

Nie twórz tylu przycisków. Narysuj je sobie na panelu i oprogramuj "OnClick" tego panelu.

0

Moim zdaniem problem polega na tym że tworzysz to jak forma jest widoczna. Robiłem sobie ostatnio moduł konfiguracji do programu (opcje), całą formatkę tworzę dynamicznie od podstaw, do każdej opcji, jest labelke, jakiś edit, jakiś button lub checkbox (może w poniedziałek dam jakiś zrzut), wszystko podzielona na kategorie (pagecontrol), z hintami, colorami i enabled'ami odpowiadającymi uprawnieniom operatora. Dzięki temu że robie to dynamicznie, dodanie jakiejś opcji do programu, wymaga wpisania 1 linii kodu (interfejs, zapis, odczyt - robi się sam). Pomijam fakt, że zapis i odczyt, może być do rejestru lub bazy danych - ale to nie w tym temacie. W każdym razie początkowo robiłem to źle i faktycznie trwało długo (komponentów na ten moment będzie z 300 - zastanawiałem się nawet na progrssbarem ;]). Rozwiązanie - twórz komponenty w kontruktorze formatki, a nie jak ona jest już widoczna - to rozwiązuje cały problem. Co innego jak musisz w czasie jak formatka jest widoczna - wtedy polecam zrobić z komponentem wszystko co się da zanim go wyświetlisz (zanim przypiszesz właściwość Parent).

0

to nie ejst tak, że dynamicznie oznacza powoli - próbowałeś może wstawić statycznie te 1024 buttony i porównać czas? z pewnością był by taki sam.
btw - tak jak TheBigStaticObject napisał, tworzenie tylu buttonów jest troche poronionym pomysłem, użyj panelu albo image.

0

b0bik mial racje, sprawdz to:

procedure TForm1.Button1Click(Sender: TObject);
var
i,j: Integer;
start : TTime;
begin
form1.Visible:=False;
start := time;
for i := 0 to 31 do begin
for j := 0 to 31 do begin
with TButton.Create(Form1) do begin
parent := Form1;
left := i26+2;
width := 25;
top := j
26+2;
height := 25;
end;
end;
end;
showmessage(TimeToStr(now-start));
form1.Visible:=True;
end;

;)

0

Dodatkowo, zamiast ustawiać każdą ze współrzędnych, używaj metody SetBounds(X, Y, W, H);

0
Szczawik napisał(a)

Dodatkowo, zamiast ustawiać każdą ze współrzędnych, używaj metody SetBounds(X, Y, W, H);

Dodatkowo nie wyliczaj poprzez mnożenie współrzędnych w każdym kroku, metoda

var 
 ...
  ii: integer;
  jj: integer;
begin
  ii := 2;
  for i := 0 to 31 do 
  begin
    jj := 2;
    for j := 0 to 31 do 
    begin
      with TButton.Create(Form1) do 
      begin
        parent := Form1;
        SetBounds( ii, jj, 25, 25 );
      end;
      Inc( jj, 26 );
    end;
    Inc( ii, 26 );
  end;
  showmessage(TimeToStr(now-start));
  form1.Visible:=True;
end;

:)

A poważnie - przyłóż się i spróbuj sposobu z TPanel/TImage :)

0

heh przyklad z pzyciskami byl tylko przykladem:P
zazwyczaj chodzi mi o caly formularz z duza iloscia roznych komponentow.

ale i tak wiele z przedstawionych pomyslow jest dosc ciekawych i postaram sie je wykozystac.

dzieki
pozdrawiam

0 użytkowników online, w tym zalogowanych: 0, gości: 0