Ja, das merke ich schon -- und ich merke auch dass mir das noch eine Weile Kopfschmerzen bereiten wird

Ja, das merke ich schon -- und ich merke auch dass mir das noch eine Weile Kopfschmerzen bereiten wird
Die sind mir tatsächlich damals durch die Lappen gegangen, und ihre Größe steht noch als Konstante im Quelltext. Ist nun in der SVN-Version behoben. Allerdings gefällt mir das noch nicht, weil der Bereich mit den Scrollbuttons in gesamter Höhe übermalt wird, so dass das äußerste rechte Tab abgeschnitten wird, sobald er zu nahe kommt. Außerdem hat Windows 11 so bescheuerte Themes, dass der klickbare Scrollbutton ausgeblendet wird (es handelt sich anscheinend um die Scrollbar-Arrow-Themes), und wenn man nur den inaktiven ScrollButton sieht, ist das extrem verwirrend.charlytango hat geschrieben: Do 5. Jun 2025, 13:38 Wenn die Anzahl der Tabs zu viel für den Anzeigebereich wird, werden Navigationspfeile angezeigt, was gut ist. Leider sind die auf meinem hochauflösenden Monitor winzig
Das sind aber im wesentlichen Funktionen, die auch bei Browsern auf dem Kontextmenü liegen und dazu keine direkten Buttons vorhanden sind (ausser einem + für Tab hinzufügen vielleicht).charlytango hat geschrieben: Sa 7. Jun 2025, 09:46 Darf ich etwas unverschämt sein und mir noch zwei/drei Buttons rechts wünschen?![]()
- einen Button um ein Tab hinzuzufügen
- einen zweiten um Tabs als Liste anzuzeigen
- einen dritten um Tabs rechts außen löschen zu können.
Ein Diskussion welche Form die Tabs haben sollen ist Geschmack und ändert sich von BS zu BS, von Widgetset zu Widgetset, bzw. was der Benutzer für ein Theme konfiguriert hat. Wenn jetzt MS oder Apple eine geistige Blähung hat und die Echen müssen wieder scharf sein, hat man genau den anderen Wunsch.charlytango hat geschrieben: Sa 7. Jun 2025, 09:46 Vor allem optisch sind die Browser da voraus - vielleicht hat da auch jemand einen Tip oder Trick der die Optik verbessert. Windows Buttons sind halt nicht mehr der letzte Schrei.
Runde Ecken der Tab wären ein erster Schritt![]()
Hab gerade gesehen, dass die Anchors-Eigenschaft nicht veröffentlicht war. Hole dir die aktuelle svn-Version, oder füge in deiner Version ein "property Anchors;" im Published-Abschnitt von TJvTabBar hinzucharlytango hat geschrieben: Mi 11. Jun 2025, 12:57 Ich versuche auch den JvTabBar im Hauptformular mit Ankern zu fixieren -- bisher hat er sich allen Versuchen entzogen.
Die Idee war, neben dem TabBar ein Panel mit Speedbuttons zu verankern was bisher fehlschlug.
Kann ich mangels Monitoren (oder eigentlich: Schreibtischplatz) nicht prüfen. Hast du in den Projekt-Einstellungen die richtige scaling-Option eingestellt? (unter "Use manifest resource" eine der "per-monitor"-Optionen)Auch habe ich Probleme mit der Höhe des TabBar bei Monitoren verschiedener Auflösung.
Du kannst natürlich deine eigenen Icons nehmen. In dem Demo-Programm sind sie halt 24x24 px. Nimm 16x16 stattdessen. Im Images/General_purpose-Ordner der Lazarus-Installation findest du "alle" GrößenIm Verhältnis zur Schrift sind die Icons optisch etwas groß.
Das Problem ist aber, dass der "geschlossene" Tab als Parameter an das Event mitgegeben worden ist. Wenn der Tab aber wirklich schon geschlossen ist, dann gibt es den Parameter auch nicht. Blöde Konstruktion - ich hätte den Parameter weggelassen. Ich will das aber auch nicht ändern, weil es ein Property ClosingTab gibt, der an mehreren Stellen verwendet wird, und da mache ich mit Sicherheit etwas kaputt. Du darfst halt beim erneuten Einlesen des Menüs nur die tabs aufnehmen, die nicht dem Tab-Parameter des Events, also dem ClosingTab, entsprechen.Die Events im JvTabBar klingen mir etwas kryptisch: bei OnTabClosed würde ich erwarten dass das feuert wenn ein Tab geschlossen wurde.
Scheinbar existiert der Tab zu dem Zeitpunkt noch, denn ein Refresh für eine Liste existierender Tabs fürs Menü zeigt ihn noch an.
Code: Alles auswählen
procedure TMainForm.RenewMenuItems(mCon: TMenuItem);
begin
[...]
for i:=0 to jvtabbar1.Tabs.Count -1 do
begin
if jvTabBar1.tabs[i] = JvTabBar1.ClosingTab then
Continue;
MyItem:=TMenuItem.Create(mCon);
[...]
end;
aForm ist eine lokale Variable in der Einlinken-Prozedur und wurde nirgendwo erzeugt. Daher gibt es auch kein Property Parent.charlytango hat geschrieben: Mi 11. Jun 2025, 12:57 ich kann das entworfene Vorfahrenformular (TFormParentPage) jetzt auf zwei Arten erstellen und einhängen. Die wohl konservative Methode wie auch die anderen Formulare im Beispiel erstellt wurden oder die Methode in der dem Partntformular JvTabBar und JvPageList zugewiesen werden und eine prozedur im Parentformular erledigt das Einklinken. Passt soweit.
Auch das Ausklinken mit einem Button auf dem Formular klappt.
Was dzt noch gar nicht klappt ist das wieder einbauen einer ausgeklinkten Form in die Tabs obwohl ich dazu die gleiche Funktion verwende wie beim ersten Einklinken. In Zeile 117 kommt es zu einer Exception. Keine Ahnung warum -- Bitte Hilfe
Eine Page der PageList müsste eigentlich ein Tag-Property haben. Da kannst du den Zeiger auf das Formular ablegen, und du weißt immer, welches Formular sich auf dem aktuellen Tab befindet.charlytango hat geschrieben: Mi 11. Jun 2025, 12:57 Für das Ausklinken vom Hauptformular aus braucht es noch eine Möglichkeit auf die jeweils eingeklinkte Form zuzugreifen ohne zu wissen welche das denn ist. Ich werde mal versuchen die Components einer Page durchzusteppen. Eigentlich dürfte da dann ja nur eine drauf sein.
Code: Alles auswählen
procedure TFormParentPage.Einklinken;
var
aTab:TJvTabBarItem;
iPageNumber:integer;
begin
if assigned(Self) then begin
{offensichtlich wird auch gleichzeitig eine jvStandardpage
in der Pagelist angelegt und synchronisiert.}
aTab:=FTabBar.AddTab(FsCaption);
aTab.ImageIndex:=FImageIndex;
FTabBar.SelectedTab:=aTab;
iPageNumber:=FTabBar.Tabs.Count-1;
Self.Parent:=TJvPageList(FTabBar.PageList).Pages[iPageNumber]; // <<-- aus unerfindlichem Grund wird in AddMultipleTabs gesprungen
//Pointer des erzeugten Formulars in der Page der Pagelist hinterlegen
TJvPageList(FTabBar.PageList).Pages[iPageNumber].Tag:=PtrInt(Self);
Self.BorderStyle:=bsNone;
Self.Align:=alclient;
Self.Label1.Caption:=FsCaption;
Self.Show;
end
else
showmessage('Form unassigned');
end;
Du hast das "Enabled"-Häkchen für den rechten Anker der TabBar nicht gesetzt - siehe Screenshot. Und PageList darfst du oben nicht mit dem Formular verankern, sondern mit dem unteren Rand der TabBar (also: im Feld "Top anchoring" "MainForm" durch JvTabBar1 ersetzen und in der Buttongruppe den unteren Butten klicken, außerdem das obere Borderspacing auf 0 oder etwas ähnliches)charlytango hat geschrieben: Mi 11. Jun 2025, 20:50 Das mit dem Anker funktioniert besser aber noch nciht optimal.
Das liegt daran, dass nach dem "Aushängen" offenbar das Hauptformular deaktiviert und nach dem "Einhängen" wieder aktiviert wird. Aber im OnActivate-Handler hast du den Aufruf von AddMultipleTabs... Entweder setze in OnActivate eine Status-Variable, die nach dem ersten Aufruf von OnActivate alle weiteren Aufrufe von AddMultipleTabs blockiert, oder packe das ganze Zeug einfach in OnCreate - ich sehe keinen Grund, warum das dort nicht stehen kann.charlytango hat geschrieben: Mi 11. Jun 2025, 20:50 In Zeile 96 wird ohne ersichtlichen Grund nun aus dem MainForm die Prozedur AddMultipleTabs angesprungen und ausgeführt. Mit dem Ergebnis dass eben 4 zusätzliche Tabs eingehängt werden
Code: Alles auswählen
type
TFormParentPage = class(TForm)
...
private
FTabBar: TJvTabBar;
FPageList: TJvPageList;
procedure SetTabBar(...);
...
end;
procedure TFormParentPage.SetTabBar(AValue: TJvTabBar); // TFormParentPage.SetPageList kann mMn entfallen
begin
if FTabBar = AValue then exit;
FTabBar := AValue;
FPageList := TJvPageList(FTabBar.PageList);
end;
procedure TFormParentPage.Einklinken;
var
aTab:TJvTabBarItem;
iPageNumber:integer;
begin
if assigned(Self) then begin
...
Self.Parent:=FPageList.Pages[iPageNumber];
FPageList.Pages[iPageNumber].Tag:=PtrInt(Self);
Code: Alles auswählen
procedure TFormParentPage.Notification(Component: TComponent; Operation: TOperation); // in protected, und "override";
begin
inherited;
if Operation = opRemove then
begin
if Component = FTabBar then
FPageList := nil;
end;
end;