TGradTabControl : Erster Preview :)

Rund um die LCL und andere Komponenten
EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

TGradTabControl : Erster Preview :)

Beitrag von EugenE »

Guten Morgen,

ich arbeite jetzt schon etwas länger ( denke mal mehr als 3 Wochen ) an dieser Komponente. Als Basis der Logik habe ich den Quellcode von TPageControl, TNotebook & TNBPages logisch übernommen, davon vllt hälfte nur kopiert und bezeichnungen geändert. Als Basis für die TabButtons habe ich meinen TGradButton genommen.

Die aktuellen Features:
- TabEvents : Click, OnMouseDown, OnMouseUp ( vorerst ^^ )
- IDE Kontext-Menu erweiterung wie TPageControl
- Man kann es wie einen TPageControl nutzen
- TabPositionen ( noch paar Fehler )

ToDo:
- CloseButton ( sieht irgendwie doof aus ( aktuelle svn version))
- TabPosition + LongTabs ( Rechts und Links lange tabs anstatt gedrehte )
- Eine "Mittel-Klick-Tab-Schließ"-Demo ( erster versuch davon ist gescheitert ^^ )
- Mehr Events
- und den ganzen anderen Rest von http://www.lazarusforum.de/viewtopic.php?t=1840" onclick="window.open(this.href);return false; ^^

Download über SVN:

Code: Alles auswählen

svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/gradcontrols/" onclick="window.open(this.href);return false; gradcontrols
Dateianhänge
Screenshot
Screenshot
Zuletzt geändert von EugenE am So 5. Okt 2008, 20:12, insgesamt 3-mal geändert.

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

Beitrag von pluto »

Was nicht schlecht währe, währe ein oder mehrere Bilder im Anhang !
Ich werde mir mal deine Soruce-Code anschauen, nachher.

Evlt. werde ich dir auch helfen beim Projekt und lasse meins. Aber ich finde mein ansatzt auch nicht schlecht, auch wenn es noch einige Fehler und Probleme zu lösen gibt.

Den Zweiten Punkt Vorstehe ich eigentlich nicht so ganz, wo da das Problem ist, beim schließen ? genauer beschreiben bitte. Eine Seite im PageControl wird z.b. meine ich so "geschlossen":
TabSheet1.Destroy schon sollte die Seite weg sein.

Die Mehr Events könnte ich evlt. einbauen. Wenn du möchtest. Aber wir sollten klären welche Events genau:
Pro Tab:
MouseDown
MouseMove
MouseLeave
MouseEnter
Move(Wenn ein Tab verschoben wird)
Delete
Add
Insert
PaintTab(Beim Zeichnen, so kann der User drauf einfluss nehmen, wie bei der ListBox)
KeyDown, KeyPress, keyUp ?

Das währe Events die mir einfallen würden. und die ich auch ohne große Probleme einbauen könnte.
(glaube ich aufjedenfall)
MFG
Michael Springwald

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

pluto hat geschrieben:Was nicht schlecht währe, währe ein oder mehrere Bilder im Anhang !
Ich werde mir mal deine Soruce-Code anschauen, nachher.

Evlt. werde ich dir auch helfen beim Projekt und lasse meins. Aber ich finde mein ansatzt auch nicht schlecht, auch wenn es noch einige Fehler und Probleme zu lösen gibt.
Ok Bilder erstelle ich dann heute oder morgen.
pluto hat geschrieben: Den Zweiten Punkt Vorstehe ich eigentlich nicht so ganz, wo da das Problem ist, beim schließen ? genauer beschreiben bitte. Eine Seite im PageControl wird z.b. meine ich so "geschlossen":
TabSheet1.Destroy schon sollte die Seite weg sein.
So werden die auch geschlossen, ich meine das jetzt so: Wenn ich in laufzeit per Mittelklick drauf klick und den code ausführe ".Destroy / .Free" wird alles ausgeführt ABER wegen meinem Button werden noch einpaar Zeichen Aufgaben ausgeführt und wenn der Button schon weg ist kann da auch nix gezeichnet werden , aber dem Problem bin ich dran^^
pluto hat geschrieben: Die Mehr Events könnte ich evlt. einbauen. Wenn du möchtest. Aber wir sollten klären welche Events genau:
Pro Tab:
MouseDown - schon drinne, sowie MouseUp
MouseMove
MouseLeave
MouseEnter
Move(Wenn ein Tab verschoben wird)
Delete
Add
Insert
PaintTab(Beim Zeichnen, so kann der User drauf einfluss nehmen, wie bei der ListBox)
- denke mal das sollte die Style-Klassen dann später übernehmen und wer was neues will soll nen neuen Style erstellen ^^
KeyDown, KeyPress, keyUp ?

