Ik zit met het volgende:

In de applicatie worden - afhankelijk van wat er door de gebruiker is geconfigureerd) - een of meer buttons op het scherm moeten komen; minimaal geen, maximaal 3, in twee groepen. Deze komen op een bestaande toolbar, achter al aanwezige (en actieve) knoppen.
Het is de bedoeling dat als er een button in een groep wordt aangemaakt, er vóór die groep een splitter (TSplitter of afgeleide) wordt geplaatst. Dus niet vast, maar op het moment dat het nodig is. Dat betekent:
Groep 1:
geen buttons: geen splitter
1,2 of 3 buttons: eerst een splitter, daarna de buttons
Groep 2:
geen buttons: geen splitter
1,2 of 3 buttons: eerst een splitter, daarna de buttons

Dit zijn dus mogelijke opties: ([X] = bestaande laatste button op de toolbar, [1], [2] = buttons van eerste groep, [A], [B] = buttons van 2e groep, | = splitter)

[x] (geen buttons, dus geen splitter)
[x] | [1] [2] (alleen groep 1), of
[x] | [A] [B] (alleen groep 2)
[x] | [1] | [A] [B] (beide groepen minimaal 1 button, splitter vóór elke groep)

Elke groep wordt als volg aangemaakt (in grote lijn):

Code:
 
  ...
  nextButton := baseButton.left + 1; // Die staat direct na de voorgaande = hier komt eerst de splitter
  Splitter := MaakSplitter (BaseButton, NextButton) ;
  NrBts := 0;
  for i := eev01 to eev20 do
  begin
    // Dan moet er een Koppeling-button opgezet en ingevuld worden - op de plaats van Rontgenbutton1
    tbbR := MaakKoppelingButton (i, BaseButton, NextButton, NextNum, Shortcut, Patient, OnClick) ;
    if tbbR <> nil then
    begin
      NrBts := NrBts + 1;
      MaakRontgenMenu (tbbR, menu1, menu2, eerste_gevuld, tweede_gevuld, Shortcut) ;
    end;
  end;

  if NrBts > 0 then
  begin
    Splitter.Visible := true ;
    Splitter.repaint;
  end else
  begin
    FreeandNil (Splitter);
    nextButton := baseButton.left + 1; // Tetugzetten - want bij aanmaak van splitter is die aangepast
  end;
  ...
BaseButton is een toolbutton in het scherm die als placeholder fungeert om dit te plaatsen - wordt onzichtbaar gemaakt;
NextButton is de locatie (.left) van waar de volgende control (splitter of button) moet komen. Deze wordt eenmaal ingesteld en verder bijgestuurd met de breedte van de controle + marge.

De splitter wordt dus altijd aangemaakt maar pas zichtbaar gemaakt als er iets te splijten is:

Code:
function TKoppelingButton.MaakSplitter (BaseButton: TdSpeedbutton; var NextButton: integer) :TcSplitter;
var
  s: tcSplitter ;
begin
  s := TcSplitter.create ((BaseButton.Parent).Parent);
  if nextButton > baseButton.left + 1 then    // dan zijn er al buttons neergezet...
    NextButton := Nextbutton + S.Width ;    // dus dan moet de breedte van de splitter ervan er nog bij.
  s.Left := nextButton ;
  s.Top  := baseButton.Top ;
  s.Enabled := true ;
  s.Visible := false;  // initieel onzichtaar
  S.update;
  nextButton := s.Left + s.Width + 1;
  result := s;
end;
Rseultaat: De buttons komen inderdaad op het scherm zoals bedoeld, maar de splitters ontbreken: de eerste button staat ook op de plaats van de placeholder, terwijl daar de splitter had moeten staan:

[X] [1] [A] [B]

wat had moeten zijn:

[X] | [1] | [A] [B]

Zet ik de splitters direct op de toolbar, zijn ze inderdaad te zien - maar exact op de plaats waar ze zijn gedefinieerd; wat in geval van buttons in beide groepen betekent dat beide splitters bij elkaar staan, voor de buttons (de placeholder is immers onzichtbaar)

[x] || [1] [A] [B]

in plaats van

[X] | [1] | [A] [B].

Ik heb ook geprobeerd om in dat geval de tweede splitter op een andere plaats te zetten maar ook dat lukt niet.

Hoe krijg is dat voor elkaar - als het al kan?