Schließenbutton in TabSheet?

Für Fragen von Einsteigern und Programmieranfängern...
AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Schließenbutton in TabSheet?

Beitrag von AlterMann »

Hallo

Kennt jemand eine Möglichkeit (oder eine vorgefertigte Klasse) um einem Tab eines TTabSheets ein kleines Kreuzchen zum Schließen der einzelnen Tabs (Wie z.B. die Tabs in Opera etc.) zu spendieren?

Danke fürs Lesen
Christian
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Schließenbutton in TabSheet?

Beitrag von theo »

AlterMann hat geschrieben:Kennt jemand eine Möglichkeit (oder eine vorgefertigte Klasse) um einem Tab eines TTabSheets ein kleines Kreuzchen zum Schließen der einzelnen Tabs (Wie z.B. die Tabs in Opera etc.) zu spendieren?


Das ist unter Windows wahrsch. nicht soo einfach.

Das Problem ist, das es vom WidgetSet abhängt, wie die Tabs aussehen.
Bei Qt und GTK2 sind die "gratis" dabei (siehe Code Editor von Lazarus):
http://wiki.lazarus.freepascal.org/Imag ... _Linux.png
http://wiki.lazarus.freepascal.org/Imag ... _Linux.png

Und - mit dem gleichen Code - bei Windows eben nicht.
http://wiki.lazarus.freepascal.org/Image:Windows_7.png

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schließenbutton in TabSheet?

Beitrag von AlterMann »

Verstehe ich das recht, daß das eigentliche Darstellen dieser Komponenten nicht von Routinen innerhalb des Lazarusprogrammes erledigt wird, sondern dazu Funktionen des Betriebssystems aufgerufen werden?
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Schließenbutton in TabSheet?

Beitrag von theo »

AlterMann hat geschrieben:Verstehe ich das recht, daß das eigentliche Darstellen dieser Komponenten nicht von Routinen innerhalb des Lazarusprogrammes erledigt wird, sondern dazu Funktionen des Betriebssystems aufgerufen werden?


Ja. Deshalb sieht es ja auch überall "nativ" aus, und nicht überall gleich (wie z.B. bei msegui).

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Schließenbutton in TabSheet?

Beitrag von DiBo33 »

Wie @theo schon anmerkte, das ist Sache des entspr. Widgets.

Unter Win hast du da nativ keine Chance, unter GTK2 ist das einfach mittels TNotebook und der Eigenschaft showCloseButton erreicht.

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schließenbutton in TabSheet?

Beitrag von AlterMann »

Neuer Versuch, neues Problem

Ich behelfe mir halt mit einem BitBtn am Rand der PageControl.
Sieht ganz leidlich aus und wird auch seinen Zweck erfüllen:

laz1.jpg
laz1.jpg (2.1 KiB) 2450 mal betrachtet


Aber:
Schließe ich mit folgender Routine alle TCncEdits (und nur wenn ich wirklich alle schließe sonst nicht) kommt am Ende wenn ich die Form komplett beende die Meldung: ...exe raised Exception class 'External: SIGSEGV'

Code: Alles auswählen

procedure TForm1.BitBtn1Click(Sender: TObject);
 
 var P : TPAgeControl;
 
begin
 P := PageControl1;
 if P.PageCount > 0 then P.ActivePage.Free;
 if P.PageCount = 0 then BitBtn1.Hide;
end;



Der Fehler tritt offenbar hier auf: (wincontrol.inc)

Code: Alles auswählen

function TWinControl.GetControlCount: Integer;
begin
  Result := 0;
  if FControls <> nil then Inc(Result, FControls.Count); [b]<-- In dieser Zeile[/b]
  if FWinControls <> nil then Inc(Result, FWinControls.Count);
end;


Eigentlich sollte doch mit der Abfrage "if PageCount > 0 " verhindert sein, daß ich ein Objekt freigebe das es nicht mehr gibt?
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Schließenbutton in TabSheet?

Beitrag von theo »

Diesen Fehler kann ich unter Linux nicht reproduzieren. Lazarus 0.9.29 r23403M FPC 2.4.0 i386-linux-gtk 2 (beta)

Hast du Controls auf den Tabsheets, die das auslösen könnten?

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schließenbutton in TabSheet?

Beitrag von AlterMann »

theo hat geschrieben:Hast du Controls auf den Tabsheets, die das auslösen könnten?


Nein, die TabSheets sowie die CncEdits erzeuge ich zur Laufzeit so:

Code: Alles auswählen

procedure TForm1.MenuItem4Click(Sender: TObject);
 
 var
  t : TTabSheet;
  s : TCncEdit;
 
begin
  if OpenDialog1.Execute then
   begin
    t := TTabSheet.Create(PageControl1);
    t.Caption := ExtractFileName(Opendialog1.FileName);
    s := TCncEdit.Create(t);
    s.Parent := t;
    s.Align := alClient;
    s.OnKeyPress := @SynEdit1KeyPress;
    t.Parent := PageControl1;
    s.Lines.Loadfromfile(OpenDialog1.FileName);
    s.ScrollBars := ssAutoBoth;
    t.show;
    BitBtn1.Show;
   end;
end;


Sonst habe ich nichts auf den Tabsheets.
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schließenbutton in TabSheet?

Beitrag von AlterMann »

Noch ein Hinweis

Wenn ich alle Tabs schließe und anschließend neue öffne fehlt beim ersten Dokument der Reiter das sieht dann so aus:
laz3.jpg
laz3.jpg (6 KiB) 2438 mal betrachtet


statt so:

laz2.jpg
laz2.jpg (6.37 KiB) 2438 mal betrachtet


Vielleicht bringt euch das auf eine Idee was ich falsch mache...
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Schließenbutton in TabSheet?

Beitrag von theo »

Das ist wahrsch. ein Bug im TPageControl für Win32. Es gibt ähnliche Meldungen http://bugs.freepascal.org/view.php?id=14625

Für den Moment würde ich den letzten (einzigen) Tab einfach nicht schliessen, sondern nur den Text im Synedit löschen und die Tab Caption auf "Unbenannt" setzen.
Dann sollte es keine Probleme geben.

P.S. Es geht aber auch mit einem Hack: Wenn's leer ist einfach eine dummy page erstellen und nach dem einfügen der eigentlichen Page gleich wieder löschen.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var ts, tstemp:TTabSheet;
begin
 tstemp:=nil;
 if PageControl1.PageCount=0 then
 begin
  tstemp:=TTabSheet.Create(PageControl1);
  tstemp.PageControl:=PageControl1;
 end;
 
 ts:=TTabSheet.Create(PageControl1);
 ts.Caption:=TimeToStr(now);
 ts.PageControl:=PageControl1;
 PageControl1.ActivePage:=ts;
 
 if tstemp<>nil then tstemp.Free;
end;


Das Beste wäre natürlich, du würdest den Fehler in der LCL reparieren und einen Patch machen. ;-)

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schließenbutton in TabSheet?

Beitrag von AlterMann »

theo hat geschrieben:Das ist wahrsch. ein Bug im TPageControl für Win32. Es gibt ähnliche Meldungen http://bugs.freepascal.org/view.php?id=14625
Wow! Das erste merkwürdige Phänomen an dem ich nicht selbst schuld bin ... :D

Für den Moment würde ich den letzten (einzigen) Tab einfach nicht schliessen, sondern nur den Text im Synedit löschen und die Tab Caption auf "Unbenannt" setzen.
Dann sollte es keine Probleme geben.

So mach ich's. Da es ja ohnedies besser ist wenn von Anfang an ein leeres Dokument erscheint, laß ich die PageControl nie leer werden.


Das Beste wäre natürlich, du würdest den Fehler in der LCL reparieren und einen Patch machen. ;-)

Nana, wir wollen malö nicht übertreiben :P, glaub nicht, daß ich Lazarus einen großen Gefallen täte, im derzeitigen Stadium in der LCL herumzufummeln ...

