![]() |
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. |
Re: PageControl - Tabs um Schließen-Symbol erweitern
Evtl. könntest du diese beiden Tipps miteinander verbinden:
![]() ![]() 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: |
Re: PageControl - Tabs um Schließen-Symbol erweitern
Danke erstmal, mal gucken ob ich da halbwegs durchsteige.
Zitat:
|
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* |
Re: PageControl - Tabs um Schließen-Symbol erweitern
Kommt doch nur aufs Parent des Buttons an... und dann musst du eben die Koordinaten umrechnen.
|
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. ;) |
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?
|
Re: PageControl - Tabs um Schließen-Symbol erweitern
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
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 |
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 |
Re: PageControl - Tabs um Schließen-Symbol erweitern
Aktualisiertes Demo
![]() Neu: * TabSheet zur Laufzeit erzeugen * Per Kontextmenü ein Tab schließen * Quelltext ein wenig kommentiert |
Re: PageControl - Tabs um Schließen-Symbol erweitern
Moin.
@toms, eine Frage dazu, was ist die Unit WinXP ? |
Re: PageControl - Tabs um Schließen-Symbol erweitern
Zitat:
|
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? |
Re: PageControl - Tabs um Schließen-Symbol erweitern
Wird auch keine VCL-Interne Window Message verschickt? Ala CM_MOUSECLICK oder so?
|
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.
|
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:
OnMouseDown der Form feuert nicht wenn auf andere Bereiche des PageControl geklickt wird.
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 |
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)?) |
Re: PageControl - Tabs um Schließen-Symbol erweitern
Kleiner EInwurfvon mir: die Jedis bieten eine schöne Komponente: TJvTabBar
|
Re: PageControl - Tabs um Schließen-Symbol erweitern
Zitat:
|
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
|
Re: PageControl - Tabs um Schließen-Symbol erweitern
Zitat:
|
Re: PageControl - Tabs um Schließen-Symbol erweitern
Hallo,
Zitat:
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:
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] |
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
![]() |
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 |
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; |
AW: PageControl - Tabs um Schließen-Symbol erweitern
Hi!
Super, danke! LG, Frederic |
AW: PageControl - Tabs um Schließen-Symbol erweitern
Zitat:
|
AW: PageControl - Tabs um Schließen-Symbol erweitern
Nö, pack das mal in die Formularunit mit dem PageControl.
|
AW: PageControl - Tabs um Schließen-Symbol erweitern
Zitat:
Delphi-Quellcode:
in das FormResize Event gepackt habe.
ReCalculateButtonPositions
Delphi-Quellcode:
procedure TMainForm.FormResize(Sender: TObject);
begin ReCalculateButtonPositions; end; |
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 |
AW: PageControl - Tabs um Schließen-Symbol erweitern
Was möchtest du wetten, dass das eine S nicht klein ist?
![]() 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
|
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 |
AW: PageControl - Tabs um Schließen-Symbol erweitern
Liste der Anhänge anzeigen (Anzahl: 2)
So jetzt aber mit Anhang, sorry.
|
AW: PageControl - Tabs um Schließen-Symbol erweitern
ups
Delphi-Quellcode:
nicht
=
Delphi-Quellcode:
:oops:
is
(für Instanz/Variable, nicht Klasse/Typ) Und nein, es steht nicht Tabsheet1 drin. :zwinker: |
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 |
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
=
![]() ![]() "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; |
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 |
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 17:25 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