[delphi] Button maken terwijl je prog draait

Pagina: 1
Acties:
  • 100 views sinds 30-01-2008
  • Reageer

  • Engineer
  • Registratie: Juni 2001
  • Laatst online: 04-05 00:03
Hoi,

Weet iemand hoe ik een button kan maken terwijl m'n prog draait? :)
Het gaat dus om delphi..

thnx

Verwijderd

buttunEen:=Tbutton.Create(Form1);
buttunEen.Parent:=Form1;
buttunEen.Show;

of iets dergelijks ;)

  • Engineer
  • Registratie: Juni 2001
  • Laatst online: 04-05 00:03
Neej, ik wil nix van te voren definieren :)

  • wizl
  • Registratie: Maart 2001
  • Laatst online: 27-02-2023

wizl

hmmz

Is er wel al een programma van te voren, of dat ook niet :P
Misschien kun je het doel even omschrijven, dan is vaak ook meteen duidelijk wat je nu eigenlijk wel, en niet wilt . . .

  • Engineer
  • Registratie: Juni 2001
  • Laatst online: 04-05 00:03
Ok, ik ben bezig met m'n eigen taskbar,waarop ik net zoals windows het doet,
een button wil neerzetten voor elk programma wat er draait :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 18:16

Creepy

Tactical Espionage Splatterer

Niks definieren? OF gewoon dynamisch knoppen aanmaken zonder dat je weet hoeveel dit er zijn??
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure maakwatzooi;
var dummy: TButton
begin
     dummy:=TButton.create(form1);
     dummy.parent:=form1;
     dummy.caption:='Knopje 1';
     dummy.show;
     dummy.onclick:=onklickding;

     dummy:=TButton.create(form1);
     dummy.parent:=form1;
     dummy.caption:='Knopje 2';
     dummy.show;
     dummy.onclick=onklickding;
end;

procedure onklickding(sender: TObject);
begin
     showmessage('je klikte '+(sender as tbutton).caption+'  aan');
end;

Je moet die dummy wel aanmaken zodat je wat properties kan toekennen enzo... meerdere keren dummy createn is geen probleem, omdat de create functie elke keer een nieuwe instantie van het object terug geeft.

Je moet ze natuurlijk ook nog wel zelf opschonen, dus moet je via Form1 alle child controls zoeken.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Engineer
  • Registratie: Juni 2001
  • Laatst online: 04-05 00:03
Ik heb er nu dit van gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure makebutton(naam: String; hwnd: hwnd; pos: integer);
var dummy: TButton;
      teller : integer;
begin
dummy := TButton.create(form1);
     dummy.parent := form1;
     dummy.Left := 100;
     dummy.caption := WindowText(hwnd);
     dummy.show;
     dummy.Width := 100;
     dummy.Top := 5;
     //dummy.onclick := onklickding;
end;

Dat word met een loop aangeroepen, maar steeds als er 1 button bijkomt gaat de ander weg :(

Wat kan ik hieraan doen? :)

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 21:54
Waarom zou je in hemelsnaam je referenties weg willen gooien? Denk dat het wel zo fijn is als je ook straks je zooi weer kan opruimen zodat je niet al het geheugen op gaat vreten.. zet je buttons dus in een array oid.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 18:16

Creepy

Tactical Espionage Splatterer

Op dinsdag 18 september 2001 17:40 schreef hdd het volgende:
Ik heb er nu dit van gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure makebutton(naam: String; hwnd: hwnd; pos: integer);
var dummy: TButton;
      teller : integer;
begin
dummy := TButton.create(form1);
     dummy.parent := form1;
     dummy.Left := 100;
     dummy.caption := WindowText(hwnd);
     dummy.show;
     dummy.Width := 100;
     dummy.Top := 5;
     //dummy.onclick := onklickding;
end;

Dat word met een loop aangeroepen, maar steeds als er 1 button bijkomt gaat de ander weg :(

Wat kan ik hieraan doen? :)
Ze gaan zo te zien niet weg.. maar je zet ze over elkaar heen :) (left := 100, top:= 5)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Dat tie steeds weg gaat, komt dat niet doordat je de nieuwe knop telkens op dezelfde pos zet en dus over de vorige heen zet?

En over memory leaks hoef je je in dit geval geen zorgen te maken daar tform al zijn child controls zelf opruimt, daarom geef je telkens de parent aan :)

  • Engineer
  • Registratie: Juni 2001
  • Laatst online: 04-05 00:03
Neej ik heb al geprobeert met left = left + 100,
maar dan krijg ik helemaal nix meer te zien ;(

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op dinsdag 18 september 2001 18:00 schreef Jelmer Barhorst het volgende:
Waarom zou je in hemelsnaam je referenties weg willen gooien? Denk dat het wel zo fijn is als je ook straks je zooi weer kan opruimen zodat je niet al het geheugen op gaat vreten.. zet je buttons dus in een array oid.
VCL kent geen memoryleaks in controls doordat alle TComponent-derivants een Owner moeten hebben die verantwoordelijk is voor het vrijgeven. De uiteindelijke root-component is Application, die bij het beeindigen van je programma automatisch wordt weggeknikkerd (en dan recursief al z'n owned components meeneemt).

Enne hdd, je verknalt iets anders hoor als je consequent maar 1 button ziet, want je blijft inderdaad ad infinitum buttons bij-jongen. Daar ligt het dus niet aan (8>

Professionele website nodig?


Verwijderd

Het enige wat je daar mee bereikt is dat "left" bij iedere aanroep 200 is! Wat je moet doen is in een globale variabele maken waarin je bijhoudt wat "left" is!

Verwijderd

Op dinsdag 18 september 2001 19:25 schreef The_Navigator het volgende:
Het enige wat je daar mee bereikt is dat "left" bij iedere aanroep 200 is! Wat je moet doen is in een globale variabele maken waarin je bijhoudt wat "left" is!
Beter bepaal je het gewoon, doormiddel van een ControlCount*ButtontWidth..

Verwijderd

Als je je buttons in een lijstje bijhoudt, is 't misschien wat simpeler...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure AddButton(h: hwnd);
var
  AButton: TButton;
begin
  AButton := TButton.Create(Form1);
  with AButton do begin
    Width := 100;
    Left := (ButtonList.Count + 1) * (Width + 5) - 5;
    Top := 5;
    Caption := WindowText(h);
    Parent := Owner;
    // OnClick := OnButtonClickHandler;
  end;
  ButtonList.Add(AButton);
end;

ButtonList is een globale variabele, en kan gewoon een simpele TList zijn. Of als je 't netjes wilt doen een afgeleide van TList, met wat extra slimmigheidjes:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{ interface }

type
  TButtonList = class(TList)
  private
    function GetItem(Index: integer): TButton;
  public
    property Items[Index: integer]: TButton read GetItem; default;
    function ItemByCaption(ACaption: string): TButton;
    procedure Clear; override; // wordt ook aangeroepen door de destructor
  end;

{ implementation }

function TButtonList.GetItem(Index: integer): TButton;
begin
  Result := nil;
  if (Index >= 0) and (Index < Count) then
    // geef als result een TButton terug i.p.v. een TObject,
    // zodat je niet steeds hoeft te typecasten
    Result := TButton(inherited Items[Index]);
end;

function TButtonList.ItemByCaption(ACaption: string): TButton;
var
  i: integer;
begin
  Result := nil;
  for i := 0 to Count-1 do
    if Items[i].Caption = ACaption then begin
    Result := Items[i];
    Break;
    end;
end;

procedure TButtonList.Clear;
var
  i: integer;
begin
  // ruim de buttons in de lijst op
  for i := Count-1 downto 0 do
    Items[i].Free;
  // laat de Clear van TList voor de rest zorgen
  inherited;
end;

Dit kun je zo mooi maken als jezelf wilt, bv. door de Add te overriden zodat 'ie alleen maar TButtons accepteert, etc., maar dat is aan je eigen fantasie en ideeen. :)

Erg handig als je tussendoor ook wilt checken (via een timer o.i.d.) of er misschien buttons zijn zonder bijbehorende window handle. Die kun je dan uit 't lijstje verwijderen (wel eerst de button free-en, kan mooi door de Delete te overriden), en de overgebleven buttons weer netjes te laten aansluiten. Kan ook goed in die Delete override, trouwens...

Verwijderd

Op dinsdag 18 september 2001 21:22 schreef Afterlife het volgende:
Als je je buttons in een lijstje bijhoudt, is 't misschien wat simpeler...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure AddButton(h: hwnd);
var
  AButton: TButton;
begin
  AButton := TButton.Create(Form1);
  with AButton do begin
    Width := 100;
    Left := (ButtonList.Count + 1) * (Width + 5) - 5;
    Top := 5;
    Caption := WindowText(h);
    Parent := Owner;
    // OnClick := OnButtonClickHandler;
  end;
  ButtonList.Add(AButton);
end;

ButtonList is een globale variabele, en kan gewoon een simpele TList zijn. Of als je 't netjes wilt doen een afgeleide van TList, met wat extra slimmigheidjes:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{ interface }

type
  TButtonList = class(TList)
  private
    function GetItem(Index: integer): TButton;
  public
    property Items[Index: integer]: TButton read GetItem; default;
    function ItemByCaption(ACaption: string): TButton;
    procedure Clear; override; // wordt ook aangeroepen door de destructor
  end;

{ implementation }

function TButtonList.GetItem(Index: integer): TButton;
begin
  Result := nil;
  if (Index >= 0) and (Index < Count) then
    // geef als result een TButton terug i.p.v. een TObject,
    // zodat je niet steeds hoeft te typecasten
    Result := TButton(inherited Items[Index]);
end;

function TButtonList.ItemByCaption(ACaption: string): TButton;
var
  i: integer;
begin
  Result := nil;
  for i := 0 to Count-1 do
    if Items[i].Caption = ACaption then begin
    Result := Items[i];
    Break;
    end;
end;

procedure TButtonList.Clear;
var
  i: integer;
begin
  // ruim de buttons in de lijst op
  for i := Count-1 downto 0 do
    Items[i].Free;
  // laat de Clear van TList voor de rest zorgen
  inherited;
end;

Dit kun je zo mooi maken als jezelf wilt, bv. door de Add te overriden zodat 'ie alleen maar TButtons accepteert, etc., maar dat is aan je eigen fantasie en ideeen. :)

Erg handig als je tussendoor ook wilt checken (via een timer o.i.d.) of er misschien buttons zijn zonder bijbehorende window handle. Die kun je dan uit 't lijstje verwijderen (wel eerst de button free-en, kan mooi door de Delete te overriden), en de overgebleven buttons weer netjes te laten aansluiten. Kan ook goed in die Delete override, trouwens...
En als je het nu op een panel zet heb je een balk met knoppies (ook wel TToolbar genoemd.. :))

Verwijderd

Op dinsdag 18 september 2001 21:26 schreef cartman3380 het volgende:
En als je het nu op een panel zet heb je een balk met knoppies (ook wel TToolbar genoemd.. :))
:)

Maar dan blijft 't knutselen met meegeleverde componenten. Ik hoopte met mijn hints ook nog iets educatiefs te bereiken... Gewoon een simpel voorbeeldje van class inheritance, en nog zinvol ook! :D
Pagina: 1