AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Dynamisch erstellte Buttons wieder Freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisch erstellte Buttons wieder Freigeben

Ein Thema von glkgereon · begonnen am 18. Mai 2005 · letzter Beitrag vom 20. Mai 2005
Antwort Antwort
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Dynamisch erstellte Buttons wieder Freigeben

  Alt 18. Mai 2005, 15:10
Hi

ich erstelle ein paar Buttons Dynamisch.
erst mal was code:
Delphi-Quellcode:
  TBtn = record
    Btn: TButton;
    App: String;
  end;

  TForm_Main = class(TForm)
  public
    Btns: array of TBtn;
    Count: Integer;
    procedure AddBtn(Cap, App: String);
    procedure ChangeBtn(Index: Integer; Cap, App: String);
    procedure DelLastBtn;
  end;
Delphi-Quellcode:
procedure TForm_Main.AddBtn(Cap, App: String);
begin
  Inc(Count);
  SetLength(Btns,Count);
  with Btns[Count-1] do
    begin
    Btn:=TButton.Create(Form_Main);
    Btn.Name:='Btn_'+IntToStr(Count);
    Btn.Caption:=Cap;
    Btn.Parent:=Form_Main.Grp_Prog;
    Btn.Show;
    Btn.Left:=8;
    Btn.Height:=25;
    Btn.Width:=122;
    Btn.Top:=24+(Count-1)*33;
    Btn.Tag:=Count;
    Btn.OnClick:=BtnClick;
    end;
end;

procedure TForm_Main.ChangeBtn(Index: Integer; Cap, App: String);
begin
  if Index<Count then
    begin
    if Cap<>'Samethen Btns[Index].Btn.Caption:=Cap;
    if App<>'Samethen Btns[Index].App:=App;
    end;
end;

procedure TForm_Main.DelLastBtn;
begin
  Btns[Count].Btn.Free; //<-- Fehler!!!
  Btns[Count].App:='';
  Dec(Count);
  SetLength(Btns,Count);
end;
So, alles klappt soweit, die Buttons werden wie gewünscht erstellt, angezeigt und geändert.
nun klappt aber das löschen nicht.

muss ich irgendwie den button in der groupbox wieder austragen?

Edit: Achso, folgendes funzt:

Delphi-Quellcode:
procedure TForm_Main.FormClose(Sender: TObject; var Action: TCloseAction);
var i:Integer;
begin
  for i:=0 to Count-1 do Btns[i].Btn.Free;
  SetLength(Btns,0);
end;
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Dynamisch erstellte Buttons wieder Freigeben

  Alt 18. Mai 2005, 15:13
Wenn du die Freigabe eh nur beim beenden des Formulars durchführen willst, brauchst Du nichts zu machen.
Durch
Btn:=TButton.Create(Form_Main); teilse Du dem Button mit das Form_Main sein Owner ist und dieser trägt sich in die Verwaltungsliste von Form_Main ein. Damit kann Form_Main die Freigabe selbständig durchführen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

Re: Dynamisch erstellte Buttons wieder Freigeben

  Alt 18. Mai 2005, 15:36
In der Annahme, dass der Fehler eine AV ist,

könnte es sein, dass du über die Arraygrenzen hinausgehtst ?

Richtig wäre dann also das
Code:
**Btns[Count[color=#ff0000]-1[/color]].Btn.Free;
  Btns[Count[color=#ff0000]-1[/color]].App:='';
  Dec(Count);
  SetLength(Btns,Count);
oder
Code:
**[color=#008000]Dec(Count);[/color]
  Btns[Count].Btn.Free;
  Btns[Count].App:='';
  SetLength(Btns,Count);
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#4

Re: Dynamisch erstellte Buttons wieder Freigeben

  Alt 18. Mai 2005, 15:48
jheins hatte recht
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: Dynamisch erstellte Buttons wieder Freigeben

  Alt 18. Mai 2005, 18:16
Btn := TButton.Create(Self); Der Unterschied ist, das mit Form_Main die Buttons immer Form_Main gehoeren.
Sollte man einmal eine zweite Form dieser Klasse erstellen, dann wuerden deren Buttons auch Form_Main gehoeren
und nicht der neuen Form. Das kann boese Fehler nach sich ziehen.
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#6

Re: Dynamisch erstellte Buttons wieder Freigeben

  Alt 18. Mai 2005, 18:31
ja, schon klar, nur das wird (bei diesem Projekt) NIE passieren.

es geht darum das ich per button andere anwendungen starten will, aber halt nicht weiss wieviele der user haben will.
die Form brauche ich aber nur einmal...
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

Re: Dynamisch erstellte Buttons wieder Freigeben

  Alt 18. Mai 2005, 20:14
Man sollte es sich trotzdem angewoehnen. Es hilft, besonders wenn man weiss was es bedeutet.
Ich sage das ja hier auch fuer alle die diesen Thread lesen.
  Mit Zitat antworten Zitat
Coly

Registriert seit: 22. Nov 2003
7 Beiträge
 
#8

Re: Dynamisch erstellte Buttons wieder Freigeben

  Alt 20. Mai 2005, 13:17
oder man macht es so :

Delphi-Quellcode:
for i := 0 to Count do
  TButton(FindComponent('Btn_'+IntToStr(i)));
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Dynamisch erstellte Buttons wieder Freigeben

  Alt 20. Mai 2005, 13:58
Erstens wuerde ich jetzt mal wetten das es "Count - 1" heissen muss und zweitens kann man nicht immer die Buttons in der IDE anlegen.
Manchmal weiss man erst zur Laufzeit wieviel Buttons es werden sollen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz