Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 11 odgovora
  • 4.417 pregleda

Najnovija ↓

Kreiranje komponenti 24.04.2003. u 22:01 · pre 286 meseci #1
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.
Re: Kreiranje komponenti 25.04.2003. u 00:13 · pre 286 meseci #2
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)
Potpis
blogče :: unescaped beta
  »
go-paste extenzija
  »
reč dana: backup
  »
bočne koalicije
Re: Kreiranje komponenti 02.06.2003. u 19:39 · pre 285 meseci #3
E ovo sa sa "array of button" je nesto sto skoro nisam video.
Ali ostao je "problemcic" kako da reagujem na onclick tih buttona ?
Re: Kreiranje komponenti 02.06.2003. u 22:49 · pre 285 meseci #4
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;


Potpis
blogče :: unescaped beta
  »
go-paste extenzija
  »
reč dana: backup
  »
bočne koalicije
Re: Kreiranje komponenti 03.06.2003. u 13:09 · pre 285 meseci #5
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.

Re: Kreiranje komponenti 04.06.2003. u 03:47 · pre 285 meseci #6
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 ;)
Potpis
blogče :: unescaped beta
  »
go-paste extenzija
  »
reč dana: backup
  »
bočne koalicije
Re: Kreiranje komponenti 05.06.2003. u 18:46 · pre 284 meseca #8
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
Re: Kreiranje komponenti 05.06.2003. u 18:56 · pre 284 meseca #9
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 !
Re: Kreiranje komponenti 05.06.2003. u 21:05 · pre 284 meseca #10
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..
Potpis
blogče :: unescaped beta
  »
go-paste extenzija
  »
reč dana: backup
  »
bočne koalicije
Re: Kreiranje komponenti 06.06.2003. u 12:46 · pre 284 meseca #12
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.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme