Results 1 to 13 of 13

Thread: Wijziging doorvoeren op meerdere Forms welke in een PageControl geladen zijn

Hybrid View

  1. #1
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289

    Wijziging doorvoeren op meerdere Forms welke in een PageControl geladen zijn

    Hoi

    Ik ben al een tijdje aan het stoeien met hoe ik zaken kan aanpassen op forms welke geladen worden in een PageControl.
    Het lukt me wel één Form aan te passen, maar niet alle forms.

    Ik zie niet waarom het mis gaat.

    Code:
    
    procedure TfrmMain.btnAddClick(Sender: TObject);
    var
      lFrmTabsheet              : TFrmTabsheet;
      lTabSheet                 : TTabSheet;
    begin
      lTabSheet                 := TTabSheet.Create(PageControl);
      lTabSheet.PageControl     := PageControl;
      lTabSheet.Name            := 'Tabsheet' + FPageCounter.ToString;
      lTabSheet.Caption         := 'Tabsheet' + FPageCounter.ToString;
    
      lFrmTabsheet              := TFrmTabsheet.Create(lTabSheet);
      lFrmTabsheet.BorderStyle  := bsNone;
      lFrmTabsheet.Parent       := lTabSheet;
      lFrmTabsheet.Align        := alClient;
      lFrmTabsheet.Tag          := FPageCounter;
      lFrmTabsheet.Show;
    
      PageControl.ActivePage    := lTabSheet;
      UpdateLabel;
    
      inc(FPageCounter);
    end;
    
    procedure TfrmMain.btnDelClick(Sender: TObject);
    begin
      if PageControl.PageCount > 0 then
        PageControl.ActivePage.Free;
    end;
    
    procedure TfrmMain.UpdateLabel;
    begin
      Label1.Caption := 'Active Page Idx: ' + PageControl.ActivePageIndex.ToString;
    end;
    
    // https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.ComCtrls.TPageControl_Properties
    procedure TfrmMain.UpdatePage(aPageIndex: integer);
    var
      I : integer;
      J : integer;
    
    // TFORM (FrmMain) -> TPageControl (PageControl) -> TTabsheet (Tabsheetx) -> TForm (FrmTabsheet) -> TEdit (edtFrmTabsheet)
    
    begin
      for I := 0 to ComponentCount -1 do
        if Components[I] is TPageControl then
          if TPageControl(Components[I]).PageCount > 0 then
            if TTabsheet(TPageControl(Components[I]).Pages[aPageIndex]).ControlCount > 0 then
              for J := 0 to TTabsheet(TPageControl(Components[I]).Pages[aPageIndex]).ControlCount - 1 do
    
                if TPageControl(Components[I]).ActivePage.Controls[J] is TForm then
                  TFrmTabsheet(TPageControl(Components[I]).ActivePage.Controls[J]).edtFrmTabsheet.Text := Edit1.Text;
    end;
    
    procedure TfrmMain.btnCurPageEditClick(Sender: TObject);
    begin
      UpdatePage (PageControl.ActivePageIndex);
    end;
    
    procedure TfrmMain.btnAllPageEditClick(Sender: TObject);
    var
      I                        : integer;
    begin
      if PageControl.PageCount > 0 then
        for I := 0 to PageControl.PageCount - 1 do
          UpdatePage (I);
    end;
    Tevens een zipje toegevoegd.
    pgControl.zip
    Alvast bedankt,

    Herby

  2. #2
    J.W. de Bokx
    Join Date
    Jun 2007
    Location
    Pijnacker
    Posts
    82
    Als ik het zo vlug bekijk mist hier:
    TFrmTabsheet(TPageControl(Components[I]).ActivePage.Controls[J]).edtFrmTabsheet.Text := Edit1.Text;
    het panel waar de edit op staat.

  3. #3
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Quote Originally Posted by JWBokx View Post
    Als ik het zo vlug bekijk mist hier:
    TFrmTabsheet(TPageControl(Components[I]).ActivePage.Controls[J]).edtFrmTabsheet.Text := Edit1.Text;
    het panel waar de edit op staat.
    Maar waarom werkt het dan wel op de tab die ik kies met activepageindex en niet als ik een teller gebruik?

  4. #4
    J.W. de Bokx
    Join Date
    Jun 2007
    Location
    Pijnacker
    Posts
    82
    Hmmm inderdaad loop je door alle controls van de page, dus moet de edit box ook langs komen...


    Ik ben er een beetje uit hoe ik dat soort dingen deed....
    Maar als ik het me goed herinner veranderde ik de parent van het panel, niet de hele form.
    Dan heb je ook geen gezeur met borders en icons.

    Wat ik me nog wel herinner is dat de parent wel terug gezet moest worden voordat alles gesloten wordt.
    Anders geeft het ene form de componenten vrij terwijl een ander form ze toont...

    Waarom wil je de tekst van een niet zichtbare edit aanpassen?

  5. #5
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    ik ben bezig met een applicatie waar meerdere keren dezelfde form gestart wordt en op di eform stata bv een panel.
    Ik wil daarmee bereiken dat zodra ik in het menu zeg "panel X uit" dat die op alle geopende tabsheets dan ook uitgezet wordt.

    Ik had even een TEdit als test gebruikt maar had ook direct een panel.visible kunnen gebruiken.
    Maakt voor de eindsituatie niks uit want ik kom niet op de andere pagina's uit.

  6. #6
    Quote Originally Posted by Herby View Post
    Ik ben al een tijdje aan het stoeien met hoe ik zaken kan aanpassen op forms welke geladen worden in een PageControl.
    Het lukt me wel één Form aan te passen, maar niet alle forms.
    Ten eerste... Je hebt het hier niet over meerdere TForms maar over TabSheets.
    Edit: O, ik zie het al, je misbruikt de term Tabsheet in TFrmTabsheet. Dat is dus wel een Tform

    Verder heb je de volgende regel:
    Delphi Code:
    1. if TPageControl(Components[I]).ActivePage.Controls[J] is TTabsheet then
    2.   TFrmTabsheet(TPageControl(Components[I]).ActivePage.Controls[J]).edtFrmTabsheet.Text := Edit1.Text;

    Je hebt daar "ActivePage" staan. Dat betekend dus dat je van Component[I] altijd de ActivePage pakt (dus momenteel zichtbare tabsheet), terwijl jij eigenlijk door alle Pages/tabsheets door wilt lopen. Dan moet je dus niet ActivePage gebruiken.

    Je zou het dus zo kunnen doen
    Delphi Code:
    1. if TTabsheet(TPageControl(Components[I]).Pages[aPageIndex]).Components[J] is TFrmTabsheet then
    2.   TFrmTabsheet(TPageControl(Components[I]).Pages[aPageIndex].Components[J]).edtFrmTabsheet.Text := Edit1.Text;

  7. #7
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    man man man

    dat ik daar een paar uur overeen heb gekeken

    Bedankt

  8. #8
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Toch nog een vraagje.

    Eigenlijk wil ik de code niet in het FrmMain hebben maar in FrmTabsheet want anders krijg je wel heel veel code in je mainform.

    Als ik nu een checkbox "ShowPanel" op FrmMain plaats en hij moet dan alle panels visible maken of juist niet.

    Form welke geladen wordt in de pagecontrol:
    Code:
    type
      TfrmTabsheet = class(TForm)
        pnlFrmTabsheet: TPanel;
        edtFrmTabsheet: TEdit;
      private
        { Private declarations }
        FShowPanel : boolean;
        procedure SetShowPanel (aShow: boolean);
      public
        { Public declarations }
        property ShowPanel : boolean    read FShowPanel     write SetShowPanel;
      end;
    
    var
      frmTabsheet: TfrmTabsheet;
    
    implementation
    
    {$R *.dfm}
    
    { TfrmTabsheet }
    
    procedure TfrmTabsheet.SetShowPanel(aShow: boolean);
    begin
      pnlFrmTabsheet.Visible := aShow;
      FShowPanel := pnlFrmTabsheet.Visible;
    end;
    Vanuit de mainform krijg ik nu een AV als ik probeer Showpanel aan te roepen.

    Code:
    procedure TfrmMain.cbShowPanelClick(Sender: TObject);
    var
      I : integer;
      lTabsheet : TTabsheet;
    begin
      if PageControl.PageCount > 0 then
        for I := 0 to PageControl.PageCount -1 do
          begin
            lTabsheet := PageControl.Pages[I];
            TFrmTabsheet(lTabsheet).ShowPanel := cbShowPanel.Checked;
          end;
    end;

  9. #9
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    fixed

    Code:
    procedure TfrmMain.cbShowPanelClick(Sender: TObject);
    var
      I : integer;
      lTabsheet : TTabsheet;
    begin
      if PageControl.PageCount > 0 then
        for I := 0 to PageControl.PageCount -1 do
          if PageControl.Pages[I].Controls[0] is TFrmTabsheet then
            TFrmTabsheet(PageControl.Pages[I].Controls[0]).ShowPanel := cbShowPanel.Checked;
    end;

  10. #10
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Strikt genomen hoeft die "if PageControl.PageCount > 0 then" niet eens: wanneer PageCount 0 is, zal de loop niet doorlopen worden.

    Een probleem waar je over 15 jaar tegenaan gaat lopen: wanneer je een control op dezelfde tabsheet, naast de form zet, dat Controls[0] niet je TfrmTabSheet meer is (en dan ben je weer een dag bezig voordat je het door hebt).

    Ik weet het: ik ben een aardig defensieve programmeur.
    TMemoryLeak.Create(Nil);

  11. #11
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Quote Originally Posted by VideoRipper View Post
    Strikt genomen hoeft die "if PageControl.PageCount > 0 then" niet eens: wanneer PageCount 0 is, zal de loop niet doorlopen worden.

    Een probleem waar je over 15 jaar tegenaan gaat lopen: wanneer je een control op dezelfde tabsheet, naast de form zet, dat Controls[0] niet je TfrmTabSheet meer is (en dan ben je weer een dag bezig voordat je het door hebt).

    Ik weet het: ik ben een aardig defensieve programmeur.
    Hoe zou jij het dan opgelost hebben?

  12. #12
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by Herby View Post
    Hoe zou jij het dan opgelost hebben?
    Ik denk op een soortgelijke manier als dit (even uit de losse pols):
    Delphi Code:
    1. function FindFirstControl(AParent: TWinControl; AClass: TClass): TControl;
    2. var
    3.   I: Integer;
    4. begin
    5.   if Assigned(AParent) then
    6.     for I := 0 to Pred(AParent.ControlCount) do
    7.       if AParent.Controls[I] is AClass then
    8.         Exit(AParent.Controls[I]);
    9.   Result := nil;
    10. end;
    11.  
    12. procedure TfrmMain.cbShowPanelClick(Sender: TObject);
    13. var
    14.   F: TFrmTabsheet;
    15.   I: Integer;
    16. begin
    17.   for I := 0 to Pred(PageControl.PageCount) do
    18.   begin
    19.     F := TFrmTabsheet(FindFirstControl(PageControl.Pages[I], TFrmTabsheet));
    20.     if Assigned(F) then
    21.       F.ShowPanel  := cbShowPanel.Checked;;
    22.   end;
    23. end;
    De functie FindFirstControl geeft de eerste control terug die voldoet aan de opgegeven klasse en is ook te gebruiken voor andere controls die van TControl afstammen mocht je dat ooit nodig hebben.
    TMemoryLeak.Create(Nil);

  13. #13
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Thx, die losse pols van jou doet het prima, werkt prima.

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
  •