Results 1 to 3 of 3

Thread: dynamische Splitter plaatsen (geen vaste locatie)

  1. #1

    dynamische Splitter plaatsen (geen vaste locatie)

    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?

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,274
    Volgens mij haal je Owner en Parent door elkaar...

    Owner is de eigenaar van het component en is oa. verantwoordelijk voor het opruimen.
    Parent is de control waar het component op staat.

    Vaak is Owner en Parent hetzelfde (als bijvoorbeeld een TButton direct op een TForm staat), maar
    dit hoeft niet zo te zijn.

    Bij het creëren van een control (in dit geval een TSplitter) geef je als owner bijvoorbeeld de form
    op, maar als parent wil je (als ik je verhaal begrijp) de parent van BaseButton.

    Concreet wordt het dus (in pseudo-code):
    Delphi Code:
    1. S := TcSplitter.Create(BaseButton);
    2. S.Parent := BaseButton.Parent;

    Owner <> Parent: het zijn twee totaal verschillende properties.
    Owner maakt onderdeel uit van TComponent, terwijl Parent alleen bij T(Win)Control afgeleiden bestaat.
    Last edited by VideoRipper; 01-May-18 at 14:57.
    TMemoryLeak.Create(Nil);

  3. #3
    Dat was het dus - met een kleine aanpassing (voor de volledigheid):
    Code:
    S := TcSplitter.Create(owner);  // het scherm - niet de placeholder....
    S.Parent := BaseButton.Parent; //de toolbar
    geldt overigens ook voor de buttons.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •