Sign in Join
Wiki copytemporary

MSEide+MSEgui: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Introduction
22
33The MSEide is a Cross Platform GUI Development System for Pascal programmers, completely written in Pascal. The MSEgui does not feature VCL compatibility. The graphics library provides an interface to win32 and X11. Despite being a single person (Martin Schreiber) effort for the moment, the IDE and GUI has already an amazing feature list:
44
55- Internal character encoding is UCS2.
66- Internationalization tool included.
77- Docking forms.
88- Embedded forms (similar to TFrame).
99- Visual form inheritance.
1010- Links to xlib and gdi32, no external widget library needed.
1111- Database access components and data edit widgets.
1212- Integrated debugging.
1313- Integrated report designer.
1414- Flexible and handy build system with switchable macros.
1515- and more...
1616
1717### But what about Lazarus?
1818
1919[Lazarus](http://www.lazarus.freepascal.org) is an IDE that aims to provide a high degree of compatibility with VCL code, while providing a native look on many platforms. The native look is very important for many developers, but combined with the VCL compatibility necessitates many complex interfaces to the different native widget sets (Win32, Cocoa, GTK, Qt). The continuous evolution of these native widget sets (gtk1-\>gtk2-\>gtk3, qt-\>qt5) provokes endless catching up.
2020
2121MSEide+MSEgui neither features (or suffers :-) VCL compatibility, nor provides a real native look on target platforms. The graphics library provides an interface to win32 and X11. The advantage of the X11 layer is the immediate availability of a large and stable (in time) target platform.
2222
2323These different goals of both projects make them both fulfill different needs.
2424
2525### Why this wiki
2626
2727The design of the MSE GUI is a fresh approach to GUI design patterns. It features many innovative solutions for typical GUI tasks. Being innovative, the MSE GUI library differs substantially from VCL/LCL/CLX. Switching from VCL to MSE may be more challenging than switching [[Code Conversion Guide|from VCL to LCL]]. These wiki pages aim to ease the first steps with this promising alternative IDE and GUI library.
2828
2929## Download and links
3030
3131- MSE project is now part of **mse-org**: <https://github.com/mse-org>
3232
3333- MSEide & MSEgui sources are here: <https://github.com/mse-org/mseide-msegui>
3434
3535- Biography of Martin: <https://sites.google.com/view/martin-schreiber-biography/>
3636
3737- Beginner's tutorial (in Russian) at: <http://freepascal.ru/article/mse/20060108181639/>
3838
3939- See also: "MSEide+MSEgui. Draw lesson." (in Russian): <http://freepascal.ru/article/mse/20060205191314/>
4040
4141- MSElang, the future compiler for the MSEide+MSEgui project: <https://gitlab.com/mseide-msegui/mselang/wikis/home>
4242
4343## Quick start
4444
4545### Open Project
4646
4747Launch the IDE and use Project-\>Open to open the provided demo msegui/apps/demo/demo.prj.
4848
4949The title of the IDE reflects the opened project.
5050
5151Hit F9 and (if you followed the installation instructions :-), be amazed by the speed of FPC+MSE.
5252
5353### First RAD steps
5454
5555Close the running project. Use Project-\>Source to open the project source demo.pas.
5656
5757Ctrl-click on the parameter mainfo in the line application.createform(tmainfo,mainfo); to navigate to main.pas.
5858
5959Click on F12 to toggle between unit and form.
6060
6161Not everything will feel that familiar, because of that, these pages are written.
6262
6363Click on the button, this will auto raise the property editor (unusual but useful).
6464
6565Let us add another button. Make the component palette visible if necessary (View-\>Toolbar-\>Component Palette).
6666
6767Select the tbutton on the widget page. Click on the form to create the button.
6868
6969Give it a caption in the usual way.
7070
7171Creating an event handler does not work with the usual double clicking on the onexecute property.
7272
7373Instead, you must select the onexecute property in the property editor, type the name of an event handler and press enter.
7474
7575The MSE RAD will create the handler and position the pointer on the definition.
7676
7777Use ctrl-shift-down arrow (or up) to navigate between implementation and definition.
7878
7979Just add some code like writeln('Hello world'); Hit F9.
8080
8181The writeln will end up in the target console window of MSE (not the console in which you started MSE).
8282
8383### Adding a Main Menu
8484
8585#### Add Main Menu
8686
8787Add a tmainmenu component from the Gui component tab to your main form. Click on your mainform (mainfo), so that Object Inspector shows the properties of the mainform. Use the arrow next to the mainmenu property of the mainform, to select tmainmenu1 as the mainmenu of mainfo.
8888
8989#### Add Menu Items
9090
9191In the Object Inspector, expand the mainmenu branch. In this branch, open the menu property of mainmenu. Change the submenu.count of menu to 1 (or higher). Now expand the submenu.count property, which will show "Item 0". Expand "Item 0" and set the caption, for instance to "&File". Now you can repeat the same procedure one level deeper... Change the submenu.count property of "Item 0" to 1. Expand this last submenu.count property and set the caption of the new "Item 0", for instance to "E&xit". Hit F9 and your program should have a menu *F*ile with the entry E*x*it in it.
9292
9393Alternatively, in Object Inspector you may right click a submenu.count property, or an "Item n" property, which will reveal a context sensitive pop up menu. Use this pop up menu to insert, append or delete menu items.
9494
9595Once you have more than one submenu, you can use drag and drop to move the menu items ("Item n"). Start the drag mouse move on the "Item n" line.
9696
9797### Create New Project
9898
9999In order to create a new project based on a template, use Project-\>New-\>From Template. For a GUI project select "default.prj", for a console project select "console.prj"
100100
101101## The concept
102102
103103MSEgui is a Pascal program library, which provides the building blocks for developing programs with graphical user interface.<sup>1</sup>
104104
105105MSEide is the corresponding integrated development environment for effective software production with Free Pascal and MSEgui. MSEide is also suitable for the development of gcc and microcontroller applications.
106106
107107Currently MSEide+MSEgui run under i386-linux, x86-64-linux, arm-linux, x86-64-freebsd, i386-win32 and x86-64-win64 while supported microprocessors are CPU32, ARM and AVR32. MSEgui is predominantly platform independent. Additional platforms may be added by implementing the system-dependent software elements. The system-dependent MSEgui modules are located in subdirectories of lib/common/kernel.
108108
109109### Main development goals
110110
111111- Relevant increase in productivity, compared with other development systems.
112112- Identical appearance and functionality on all platforms, without additional measures in the user code.
113113- Dependence on additional libraries kept as little as possible.
114114- Orthogonality - there should be as little as possible interference between different program elements and as few as possible exceptions and special cases.
115115- Highly parametrised GUI elements.
116116- Working with MSEide+MSEgui should be fun.
117117
118118### Architecture overview
119119
120120MSEgui requires no external component libraries - it communicates directly with the graphical interface of the operating system, X11 via Xlib on Linux and gdi32 under Windows.
121121
122122For the individual GUI elements no operating system resources are required - only the main windows are known to the operating system. The entire processing of external events (keyboard, mouse, focus control ...) happens within MSEgui on a Pascal level.
123123
124124The base class for GUI elements is a `twidget`. There is no distinction between simple graphic elements and elements which can receive input focus, as is the case in Delphi. All MSEgui widgets have the full functionality of a `twidget` at their disposal.
125125
126126Important features of `twidget` are `twidget.frame` and `twidget.face`. When frame or face are not used, they are represented by NIL pointer, in this way using almost no resources.
127127
128128`twidget.frame` is responsible for the frame around the working area of the element. The appearance of the frame is higly adjustable - it can be a simple and quickly drawable 3D frame, as well as a complex and slower composite construct, based on images. There are also other frame elements, that can build scroll bars, buttons and labels.
129129
130130`twidget.face` draws the background of the working area of a desktop GUI element - color gradients and images in various forms can be shown, while partial transparency is also possible.
131131
132132Setting the properties of frame and face can be centralised by using `tframecomp` and `tfacecomp`, which can be selected into `tframe` and `tface` as templates.
133133
134134The next level of centralization is `tskincontroller`, through which program-wide settings can be made. In order to achieve that, `tskinkontroller` assigns to the GUI elements the appropriate `tframcomp` and `tfacecomp` templates.
135135
136136The control of the widget functions (focusin, focusout, ...) is done by virtual procedures and functions and not through messages. The MSEgui message function has other tasks. Also a Corba-style interface is used - for the safe connection between the various components and the automatic disconnection through destroy, a `tobjectlinker` is used.
137137
138138The type `msestring` is used in MSEgui for storing text. At the moment, msestring equals WideString. However, the reference counted FPC WideString (UnicodeString) is planned to be used under Windows, as soon as it becomes available in one of the future FPC releases.
139139
140140In text files the utf-8, ASCII or the local encoding is used - MSEide+MSEgui does not use utf-16 files.
141141
142142The MSEgui database components provide the conversion from the local encoding or the utf-8 (adjustable) to WideString for the data buffering. For file operations, a set of MSEgui's own functions with WideString interface exists. An MSEgui application can therefore work consistently with WideStrings, which is a significant relief for some tasks.
143143
144144Specialized data edit widgets for the basic data types (integer, real, tdatetime, ...) are available in MSEgui (`tintegeredit`, `trealedit`, `tdatetimeedit`, ...). The main event property of these widgets is `onsetvalue`, which can be used for reacting upon user input.
145145
146146The `t*edit` widgets can be inserted into a `twidgetgrid` and in that way form a column of the appropriate data format.
147147
148148For viewing and editing of data fields a `tdbwidgetgrid` togeather with a set of `tdb*editwidget`s can be used. Worth mentioning are also different lookup components and a `tlookupbuffer`, a fast associative data memory.
149149
150150The basic component of the MSEgui's database environment is `tmsebufdataset`, from which `tmsesqlquery` is derived. MSEgui DB is a fork of the FPC SQLDB system, where TBufDataset and large parts of TSQLQuery and the connection components have been completely rewritten.
151151
152152`tmsebufdataset` offers local indices, calculated and internalcalc-fields, a mode with an interrupted database connection, an in-memory mode where no database connectivity is necessary and can keep a local journal, in order to later reconect a previously disconnected database connection. `tmsebufdataset` stores texts as WideStrings of variable length.
153153
154154Further, there are SQL script components and `tsqlresult` for quick queries without the TDataset overhead. Persistent TField instances are either kept within `tmsesqlquery`, where they can be edited in the object inspector via `tmsesqlquery.controller.fields`, or they can be inserted into forms or modules as as individual components from the 'DBf' component palette.
155155
156156MSEide supports 'visual form inheritance', Submodule (Delphi TFrame equivalent) and allows the assignment of components of other forms or modules to component properties at design time.
157157
158158Internationalization is done via resource modules that are loadable at runtime. The MSEi18n, a tool that supports the import and export of texts in spreadsheet programs is available for editing - therefore facilitating a translation by nonprogrammers.
159159
160160<sup>1</sup>) This chapter is based on a translation of a German text provided by Martin Schreiber.
161161
162162## Tips: MSEide
163163
164164### Larger fonts
165165
166166Some may find the standard menu font a bit small. The standard font for the main menu of an MSEgui application is the font defined by the stf_menu stock font. You can change a stock font value with a startup parameter, \<fontheight\> is given in pixels.
167167
168-`--FONTALIAS=<alias>,<fontname>[,<fontheight>[,<fontwidth>[,<options>]]]`
168+```text
169+--FONTALIAS=<alias>,<fontname>[,<fontheight>[,<fontwidth>[,<options>]]]
170+```
169171
170172So if you start the mseide like this, you can get a larger menu font:
171173
172-` mseide --FONTALIAS=stf_menu,sans,16`
174+```text
175+ mseide --FONTALIAS=stf_menu,sans,16
176+```
173177
174178In order to increase the base font size for all stock fonts use
175179
176-` mseide --FONTALIAS=stf_default,,16`
180+```text
181+ mseide --FONTALIAS=stf_default,,16
182+```
177183
178184### Shortcuts
179185
180186Common
181187
182188- **Ctrl+F4** - Close
183189- **Ctrl+S** - Save
184190- **Ctrl+E** - Select page
185191- **F11** - Toggle Form/Inspector
186192- **F12** - Toggle Form/Unit
187193- **Shift+Ctrl+\[0..9\]** - Bookmark 0..9
188194- **Ctrl+\[0..9\]** - Go to bookmark 0..9
189195- **Ctrl+LeftClick** - Go to var(class, method, unit) declaration
190196- **Shift+Ctrl+Up** - Go to method declaration
191197- **Shift+Ctrl+Down** - Go to method implementation
192198- **Shift+Ctrl+Space** - Show procedure header
193199
194200Debug
195201
196202- **F7** - Step
197203- **F8** - Next
198204- **F9** - Continue
199205- **Shift+F7** - Finish
200206- **Shift+Ctrl+F8** - Next instruction
201207- **Shift+Ctrl+F7** - Step instruction
202208- **F5** - Toggle breakpoint
203209- **Shift+F5** - Toggle breakpoint enabled/disabled
204210- **Ctrl+B** - Breakpoints on/off
205211- **Ctrl+W** - Watches on/off
206212
207213Editor
208214
209215- **Ctrl+Z** - Undo
210216- **Ctrl+X** - Cut
211217- **Ctrl+C** - Copy
212218- **Ctrl+V** - Paste
213219- **Ctrl+F** - Find
214220- **F3** - Search again
215221- **Ctrl+L** - Go to line.
216222- **Ctrl+I** - Indent block
217223- **Ctrl+U** - Unindent
218224
219225### Print from IDE
220226
221227You need the [ghostscript](http://ghostscript.com/awki)
222228
223229### Recent opened files or projects
224230
225231The last opened projects are in the dropdown list of 'Project'-'Open'-'Name'. The last opened files are in the dropdown list of 'File'-'Open'-'Name'.
226232
227233### Menu Editing
228234
229235- Use submenu.count to set the wanted menu items count.
230236- Right click on submenu.count or on a menu item "Item X" to display a context-sensitive menu that allows to insert,append or delete a submenu entry
231237- Use drag and drop on a submenu entry to move the the item in the array.
232238
233239### New Panels in the IDE
234240
235241Example, you want to have the watch, stack and cpu window in a window:
236242
237243- select the menu item **View**-**Panels**-**New Panel**.
238244- select the menu item **View**-**Watches**.
239245- drag the Watches window by the grip (not the window title!) in the new panel.
240246- same with Stack and CPU window.
241247- to split horizontal drag one of the grip of the inserted widgets to the left border of the panel.
242248- to split vertical drag one of the grip of the inserted widgets to the bottom border of the panel.
243249- to use tabs drag one of the grip of the inserted widgets to the centre of the panel.
244250
245251### Design Tab-Order
246252
247253Main way in **MSEide** is set the tab order after all widgets are placed in the form with the popup menu function "Set Tab Order". Select a widget in the container where you wish to set the tab oder, click right, click "Set Tab Order", click row 0, click "Start", click the widget in the container which should get tab order 0, click the widget which should get tab order 1..
248254
249255An alternative is to drag and drop the rows to the desired position. The first row corresponds to the tab order 0 the second to the 1 and so on.
250256
251257#### Creating a new event handler
252258
253259Select the event you want in the **Object Inspector**, then type name of the new event handler. IDE create a new procedure(declaration and implementation) in the source code. If you double-click the name of the event handler in the **Object Inspector**, source editor opens with the cursor at begin of your handler implementation.
254260
255261## Tips: MSEgui
256262
257263### Tabbed control
258264
259265- Put **ttabwidget** control on the form. Now you have container (*ttabwidget1*) for pages.
260266- Put as many **ttabpage** controls on the *ttabwidget1* as tabs you want.
261267
262268### Splitter
263269
264270We have two widgets (widgetLeft, widgetRight) and we need horizontal splitter between them.
265271
266272- Add TSplitter to form and resize it as you want.
267273- Change the **linkleft** of *tsplitter1* to **widgetLeft** and **linkright** to **widgetRight**. At this step our widgets stick to splitter.
268274- Change the **spo_hmove** to **True**. That's all.
269275- If you want to save a proportion between width of *widgetLeft* and width of *widgetRight* when the main form is resized then change the **so_hprop** to **True**.
270276- If you need the vertical splitter then use other properties **linktop**, **linkbottom**, **spo_vmove**, **spo_vprop**.
271277
272278### Switch-off auto-scrolling of the form(widget)
273279
274280Change the **container - frame - sbhorz - options - sbo_showauto** property of the form to **False**.
275281
276282### Read/write data in the twidgetgrid
277283
278284- **editwidget.value** -\> value of the actual row
279285- **editwidget\[rowindex\]** or **editwidget.gridvalue\[rowindex\]** -\> value of the addressed row
280286- **editwidget.gridvalues** the whole column as a dynamic array.
281287
282288### First events
283289
284290**OnCreate** is called before loaded procedures of the components of the form are called, **OnLoaded** is called after loaded procedures of the components of the form are called. Many components do initializations in loaded procedures, event properties are inactive before procedure loaded of the component is called.
285291
286292### MDI
287293
288294MDI - application can be created using TDockFormWidget or TDockPanel (as MDI-area) and TDockForm (as ancestor for you MDI-child window). There are examples:
289295
290296- How to use TDockForm with custom MDI-buttons <http://brefi.narod.ru/mdi_example2.tar.gz> or in *\$MSESOURCES/contributed/ivankob/examples*
291297- Simple MDI-controller (create, switch, ... the child windows) <http://mihafpc.narod.ru/MDISample.tar.gz> or in *\$MSESOURCES/contributed/miha*
292298
293299### Drawing
294300
295301#### Redraw form the additional thread
296302
297303Use a **tthreadcomp** (tab **Gui**) to do the long time procedure. If you need to access widgets and other gui variables from the additional thread, call **application.lock** before and **aplication.unlock** after accessing the main event thread elements.
298304
299305#### Force repaint
300306
301307- **twidget.invalidate** to invalidate an individual widget
302308- **twidget.rootwidget.invalidate** to invalidate the window
303309- **application.invalidate** to invalidate all windows (=forms) in the application
304310
305311#### Draw text
306312
307313There are two methods to draw texts in MSEgui:
308314
309315- Simple text positioning by baseline position of start of the first character with **tcanvas.drawstring**.
310316- With the drawtext procedures of **msedrawstring.pas**.
311317
312318#### Widgets canvas
313319
314320No twidget has a canvas. The canvas used for painting is normally one of the canvas of twindow, it can also be an canvas of a tbitmap or a tprinter or... MSEgui uses one canvas to paint a whole window with all widgets. *tcanvas.font* is initialized by **twidget.getfont**, *canvas.color* by **twidget.actualcolor** before calling **twidget.dopaint**, see **twidget.paint** procedure in msegui.pas.
315321
316322#### Theming (Frames & Faces)
317323
318324Every twidget has a property **frame** and **face**. If they are deactivated (\<disabled\> in object inspector) they are only an nil pointer and need no more resources. Activate them by clicking on the ellipse button in the right object inspector column in the row face respective frame.
319325
320326The **face** property defines the background of the client area of the widget.
321327
322328It is a combination of a fade and a bitmap. Both of them can be semitransparent. The bitmap can be stretched and/or tiled. Example: you want to create a button with a fade as face.
323329
324330- place a *tbutton* on the form.
325331- in object inspector activate property face.
326332- set *face.fade.color.count* to 2.
327333- click on the **+** at *color.count*.
328334- in item 0 select cl_gray.
329335- in item 1 select cl_ltgray, now you have a left to write fade from gray to light gray.
330336- change *face.fade.direction* to *gd_up* or *gd_down*, you get a convex resp. concave fade.
331337
332338If you want, you can blend an additional structure over the fade:
333339
334340- select the wanted pattern image in *face.image*.
335341- activate *face.image.alignment* al_tiled.
336342- adjust *face.image.transparency* to your needs, \$000000 = opaque, \$ffffff = fully transparent. The number defines the transparency of the three color channels (\$RRGGBB).
337343
338344To centralise the face look use an **tfacecomp** (tab *Gui*) and select the facecomp in *template* of the *face* properties.
339345
340346The **frame** property defines the look of an additional frame around the component and shows a possible caption at the widget. Example: you want an lowered frame around and a caption right of the button.
341347
342348- activate property *frame*.
343349- set *frame.levelo* to -1.
344350- set *frame.leveli* to 1.
345351- enter the caption text in *frame.caption*.
346352- set *frame.captionpos* to cp_right.
347353
348354To centralise the frame look use an **tframecomp** (tab *Gui*) and select the framecomp in *template* of the *frame* properties.
349355
350356#### Desktop colors in the MSE application
351357
352358Default values of the mapped colors stored in the array **msegraphics.defaultmapped**. For change it's values you can use function **msegraphics.setcolormapvalue** [Win32 and KDE example](http://www.freepascal.org/wiki/index.php/User:Miha) (*\$MSESOURCES/contributed/miha/GuiStyle.pas*)
353359
354360## Application examples and screenshots
355361
356362### A Firebird application
357363
358364The following screen shots are taken from an MSEgui Firebird database application. The programmer writes he has customized the look and feel of his application in about 30 minutes with a tfacecomp and two tframecomp. He states that the look and feel is identical on Linux and Windows.
359365
360366![](/wiki-images/a/a7/Mse_dbwidgetgrid1.jpg)
361367
362368![](/wiki-images/e/ea/Mse_dbwidgetgrid2.jpg)
363369
364370Linux version: ![](/wiki-images/c/c0/Mse_form1.jpg)
365371
366372Windows version: ![](/wiki-images/8/8a/Mse_form1w.jpg)
367373
368374Linux version: ![](/wiki-images/a/ab/Mse_button1.jpg)
369375
370376Windows version: ![](/wiki-images/6/65/Mse_button1w.jpg)
371377
372378The report is designed and rendered with the built-in MSEide+MSEgui report designer and report generator.
373379
374380![](/wiki-images/2/2e/Mse_report1.jpg)
375381
376382Two MDI forms with fade and flat frame.
377383
378384![](/wiki-images/1/18/Mse_gripfade1.png)
379385
380386### An embedded system
381387
382388An embedded system for medical applications, in this case steam sterilizers, was realized with MSE-IDE & MSE-GUI for the control unit, nowadays also commonly called the "human machine interface", HMI.
383389
384390![](/wiki-images/d/d4/MainScreen.png)
385391
386392The control unit uses a touch panel a its display, therefore all active controls have to be made rather large to enable the personnel to handle them easily. The main screen consists of a few informational display fields and allows to select the implemented sterilizing processes by means of a menu consisting of several button components showing the process names along with a short description in a separate panel. The visibility of the buttons and their captions are defined during program loading by means of a configuration file. The informational fields display the devices' operating values in real time using a MSE system timer to collect the information from the PLC.
387393
388394![](/wiki-images/2/2b/ProcessDisplay.png)
389395
390396After processing has been started, the display is switched to a different format showing the operating values in large digits on some numeric display field components on the left and a graphical representation of the process history on the right, again both as real time "live displays". If the diagram curves would reach the right panel border, the diagram would change to a scrolling mode, always showing the current state at the extreme right.
391397
392398![](/wiki-images/b/b2/StateDisplay.png)
393399
394400For diagnostic purposes, also a schematic state display is available. This shows a simplified schematic of the apparatus, along with real time animated symbols of the control elements, as there are valves and pumps, each displayed in a derived version of a timage component, created and placed dynamically on program load. Also shown are the most important process values as numerical displays, also dynamically placed. The schematic field really is the output of a separate program, running in parallel to the process display which provides the upper and lower parts of the screen display.
395401
396402![](/wiki-images/e/ec/ControlScreen.png)
397403
398404There is also a mode for setting several control and function parameters and to recall previous operational and diagnostic data. It is organised as a tabbed screen containing several run time parametrized menu pages and a couple of display field pages. Some of the pages allow access only after entering a pass code to prevent missuse of critical functions.
399405
400406![](/wiki-images/a/aa/ProtocolReview.png)
401407
402408This is a screen displaying a graphical protocol of a previous process. The protocol is usually printed out immediately after termination, as required by the regulations. The printer output is generated as a postscript file, processed by ghostscript both for print out and for the on screen display shown, which uses the png format for loading into the display field.
403409
404410![](/wiki-images/e/e0/Attribution.png)
405411
406412Of course, there is also an attribution display, showing program version, creator information and the tools used for the creation of the system, Free Pascal and MSE-IDE & MSE-GUI. As background, it uses a photography of one such apparatus as it is used in clinics displayed in an image component carrying several label fields used for the text. Above all of that sits a transparent button to close the picture.
407413
408414## Reference: MSEide
409415
410416- To move and resize components without gridsnap use shift+cursorkeys and ctrl+cursorkeys.
411417- There are many possibilities with properties twidget.frame and twidget.face, for instance tiled semitransparent bitmaps and color fades (all twidget descendants have these properties!).
412418
413419For client area of forms use tmseform.container.frame and tmseform.container.face, tmseform has additionally onpaint to do custom drawing.
414420
415421You can write your own widgets and override procedure dopaint or use teventwidget with onpaint,onresize,onmouseevent,onkeydown,onkeyup...
416422
417-`How to convert filenames to windows format? `\
418-`Unit msefileutils: `\
419-`function tosysfilepath(const path: filenamety): filenamety; `\
420-`procedure tosysfilepath1(var path: filenamety); `\
421-`Converts to filename format of actual OS. `\
422-`function tomsefilepath(const path: filenamety): filenamety; `\
423-`procedure tomsefilepath1(var path: filenamety); `\
424-`Converts from filename format of actual OS.`
423+``` pascal
424+How to convert filenames to windows format?
425+Unit msefileutils:
426+function tosysfilepath(const path: filenamety): filenamety;
427+procedure tosysfilepath1(var path: filenamety);
428+Converts to filename format of actual OS.
429+function tomsefilepath(const path: filenamety): filenamety;
430+procedure tomsefilepath1(var path: filenamety);
431+Converts from filename format of actual OS.
432+```
425433
426-`Where is the MDI ???   `\
427-`In MSEgui we have tdockform and tdockpanel for that purpose. `\
428-`Have a look at property dragdock.`
434+```text
435+Where is the MDI ???
436+In MSEgui we have tdockform and tdockpanel for that purpose.
437+Have a look at property dragdock.
438+```
429439
430440### MSEi18n
431441
432442## [[Reference: MSEgui]]
433443
434444[[Reference: MSEgui|On this page you can find a working in progress for documenting MSEGUI.]]
435445
436446## See also
437447
438448- [[MSEide MSEgui first step]] Tutorial for beginners showing to create first program.
439449- [[MSEide MSEgui Howto]] Windows example.
440450
441451------------------------------------------------------------------------
442452
443453---
444454*From the Free Pascal wiki, page "MSEide+MSEgui", as it stood on 2021-08-31 after a change by Alextpp, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
445455Category: MSEide+MSEgui

Back to history