Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Handle ändert sich (https://www.delphipraxis.net/176636-handle-aendert-sich.html)

ede57 18. Sep 2013 10:21

Handle ändert sich
 
Problem ??

in einen Frame fordere ich im Constructor ein Handle an
Code:
// Handle Anfordern
   HandleNeeded;
   ha := HandleAllocated; // = True
   frame__auftrag_daten.Message_Handle := self.Handle;
Wenn ich dann eine Message vom untergeordneten Frame an dieses Handle eine Message schicke
hat sich das Handle des Parent geändert.
Parent.Handle hat dann einen anderen Wert.
Weiß jemand einen Rat ??
Auch mit AferConstruction komme ich nicht weiter

Bummi 18. Sep 2013 12:04

AW: Handle ändert sich
 
Du könntest CreateWnd überschreiben welches aufgerufen wird wenn das Frame erstellt oder das zugrunde liegende Bildschirmobjekt freigegeben und neu erstellt werden muss.

Delphi-Quellcode:
  TMyFrame = class(TFrame)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure CreateWnd;override;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}
procedure TMyFrame.Button1Click(Sender: TObject);
var
 p:TWinControl;
begin
  p := Parent;
  parent := nil;
  parent := p;
end;

procedure TMyFrame.CreateWnd;
begin
   inherited;
   label1.caption := IntToHex(handle,6);
end;

ede57 18. Sep 2013 12:46

AW: Handle ändert sich
 
Danke für den Tip
Brauch das Handle nicht erst nach einen ButtonClick

Habe folgende Klasse wovon alle Frames kommen.
Delphi-Quellcode:
unit _frame_basis;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  Tframe = class(Forms.TFrame)
  private
    function get_Message_Handle: HWND;Virtual;
    procedure Set_Message_Handle(const Value: HWND);Virtual;
  protected
    FHandle_Parent : HWND;
  public
    property Message_Handle : HWND read get_Message_Handle write Set_Message_Handle;
  end;

implementation

{$R *.dfm}

{ Tframe__basis }
function Tframe.get_Message_Handle: HWND;
begin
  result := FHandle_Parent;
end;

procedure Tframe.Set_Message_Handle(const Value: HWND);
begin
  FHandle_Parent := Value;
end;

end.
Diese Unit binde ich bei allen Frames mit ein so das jeder Frame den Message_Handle hat.
Im Constructor forder ich ein Handle an und dann weise ich das Handle (siehe #1) zu
Wenn ich dann z.b. im edit1Onchangeevent bin, hat sich der wert von Message_Handle geändert,
obwohl ich ihn nichts anderes zugewiesen habe.
Der wert von Message_handle und Parent.Handle sind dann unterschiedlich was ja eigetlich nicht sein sollte

Mein übergeordneter Frame

Vielleiht habe ich auch was übersehen

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,
  auftrag_frame_auftrag_arten_kategorien,
  allg_frame_ordner,
  auftrag_frame_auftrag_daten,
  tab_auftrag_gesamt,
  _global_messages,
  _frame_basis;

type
  Tframe__auftrag = class(TFrame)
    frame__auftrag_daten: Tframe__auftrag_daten;
  private
    FAuftrag             : TAuftrag;
    procedure AfterConstruction;Override;
  protected
    procedure  SachnummerChangeMessage(var msg: TMessage); message wm_sachnummerChange;
    procedure  AuftragsNrChangeMessage(var msg: TMessage); message wm_auftragsnrChange;
    procedure  AuftragsNrExitMessage(var msg: TMessage); message wm_auftragsnrExit;
    procedure  AuftragsBeschrChangeMessage(var msg: TMessage); message wm_auftragsBeschrChange;
  public
    constructor Create(AOwner : TComponent);Override;
    destructor Destroy;Override;
  end;

implementation
{$R *.dfm}
{ Tframe__auftrag }
constructor Tframe__auftrag.Create(AOwner: TComponent);
begin
   inherited Create(AOwner);
   ......
   .......
end;
procedure Tframe__auftrag.AfterConstruction;
var
 ha : boolean;
begin
   inherited;
   HandleNeeded;
   ha := HandleAllocated; // = True
   frame__auftrag_daten.Message_Handle := self.Handle;
end;
destructor Tframe__auftrag.Destroy;
begin
   ........
   .........
   inherited;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 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