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 PageControl - Tabs um Schließen-Symbol erweitern (https://www.delphipraxis.net/79030-pagecontrol-tabs-um-schliessen-symbol-erweitern.html)

Balu der Bär 15. Okt 2006 10:18


PageControl - Tabs um Schließen-Symbol erweitern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

heute habe ich einen mehr oder minder schweren Anschlag auf euch vor. *g*

Ich benutze in meinem Programm ein TPageControl auf welchem mehrere TabSheets liegen. Jetzt hätte ich gerne, dass jeder Tab ein Schließen-Symbol ([x]) am Ende jedes Tabs hat, sodass man den Tab schließen kann (Beispiel siehe Anhang). Leider habe ich bloß keine Ahnung wie ich das mit einem PageControl hinbekomme. Ich dachte daran das Schließen Symbol mittels Canvas auf den Tabreiter zu zeichnen, klappte nach den ersten Versuchen aber auch nicht recht, da erstens jeder Tabreiter unterschiedlich groß sein kann und zweitens ich nicht wüsste wie ich auf das Klicken auf das gezeichnete Symbol reagieren sollte. Hat da jemand ne Idee wie ich das hinbekomme? Danke euch.

Daniel G 15. Okt 2006 10:42

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Evtl. könntest du diese beiden Tipps miteinander verbinden:

Herausfinden, auf welches Tab geklickt wurde (benutzt TabRect)
Bsp. für selbst gezeichneten Closebutton

Evtl. könnte man dann unter Verwendung von TabRect mit relativen Positionsangaben eine Closebutton zeichnen.

P.S.: Solltest du 'ne Lösung haben, poste sie mal bitte hier... :mrgreen:

//Edit: Oh Gott, zweimal "Evtl." :roll:

Balu der Bär 15. Okt 2006 10:55

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Danke erstmal, mal gucken ob ich da halbwegs durchsteige.

Zitat:

Zitat von Daniel G
P.S.: Solltest du 'ne Lösung haben, poste sie mal bitte hier... :mrgreen:

:stupid: :gruebel: :mrgreen:

Balu der Bär 15. Okt 2006 12:20

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Ich nochmal, also das Erstellen des Buttons hat mit diesem Code ja schon geklappt. Leider nur bekomme ich es einfach nicht hin den Button oben in in die Tabbeschriftung zu schreiben. In TabRect liegen zwar die Positionen des Reiters, jedoch komm ich einfach nicht drauf wie ich dort hinein zeichnen kann. :wall:

Ich glaube so langsam krieg ich es hin. *g*

DGL-luke 15. Okt 2006 12:29

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Kommt doch nur aufs Parent des Buttons an... und dann musst du eben die Koordinaten umrechnen.

Balu der Bär 15. Okt 2006 13:32

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ok, ich hatte anfangs einen kleinen Denkfehler drin, deshalb klappte es ständig nicht. :wall:

Jetzt gehts aber ungefähr so wie ich mir das gedacht habe (siehe Screenshot). Hab mal ein klitzekleines Beispiel angehangen, sollte für jeden verständlich sein. Der ganze Dank gebührt natürlich dataspider für seinen Code. ;)

API 29. Jun 2009 14:43

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Wie kann man bei Klick auf einen Schließen-Button benachrichtigt werden und dann das zugehörige Tab schließen?

toms 29. Jun 2009 15:13

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von API
Wie kann man bei Klick auf einen Schließen-Button benachrichtigt werden und dann das zugehörige Tab schließen?

Indem man TrwCloseButton einen OnClick/OnMouseUp Handler zuweist.
Im Anhang ein erweitertes Demo. Schöner ist es natürlich, wenn das Ganze in eine eigene Klasse verpackt wird.

Tags: PageControl, CloseButtons, Close buttons, TabSheet

einfach112 1. Jul 2009 23:34

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Hi ! also ich versuche gerade das alles etwas zu erweitern und versuche während der laufzeit ein tabsheet hinzuzufügen ......
nur ich habe immer probleme....
1. Tabsheet wird hinzugefügt aber hat kein X
2. wenn ich beim erstellen des tabsheets gleichzeitig Showtabbuttons;
aufrufe
dann wird bei den Tabsheets (t1+t2+t3) jeweils ein zweites X je tabsheet gezeichner und eines auf meinem neuen tab !.....
Hat jemand ne idee wie man das ändern kann das er eventuell so wie beim schliessen eines tabs auch beim neuen erstellen eines tabs die jeweiligen tabsheets zählt und dann die Xse neu zeichnet ?! ?!

