AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Eigene Klasse von TTabsheet

Ein Thema von Pro_RJ · begonnen am 10. Sep 2013 · letzter Beitrag vom 12. Sep 2013
Antwort Antwort
Seite 1 von 2  1 2   
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#1

Eigene Klasse von TTabsheet

  Alt 10. Sep 2013, 12:34
Halli Hallo,

Ich Arbeite mit BDS2006.

Ich Arbeite in meinem Projekt viel mit Pagecontrols und Tabsheets.
Jetzt soll es dem Anwender ermöglicht werden einzelne Tabsheets ein bzw. auszublenden. Dieses soll über die Eigenschaft "Tabvisible" geschehen.

Zusätzlich ist es aber auch so das zur Laufzeit einzelne Tabsheets per Tabvisible ein und ausgeschaltet werden. z.b. wenn die Register nicht angezeigt werden und nur per ButtonClick auf die nächste Seite gewechselt wird.

Meine Idee war jetzt die, das im setter von Tabvisible geprüft wird, darf das Register Tabvisible True bekommen oder nicht.


Dafür wollte ich mir einfach eine Eigene Klasse erstellen und den Setter überschreiben.

Delphi-Quellcode:
// das Eigene Tabsheet
TMyTabsheet = Class(TTabsheet)
  Property Benutzerdarfeinstellen : Boolean;
  Property Tabvisible : Boolean read getMyTabvisible write setMyTabvisible;

  ....
end;

// Dazu noch das eigene Pagecontrol

TMyPagecontrol = Class(TPagecontrol)
  ....
end;
Das ist ja soweit alles kein Problem.
Das Problem ist folgendes:
Wenn ich zur Entwurfszeit ein Pagecontrol aus der Tool-Palette auf ein Form ziehe dann auf dieses Pagecontrol Rechte maus machen und sage "Neue seite" dann wird ja von der Delphi-IDE automatisch ein Neues Tabsheet erzeugt. nur dieses Tabsheet ist von der Delphi-Klasse TTabsheet und nicht von TMyTabsheet.

Gibt es eine möglichkeit delphi dazu zu bringen mir dann ein Objekt von TMyTabsheet zu erzeugen?
Oder muss ich dann diese ganze Steuerung zum erstellen von neuen Tabsheets usw. selber bauen?

mfg

Jens
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Eigene Klasse von TTabsheet

  Alt 10. Sep 2013, 12:57
Ich würde die Klassen TTabsheet & TPageControl ganz in Ruhe lassen und die Logik in eine eigene Klasse verlagern.
Damit erspart man sich einige Probleme.
Anstatt also im Code bestimmte TabSheets über Property TabVisible zu ändern "sagst" du das der neuen Stellvertreter-Klasse.
Delphi-Quellcode:
type
TPageUserController = class(TObject)
public
  property Pagecontrol: TPageControl

  procedure SetTabVisible(tab:TTabSheet; Visible:Boolean);
  procedure SetUserVisible(tab:TTabSheet; Visible:Boolean);
end;
Pro Tabsheet benötigt diese Klasse 2 Booleans, die die Infos zwischenspeichern.
fork me on Github
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Eigene Klasse von TTabsheet

  Alt 10. Sep 2013, 12:58
Hast du mal versucht, TMyTabsheet stattdessen auch TTabsheet zu nennen und damit in deinem Formular das TTabsheet zu überschreiben?

Also in deiner Unit ein

TTabsheet = class(Vcl.ComCtrls.TTabSheet) ?
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#4

AW: Eigene Klasse von TTabsheet

  Alt 10. Sep 2013, 13:07
noch nicht, da es ja eigentlich einen Namenskonflikt erzeugen würde.
Nur woher soll dann delphi Wissen welches "Tabsheet" erzeugt werden soll?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Eigene Klasse von TTabsheet

  Alt 10. Sep 2013, 14:27
Deins natürlich, denn das verdeckt das "normale" TTabsheet. Nennt sich, glaube ich, Interposer-Klasse. Probier es doch mal aus, ich habe so etwas eben grade noch mit einem TDBGrid gemacht um ihm seine Scrollbalken zu nehmen: Einfach eine TDBGrid-Interposer-Klasse, der Instanz einmal die Scrollbalken genommen und der Interposer-Klasse die UpdateScrollbars -Methode kaputt gemacht. Funktioniert bestens.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
664 Beiträge
 
