Gehirnakrobatik rund um TPageControl/JvTabBar

Rund um die LCL und andere Komponenten
charlytango
Beiträge: 1153
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Gehirnakrobatik rund um TPageControl

Beitrag von charlytango »

wp_xyz hat geschrieben: So 10. Aug 2025, 12:04 Daher ist der zu verschiebende Tab bereits bekannt als JvTabBar.SelectedTab
Klingt logisch. Muss ich heute Abend probieren

charlytango
Beiträge: 1153
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Gehirnakrobatik rund um TPageControl

Beitrag von charlytango »

Hab ich einen Knoten in meinen Gehirnwindungen?

Code: Alles auswählen

procedure TMainForm.JvTabBar1TabMoving(Sender: TObject; DestTab: TJvTabBarItem;
  var AllowMove: Boolean);
//var
//  a,b:boolean;
begin
  //// Do now allow to move a tab FROM fixed Tabs.
  //a := JvTabBar1.SelectedTab.Index > piFixedTabs -1;
  //
  //// Do now allow to move a tab INTO fixed Tabs. - das klappt
  //AllowMove := DestTab.Index > piFixedTabs-1;
  //
  //AllowMove:= a and b;

  if JvTabBar1.SelectedTab.Index > piFixedTabs -1 then
    AllowMove:=false
  else
    AllowMove:= DestTab.Index > piFixedTabs-1;

end; 

Es lässt sich kein Tab in den fixierten Bereich schieben, aber es lässt sich ein Tab aus dem fixierten Tab in den offenen Bereich schieben.

Sehe ich den Wald vor lauter Bäumen nicht , oder ???

Sieben
Beiträge: 294
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Gehirnakrobatik rund um TPageControl

Beitrag von Sieben »

Yep, zunächst mal setzt du AllowMove auf False, obwohl du gerade noch geschrieben hast, dass diese Bedingung ein True zur Folge haben soll.

Code: Alles auswählen

  //a := JvTabBar1.SelectedTab.Index > piFixedTabs -1;
  //AllowMove:= a and b;

charlytango
Beiträge: 1153
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Gehirnakrobatik rund um TPageControl

Beitrag von charlytango »

Sieben hat geschrieben: So 10. Aug 2025, 22:16 dass diese Bedingung ein True zur Folge haben soll.
Nein, soll sie nicht.

gegeben sind n Tabs auf den Tabreitern.
tablist.png
tablist.png (1.41 KiB) 3756 mal betrachtet
die linken zwei sollen fix bleiben (Tab1 und Tab2) und weder nach rechts geschoben werden können (in den Bereich Tab3 bis Tab5) noch andere tabs in den Bereich der fixierten hineingeschoben werden können.

Dazu habe ich:
die Anzahl der fixierten Tabs: piFixedTabs
den Index des aktuell selektierten Tabs: JvTabBar1.SelectedTab.Index
den index des Zieltabs: DestTab.Index

AllowMove soll in allen erlaubten "Moves" true sein, und in allen nicht erlaubten Fällen false.

ich habe schon einige Varianten versucht und es gelingt mir immer irgendwie einen fixierten Tab aus der fixierten Zone heraus zu schieben

wp_xyz
Beiträge: 5247
Registriert: Fr 8. Apr 2011, 09:01

Re: Gehirnakrobatik rund um TPageControl

Beitrag von wp_xyz »

Ich denke, bei mir funktioniert's:

Code: Alles auswählen

procedure TForm1.JvTabBar1TabMoving(Sender: TObject; DestTab: TJvTabBarItem;
  var AllowMove: Boolean);
begin
  if (JvTabBar1.SelectedTab.Index in [0..1]) or (DestTab.Index in [0..1]) then
    AllowMove := false;
end; 
AllowMove muss man nicht auf true setzen, das ist ja der Standardwert, andernfalls würde das Verschieben ohne OnTabMoving-Handler nicht funktionieren, und das macht die Logik etwas einfacher.
Dateianhänge
jvTabBar_TabMoving.zip
(2.16 KiB) 112-mal heruntergeladen

charlytango
Beiträge: 1153
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Gehirnakrobatik rund um TPageControl

Beitrag von charlytango »

Heureka -- wieder eine Kuh vom Eis-- THX

charlytango
Beiträge: 1153
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Gehirnakrobatik rund um TPageControl

Beitrag von charlytango »

Die Oberfläche funktioniert bis auf einige "Brösel" recht passabel.

Als Ziel habe ich immer noch im Hinterkopf, daraus ein Package zu machen.

Frage -- macht es als "Vorstufe" dazu Sinn den JvTabBar, JVPageList und die Toolbar samt den nötigen Funktionen in ein Frame zu packen um zu verstehen wie man ein Package programmieren müsste ?

In meinem Kopf verhält sich ein TFrame auch nicht soo viel anders als eine Komponente.

In einem Package müsste ich wohl alles im Code erstellen und platzieren. In einem Frame habe ich erstmal die grafische Unterstützung, die ich dann Stück für Stück durch Code ersetzen kann.

Eure Meinung dazu ?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6923
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Gehirnakrobatik rund um TPageControl/JvTabBar

Beitrag von af0815 »

TFrame verhält sich wie eine versteckte TForm, wobei die Komponenten auf die Zielkomponente umgeroutet werden.

Ist recht Interessant wie das im Hintergrund gemacht wird.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 5247
Registriert: Fr 8. Apr 2011, 09:01

Re: Gehirnakrobatik rund um TPageControl

Beitrag von wp_xyz »

charlytango hat geschrieben: Fr 22. Aug 2025, 00:32 Frage -- macht es als "Vorstufe" dazu Sinn den JvTabBar, JVPageList und die Toolbar samt den nötigen Funktionen in ein Frame zu packen um zu verstehen wie man ein Package programmieren müsste ?
Für ein "Package" musst du nichts programmieren. Das ist im wesentlichen nur eine Datei (.lpk), in der die zum Package gehörenden Units aufgeführt sind und für die du ein paar Konfigurationsangaben (Versionsnummer, Lizenz, Beschreibung, Laufzeit- oder Entwurfzeitpackage, usw) machen musst.

Ob du die neue Funktionalität in ein Frame oder eine einfachere Komponente (z.B. von Panel abgeleitet) packst, hat Vor- und Nachteile:
  • Frame: einfache visuelle Programmierung der Anordnung der Teil-Komponenten, aber zur Entwurfzeit des Projekts oft unabsichtlich zu leicht änderbar
  • Panel: die Teilkomponenten JvTabBar, JvPagelist etc müssen im Code erzeugt werden. Tieferer Einstieg in die Komponenten-Entwicklung nötig.
Egal was du machst: Es muss dir klar sein, dass dein Package eine Abhängigkeit von JvTabBar/PageList usw. hat. Um das zu lösen, hast du zwei Möglichkeiten:
  • Füge das Package JvPageCompsR zur Liste der "benötigten Packages" deines Package hinzu. Wenn du mit Frames arbeitest und JvTabBar etc nicht zur Laufzeit erzeugst, brauchst du auch das Entwurfzeitpackage mit dem "D" hinten (JvPageCompsD), und da hast du dann evtl auch diese Fremdkomponenten mit auf der Komponenten-Palette.
  • Du kopierst die Units für JvTabBar etc in dein Package-Verzeichnis und arbeitest mit diesen Kopien (und verweist im Readme darauf, dass diese der JVCL entnommen wurden). Das hat aber auch wieder ein Problem: Wenn ein User die JVCL-Komponenten installiert, gibt es plötzlich zwei JvTabBars in der IDE, und das mag diese gar nicht. Daher wäre es ratsam, diese Fremd-Units und Fremd-Komponenten umzubenennen. Das wiederum erschwert, evtl. künftige Updates der Original-Units einzupflegen...