bin wie immer über hilfe sehr sehr dankbar !
mfg
einfach112

toms 2. Jul 2009 06:05

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Aktualisiertes Demo im Anhang.

Neu:

* TabSheet zur Laufzeit erzeugen
* Per Kontextmenü ein Tab schließen
* Quelltext ein wenig kommentiert

turboPASCAL 2. Jul 2009 06:19

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Moin.

@toms, eine Frage dazu, was ist die Unit WinXP ?

toms 2. Jul 2009 06:33

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Zitat:

Zitat von turboPASCAL
Moin.

@toms, eine Frage dazu, was ist die Unit WinXP ?

Diese Unit kann entfernt werden. Brauchte ich nur für D6, da dieses die XPMan noch nicht hat.

anse 28. Jul 2009 19:51

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Cool wäre ja jetzt noch wenn man im leeren Bereich rechts neben den Tabs auf Doppelklick ein neues Tab öffnen könnte - so wie es im FireFox und mittlerweile auch einigen anderen Anwendungen funktioniert. Leider feuert in dem Bereich aber kein einziger Event:
* OnMouseDown + OnMouseUp reagieren nur auf den Tabs selbst, nicht aber in dem freien Bereich
* OnMouseClick + OnDblClick gibt's gar nicht bei TPageControl
* OnMouseActivate ist unbrauchbar für diesen Zweck und feuert auch dort nicht
* Auch die darunterliegende Komponente feuert hier kein OnClick o.ä. (was auch eigentlich logisch ist, aber hätte ja sein können)

Ideen?

mirage228 29. Jul 2009 00:21

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Wird auch keine VCL-Interne Window Message verschickt? Ala CM_MOUSECLICK oder so?

anse 29. Jul 2009 07:04

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Oh, sofern ein Tab den Fokus hat wird bei Klick auf den freien Bereich die Message 45060 verschickt. Keine Ahnung welche das genau ist, WM_LBUTTONDOWN (513) ist es nicht.

Lannes 29. Jul 2009 07:31

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Hallo,

45060 -> $B004

Aus controls.pas:
CM_BASE = $B000;
CM_CANCELMODE = CM_BASE + 4;

In OnMouseDown der Form kannst Du ermitteln ob ein Mousklick in dem Bereich stattgefunden hat:
Delphi-Quellcode:
var aRect : TRect;
    aPoint : TPoint;
begin
  aRect := PasgeControl.ClientRect;
  aPoint := PasgeControl.ScreenToClient(ClientToScreen(Point(X,Y)));
  if PtInRect(aRect,aPoint) then
    //neben Reiter geklickt
    else
      //auf Form geklickt
OnMouseDown der Form feuert nicht wenn auf andere Bereiche des PageControl geklickt wird.

anse 29. Jul 2009 20:40

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Hey Lannes, Grüße nach Münster aus Nienberge (bzw. Neuenkirchen privat) :)

Bei mir feuert die Form kein OnMouseDown wenn ich auf eine Komponente - egal welche und egal an welcher Stelle ich klicke. (D11)

(ähm, arbeitest du wirklich noch mit Delphi 3 (siehe dein Profil)?)

semo 29. Jul 2009 21:36

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Kleiner EInwurfvon mir: die Jedis bieten eine schöne Komponente: TJvTabBar

toms 30. Jul 2009 06:24

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Zitat:

Zitat von M. Hassmann
Kleiner EInwurfvon mir: die Jedis bieten eine schöne Komponente: TJvTabBar

Das "X" ist jedoch immer links und es gibt keine Hover/OnClick-Effekte

uwewo 30. Jul 2009 08:06

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Delphi-Quellcode:
//Notlösung, da kA wie man das TRect manuell setzt um den Reiter zu verbreitern:
PageControl1.Pages[PageIndex].Caption := PageControl1.Pages[PageIndex].Caption + '     ';
Delphi-Quellcode:
PageControl.TabWidth

toms 30. Jul 2009 08:45

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Zitat:

Zitat von uwewo
Delphi-Quellcode:
//Notlösung, da kA wie man das TRect manuell setzt um den Reiter zu verbreitern:
PageControl1.Pages[PageIndex].Caption := PageControl1.Pages[PageIndex].Caption + '     ';
Delphi-Quellcode:
PageControl.TabWidth

Damit kann man aber nicht verschiedene Breiten festlegen.

Lannes 30. Jul 2009 18:08

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Hallo,
Zitat:

Zitat von anse
Bei mir feuert die Form kein OnMouseDown wenn ich auf eine Komponente - egal welche und egal an welcher Stelle ich klicke. (D11)

da muss ich Dir zustimmen wenn Du meinen Code so genommen hast, meine vorgeschlagene Berechnung der Koordinaten ist falsch. Bleibe aber bei der Aussage, der Mausklick in dem leeren Bereich rechts neben den Tabs wird an das Parent-Element weitergereicht. Das Parent-Element kann die Form oder z.B ein Panel sein.

Hab den Code etwas überarbeitet, getestet mit D3 und Turbo Delphi:
Delphi-Quellcode:
procedure NewTab(PgC: TPagecontrol;TabPrefix : String);
var aRect : TRect;
    aPoint : TPoint;
begin
  aPoint := PgC.ClientOrigin;
  aRect := Rect(aPoint.x,aPoint.y,aPoint.x + PgC.Width,aPoint.y + PgC.Height);
  GetCursorPos(aPoint);
  if PtInRect(aRect, aPoint) then
    with TTabSheet.Create(PgC) do
      begin
      PageControl := PgC;
      Name := 'Tab' + IntToStr(PgC.PageCount);
      Caption := TabPrefix + IntToStr(PgC.PageCount);
      PgC.ActivePage := PgC.Pages[PgC.PageCount-1];
      end;
end;

//PageControl liegt direkt auf der Form
procedure TForm1.FormDblClick(Sender: TObject);
begin
  NewTab(PageControl1,'Unbenannt ');
end;

//PageControl ist einem Panel zugeordnet
procedure TForm1.Panel1DblClick(Sender: TObject);
begin
  NewTab(PageControl2,'New ');
end;


[OT]
Zitat:

Zitat von anse
Hey Lannes, Grüße nach Münster aus Nienberge (bzw. Neuenkirchen privat) :)
(ähm, arbeitest du wirklich noch mit Delphi 3 (siehe dein Profil)?)

Grüße zurück, ist ja hier um die Ecke, reicht für einen Abendspaziergang :hi:
Ja, im wesentlichen mit D 3, startet sehr schnell(D3 = 2 Sek, Turbo Delphi 1/2 Minute).
Bisher konnte ich mit D3 alle Anforderungen abdecken, gut, einiges erfordert einen größeren Aufwand, aber man lernt auch viel dabei.
[/OT]

anse 30. Jul 2009 23:13

Re: PageControl - Tabs um Schließen-Symbol erweitern
 
Jo, das war der entscheidende Hinweis - vielen dank! Die direkt darunter liegende Form oder Panel feuert das OnDblClick. In meinem Fall ein Panel auf der Form. Klappt wunderbar. Werde das mit dem obigen Code für den Close-Button kombinieren und hier einbauen.

fkerber 11. Mär 2011 01:19

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Hi,

ich muss mal diesen etwas älteren Thread hervorzaubern ;)
Im Prinzip kann das PageControl hier nahezu alles, was ich möchte, aber es gibt (zumindest bei mir) ein kleines Problem.
Wenn mehr Pages da sind, als angezeigt werden können, gibt es ja rechts diese netten Pfeile zum Durchscrollen (wenn multiline = False). Leider scrollen dabei nur die Tabs durch die Gegend und die X bleiben fix.
Gerade bei unterschiedlichen breiten Tabs fällt das dann sehr unschön auf.
Leider konnte ich kein Event finden, dass gefeuert wird, wenn dieses Scrollen stattfindet, um dann die X neu zu zeichnen - außer onDrawTab (wenn OwnerDraw = True) und dann war erstmal alles Schöne weg und ich befürchte, der Aufwand im onDrawTab alles selbst zu zeichnen, bis es so aussieht, wie es jetzt ist, ist wahrscheinlich nicht ganz gering. Davon ab würde dann das Ganze ja auch viel zu oft aufgerufen werden.

Hat da vielleicht jemand eine Idee zu?


LG, Frederic

Björn Ole 19. Mär 2011 17:47

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Da hast du dein Event. ;)
Delphi-Quellcode:
type
  TPageControl_ = class(TPageControl)
  private
    FOnScroll: TNotifyEvent;
  protected
    procedure WndProc(var Message: TMessage); override;
  published
    property OnScroll: TNotifyEvent read FOnScroll write FOnScroll default nil;
  end;

  TPageControl = class(TPageControl_);

{ TPageControl_ }

procedure TPageControl_.WndProc(var Message: TMessage);
begin
  inherited;
  if (Message.Msg = WM_HSCROLL) and Assigned(FOnScroll) then
    FOnScroll(Self);
end;

fkerber 19. Mär 2011 17:48

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Hi!

Super, danke!


LG, Frederic

Back2Code 12. Jan 2015 13:45

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Zitat:

Zitat von Björn Ole (Beitrag 1089700)
Da hast du dein Event. ;)
Delphi-Quellcode:
type
  TPageControl_ = class(TPageControl)
  private
    FOnScroll: TNotifyEvent;
  protected
    procedure WndProc(var Message: TMessage); override;
  published
    property OnScroll: TNotifyEvent read FOnScroll write FOnScroll default nil;
  end;

  TPageControl = class(TPageControl_);

{ TPageControl_ }

procedure TPageControl_.WndProc(var Message: TMessage);
begin
  inherited;
  if (Message.Msg = WM_HSCROLL) and Assigned(FOnScroll) then
    FOnScroll(Self);
end;

Soll das in die Vcl.ComCtrls Unit??

DeddyH 12. Jan 2015 13:54

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Nö, pack das mal in die Formularunit mit dem PageControl.

Back2Code 12. Jan 2015 14:35

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Zitat:

Zitat von DeddyH (Beitrag 1286338)
Nö, pack das mal in die Formularunit mit dem PageControl.

Habs jetzt anders gemacht und zwar indem ich
Delphi-Quellcode:
ReCalculateButtonPositions
in das FormResize Event gepackt habe.

Delphi-Quellcode:
procedure TMainForm.FormResize(Sender: TObject);
begin
  ReCalculateButtonPositions;
end;

HCB 17. Feb 2023 13:02

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Hallo Leute,
ich probiere eine StringVariable auszuwerten:

var ClickedTab: String;
begin
clickedTab:=TComponent(msg.LParam).Owner.GetNamePa th;
showMessage(clickedTab);

Hier wird die Variable clickedTab korrekt als Tabsheet1 angezeigt!!
Wenn ich diese aber anschließend hier auswerten möchte mit

if clickedTab = 'Tabsheet1' then showMessage('1');

wird mir einfach ShowMessage nicht angezeigt.

Ich verzweifle noch, ich finde den Fehler nicht!!!
Hat jemand eine Idee woran es liegen könnte?

LG Harry

himitsu 17. Feb 2023 13:11

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Was möchtest du wetten, dass das eine S nicht klein ist?
Delphi-Referenz durchsuchenSameText


Oder steht da wirklich nur der eine Komponentenname im Path?

Oder warum nicht mal ohne Strings?
Delphi-Quellcode:
if TComponent(msg.LParam).Owner is TabSheet1 then

HCB 17. Feb 2023 15:42

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Danke Himitsu für deine Hilfe.

> Oder steht da wirklich nur der eine Komponentenname im Path?

Es steht nur Tabsheet1 in der Variable ClickedTab, siehe screeshot.

>if TComponent(msg.LParam).Owner is TabSheet1 then

lässt sich nicht kompileren wegen Fehler, siehe Screenshot.

Irgendwie merkwürdig. Hat jemand vielleicht noch eine Idee?

LG Harry

HCB 17. Feb 2023 15:44

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Liste der Anhänge anzeigen (Anzahl: 2)
So jetzt aber mit Anhang, sorry.

himitsu 17. Feb 2023 16:03

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
ups
Delphi-Quellcode:
=
nicht
Delphi-Quellcode:
is
:oops:
(für Instanz/Variable, nicht Klasse/Typ)

Und nein, es steht nicht Tabsheet1 drin. :zwinker:

HCB 17. Feb 2023 16:42

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Danke Himitsu für die schnelle Hilfe:
Ich seh den Wald vor lauter Bäume nicht, hab gar nicht so genau auf die Groß- und Kleinschreibung beim String geachtet (Tabsheet1 / TabSheet1):oops: Wieder was zu gelernt.
Jetzt hab ich nur noch ein Problem, dass sich der Index verschiebt. Ich wollte den angeklickten Tab auf Visible:= false setzen, funktioniert bis zum letzten Tab, der dann Tabsheet1 wird, obwohl der Name Tabsheet3 ist.