Delphi 12 Athens
 
#6

AW: Eigene Klasse von TTabsheet

  Alt 11. Sep 2013, 08:27
Man könnte die TTabsheets erst von Delphi erstellen lassen und dann manuell im Quellcode und in der DFM nach TMyTabsheet ändern.

Nur so eine Idee, nicht ausprobiert.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: Eigene Klasse von TTabsheet

  Alt 11. Sep 2013, 08:51
Funktioniert bestens.
Glaube ich Dir, nur sobald man in der Uses-Klausel rumfummelt (oder irgend ein blöder Formatierer), kann es passieren, das plötzlich nicht mehr deine Klasse, sondern die Originalklasse verwendet wird. D.h.: Die korrekte Funktion ist von der Reihenfolge der Units der Uses-Klauses abhängig.

Ich halte es für gefährlich, solche Tricks zu verwenden. Außerdem ist es schwer verständlich.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Eigene Klasse von TTabsheet

  Alt 11. Sep 2013, 09:58
Das mache ich ja auch nicht aus Spaß, sondern nur, wenn es nicht anders geht. In meinem Leben bislang zwei mal: Einmal für irgendeinen (unsinnigerweise protected) onXYZ-Event einer TTrackbar und dieses mal eben für die Scrollbalken eines TDBGrid. Also nur für reine Äußerlichkeiten einer VCL-Komponente.

Ein echter Mann würde eine richtige Unterklasse erstellen, aber da eben das mit VCL-Komponenten auf einem Formular doch nicht einfach in kurzer Zeit einfach zu machen ist (oder irre ich mich?), habe ich lieber zu dieser Methode gegriffen.

Da diese "Interposer-Klasse" nicht in einer anderen Unit, sondern in der gleichen wie das Formular: So kann mir doch keine andere Unit diese Klasse verdecken? Meine ist immer ganz oben, richtig?


Aber ja, es ist ein ziemlicher Hack und sollte man nicht zur Gewohnheit werden lassen. Habe ich bislang auch nur in Delphi mit seiner komischen Interpretation von Sichtbarkeitsmodifikatoren gesehen
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#9

AW: Eigene Klasse von TTabsheet

  Alt 11. Sep 2013, 14:45
Halli Hallo,
danke erstmal für die Anworten.
Aufgrund der Komplexität des Programmes (über 300 Fenster) und auch der Sicherheit habe ich es jetzt wie folgt gelöst:

Jedes Fenster stammt bei uns von einer gemeinsamen Vorfahrenklasse ab (TMYCustomform) diese Steuert die gesamte Benutzerverwealtung. Diese hab ich jetzt so erweitert, das die Tabsheets auch mit in der Benutzerliste gespeichert werden(hier standen bis her nur die Labels,Edits,Butten usw)

Diese Klasse hab ich jetzt um die Eigenschaft "Tabvisible[Page : TTabsheet]" erweitert. Jeder Aufruf von Tabsheet1.tabvisible := true wird auf Self.Tabvisible[Tabsheet1] := True geändert. Damit habe ich einen gemeinsamen Punkt wo ich prüfen kann, ob der Anwender das register sehen darf oder nicht.

Ausserdem habe ich die TPagecontrol Klasse abgeleitet und ein "BeforeChange" implementiert in der ich abfragen kann welches register jetzt angezeigt werden soll. Dieses Ereigniss prüft in der Benutzerliste ob der Anwender in das register darf oder eben nicht. Darf er nicht lasse ich einen wechsel des Registers einfach nicht zu.

Das ist für uns die Sicherere Variante mit relativ geringem Aufwand. und bei der weiteren Entwicklung muss nichts weiter beachtet werden.

mfg
Jens
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Eigene Klasse von TTabsheet

  Alt 11. Sep 2013, 14:47
Ah und ich dachte, man kann nicht einfach eine Unterklasse einer VCL-Komponente auf dem Formular erstellen da Delphi doch immer die Oberklasse nimmt? War ich wohl zu dumm dafür, als ich das mal versucht hatte...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 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