![]() |
zur laufzeit erstelltes control wird nur teilweise zerstört
hallo
zur Laufzeit erstelle ich ein panel, zwei edit's und einen bitbtn mit folgenden zeilen:
Delphi-Quellcode:
das bedeute ja, das allen den gleichen parent haben, oder?
p:= TPanel.Create(self);
with p do begin parent:= self; p.name:='max'; height:=100; Width :=200; Top:= mousePos.x; left:= MousePos.y; Ctl3D:=false; popupmenu:=popupmenu1; end; for i:=1 to 2 do begin ed:=TEdit.Create(self); ed.parent:=p; ed.name:= 'ed' + inttostr(i); ed.Height:= 20; ed.Width := 70; ed.text := ''; with Tedit(FindComponent('ed'+ inttostr(i))) do begin case i of 1: begin top := 10 ; left := 10 ; end; 2: begin top := 12 * i+ height; left := 10; end; end; end; end; btt:=TBitbtn.Create(self); btt.Parent:= p.Parent; .... jetzt möchte ich das Control im OnClick des buttons zerstören. da aber nach löschen kein button mehr da ist, will ich das löschen mit postmessage, an den messageloop anhängen. ich suche mir das handle des panels und versuche mit WM_Destroy zu löschen -> klappt nicht dann mit WM_Close -> da verschwindet das panel, aber der button bleibt warum???????? raik |
Re: zur laufzeit erstelltes control wird nur teilweise zerst
ich wollte mal hochschieben :oops:
|
Re: zur laufzeit erstelltes control wird nur teilweise zerst
noch mal schieben
hier die erstellung des Panels mit allen Controls
Delphi-Quellcode:
nach der eingabe möchte ich dies wieder löschen und zwar so:
procedure TfrmMain.geteilter1Click(Sender: TObject);
var p : TPanel; ed : TEdit; btt: Tbutton; MousePos: Tpoint; i:integer; begin if XPMenu1.Active then XPMenu1.Active:= False; mousePos:=screentoClient(Mouse.CursorPos); p:= TPanel.Create(Stringgrid1); with p do begin parent:= frmmain; p.name:='max'; height:=100; Width :=200; Top:= mousePos.x; left:= MousePos.y; Ctl3D:=false; popupmenu:=popupmenu1; end; btt:=TButton.Create(self); btt.Parent:= p.parent; btt.name:='britta'; btt.Top := p.top + p.Height -30; btt.left:= p.Left +10; //btt.Kind:=bkOk; btt.Visible:=true; btt.onClick:=GeteilterDienstInsert; for i:=1 to 2 do begin ed:=TEdit.Create(self); ed.parent:=p; ed.name:= 'ed' + inttostr(i); ed.Height:= 20; ed.Width := 70; ed.text := ''; with Tedit(FindComponent('ed'+ inttostr(i))) do begin case i of 1: begin top := 10 ; left := 10 ; end; 2: begin top := 12 * i+ height; left := 10; end; end; end; end; XPMenu1.Active:= true; end;
Delphi-Quellcode:
procedure Tfrmmain.GeteilterDienstInsert(Sender : TObject);
var hedit,hwd :THandle; sErsterDienst, sZweiterDienst : String; iCnt: integer; begin for icnt :=1 to 2 do begin with TEdit(FindComponent('ed'+ Inttostr(iCnt))) do case iCnt of 1: sErsterDienst := text; 2: sZweiterDienst := text; end; end; Stringgrid1.Cells[stringgrid1.Col,stringgrid1.row]:=sErsterDienst + #13#10 + sZweiterDienst; hedit:= Findwindow(nil,'Kindergarten'); hwd:=FindWindowEx(hedit,0,'TPanel','max'); postmessage(hwd,WM_close,0,0); //Showmessage(inttostr(hedit)); end; der bursche löscht alles, läßt mir aber den button frech auf der form stehen, weitere click's sind möglich. wm_destroy habe ich auch schon probiert. hat jemand wenigstens einen ansatz für mich. raik |
Re: zur laufzeit erstelltes control wird nur teilweise zerst
mit sendmessage ist es das gleiche. edit's und panel verschwinden ,doch der button hält sich energisch. :oops:
|
Re: zur laufzeit erstelltes control wird nur teilweise zerst
Hallo kiar,
ja ich habe noch eine Vorschlag. Sende die Message mit PostMessage nicht an das Panel, sondern an das Formular! Ungefähr wie folgt:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; const WM_PRIVATE_FREEPANEL = WM_APP+100; type TForm1 = class(TForm) Panel1: TPanel; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } procedure WMPRIVATE_FREEPANEL(var Msg : TMessage); message WM_PRIVATE_FREEPANEL; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin PostMessage(Handle,WM_PRIVATE_FREEPANEL,0,0); end; procedure TForm1.WMPRIVATE_FREEPANEL(var Msg: TMessage); begin Panel1.Free; Panel1:=Nil; end; end. |
Re: zur laufzeit erstelltes control wird nur teilweise zerst
Hallo kiar,
mir ist in deinem Quelltext folgende Zeile aufgefallen.
Delphi-Quellcode:
Ich glaube, dass du dem Button das Parent des Panels zuweist. Daraus folgt, dass der Button nicht beim löschen des Panels verschwindet, da er nicht auf dem Panel liegt sondern auf dem Parent des Panels. So müsste es richtig sein.
btt.Parent:= p.parent;
Delphi-Quellcode:
Tschüß Markus
btt.Parent:= p;
|
Re: zur laufzeit erstelltes control wird nur teilweise zerst
Hallo Markus,
ich bin mir ziemlich sicher, der Owner für das freigeben verantwortlich ist und nicht der Parent. |
Re: zur laufzeit erstelltes control wird nur teilweise zerst
nach dem ich die oben ausführungen angepasst habe verschwindet das panel vom schirm, existiert aber trotzdem noch.
ein nochmaliger aufruf, sagt, das die komponente schon existiert. ich kriege das ding einfach nicht kaputt ? raik |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz