Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [VCL] Controls in TCategoryPanel Header einfügen (https://www.delphipraxis.net/186709-%5Bvcl%5D-controls-tcategorypanel-header-einfuegen.html)

nuclearping 24. Sep 2015 02:19

[VCL] Controls in TCategoryPanel Header einfügen
 
Hallo! :)

Ich habe ein
Delphi-Quellcode:
TCategoryPanel
abgeleitet und möchte gern in den Header diverse Controls einfügen. Eine ComboBox und einen Button zum Beispiel.

Ich habe mir den Code vom
Delphi-Quellcode:
TCustomCategoryPanel
angeschaut. Und so wie ich das verstanden habe, werden die eingefügten Controls über den Message-Handler
Delphi-Quellcode:
TCustomCategoryPanel.CMControlListChanging
in das
Delphi-Quellcode:
FPanelSurface
"verschoben".

Also habe ich mir in meiner abgeleiteten Klasse einen gleichen Message-Handler erstellt:

Delphi-Quellcode:
interface

// ...

TElementsCategoryPanel = class(TCategoryPanel)
  // ...
private
  FObservationTypeSelector: TComboBox;

  procedure CMControlListChanging(var Message: TCMControlListChanging);
    message CM_CONTROLLISTCHANGING;
  // ...
end;

implementation

// ...

procedure TElementsCategoryPanel.CMControlListChanging(
  var Message: TCMControlListChanging);
begin
  if (Message.ControlListItem^.Control = FObservationTypeSelector) then
    begin
      if Message.Inserting then
        begin
          FObservationTypeSelector.Parent := nil; // Die Combobox aus dem FPanelSurface holen
          Message.ControlListItem^.Parent := Self;
          Message.ControlListItem^.Control.Top := 0;
        end;
    end
  else
    inherited;
end;
Wenn ich mit Breakpoints durchsteppe, funktioniert das Ganze auch.
Delphi-Quellcode:
inherited
ruft die Originalfunktion
Delphi-Quellcode:
TCustomCategoryPanel.CMControlListChanging
nur auf, wenn
Delphi-Quellcode:
Message.ControlListItem^.Control
nicht meine Combobox ist.

Aber egal wie ich es drehe und wende, die
Delphi-Quellcode:
FObservationTypeSelector
Combobox landet trotzdem im
Delphi-Quellcode:
FPanelSurface
?!
Delphi-Quellcode:
Message.ControlListItem^.Control.Top := 0
setzt die Combobox nicht, wie gedacht, auf die Höhe des Headers, sondern sie landet darunter in dem
Delphi-Quellcode:
FPanelSurface
.

Ich habe auch schon eine Alternative versucht:

Delphi-Quellcode:
procedure TElementsCategoryPanel.CMControlListChanging(
  var Message: TCMControlListChanging);
begin
  inherited; // Immer Originalfunktion aufrufen

  if (Message.ControlListItem^.Control = FObservationTypeSelector) then
    begin
      if Message.Inserting then
        begin
          // Combobox wieder aus der FPanelSurface.FWinControls Liste entfernen
          FPanelSurface.RemoveControl(Message.ControlListItem^.Control);

          Message.ControlListItem^.Parent := Self;
          Message.ControlListItem^.Control.Top := 0;
        end;
    end;
end;
Da knallts aber bei
Delphi-Quellcode:
procedure TWinControl.Remove
, weil sowohl
Delphi-Quellcode:
FTabList
als auch
Delphi-Quellcode:
FWinControls
angeblich
Delphi-Quellcode:
nil
sind, obwohl sie in der originalen Funktion bei
Delphi-Quellcode:
FPanelSurface.InsertControl
erzeugt werden ... ?!

Was mache ich hier falsch?

PS: Crosspost http://stackoverflow.com/questions/3...-header-region


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