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