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

Kreiranje komponenti

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

[ Pregleda: 3365 | 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



+2 Profil

icon Kreiranje komponenti24.04.2003. u 21:01 - pre 255 meseci
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.
 
Odgovor na temu

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

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

Sajt: localhost


+5 Profil

icon Re: Kreiranje komponenti24.04.2003. u 23:13 - pre 255 meseci
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)

 
Odgovor na temu

bofcilo
Z Roncevic
Novi Sad

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



Profil

icon Re: Kreiranje komponenti02.06.2003. u 18:39 - pre 254 meseci
E ovo sa sa "array of button" je nesto sto skoro nisam video.
Ali ostao je "problemcic" kako da reagujem na onclick tih buttona ?
 
Odgovor na temu

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

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

Sajt: localhost


+5 Profil

icon Re: Kreiranje komponenti02.06.2003. u 21:49 - pre 254 meseci
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;



 
Odgovor na temu

silverglider

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

Sajt: www.benchmark.co.yu


Profil

icon Re: Kreiranje komponenti03.06.2003. u 12:09 - pre 254 meseci
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.

 
Odgovor na temu

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

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

Sajt: localhost


+5 Profil

icon Re: Kreiranje komponenti04.06.2003. u 02:47 - pre 254 meseci
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 ;)

 
Odgovor na temu

silverglider

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

Sajt: www.benchmark.co.yu


Profil

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

bofcilo
Z Roncevic
Novi Sad

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



Profil

icon Re: Kreiranje komponenti05.06.2003. u 17:46 - pre 254 meseci
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
 
Odgovor na temu

bofcilo
Z Roncevic
Novi Sad

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



Profil

icon Re: Kreiranje komponenti05.06.2003. u 17:56 - pre 254 meseci
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 !
 
Odgovor na temu

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

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

Sajt: localhost


+5 Profil

icon Re: Kreiranje komponenti05.06.2003. u 20:05 - pre 254 meseci
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..
 
Odgovor na temu

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 - pre 254 meseci
Pa koristis blagodeti RTTI-ja:

If Sender is TButton then
ShowMesssage( (Sender as TButton).Caption );
 
Odgovor na temu

bofcilo
Z Roncevic
Novi Sad

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



Profil

icon Re: Kreiranje komponenti06.06.2003. u 11:46 - pre 254 meseci
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.
 
Odgovor na temu

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

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

Postavi temu Odgovori

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