Das währe Events die mir einfallen würden. und die ich auch ohne große Probleme einbauen könnte.
(glaube ich aufjedenfall)
Jop die Events müssten leicht einbaubar sein ^^

Ich habe auch schon mein TabControl als Sidebar nutzen können ^^ und es sah sogar Gut aus :D

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von EugenE »

So Leute,

ich habe weiter an meinem TGradTabControl gearbeitet, und so langsam kann man diese auch schon benutzen.

Die neuste Version könnt ihr per SVN laden , den Link gibt es im ersten Post.

Jetzt weiß ich aber nich wie ich weiter machen soll ich entweder für jede SubKomponente die Events an das Main-Control weiterleiten so dass man jedes Event von jedem COntrol einzelln nehmen kann ODER alle Events von den Subcontrols in ein Globalen Event einbringen?

Naja Gute Nacht,
Eugen

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von Socke »

EugenE hat geschrieben:Jetzt weiß ich aber nich wie ich weiter machen soll ich entweder für jede SubKomponente die Events an das Main-Control weiterleiten so dass man jedes Event von jedem COntrol einzelln nehmen kann ODER alle Events von den Subcontrols in ein Globalen Event einbringen?
Du meinst, ob du ein OnButtonPaint( Index: Integer ) für alle Buttons verwenden sollst, oder ob jeder Button (bspw. über die Page (TCustomPage?)) ein entsprechendes Event bekommt? Evtl. wäre da dann beides zusammen eine gute Lösung; man könnte dann - je nach dem, was man braucht - auf das Zeichenen eines jeden Buttons reagieren, oder auf das Zeichnen eines einzelnen Buttons (ohne if-Abfrage :D). Wobei Styles irgendwie direkten Zugang zu den Paint-Mechanismen haben sollten (in der default Paint-Methode aufrufen oder so).

Wenn du aber meinst, ob ein Event bei allen Events der Subcontrols ausgelöst werden soll (OnEvent?), weiß ich nicht, wie man das realisieren könnte bzw. inwiefern dies überhaupt sinn hat.

Noch was zum Löschen:
Wenn der Destruktor einer Seite aufgerufen wird, muss das übergeordnete Tab-/Pagecontrol dies irgendwie mitbekommen (der Tab muss entfernt werden). Bei den LCL-Komponenten, weiß ich nur, dass die Parent-Eigenschaft nicht gesetzt ist, und deshalb das "Parent" darüber nicht ermittelt und benachrichtigt werden kann. Du könntest das ja darüber machen (d.h. durch setzten von Parent wir das PageControl gewechselt). Wenn du aber von TCustomPage ableitest, wäre die prinzipielle Austauschbarkeit der Seiten zwischen den verschiedenen Tab-/PageControls nicht mehr gewährleistet (keine Ahnung ob das derzeit überhaupt funktioniert).

Noch was zu den Styles:

Code: Alles auswählen

unit styles;
interface
uses Graphics;
type
  TStyleClass = Class of TCustomStyle;
  TCustomStyle = class(TObject)
  {...}
  public 
    class function StyleClass: TStyleClass; virtual; abstract
    procedure PaintTab(ACanvas: TCanvas; ARect: TRect); virtual; abstract;
    { eventuell hier schon ein paar eigenschaften, die für alle Styles gleich sind }
    property Color: TColor {...};
    property BackgroundColor: TColor {...};
    property Font: TFont {...}
   { vielleicht sollte ein Style die Erscheinungsweise der Tabs (mit PaintTab) und der Seiten beeinflussen können }
  end;
  TAStyle = class(TCustomStyle)
    class function StyleClass: TStyleClass; override;
    procedure PaintTab(ACanvas: TCanvas; ARect: TRect); override;
  end;
