AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Button Selbstzerstörung

Ein Thema von weisswe · begonnen am 25. Aug 2015 · letzter Beitrag vom 27. Aug 2015
Antwort Antwort
Seite 1 von 3  1 23   
weisswe
(Gast)

n/a Beiträge
 
#1

Button Selbstzerstörung

  Alt 25. Aug 2015, 12:23
Hallo!

Habe folgende Aufgabenstellung:
a) Erstelle dynamische Buttons auf einem Layout
b) Beim Klick auf einen der neu generieren Buttons führe Schritt a) aus
Klar ist, das ich beim Freigeben auch den aktuell geklickten Button zerstören muss -> Exception -> logisch
Wie kann man das "umschiffen"?

Delphi-Quellcode:
type barray = Array of TButton;
var btns: barray;

procedure TForm1.abtnClick(Sender: TObject);
var i: Integer;
begin
   for i := length(btns) - 1 downto 0 do btns[i].Free;
   SetLength(btns, 0);
   for i := 0 to random(9) + 1 do
   begin
      btns[i] := TButton.Create(nil);
      btns[i].name := 'abutton' + IntToStr(i);
      btns[i].text := 'Button' + IntToStr(i+1);
      btns[i].Parent := GridLayout1;
      btns[i].OnClick := abtnClick;
   end;
end;
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.835 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Button Selbstzerstörung

  Alt 25. Aug 2015, 12:27
Delphi-Quellcode:
if Sender = deinButton then
  NichtZerstören;
  Mit Zitat antworten Zitat
weisswe
(Gast)

n/a Beiträge
 
#3

AW: Button Selbstzerstörung

  Alt 25. Aug 2015, 12:57
Delphi-Quellcode:
if Sender = deinButton then
  NichtZerstören;
Aber ich möchten ja auch den gedrückten Button zerstören!?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.745 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Button Selbstzerstörung

  Alt 25. Aug 2015, 13:04
Ich verstehe das hinten und vorne nicht. Ein OnClick-Event eines Buttons kann doch den Button ganz normal zerstören? Schreib doch einfach mal in das OnClick -Event eines normalen Buttons Sender.Destroy() . Wo soll denn da die Exception sein?

Wo ich eher eine Exception sehe ist hier:
Delphi-Quellcode:
   SetLength(btns, 0);
    for i := 0 to random(9) + 1 do
    begin
       btns[i] := TButton.Create(nil);
[...]
Wie soll das funktionieren? Du setzt das Array (unnötigerweise) auf Länge Null und fängst dann an, darin herumzuschreiben.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.287 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Button Selbstzerstörung

  Alt 25. Aug 2015, 13:14
Ein OnClick-Event eines Buttons kann doch den Button ganz normal zerstören?
Diesem Gedankenfehler war ich neulich für ein FMX.TListViewItem auch erlegen. Das Dumme ist, dass dort ggf. der Click-Handler ausgeführt, danach aber mit der Instanz weiter hantiert wird. Letztere ist aber nicht mehr da, wenn sie im OnClick freigegeben wird -> *Rumms*.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.236 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Button Selbstzerstörung

  Alt 25. Aug 2015, 13:17
Die OnClick-Behandlung veranlasst ja noch der Button selbst.
Nach Erledigung kommt der Programmablauf wieder zurück zum Button.
Was dann passiert kannst Du nicht beeinflussen. Vielleicht will Windows den Button jetzt nochmal zeichnen o.ä. - und plötzlich ist er weg
Also der bisherige Speicherbereich ist undefiniert.

Ein Workaround wäre, den Button unsichtbar zu machen und irgendwo zu merken (in einer Liste oder globalen Variable o.ä.).
Dann kannst Du etwas später, wenn mal Zeit ist (und Windows garantiert nicht mehr benutzt), diesen freigeben.
Also so etwas wie einen Papierkorb bauen, der immer mal geleert wird.

Sonst wäre auch möglich, eine Message an den Button zu senden, der ihn veranlasst, sich freizugeben.
Dazu gab es schon Beiträge in der DP.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.024 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Button Selbstzerstörung

  Alt 25. Aug 2015, 13:29
Delphi-Quellcode:
if Sender = deinButton then
  NichtZerstören;
Fast...

Delphi-Quellcode:
type barray = Array of TButton;
var btns: barray;

procedure TForm1.abtnClick(Sender: TObject);
var
  i: Integer;
  MichNicht:TButton;
begin
  for i := length(btns) - 1 downto 0 do
    if TButton(Sender) = self
      then btns[0] := btns[i]
      else btns[i].Free;

  for i := 1 to random(9) + 1 do
    begin
       btns[i] := TButton.Create(nil);
       btns[i].name := 'abutton' + IntToStr(i);
       btns[i].text := 'Button' + IntToStr(i+1);
       btns[i].Parent := GridLayout1;
       btns[i].OnClick := abtnClick;
    end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Button Selbstzerstörung

  Alt 25. Aug 2015, 13:43
Mit dem IdleWorker (s. da -> http://www.delphipraxis.net/1305417-post11.html) geht das einfach so
Delphi-Quellcode:
uses
  IdleWorker;

procedure TForm1.abtnClick(Sender: TObject);
begin
  TIdleWorker.Default.Execute(
    procedure
    var
      i: Integer;
    begin
      // alte Buttons entsorgen
      for i := low(btns) to high(btns) do
        btns[i].Free; // ein DisposeOf wäre hier besser

      // neue Länge für das Array
      SetLength(btns, random(9) + 1 );

      // neue Buttons erzeugen
      for i := low(btns) to high(btns) do
      begin
        btns[i] := TButton.Create(nil);
        btns[i].name := 'abutton' + IntToStr(i);
        btns[i].text := 'Button' + IntToStr(i+1);
        btns[i].Parent := GridLayout1;
        btns[i].OnClick := abtnClick;
      end;
    end );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
weisswe
(Gast)

n/a Beiträge
 
#9

AW: Button Selbstzerstörung

  Alt 25. Aug 2015, 13:50
Mit dem IdleWorker (s. da -> http://www.delphipraxis.net/1305417-post11.html) geht das einfach so
Einfach nur perfekt!!!

DANKE Sir Rufo!!!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.024 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Button Selbstzerstörung

  Alt 25. Aug 2015, 13:57
Mit dem IdleWorker (s. da -> http://www.delphipraxis.net/1305417-post11.html) geht das einfach so
Logisch - vorausgesetzt die Application ist nicht anderweitig beschäftigt...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf