AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Button zerstören?

Ein Thema von Moyyer · begonnen am 20. Dez 2003 · letzter Beitrag vom 22. Mär 2004
Antwort Antwort
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#1

Button zerstören?

  Alt 20. Dez 2003, 17:59
Hallo Alle Zusammen

Ich habe hier eine ganz einfaches Programm. Es erstellt 500 Buttons.
Nun will ich, das wenn ich einen bestimmten Button drücke, dieser verschwindet (sich zerstört). Aber bei mir kommt immer die Fehlermeldung "Abstrakter Fehler". Was muss ich ändern, damit es funktioniert? Oder geht es überhaupt?

Delphi-Quellcode:

const
MAX_BUTTONS = 500;

procedure TForm1.Button1Click(Sender: TObject);
var
    i: integer;
begin
  SetLength(pbTemp,MAX_BUTTONS);
  for i:=0 to MAX_BUTTONS - 1 do
  begin
    pbTemp[i] := TButton.Create(nil);
    pbTemp[i].Name := 'ButtonNr' + IntToStr(i);
    pbTemp[i].Parent := Form1;
    pbTemp[i].Top := 16 * i;
    pbTemp[i].Left := 300;
    pbtemp[i].OnClick := butclick;
    pbtemp[i].Tag := i;
  end;
end;

procedure TForm1.ButClick(Sender: TObject);
var a: integer;
begin
a := (sender as Tbutton).tag;
label1.caption := inttostr(a);
pbtemp[a].Free;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Button zerstören?

  Alt 20. Dez 2003, 19:04
Hallo,
das liegt daran, dass Du den Button, der das OnClick Event gefeuert hat im selben zerstörst.
D.h. der Button ruft den OnClick-Handler auf. Nach dem der Code im OnClick-Handler abgearbeitet
wurde kehrt dieser zum Button zurück. Nur zum welchem Button soll er denn zurück ??? Der Button
wurde ja freigegeben. Deshalb empfehle ich im OnClick-Handler den Button nicht freizugeben, sondern
mit PostMessage eine Botschaft an das Formular zu senden. Über wParam des Messagerecords kannst Du
den Arrayindex übergeben.
Siehe Anlage
Angehängte Dateien
Dateityp: zip button.zip (163,4 KB, 47x aufgerufen)
  Mit Zitat antworten Zitat
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Button zerstören?

  Alt 20. Dez 2003, 19:32
Vielen Dank. Isst genau dass was ich gebraucht habe.
  Mit Zitat antworten Zitat
daywalker-dj-k

Registriert seit: 27. Nov 2003
85 Beiträge
 
#4

Re: Button zerstören?

  Alt 20. Mär 2004, 12:03
hallo,
hab da mal ne frage zum "button-prog". wie müsste ich das ganze lösen, wenn ich einfach in einer schleife einige objekte löschen möchte?

PostMessage(Handle,PM_FREEBUTTON,TComponent(Sender).Tag,0); da müsste ich doch jetzt quasi nur "TComponent(Sender)" durch meine komponente (über FindComponent) ersetzen.

nur was muss ich nun hier machen:

FreeAndNil(FButtonArray[Message.wParam]); ich habe ja kein array mit den objektnamen und möchte auch keins erstellen. was bedeutet denn das "message.wparam" überhaupt. Muss ich bei FreeAndNil nicht einfach nur den Objektnamen wie "Edit1" einsetzen?


danke schonmal
gruß
tkliewe



hier mal kurz der ganze quelltext:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  iCnt : Integer;
begin
  SetLength(FButtonArray,MAX_BUTTONS);
  For iCnt:=0 to MAX_BUTTONS-1 do
    begin
    FButtonArray[iCnt]:=TButton.Create(Self);
    FButtonArray[iCnt].Parent:=Self;
    FButtonArray[iCnt].Caption:='Button '+IntToStr(iCnt+1);
    FButtonArray[iCnt].SetBounds(100,12+iCnt*(FButtonArray[iCnt].Height+4),FButtonArray[iCnt].Width,FButtonArray[iCnt].Height);
    FButtonArray[iCnt].Tag:=iCnt;
    FButtonArray[iCnt].OnClick:=ButtonClick;
    end;
  Button1.Enabled:=False;
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
  {PostMessage wird hier verwendet, weil PostMessage ans Ende der Botschafts-
  warteschlange gestellt wird und deshalb erst abgearbeitet wird wenn alle
  anderen Botschaft, wie z.B. die Click Botschaft an den Button abgearbeitet
   wurde}

  PostMessage(Handle,PM_FREEBUTTON,TComponent(Sender).Tag,0);
end;

procedure TForm1.PMFREEBUTTON(var Message: TMessage);
begin
  FreeAndNil(FButtonArray[Message.wParam]);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Button zerstören?

  Alt 20. Mär 2004, 17:24
Zitat von daywalker-dj-k:
wie müsste ich das ganze lösen, wenn ich einfach in einer schleife einige objekte löschen möchte?
Wenn ButtonX nicht Bestandteil von FButtonArray ist brauchst Du das ganze Zeug mit PostMessage nicht. Dann reicht der folgende
Delphi-Quellcode:
Codeprocedure TForm1.ButtonXClick(Sender : TObject);
var
  iCnt : Integer;
begin
  For iCnt:=Low(FButtonArray) to High(FButtonArray) do
    FreeAndNil(FButtonArray[iCnt]);
end;
Zitat von daywalker-dj-k:
ich habe ja kein array mit den objektnamen und möchte auch keins erstellen. was bedeutet denn das "message.wparam" überhaupt. Muss ich bei FreeAndNil nicht einfach nur den Objektnamen wie "Edit1" einsetzen?
Wenn die Buttons in keinem Array sind, dann musst Du die Buttons geschickt benamen. Dann kannst FindComponentwie folgt nutzen:
Delphi-Quellcode:
procedure TForm1.ButtonXClick(Sender : TObject);
var
  iCnt : Integer;
begin
  For iCnt:=0 to 9 do // wir haben 10 Buttons
    FindComponent('Button'+IntToStr(iCnt)).Free;
end;
Objektnamen sind wie andere Namen auch nur Schall und Rauch. Wichtig ist, dass Du eine gültige Referenz auf das Objekt hast. Über den Namen des Objektes sorgt der Compiler dafür das dem so ist. Ob die Referenz in einer Instanzenvariablen oder in Array oder sonst wo gespeichert ist ist dabei egal.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von devnull
devnull

Registriert seit: 5. Okt 2003
362 Beiträge
 
Delphi 7 Personal
 
#6

Re: Button zerstören?

  Alt 20. Mär 2004, 22:05
Ich hab hierzu auch noch eine Frage:
Ich habe einem Button des FButtonArrays die Funktion gegeben, dass Programm zu beenden.

Erstellen eines neuen Buttons
Delphi-Quellcode:
  SetLength(Form1.FButtonArray, 10);
  Form1.FButtonArray[iCnt]:= TButton.Create(Form1);
  Form1.FButtonArray[iCnt].Parent := Form1;
  Form1.FButtonArray[iCnt].Caption := 'Programm Beenden';
  //Form1.FButtonArray[iCnt].Tag := iCnt;
  Form1.FButtonArray[iCnt].Left := x+25;
  Form1.FButtonArray[iCnt].Top := y;
  Form1.FButtonArray[iCnt].Width := w;
  Form1.FButtonArray[iCnt].Height := h;
  @Form1.FButtonArray[iCnt].OnClick := @MeinEigenesOnClick;

Nachdem auf ein Button geklickt wurde
Delphi-Quellcode:
procedure MeinEigenesOnClick (Self: TObject; Sender: TObject);
var prg_gesucht : string;
begin
  prg_gesucht := TButton(Sender).Caption;

  if prg_gesucht = 'Programm beendenthen begin
     MessageDlg ('Beenden ...',mtInformation,[mbOk],0);
     // Fehlt hier was ???
     Form1.Close;
  end;
  [...]
Seitdem ich dies so mache (Beenden des Programms) kommt nach Schließen des Programms der Windows-Fehler-Sound
und in der Delphi-Umgebung die Debugger-Exception "Ungültige Zeigeroperation".


Kann mir jemand helfen ???


MFG
devnull
-- Never change a running system --
  Mit Zitat antworten Zitat
Keex

Registriert seit: 25. Feb 2004
29 Beiträge
 
#7

Re: Button zerstören?

  Alt 21. Mär 2004, 09:26
hmm, ich hab das hier mit Buttonserstellen auch mal ausprobiert (<- newb )
klappt auch alles soweit, nur wenn ich versuche den neuen buttons ein ereignis zuzuweisen mit

Buttonarray[i].OnClick := TForm1.EigenerClick; kommt der Fehler "Incompatible Types: TNotifyevent and Procedure".
ich hab das aber doch genauso gemacht wie ihr hier
  Mit Zitat antworten Zitat
Benutzerbild von devnull
devnull

Registriert seit: 5. Okt 2003
362 Beiträge
 
Delphi 7 Personal
 
#8

Re: Button zerstören?

  Alt 21. Mär 2004, 10:05
Ersetz die Zeile mal mit der unten stehenden:
Buttonarray[i].OnClick := TForm1.EigenerClick; -->
@Form1.FButtonArray[iCnt].OnClick := @MeinEigenesOnClick;
MFG
devnull
-- Never change a running system --
  Mit Zitat antworten Zitat
daywalker-dj-k

Registriert seit: 27. Nov 2003
85 Beiträge
 
#9

Re: Button zerstören?

  Alt 21. Mär 2004, 11:22
hallo,
@ Jens Schumann

du hast mir ja geschrieben, dass ich einfach mit findcomponent das objekt suchen soll und dann mit free "löschen". dann habe ich aber wieder das geleiche problem wie der ursprüngliche poster ("Abstrakter fehler"). ich dachte halt, dass mir das "PostMessage" diesen fehler behebt.

mfg
tkliewe
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Button zerstören?

  Alt 22. Mär 2004, 09:49
Zitat von daywalker-dj-k:
du hast mir ja geschrieben, dass ich einfach mit findcomponent das objekt suchen soll und dann mit free "löschen". dann habe ich aber wieder das geleiche problem wie der ursprüngliche poster ("Abstrakter fehler"). ich dachte halt, dass mir das "PostMessage" diesen fehler behebt.
Suchst Du in dem OnClick Event mit FindComponent auch den Button, der das Event ausgelöst hat?
Das darfst Du natürlich nicht. Habe ich oben auch extra geschrieben. Wenn Du das unbedingt möchtest, dann kannst Du PostMessage nutzen. In den lParam packst Du die Objektreferenz, die Du mit Findcomponent gefunden hast. In dem Messagehandler kannst Du dann aus lParam die Objektreferenz ziehen und den Button freigeben.
I come from outer space to save the human race
  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 06:30 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