PS.: Die Exception die ursprünglich auftrat, scheint auf meinem Mist gewachsen zu sein. :oops: In TForm1.FormCloseQuery waren noch Codefragmente die auf PageControlelemente zugreifen wollten ...
Früher war alles besser. Und aus Holz!

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Schließenbutton in TabSheet?

Beitrag von pluto »

Warum nutzt du keinen TNoteBook, darauf wurde doch schon hingewiesen. Selbst der Code-Editor von Lazarus nutzt ihn.... Nur weil es nicht Nativ ist ? oder gibt es noch einen anderen Grund ?

So Not, kannst du natürlich auch eine eigene Klasse erstellen, TMyPageControle oder so, wo du einfach Panels verwaltest und ein typisches TPageControl nachahmst...dürfte nicht weiter Schwierig sein...
Aber ich verstehe auch nicht, warum es keine Native Lösung davon gibt. Z.B. FireFox, hat doch ein CloseButton....

Kommt auf den Internen Aufbau an, aber vielleicht kann man so einem Button einfach hinzufügen, zur Laufzeit. Das OpenDialog kann man ja auch ändern, unter Delphi zumindest. Es gibt da einige Funktionen für.
MFG
Michael Springwald

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schließenbutton in TabSheet?

Beitrag von AlterMann »

pluto hat geschrieben:Warum nutzt du keinen TNoteBook, darauf wurde doch schon hingewiesen.

Warum meinst Du? Wegen des Fehlers beim Schließen oder wegen des fehlenden Schließbuttons im Tab? Hätte TNoteBook denn einen solchen?
Bei mir (Windows) zeigt es wohl keinen an, trotz nboShowCloseButtons:=true


Selbst der Code-Editor von Lazarus nutzt ihn.... Nur weil es nicht Nativ ist ? oder gibt es noch einen anderen Grund ?

Hihi :lol: Weil ich gemerkt hätte daß das eine Nativ ist und das andere nicht :lol:

Aber ich verstehe auch nicht, warum es keine Native Lösung davon gibt. Z.B. FireFox, hat doch ein CloseButton....
Opera auch, drum bin ich überhaupt erst drauf gekommen ...

Kommt auf den Internen Aufbau an, aber vielleicht kann man so einem Button einfach hinzufügen, zur Laufzeit. Das OpenDialog kann man ja auch ändern, unter Delphi zumindest. Es gibt da einige Funktionen für.
Schön langsam gewöhne ich mich an den "externen" BitBtn ...
Früher war alles besser. Und aus Holz!

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Schließenbutton in TabSheet?

Beitrag von pluto »

Hihi :lol: Weil ich gemerkt hätte daß das eine Nativ ist und das andere nicht

Aber was spricht da gegen ? Ein NoteBook verhält sich intern genauso wie ein TPageControl nur weil das TPageControl vom System stammt und das TNoteBook nicht ?

SynEdit ist auch nicht Nativ, dass ist eine eigene Komponente, VST ebenfalls. Es gibt noch zahlreiche Beispiele, z.b. das Panel auch....
MFG
Michael Springwald

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schließenbutton in TabSheet?

Beitrag von AlterMann »

pluto hat geschrieben:Aber was spricht da gegen ? Ein NoteBook verhält sich intern genauso wie ein TPageControl nur weil das TPageControl vom System stammt und das TNoteBook nicht ?

SynEdit ist auch nicht Nativ, dass ist eine eigene Komponente, VST ebenfalls. Es gibt noch zahlreiche Beispiele, z.b. das Panel auch....


Du verstehst mich falsch.
Ich habe keine Ahnung welche Komponenten bei Lazarus Nativ sind und welche nicht. Drum ist mir das auch wurscht, ich verwende alles was mir nützlich erscheint ...

Aber nocheinmal: Glaubst Du TNoteBook kann unter Windows die Schließen-Buttons anzeigen?
Ich fürchte das hat genauso mit den Widgets zu tun, wie theo schrieb, und wird auch nicht gehen ...
Früher war alles besser. Und aus Holz!

Antworten