Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kreiranje komponenti

[es] :: Pascal / Delphi / Kylix :: Kreiranje komponenti

[ Pregleda: 1798 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

kajla
Milorad Janković
Beograd

Član broj: 445
Poruke: 909
*.113.EUnet.yu



Profil

icon Kreiranje komponenti24.04.2003. u 21:01

Da li je moguće u Delphiju kreirati neku komponentu (na primer TButton) iz programa (bez korišćenja Designera). Zapravo hoću da kreiram matricu dugmića tako da svakom dugmetu mogu da pristupam sa:
Code:
Button[1,5].Left:=11;

Kako je ovo moguće uraditi?

poz.
24.04.2003. u 21:01 

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.dial.InfoSky.Net

Sajt: localhost


Profil

icon Re: Kreiranje komponenti24.04.2003. u 23:13
naravno da je moguće.. prvo, recimo gore u deklaraciji forme definišeš:

Code:

const
    cMaxButtons = 50;
type 
    tForm1 = class(tForm)
      // bla truc
    public
        Buttons=array[0..cMaxButtons, 0..cMaxButtons] of tButton;
    end;

(mada je bolje preko dinamičnih nizova sem u slučaju da je broj dugmića konstantan, i promeni klasu tButton ako ti druga više odgovara)

e sad, deo oko kreiranja, vlasništva, oslobađanja i ostalog je malo komplikovanije, zavisno od toga da li je broj dugmića varira, kada treba da se kreiraju dugmići, kada treba da se oslobode i slično.. najprostiji primer je da u OnFormCreate() treba da napraviš 10*10 matricu dugmića koja treba da ostane tu do kraja izvršavanja programa.. to bi išlo ovako.

Code:

procedure tForm1.OnFormCreate(blah: parametri);
var
    b: tButton;      // ista klasa kao i gore, a može i podklasa...
begin
    for i:=0 to 9 do begin
        for j:=0 to 9 do begin
            b:=tButton.Create(self);
            b.Parent:=self;
            b.Left=i*50;
            b.Top:=j*20;
            b.Label='button '+IntToStr(i)+':'+IntToStr(j);
            b.Visible:=true;
            Buttons[i, j]:=b;
        end;
    end;
end;


(u slučaju neke druge potrebe, kaži, pa da dorađujemo)

24.04.2003. u 23:13 

bofcilo
Z Roncevic
Novi Sad

Član broj: 8671
Poruke: 6
*.neobee.net



Profil

icon Re: Kreiranje komponenti02.06.2003. u 18:39
Laptopovi

E ovo sa sa "array of button" je nesto sto skoro nisam video.
Ali ostao je "problemcic" kako da reagujem na onclick tih buttona ?
02.06.2003. u 18:39 

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.dial.InfoSky.Net

Sajt: localhost


Profil

icon Re: Kreiranje komponenti02.06.2003. u 21:49
nije nikakav problem.. evo ti kako.. (a to što kažeš da nisi vido, ne razumem.. da li tvrdiš da je loše rešenje.. kolio ja znam, to je standardno rešenje tog problema...)

Code:

// dodas gore u formi
    private
        procedure KlikNaNekoDugmeIzMatrice(Sender: tObject);
    end;

// a kasnije u implementaciji
procedure tForm1.KlikNaNekoDugmeIzMatrice(Sender: tObject);
var
    b: tButton;
begin
    b:=Sender;
    MessageDlg('kliknuto na '+b.label, mtInformation, [mbOk], 0);
end;



02.06.2003. u 21:49 

silverglider

Član broj: 651
Poruke: 218
*.batalpha.de

Sajt: www.benchmark.co.yu


Profil

icon Re: Kreiranje komponenti03.06.2003. u 12:09
Da, ali opet nisi povezao OnClick event tih dugmica.

Ako pratimo gore navedeni primer, onda u OnFormCreate event handleru, prilikom kreiranja dugmica:

Code:

procedure tForm1.OnFormCreate(blah: parametri);
var
    b: tButton;      // ista klasa kao i gore, a može i podklasa...
begin
    for i:=0 to 9 do begin
        for j:=0 to 9 do begin
            b:=tButton.Create(self);
            b.Parent:=self;
            b.Left=i*50;
            b.Top:=j*20;
            b.Label='button '+IntToStr(i)+':'+IntToStr(j);
            b.Visible:=true;
            Buttons[i, j]:=b;
        end;
    end;
end;


dodas jos jedno:

b.OnClick := KlikNaNekoDugmeIzMatrice;

posle "b.Visible:=true;" pa tako svaki button iz te matrice okida isti event handler prilikom klika. A tvoje je da u tom handleru razvrstas razlicite akcije prema imenu, indexu, tagu ili nekom trecem atributu dugmica.

03.06.2003. u 12:09 

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.dial.InfoSky.Net

Sajt: localhost


Profil

icon Re: Kreiranje komponenti04.06.2003. u 02:47
naravno da sam zaboravio ;)

hvala na dopuni. evo i celog koda ako neko nije razumeo šta gde treba da se doda..