implementation
 
class function TAStyle.StyleClass: TStyleClass; override;
begin
  Result := TAStyle
end;
 
procedure TAStyle.PaintTab(ACanvas: TCanvas; ARect: TRect); override;
begin
  ACanvas.Rectangle(TRect);
  { oder so }
end;
 
end.
Mfg Socke
P.S.
Bei einem Mittelklick-Schließen tritt das Problem auf, dass die Seite (der Buttton etc) sich in einer eigenen Ereignisbehandlerroutine freigeben muss. Das funktioniert nicht. Eine Lösung wäre TWasWeißIch.Release (so soll man Formulare sich selbst frei geben lassen). Alternative müsstest du an dein Control eine Message senden (so funktioniert das mehr oder weniger), sodass ein anderes Objekt die Freigabe übernimmt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von EugenE »

Socke hat geschrieben:Du meinst, ob du ein OnButtonPaint( Index: Integer ) für alle Buttons verwenden sollst, oder ob jeder Button (bspw. über die Page (TCustomPage?)) ein entsprechendes Event bekommt? Evtl. wäre da dann beides zusammen eine gute Lösung; man könnte dann - je nach dem, was man braucht - auf das Zeichenen eines jeden Buttons reagieren, oder auf das Zeichnen eines einzelnen Buttons (ohne if-Abfrage :D). Wobei Styles irgendwie direkten Zugang zu den Paint-Mechanismen haben sollten (in der default Paint-Methode aufrufen oder so).

Wenn du aber meinst, ob ein Event bei allen Events der Subcontrols ausgelöst werden soll (OnEvent?), weiß ich nicht, wie man das realisieren könnte bzw. inwiefern dies überhaupt sinn hat.
Nicht onEvent ich meine , das normale Control hat ja OnMouseDown , dann schicken einfach die subcontrols alle OnMouseDown zum normalen Control OnMouseDown zu und somit hat wird ueberall auf dem control dieser Event ausgeführt ( ging bei dem normalen Control nich^^)
Socke hat geschrieben:Noch was zum Löschen:
Wenn der Destruktor einer Seite aufgerufen wird, muss das übergeordnete Tab-/Pagecontrol dies irgendwie mitbekommen (der Tab muss entfernt werden). Bei den LCL-Komponenten, weiß ich nur, dass die Parent-Eigenschaft nicht gesetzt ist, und deshalb das "Parent" darüber nicht ermittelt und benachrichtigt werden kann. Du könntest das ja darüber machen (d.h. durch setzten von Parent wir das PageControl gewechselt). Wenn du aber von TCustomPage ableitest, wäre die prinzipielle Austauschbarkeit der Seiten zwischen den verschiedenen Tab-/PageControls nicht mehr gewährleistet (keine Ahnung ob das derzeit überhaupt funktioniert).
Mein PageControl basiert ja auf dem Code vom TPageControl bzw TNotebook also lassen sich die Pages auch ganz leicht löschen und auf andere PageControls verschieben^^
Socke hat geschrieben: Noch was zu den Styles:

Code: Alles auswählen

unit styles;
interface
uses Graphics;
type
  TStyleClass = Class of TCustomStyle;
  TCustomStyle = class(TObject)
  {...}
  public 
    class function StyleClass: TStyleClass; virtual; abstract
    procedure PaintTab(ACanvas: TCanvas; ARect: TRect); virtual; abstract;
    { eventuell hier schon ein paar eigenschaften, die für alle Styles gleich sind }
    property Color: TColor {...};
    property BackgroundColor: TColor {...};
    property Font: TFont {...}
   { vielleicht sollte ein Style die Erscheinungsweise der Tabs (mit PaintTab) und der Seiten beeinflussen können }
  end;
  TAStyle = class(TCustomStyle)
    class function StyleClass: TStyleClass; override;
    procedure PaintTab(ACanvas: TCanvas; ARect: TRect); override;
  end;
implementation
 
class function TAStyle.StyleClass: TStyleClass; override;
begin
  Result := TAStyle
end;
 
procedure TAStyle.PaintTab(ACanvas: TCanvas; ARect: TRect); override;
begin
  ACanvas.Rectangle(TRect);
  { oder so }
end;
 
end.
Mfg Socke
P.S.
Bei einem Mittelklick-Schließen tritt das Problem auf, dass die Seite (der Buttton etc) sich in einer eigenen Ereignisbehandlerroutine freigeben muss. Das funktioniert nicht. Eine Lösung wäre TWasWeißIch.Release (so soll man Formulare sich selbst frei geben lassen). Alternative müsstest du an dein Control eine Message senden (so funktioniert das mehr oder weniger), sodass ein anderes Objekt die Freigabe übernimmt.
Das mit den Styles schaue ich mir noch mal an, nur was das bringen soll ist mir fremd:

Code: Alles auswählen

class function TAStyle.StyleClass: TStyleClass; override;
.

Das Schließen / Löschen mit dem Mittelklick funktioniert da ich ja auch auf alle Tabs Events zugriff habe :)

Schau dir doch mal die SVN Version an, vorallem den Code, oder teste es mal aus :)

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von Socke »

EugenE hat geschrieben:Nicht onEvent ich meine , das normale Control hat ja OnMouseDown , dann schicken einfach die subcontrols alle OnMouseDown zum normalen Control OnMouseDown zu und somit hat wird ueberall auf dem control dieser Event ausgeführt ( ging bei dem normalen Control nich^^)
soll das heißen, dass wenn ich auf ein Control Clicke, dann bei allen anderen das Event ausgeführt (also OnClick ohne ein Clickclass function TAStyle.StyleClass: TStyleClass; override;[/code].
[/quote]
Meine Idee war eigentlich, dass du sowas wie eine Style-Erstellen Funktion hast.

Code: Alles auswählen

function TMyPageControl.CreateStyle( AStyleClass = TStyleClass ): TCustomStyle;
begin
  Result := AStyleClass.StyleClass.Create;
end;
Aber dann tuts auch ein virtueller Konstruktor. Ich bin irgendwie darauf gekommen, weil ich vor einiger Zeit mal mit TCollection gearbeitet hatte. Da gibts in jeder Ableitung von TCollection eine Funktion, die eine Klasse eines TCollectionItem-Nachkommen zurückliefert. Ich glaub, sowas brauchst du hier nicht wirklich...
EugenE hat geschrieben:Schau dir doch mal die SVN Version an, vorallem den Code, oder teste es mal aus :)
Werd ich am Wochenende hoffentlich mal Zeit zu haben, werd ich dann auch machen.

MfG Socke
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von EugenE »

Socke hat geschrieben:soll das heißen, dass wenn ich auf ein Control Clicke, dann bei allen anderen das Event ausgeführt (also OnClick ohne ein Click<- das ist auch eine Prozedur)? Kannst du ein Beispiel geben, welches SubControl zu welchem ParentControl ein Event schicken soll? Ich hoffe du meinst nicht die Controls, die der Anwender auf deiner Komponente platziert, sondern nur diejenigen, die in deiner Komponente vorhanden sind (Tabs, Pages etc.).
Also ich habe ein MainControl, darauf liegt ein anderes Control ( sagen wir oben ) , auf diesem control liegen 3 andere Controls, denn wenn der Programmierer ein OnClick braucht und drauf klickt könnte er normaler weise nur das vom MainControl kriegen da aber dieses von den anderen Controls überdeckt ist wird er sich wohl ärgern^^ darum müssen meine SubControls meiner Komponente diese Events an das Main Control zurückschicken ^^.

Hoffe das war gut erklärend ^^

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von Socke »

EugenE hat geschrieben:Also ich habe ein MainControl, darauf liegt ein anderes Control ( sagen wir oben ) , auf diesem control liegen 3 andere Controls, denn wenn der Programmierer ein OnClick braucht und drauf klickt könnte er normaler weise nur das vom MainControl kriegen da aber dieses von den anderen Controls überdeckt ist wird er sich wohl ärgern^^ darum müssen meine SubControls meiner Komponente diese Events an das Main Control zurückschicken ^^.

Hoffe das war gut erklärend ^^
Ich hoffe, ich habe das richtig verstanden:
Also ich wäre nicht dafür, dass alle (OnClick-)Events ein (On-Click-)Event in dem PageControl auslösen, da ein OnTabClick meiner meinung schon was anderes als ein OnPageClick ist. Entweder sollte das PageControl eine solche Differenzierung der Events beinhalten oder man muss direkt auf die einzelnen Objekte (Seiten/Tabs) zugreifen können. Wenn der Benutzer (=Programmierer) direkt auf die Controls zugreifen kann, sollten deren EventHandler-Eigenschaften nicht mit Methoden des PageControls beleggt sein (die würden dann ggf überschrieben und ein paar Events werden nie ausgelöst).

Achja: ein paar Namen wie Page1 TabButton1 usw. wären schön gewesen.
MfG Socke
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von EugenE »

Page1 TabButton1 konnte ich nicht benutzen da diese Controls noch mal auf den anderen Controls draufliegen^^ wenn du den Code gesehen hast wirst du schon sehen wieso :P

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von Socke »

so, ein bisschen feedback:
  • Code: Alles auswählen

    {...}
    published
    {...}
      property PageCount : Integer read GetCount;
    {...}
    gehört nach public, da nur lesbar. Wird zu Designzeit nicht benötigt.
  • Die Höhe der Tabs sollte einstellbar sein. Da du TGradButton verwendest, sollte das mögliche sein
  • Die links/rechts Pfeile sollten auch abschaltbar sein. Mich irritiert das, wenn ich nen Pfeil nach rechts habe, aber keine Tabs bis dahin gehen
  • Ein Problem deiner Buttons: der Text ist schwer lesbar (da ich vom Zeichen und Textausgabe keine Ahnung habe, weiß ich nicht, inwiefern dieses Problem lösbar ist)
weiters folgt nach Code Betrachtung

MfG Socke
P.S: Ach ja, es wäre toll, wenn deine Projekte nur wirklich benötigte Pakete als Abhängigkeit aufwiesen und die Projektdatei (.lpi) keine Sitzungsinformationen enthielten (die können in den Projektoptionen ausgelagert werden)

TGradTabPage enthält in Revision 589 ein paar Memoryleaks (es wird nicht alles wieder freigegeben) hat irgendwas mit Bildern zu tun (heaptrc sagt zumindest, dass irgendwas in graphics.pp/intfgraphics.pp aufgerufen wird, wahrscheinlich irgendetwas, das bilder aus Resourcen lädt; ich würd spontan auf den close-Button tippen).
Dateianhänge
heaptrc.txt
Heaptrace output; Es wurde nur eine Instanz von TGradTabPage erstellt und wieder frei gegeben.
(3.28 KiB) 65-mal heruntergeladen
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von EugenE »

1. Ok werd ich machen =)
2. TGradTabControl.TabHeight
3. Hm joa stimmt muss ich einbauen^^
4. Hm Betriebssystem?
5. Die Sitzungsinformationen habe ich eigentlich schon angeklickt damit diese als .lps gespeichert werden sollen aber ich schaue nochmal nach ^^
6. Hm das mit dem CloseButton muss es wohl sein, danke, habe einmal Heaptrc angemacht und dann nurnoch Bahnhof verstanden ^^, ich schaus mirmal an^^

Danke für das Feedback =)

Vllt noch irgendwelche Vorschläge?
http://wiki.freepascal.org/TGradPageControl" onclick="window.open(this.href);return false; (ja Screenshot kommt noch ^^)

MfG,
Eugen

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von Socke »

