TDockform descendant

Forum für alles rund um die MSEide und MSEgui
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

TDockform descendant

Beitrag von fliegermichl »

Ich hatte vor einiger Zeit so einen Buttoncontainer mit TDataButtons mit options += [bo_radioitem] gemacht, welcher sich nach dem rechten Rand ausfährt und nur noch 10 - 15 Pixel sichtbar bleiben. Wenn der Anwender mit der Maus darauf fährt, dann scrollt der Container nach links bis er vollständig sichtbar ist. Der Anwender kann nun mit der Maus über die verschiedenen Buttons fahren und bekommt eine Preview des Eingabeformulares zu sehen.
Klickt er einen der Buttons an, so bleibt das Eingabeformular stehen und er kann die Werte editieren.

Das funktioniert soweit auch ganz gut, ist mir aber zu wenig flexibel.
Könnte man mit vertretbarem Aufwand eine von TDockForm abgeleitete Klasse TSlidingDockform erstellen, welche eine ähnliche Funktionalität wie der Buttoncontainer hat, aber nur wenn die SlidingDockform horizontal oder vertikal am Rand des Parentwidget angedockt ist?

Wenn die Form als Tab, in der Mitte oder floatend ist, dann sollte die sich genauso verhalten wie bisher.
So kann man, wenn der Anwender nur einen vergleichsweise kleinen Bildschirm hat, verschiedene Eingabebereiche einblenden und wieder ausblenden ohne das diese immer sichtbar sein müssten.

Nur wenige Pixel Platzverbrauch
Nur wenige Pixel Platzverbrauch
bc_ausgeblendet.png (1.43 KiB) 2430 mal betrachtet


Bei Bedarf eingeblendet
Bei Bedarf eingeblendet

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TDockform descendant

Beitrag von mse »

fliegermichl hat geschrieben:Könnte man mit vertretbarem Aufwand eine von TDockForm abgeleitete Klasse TSlidingDockform erstellen, welche eine ähnliche Funktionalität wie der Buttoncontainer hat, aber nur wenn die SlidingDockform horizontal oder vertikal am Rand des Parentwidget angedockt ist?

Vermutlich schon, ich muss aber zugeben, dass ich nicht ganz durchblicke. ;-)
Wenn die neue Formularklasse in MSEide in 'File'-'New'-'Form' erscheinen soll, müssen die entsprechenden Angaben in 'Project'-'Options'-'Templates' gemacht werden. Werden spezielle Entwurfszeit-Funktionen benötigt, muss die Klasse ähnlich wie eine eigene Komponente in MSEide einkompiliert werden. Aus README.TXT:

Code: Alles auswählen

 
How to add custom components to MSEide
**************************************
There is a project 'apps/myide/mymseide.prj' as a demo.
Start MSEide, open project 'apps/myide/mymseide.prj', 'Project'-'Build',
'Target'-'Continue',
the IDE with the new component 'tmybutton' will be compiled and
started in the the debugger.
Binary name is 'mymseide' (linux) or 'mymseide.exe' (win32).
 
If you wish to do it from scratch:
 
- Create a register unit for your components
  (see 'apps/myide/regmycomps.pas' for an example).
- Enter the unitname followed by a comma
  ('myregunit,' if your regunitfile is 'myregunit.pas') in
  a file named 'regcomponents.inc'.
- Build the IDE with -dmorecomponents as option.
 
If you want to add custom icons to your components:
 
- Convert 24*24 pixel BMP or PNG files with tools/bmp2pas to
  an icon unit ('*_bmp.pas').
- Add the name of the icon unit to 'uses' in your register unit.
 
 

Die Entwurfszeit-Formularklasse muss sich mit "registerdesignmoduleclass()" in MSEide registrieren, siehe lib/common/regcomponents/regwidgets.pas für Beispiele. In der zugehörigen *.mfm Template-Datei muss "moduleclassname = " mit dem registrierten Klassennamen übereinstimmen, siehe apps/ide/templates/default/dockpanelform.mfm für ein Beispiel.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TDockform descendant

Beitrag von fliegermichl »

Danke schonmal für die Infos. Eine eigene Komponente hatte ich bereits schonmal testweise erstellt und in der mseide integriert.

Wo ich momentan noch wenig durchblicke, ist der Ablauf mit dem angedockten Formular. Wo muss ich mich einhängen um zu erfahren, wann das Formular seinen "angedockt" Status ändert und an welcher Stelle und in welcher Art es angedockt oder auch nicht ist.

Kann ich die Größe des angedockten Formulares temporär ändern, so daß der Splitter nicht verändert wird und damit benachbarte/parent Dockforms nicht verändert werden.?

Wenn man sich die Felder und Methoden von tdockcontroller/tcustomdockform so als newbie anschaut, ist man ein wenig erschlagen :-)

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TDockform descendant

Beitrag von mse »

fliegermichl hat geschrieben:Wo ich momentan noch wenig durchblicke, ist der Ablauf mit dem angedockten Formular. Wo muss ich mich einhängen um zu erfahren, wann das Formular seinen "angedockt" Status ändert und an welcher Stelle und in welcher Art es angedockt oder auch nicht ist.

Im Container wird bei jeder Änderung <dragdock>.onlayoutchanged aufgerufen. Im Container kann man mit <dragdock>.onchilddock und onchildfloat auf docken/floaten reagieren, für die Kinder gibt es ondock/onfloat.
Den layout-Status des containers liefert <dragdock>.splitdir.
Im Kind liefert <dragdock>.getparentcontroller() den container, habe die Funktionen in git master 08c7febb2796ce10950bf85dc041756ab678c0a9 nach "public" verschoben.
Kann ich die Größe des angedockten Formulares temporär ändern, so daß der Splitter nicht verändert wird und damit benachbarte/parent Dockforms nicht verändert werden.?

Nein, da müsstest du ein zusätzliches Container-Widget verwenden. Was ist der Zweck?
Wenn man sich die Felder und Methoden von tdockcontroller/tcustomdockform so als newbie anschaut, ist man ein wenig erschlagen :-)

Das geht mir genau gleich. :-) Die Entwicklung war eine furchtbare Plackerei.

Antworten