procedure TfrmMain.UmDestroyControl(var msg: TMessage);
var ClickedTab: String;
begin
clickedTab:=TComponent(msg.LParam).Owner.GetNamePa th;
if clickedTab = 'TabSheet1' then TabSheet1.TabVisible:=false;
if clickedTab = 'TabSheet2' then TabSheet2.TabVisible:=false;
if clickedTab = 'TabSheet3' then TabSheet3.TabVisible:=false;
ReCalculateButtonPositions;
end;

Ich dachte es wäre etwas einfacher, den angeklickten Tab auf Visible:=false setzen und bei Bedarf wieder aktivieren. Aber es müsste Caption des Tabs ermittelt werden und nach der Caption und nicht nach Index den Tab schließen bzw. deaktivieren.

Vielleicht stehts du mir mit etwas Unterstützung zur Seite.

LG Harry

himitsu 17. Feb 2023 17:54

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Erstmal: benennt man natürlich seine Komponenten so, dass sie einem sagen, was sie machen. :stupid:

.Name ist direkt ein Komponentenname.
Bei .GetNamePath muß man aufpassen, denn es können mehrere Namen sein.


Nochmal: Warum Strings, wenn du schon ein Objekt hast?

Bei Namen mußt du nunmal auf Groß-/Kleinschreibung achten,
ODER man vergleicht case-insensitiv.
->
Delphi-Quellcode:
=
aka Delphi-Referenz durchsuchenSameStr versus Delphi-Referenz durchsuchenSameText

"TabSheet1" gibt es bestimmt als Variable/Feld in der Form-Klasse.
Im QuellCode (z.B. bei Variablen) ist Groß-/Kleinschreibung egal.
Außerdem werden Objektinstanzen optimaler, schneller und vorallem fehlerunanfälliger verglichen, als irgendwelche komische Strings.
Dann knallt auch der Compiler wunderschön, wenn es diese Variable garnicht mehr gibt, z.B. weil jemand diese Komponente entlich mal ordentlich benannt hat.
Und zusätzlich kann man mit einem Objektzeiger soooooooooo schön viele coole Dinge anfangen, was mit einem dummen String nicht so geht.

Delphi-Quellcode:
//var clickedTab: TComponent;
clickedTab := TComponent(msg.LParam).Owner;
if clickedTab = TabSheet1 then TabSheet1.TabVisible := False;
if clickedTab = TabSheet2 then TabSheet2.TabVisible := False;
if clickedTab = TabSheet3 then TabSheet3.TabVisible := False;

//if clickedTab = TabSheet1 then  VERSUS  if clickedTab.Name = 'TabSheet1' then
Delphi-Quellcode:
clickedTab := TComponent(msg.LParam).Owner;
if (clickedTab = TabSheet1) or (clickedTab = TabSheet2) or (clickedTab = TabSheet3) then
  TTabSheet(clickedTab).TabVisible := False;
Delphi-Quellcode:
clickedTab := TComponent(msg.LParam).Owner;
if clickedTab is TTabSheet then
  TTabSheet(clickedTab).TabVisible := False;

HCB 18. Feb 2023 07:34

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Hallo Himitsu,
vielen Dank nochmal für Deine Unterstützung. Ich bekomme das einfach nicht hin.
Sowohl
clickedTab := TComponent(msg.LParam).Owner;
if (clickedTab = TabSheet1) or (clickedTab = TabSheet2) or (clickedTab = TabSheet3) then
TTabSheet(clickedTab).TabVisible := False;
als auch
clickedTab := TComponent(msg.LParam).Owner;
if clickedTab is TTabSheet then
TTabSheet(clickedTab).TabVisible := False;

funktionieren nicht.
Ich muss mir wohl einen anderen Lösungsweg einfallen lassen, vielleicht probier ich es mal über MDI.

LG Harry

himitsu 18. Feb 2023 08:31

AW: PageControl - Tabs um Schließen-Symbol erweitern
 
Tja, rate mal, wofür ein Debugger da ist und was man jetzt damit macht. :zwinker:

Ich kann ja nur davon ausgehn, dass in msg.LParam wirklich ein TComponent ist und dessen Owner ein TTabSheet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 Uhr.

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