EugenE hat geschrieben:1. Ok werd ich machen =)
2. TGradTabControl.TabHeight
3. Hm joa stimmt muss ich einbauen^^
4. Hm Betriebssystem?
5. Die Sitzungsinformationen habe ich eigentlich schon angeklickt damit diese als .lps gespeichert werden sollen aber ich schaue nochmal nach ^^
6. Hm das mit dem CloseButton muss es wohl sein, danke, habe einmal Heaptrc angemacht und dann nurnoch Bahnhof verstanden ^^, ich schaus mirmal an^^
2. oh, übersehen :oops:
4. WinXP Prof. 32bit. Die Schrift sieht einfach unscharf aus
5. kann auch daran liegen, dass ich irgendwelche alten Dateien von deinen Controls hatte...
6. War der CloseButton

Code: Alles auswählen

FCloseButton.Glyph.Assign(CreateBitmapFromLazarusResource('close_btn'));
du hast das bild nicht wieder freigeben (in der Instanz aus CreateBitmpa...) Lösung siehe Anhang

MfG Socke

P.S.

Code: Alles auswählen

{------------------------------------------------------------------------------
  TGradTabPages Constructor
 ------------------------------------------------------------------------------}
constructor TGradTabPages.Create(var thePageList: TListWithEvent;
var theTabList: TListWithEvent;
theGradTabControl: TGradTabControl);
begin
  inherited Create;
  fPageList := thePageList;
  fPageList.OnChange:=@PageListChange;
  FTabList := theTabList;
  fGradTabControl:= theGradTabControl;
end;
thePageList und theTabList werden zu keinem Zeitpunkt verändert. Objektevariablen sind ja nichts anderes als Pointer. Wenn die geändert werden, hast du am Ende ein anderes Objekt. Selbst wenn die als const übergeben werden, kannst du deren Eigenschaften ändern.
Dateianhänge
ugradtabcontrol.patch
patch für die ugradtabcontrol.pas
(1.12 KiB) 70-mal heruntergeladen
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Re: TGradTabControl : Erster Preview :)

Beitrag von EugenE »

Socke hat geschrieben:4. WinXP Prof. 32bit. Die Schrift sieht einfach unscharf aus
5. kann auch daran liegen, dass ich irgendwelche alten Dateien von deinen Controls hatte...
6. War der CloseButton
...
P.S.

Code: Alles auswählen

{------------------------------------------------------------------------------
  TGradTabPages Constructor
 ------------------------------------------------------------------------------}
constructor TGradTabPages.Create(var thePageList: TListWithEvent;
var theTabList: TListWithEvent;
theGradTabControl: TGradTabControl);
begin
  inherited Create;
  fPageList := thePageList;
  fPageList.OnChange:=@PageListChange;
  FTabList := theTabList;
  fGradTabControl:= theGradTabControl;
end;
thePageList und theTabList werden zu keinem Zeitpunkt verändert. Objektevariablen sind ja nichts anderes als Pointer. Wenn die geändert werden, hast du am Ende ein anderes Objekt. Selbst wenn die als const übergeben werden, kannst du deren Eigenschaften ändern.
zu 4: Schonmal mal mit den Font-Einstellungen rumgespielt?^^
zu 5: werde auch bald ne neue Version wieder hochladen, doch vorher muss ich es schaffen das wenn ein Tab Activiert wird und dieser außerhalb des Sehbaren-Bereichs ist das die Bar dahin scrollt ^^
zu 6: jo ich habs jetzt mit einem TPicture gelöst , also fast genauso wie bei deinem Patch =)

7. also soll ich die Variablen ohne var uebergeben?

MfG,
Eugen

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

Re: TGradTabControl : Erster Preview :)

Beitrag von pluto »

So endlich habe ich es hinbekommen, es zu Installieren.
Sieht nicht schlecht aus die Komponente. Hier mal die Punkte die mich stören:
01 - PageIndex wechseln durch klicken, auf den Entsprechenden Tab zur Desinger Zeit geht nicht.
02 - Die Scroll Button sollte nicht immer sichtbar sein, und auch hier sollte zur Deinsger zeit drauf geklickt werden können.

Sonst gefällt sie mir recht gut, nur weiter so !
MFG
Michael Springwald

Antworten