Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi On Button click close all TPageControl TTabSheet`s (https://www.delphipraxis.net/60434-button-click-close-all-tpagecontrol-ttabsheet%60s.html)

alpha1 6. Jan 2006 20:29


On Button click close all TPageControl TTabSheet`s
 
How to make this: On Button click close all TPageControl TTabSheet`s ?

alpha1 6. Jan 2006 20:36

Re: On Button click close all TPageControl TTabSheet`s
 
And more one question - how to make this: on right mouse click - TTabSheet under mouse show? :)

marabu 7. Jan 2006 08:15

Re: On Button click close all TPageControl TTabSheet`s
 
Try this:

Delphi-Quellcode:
procedure TWebForm.CloseAllButtonClick(Sender: TObject);
begin
  with PageControl do
    while PageCount > 0 do
      ActivePage.Free;
end;

procedure TWebForm.PageControlContextPopup(Sender: TObject;
  MousePos: TPoint; var Handled: Boolean);
var
  i: integer;
begin
  i := PageControl.IndexOfTabAt(MousePos.X, MousePos.Y);
  if i <> -1 then
  begin
    PageControl.ActivePageIndex := i;
    Handled := true;
  end;
end;
Notice that you can't have a context menu associated with the tab sheet header anymore.

marabu

Sauerkrautpoet 15. Sep 2006 15:03

Re: On Button click close all TPageControl TTabSheet`s
 
Zitat:

Zitat von marabu
Try this:

Delphi-Quellcode:
procedure TWebForm.CloseAllButtonClick(Sender: TObject);
begin
  with PageControl do
    while PageCount > 0 do
      ActivePage.Free;
end;
marabu


ich erweitere die fragestellung um die tatsache, dass ich nur einen gezielten tab schließen will.
ich habs schon mit
Delphi-Quellcode:
 
      pagecontrol.pages[tabindex].destroy;
      //beziehungsweise
      pagecontrol.pages[tabindex].free;
versucht aber hmpf...nix da. knallt mir die anwendungen speicherverletzungen ums ohr.

marabu 15. Sep 2006 15:32

Re: On Button click close all TPageControl TTabSheet`s
 
Hallo.

Destroy() ist grundsätzlich falsch. Free() sollte funktionieren. Ist denn TabIndex ein gültiger Index? Oder kann es sein, dass der Fehler erst nach dem Free() auftritt? Zur Verdeutlichung zeige ich dir die Löschroutine für ActivePage:

Delphi-Quellcode:
procedure TDemoForm.TabCloseActionExecute(Sender: TObject);
var
  i: Integer;
begin
  with PageControl do
  begin
    i := ActivePageIndex;
    ActivePage.Free;
    if i < PageCount then
      ActivePageIndex := i;
  end;
end;
Vielleicht setzt du mal einen Haltepunkt auf die Zeile mit Free in deinem Code und gehst mit F8 drüber hinweg.

Grüße vom marabu

Sauerkrautpoet 15. Sep 2006 15:57

Re: On Button click close all TPageControl TTabSheet`s
 
Zitat:

Zitat von marabu

Free() sollte funktionieren. Ist denn TabIndex ein gültiger Index?

der tab index war gültig, hab eben die ide runtergefahren und neu angefahren...itz gehts *narf*

frage noch dazu:
ich erstelle meine tabs dynamisch und lad darin forms die aus dll´s stammen.
aktualisiert sich der index der tabs, bzw wird der index eines zerstörten tabs wieder belegt, wenn ich einen neuen tab öffne?! sprich:

wenn tab 2 zerstört wird, tab neu anlegen wird automatisch wieder index 2 vergeben?!

Nighthawk1310 15. Sep 2006 16:30

Re: On Button click close all TPageControl TTabSheet`s
 
jep.

Das Page- bzw. TabControl reorganisiert die Tabindizes automatisch,
wenn du einen aus der Mitte rauslöscht. Dann gibt es wieder die Indizes
von 0 bis ... Sprich du löscht Page 2 und 3,
dann wird aus Page 4 (falls vorhanden) Page 2 und aus Page 5 Page 3.
Eine neue Page bekommt dann den Index 3 und ist Page 4.

[EDIT]
//hier noch mal ein wenig code wie ichs in meinem pagecontrolderivat gelöst habe

Delphi-Quellcode:
procedure TO12PageControl.ClosePage (Index: Integer);
begin
    //Event auslösen, falls es etwas aufzuräumen gibt
    if assigned(FOnBeforeCloseTab) then
         FOnBeforeCloseTab(Self, Index);

    //wenn index < letzte seite dann aktive seite = nächste seite
    if (Index < (PageCount - 1)) and (ActivePageIndex = Index) then
       ActivePageIndex := Index + 1;
       //SelectNextPage(True);

    //wenn index = letzte seite dann aktive seite = vorherige seite
    if (Index = PageCount) and (PageCount > 0) then
       ActivePageIndex := Index - 1;

    //seite löschen
    Pages[Index].free;

    //event auslösen, falls man jetzt etwas mit der neuen aktive seite machen möchte
    if assigned(FOnCloseTab) then
         FOnCloseTab(Self, ActivePageIndex);
end;

implementation 10. Aug 2009 09:32

Re: On Button click close all TPageControl TTabSheet`s
 
Hmmm, bei mir gibt's nur eine AccessViolation.
Dazu sei gesagt, dass ich Lazarus benutze, daher könnte sich mein Ergebnis von anderen unterscheiden.
Aber woher kann die kommen und wie verhindere ich sie?

[EDIT]
Hmm, jetzt funzt es...

[EDIT2]
Hää, jetzt doch nich mehr.
Ich bin verwirrt.
Hiillffee, ich versteh die Welt nicht mehr... :glaskugel:

Nighthawk1310 10. Aug 2009 22:51

Re: On Button click close all TPageControl TTabSheet`s
 
Zeig ansonsten mal etwas Code, damit man mal rüberschauen kann.

implementation 11. Aug 2009 09:20

Re: On Button click close all TPageControl TTabSheet`s
 
Delphi-Quellcode:
procedure TForm1.MenuItem54Click(Sender: TObject);
begin
  reg[Pages.ActivePage.Tag].synedit.free;
  Pages.ActivePage.Free;                      // Hier liegt das Problem
  UpdateStatus('Done.');
end;
Pages ist das TPageControl.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz