Einzelnen Beitrag anzeigen

nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

[VCL] Controls in TCategoryPanel Header einfügen

  Alt 24. Sep 2015, 02:19
Hallo!

Ich habe ein 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 TCustomCategoryPanel angeschaut. Und so wie ich das verstanden habe, werden die eingefügten Controls über den Message-Handler TCustomCategoryPanel.CMControlListChanging in das 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. inherited ruft die Originalfunktion TCustomCategoryPanel.CMControlListChanging nur auf, wenn Message.ControlListItem^.Control nicht meine Combobox ist.

Aber egal wie ich es drehe und wende, die FObservationTypeSelector Combobox landet trotzdem im FPanelSurface ?!
Message.ControlListItem^.Control.Top := 0 setzt die Combobox nicht, wie gedacht, auf die Höhe des Headers, sondern sie landet darunter in dem 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 procedure TWinControl.Remove , weil sowohl FTabList als auch FWinControls angeblich nil sind, obwohl sie in der originalen Funktion bei FPanelSurface.InsertControl erzeugt werden ... ?!

Was mache ich hier falsch?

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

Geändert von nuclearping (25. Sep 2015 um 00:46 Uhr)
  Mit Zitat antworten Zitat