Wenn die neue Komponente zur Entwurfszeit ins Projekt-Formular aufgenommen werden soll, musst du auch durchdenken, ob alle dafür nötigen Schritte in der IDE möglich sind. Es kann durchaus sein, dass du dir zusätzlich zur Komponente auch einen spezialiserten Property- oder Komponenten-Editor schreiben musst (dann wird's hässlich...). Oder vielleicht reicht es doch, die Komponente nur zur Laufzeit zu erzeugen und im Header der Unit oder einer Dokumentationsdatei die dafür nötigen Schritte aufzuschreiben.

Generell musst du dir auch die Frage stellen, ob das alles den Aufwand wert ist. Wenn du die neue Komponente/den neuen Frame nur in einem bestimmten Projekt benötigst, würde ich das nicht machen. Bei mehreren Projekten, wahrscheinlich ja. Und wenn die Lösung von allgemeinem Interesse ist, erst recht; dann wäre auch eine Veröffentlichung im Forum/github etc zu überlegen.

charlytango
Beiträge: 1153
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Gehirnakrobatik rund um TPageControl/JvTabBar

Beitrag von charlytango »

Ich schnitze immer noch an der Variante mit dem Frame. Sieht mal ganz gut aus.

Habe in JvTabBar bzw im TJvTabBarItem einiges gefunden was vielversprechnd scheint, ich aber nicht verstehe wie es funktioniert

Code: Alles auswählen

//TJvTabBarItem:
FData: TObject;
FAutoDeleteDatas: TObjectList;
public property Data: TObject read FData write FData; 

//TJvCustomTabBar:
function FindData(Data: TObject): TJvTabBarItem;
Es scheint mir, als ob ich in den TJvTabBarItem irgendwie Daten eintragen kann und einer Funktion FindData ein Suchobjekt übergeben kann? Scheint ein ganzes Konstrukt zu sein.
Ich habe aber absolut keinen Tau wie das funktioniert und bitte um Hilfe.
Dann könnte ich mir im Programm auch gleich die eigenen Suchfunktionen für Tabs sparen oder Optimieren.

wp_xyz
Beiträge: 5247
Registriert: Fr 8. Apr 2011, 09:01

Re: Gehirnakrobatik rund um TPageControl/JvTabBar

Beitrag von wp_xyz »

Data ist ein beliebiges Objekt, das zusammen mit dem TabBarItem gespeichert wird, genauso wie bei einer StringList etc. Mit FindData kann du die TabBar nach dem TabBarItem mit einem einem bestimmten Data-Objekt suchen lassen. Da dieses Objekt außerhalb des TabBarItem erzeugt wird (also von dir), bist auch du für dessen Freigabe verantwortlich.

Das AutoDeleteDatas habe ich bisher noch nicht "wahrgenommen" (die Komponente stammt ursprünglich von TurboPower, also nicht von mir). Dass das eine ObjectList ist, erscheint mir auf den ersten Blick unsinnig, ich hätte dafür einfach nur wieder ein TObject genommen und dieses im Destroy zerstört. Aber warum der Plural ("Datas" statt "Data", und TObjectList statt TObject)? Falls du das oben erwähnte Data-Object nicht selbst, sondern vom TabBarItem freigeben lassen möchtest (z.B. weil du dir keine weitere Liste für die Speicherung der Data-Variablen mehr leisten willst), hindert dich aber nichts daran, ein TabBarItem.AutoDeleteDatas.Add(TabbarItem.Data) aufzurufen. Damit ist das Data-Objekt in der AutoDeleteDataList gespeichert, und da diese eine TObjectList ist, wird es bei der Freigabe von der AutoDeleteDatas-List auch mit freigegeben.

charlytango
Beiträge: 1153
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Gehirnakrobatik rund um TPageControl/JvTabBar

Beitrag von charlytango »

hmm... ich denke das ist mir gerade etwas zu heiss ;-)

War nur so eine Idee ;-)

Antworten