Code:

procedure tForm1.OnFormCreate(blah: parametri);
var
    b: tButton;      // ista klasa kao i gore, a može i podklasa...
begin
    for i:=0 to 9 do begin
        for j:=0 to 9 do begin
            b:=tButton.Create(self);
            b.Parent:=self;
            b.Left=i*50;
            b.Top:=j*20;
            b.Label='button '+IntToStr(i)+':'+IntToStr(j);
            b.Visible:=true;
            b.OnClick:=KlikNaNekoDugmeIzMatrice;
            Buttons[i, j]:=b;
        end;
    end;
end;


(btw, da ne treba možda da stoji @KlikNa... uvek pobrkam kada treba, a kada ne ;)

04.06.2003. u 02:47 

silverglider

Član broj: 651
Poruke: 218
*.batalpha.de

Sajt: www.benchmark.co.yu


Profil

icon Re: Kreiranje komponenti04.06.2003. u 11:52
Ne treba @, ovo vec jeste identifikator odnosno pointer na proceduru u okviru istog pascal modula. Da je neki externi onda bi trebalo.
04.06.2003. u 11:52 

bofcilo
Z Roncevic
Novi Sad

Član broj: 8671
Poruke: 6
*.neobee.net



Profil

icon Re: Kreiranje komponenti05.06.2003. u 17:46
Kasnim malo sa dopunom onog '..nisam video..'. U pozitvnom kontekstu, nikako da imam zamerku, jednostavno nikad mi nije palo napamet da napravim array od VCL-a. Dodatak sa OnClick na internu proceduru zavrsava pricu. Sad ako bas neko hoce moze da napravi novu komponentu sa dodatnim properties, ako mu treba slozenija obrada na zajednickom OnClick.

Ostao je jos jedan mali poslic napraviti univerzalnu formu za editovanje sloga u bilo kojoj tabeli... Pokupis polja iz sloga, za svaki od njih dbedit i label
05.06.2003. u 17:46 

bofcilo
Z Roncevic
Novi Sad

Član broj: 8671
Poruke: 6
*.neobee.net



Profil

icon Re: Kreiranje komponenti05.06.2003. u 17:56
Inace sad sam i probao ceo source i pazi sad

- nije button.label nego button.caption
- nece da prihvati b :=sender jer ne dozvoljava Tbutton := Tobject
- a sto je interesantno prvo sam preskocio ceo taj red b:=sender i program je radio iako NIGDE nisam kreirao b komponentu.

Znaci

Code:

procedure....(sender : Tobject)
var b: Tbutton;
begin
  showmessage(b.caption);
end;


ovo radi iako ne bi trebalo. Otkud zna da je b == sender !
05.06.2003. u 17:56 

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.dial.InfoSky.Net

Sajt: localhost


Profil

icon Re: Kreiranje komponenti05.06.2003. u 20:05
pa naravno su moguće sitne greške kada se kod piše napamet.. no, nisi ti toliko glup, vidiš da si se snašao ;))

nego, što se b:=sender; problema tiče, stavi

b:=tButton(Sender);

a ovo što radi je ili neki bug, ili se slučajno potrefilo da na stack-u promenjive b i Sender imaju istu adresu (što opet ne bi trebalo.. opet možda bug..). za svaki slučaj, dodaj ono..
05.06.2003. u 20:05 

silverglider

Član broj: 651
Poruke: 218
*.dip.t-dialin.net

Sajt: www.benchmark.co.yu


Profil

icon Re: Kreiranje komponenti06.06.2003. u 00:32
Pa koristis blagodeti RTTI-ja:

If Sender is TButton then
ShowMesssage( (Sender as TButton).Caption );
06.06.2003. u 00:32 

bofcilo
Z Roncevic
Novi Sad

Član broj: 8671
Poruke: 6
*.neobee.net



Profil

icon Re: Kreiranje komponenti06.06.2003. u 11:46
Citat:
-zombie-:
pa naravno su moguće sitne greške kada se kod piše napamet.. no, nisi ti toliko glup, vidiš da si se snašao ;))

nego, što se b:=sender; problema tiče, stavi

b:=tButton(Sender);

a ovo što radi je ili neki bug, ili se slučajno potrefilo da na stack-u promenjive b i Sender imaju istu adresu (što opet ne bi trebalo.. opet možda bug..). za svaki slučaj, dodaj ono..


Pa rekao bih da je bug.
Ceo kod je bio ovakav

Code:

procedure btnsclick(Sender : Tobject);
var bc : Tbutton;
begin
       showmessage('Pritisnut taster :'+bc.caption);
end;


e bukvalno sam prepisivao korak po korak i preskocio taj red sa bc := Sender as Tbutton, i ne samo da radi, nego zaista bc dobije pointer na taste koji sam pritisnuo. Poslao sam jos nekim momcima ovaj slucaj, pa ako neko nesto objasni prenecu.
06.06.2003. u 11:46 

[es] :: Pascal / Delphi / Kylix :: Kreiranje komponenti

[ Pregleda: 1798 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.