Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi zur laufzeit erstelltes control wird nur teilweise zerstört (https://www.delphipraxis.net/17465-zur-laufzeit-erstelltes-control-wird-nur-teilweise-zerstoert.html)

kiar 5. Mär 2004 22:45


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:
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;
               ....
das bedeute ja, das allen den gleichen parent haben, oder?

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

kiar 7. Mär 2004 18:04

Re: zur laufzeit erstelltes control wird nur teilweise zerst
 
ich wollte mal hochschieben :oops:

kiar 24. Mär 2004 12:09

Re: zur laufzeit erstelltes control wird nur teilweise zerst
 
noch mal schieben

hier die erstellung des Panels mit allen Controls
Delphi-Quellcode:
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;
nach der eingabe möchte ich dies wieder löschen und zwar so:
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

kiar 24. Mär 2004 20:03

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:

Jens Schumann 24. Mär 2004 20:10

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.

Markus K. 24. Mär 2004 20:10

Re: zur laufzeit erstelltes control wird nur teilweise zerst
 
Hallo kiar,
mir ist in deinem Quelltext folgende Zeile aufgefallen.
Delphi-Quellcode:
btt.Parent:= p.parent;
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.
Delphi-Quellcode:
btt.Parent:= p;
Tschüß Markus

Jens Schumann 24. Mär 2004 20:12

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.

kiar 28. Mär 2004 14:44

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 17:34 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