Contributed works of Grigory Filatov
Adaptation FiveWin TsBrowse class
Color Table
Center Window’s Title
Closes application when no activity
Copy Protection (Get BIOS Name)
GetFonts
Get list of all controls
CENTER() Centers a string using pad characters Syntax CENTER(<cString>,[<nLength>],[<cPadCharacter>], [<lMode>]) --> cString Arguments <cString> Designates the character string that you choose to center. <nLength> Designates the length of the line within which the <cString> sequence is centered. <cPadCharacter> Designates the character with which the <cString> sequence is centered. The default character is a space. <lMode> Designates whether only the beginning, or both sides of <cString> are padded. The default value (.F.) only fills the beginning. Returns The processed string is returned. Description The CENTER() function provides a simple way to center text in any line. CENTER() is able to pad only on the left or on the left and right using any selected character. Leading and trailing blanks (if any) are replaced with the new character. When <nLength> is not specified, CENTER() assumes the maximum available line width to be MAXCOL() + 1, so that the correct output appears in the windows. Additionally, the current cursor position or the column position selected through a SAY command is also noted. So, if there is an output on an 80-column line that begins at column 20, a section of 40 characters from column 20 is used to center the output. Note . If the sum of the pad characters is odd, then one more character is inserted at the beginning of the character string. Examples . Center the output with an available line length of 10, and insert the leading characters: ? CENTER("xx", 10) // " xx" . Fill on the left and on the right: ? CENTER("xx", 10, .T.) // " xx " . When characters that match the <cPadCharacter> are present, these characters are removed prior to centering: ? CENTER("xx ", 10, .T.) // " xx " . Fill with other characters: ? CENTER("xx", 10, ".") // "....xx" ? CENTER("xx", 10, ".", .T.) // "....xx...." ? CENTER("x", 10, ".", .T.) // ".....x...." . In the following example, the "X" is intended to represent a 40-character wide screen. The string "CLIPPER" is centered there with the "." character, starting at position 10: @@ 1, 10 SAY CENTER("CLIPPER", ".", .T.) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXX.......CLIPPER......XXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
See Also: PADLEFT() PADRIGHT()
Introduction ADDASCII() Adds a value to each ASCII code in a string AFTERATNUM() Returns remainder of a string after nth appearance of sequence ASCIISUM() Finds sum of the ASCII values of all the characters of a string ASCPOS() Determines ASCII value of a character at a position in a string ATADJUST() Adjusts the beginning position of a sequence within a string ATNUM() Determines the starting position of a sequence within a string ATREPL() Searches for a sequence within a string and replaces it ATTOKEN() Finds the position of a token within a string BEFORATNUM() Returns string segment before the nth occurrence of a sequence CENTER() Centers a string using pad characters CHARADD() Adds the corresponding ASCII codes of two strings CHARAND() Links corresponding ASCII codes of paired strings with AND CHAREVEN() Returns characters in the even positions of a string CHARLIST() Lists each character in a string CHARMIRR() Mirrors characters within a string CHARMIX() Mixes two strings together CHARNOLIST() Lists the characters that do not appear in a string CHARNOT() Complements each character in a string CHARODD() Returns characters in the odd positions of a string CHARONE() Reduces adjoining duplicate characters in string to 1 character CHARONLY() Determines the common denominator between two strings CHAROR() Joins the corresponding ASCII code of paired strings with OR CHARPACK() Compresses (packs) a string CHARRELA() Correlates the character positions in paired strings CHARRELREP() Replaces characters in a string depending on their correlation CHARREM() Removes particular characters from a string CHARREPL() Replaces certain characters with others CHARSORT() Sorts sequences within a string CHARSPREAD() Expands a string at the tokens CHARSWAP() Exchanges all adjoining characters in a string CHARUNPACK() Decompresses (unpacks) a string CHARXOR() Joins ASCII codes of paired strings with exclusive OR operation CHECKSUM() Calculates the checksum for a character string (algorithm) COUNTLEFT() Counts a particular character at the beginning of a string COUNTRIGHT() Counts a particular character at the end of a string CRYPT() Encrypts and decrypts a string CSETATMUPA() Determines setting of the multi-pass mode for ATXXX() functions CSETREF() Determines whether reference sensitive functions return a value EXPAND() Expands a string by inserting characters JUSTLEFT() Moves characters from the beginning to the end of a string JUSTRIGHT() Moves characters from the end of a string to the beginning LIKE() Compares character strings using wildcard characters LTOC() Converts a logical value into a character MAXLINE() Finds the longest line within a string NUMAT() Counts the number of occurrences of a sequence within a string NUMLINE() Determines the number of lines required for string output NUMTOKEN() Determines the number of tokens in a string PADLEFT() Pads a string on the left to a particular length PADRIGHT() Pads a string on the right to a particular length POSALPHA() Determines position of first alphabetic character in a string POSCHAR() Replaces individual character at particular position in string POSDEL() Deletes characters at a particular position in a string POSDIFF() Finds the first position from which two strings differ POSEQUAL() Finds the first position at which two strings are the same POSINS() Inserts characters at a particular position within a string POSLOWER() Finds the position of the first lower case alphabetic character POSRANGE() Determines position of first character in an ASCII code range POSREPL() Replaces one or more characters from a certain position POSUPPER() Finds the position of the first uppercase, alphabetic character RANGEREM() Deletes characters that are within a specified ASCII code range RANGEREPL() Replaces characters within a specified ASCII code range REMALL() Removes characters from the beginning and end of a string REMLEFT() Removes particular characters from the beginning of a string REMRIGHT() Removes particular characters at the end of a string REPLALL() Exchanges characters at the beginning and end of a string REPLLEFT() Exchanges particular characters at the beginning of a string REPLRIGHT() Exchanges particular characters at the end of a string RESTTOKEN() Recreates an incremental tokenizer environment SAVETOKEN() Saves the incremental tokenizer environment to a variable SETATLIKE() Provides an additional search mode for all AT functions STRDIFF() Finds similarity between two strings (Levenshtein Distance) STRSWAP() Interchanges two strings TABEXPAND() Converts tabs to spaces TABPACK() Converts spaces in tabs TOKEN() Selects the nth token from a string TOKENAT() Determines the most recent TOKENNEXT() position within a string TOKENEND() Determines if more tokens are available in TOKENNEXT() TOKENINIT() Initializes a string for TOKENNEXT() TOKENLOWER() Converts initial alphabetic character of a token into lowercase TOKENNEXT() Provides an incremental tokenizer TOKENSEP() Provides separator before/after most recently retrieved TOKEN() TOKENUPPER() Converts the initial letter of a token into upper case VALPOS() Determines numerical value of character at particular position WORDONE() Reduces multiple appearances of double characters to one WORDONLY() Finds common denominator of 2 strings on double character basis WORDREPL() Replaces particular double characters with others WORDSWAP() Exchanges double characters lying beside each other in a string WORDTOCHAR() Exchanges double characters for individual ones
#include "hmg.ch"
PROCEDURE Main() nWindWidth := 500 nWindHeight := 400 nUnMWinCol := ( GetDesktopWidth() - nWindWidth ) / 2 nUnMWinRow := ( GetDesktopHeight() - nWindHeight ) / 2 DEFINE WINDOW frmUnTouchable ; AT 0,0 ; WIDTH nWindWidth ; HEIGHT nWindHeight ; TITle "UnTouchable Window" ; MAIN ON KEY ESCAPE ACTION thisWindow.Release DEFINE TIMER Timer_1 INTERVAL 1000 ACTION DontTouchMyWindow() END WINDOW frmUnTouchable.CENTER ACTIVATE WINDOW frmUnTouchable RETURN // UTW.Main() *.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._ PROCEDURE DontTouchMyWindow() thisWindow.Row := nUnMWinRow thisWindow.Col := nUnMWinCol thisWindow.HEIGHT := nWindHeight thisWindow.WIDTH := nWindWidth RETURN // DontTouchMyWindow() *.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._
Since HMG-IDE is an Integrated Development Environment, it’s possible building an entire project from scratch under HMG-IDE.
But this doesn’t mean “without coding”.
So, we can develop all GUI necessities of our project via HMG-IDE; but what, always we will need some little coding.
Then we can begin our project by building a project file. This is the very first and the easiest step:
Simply run IDE.exe and then select “New Project”.
When IDE ask, select (or build a new) a working folder and give a name (say Viva_HMG) to the project. .hbp extension will be assigned by IDE to project file.
Whenever IDE build a new project, automatically build and open a module file with name Main.prg and a form file with name Main.fmg.
Module file open by your text editor and form file open by IDE itself.
The content of your module file will be like this :
#include <hmg.ch> Function Main Load Window Main Main.Center Main.Activate Return
Basic rules :
– Every HMG project have one ( and only one ) “MAIN” procedure / function
– For using GUI controls, every HMG project have one ( and only one ) “MAIN” form.
So, names of both module and form files are “Main“.
File names doesn’t mandatory;
– only name of first procedure / function of first module file must be “Main” and
– “Window Type” property of one form must be “MAIN“.
You can see “module” tab of Project Browser window “(Main)” sign adjacent to the Main.prg and at the bottom line of “Properties” tab of Object Inspector “Window Type” property of “Main” form already set “MAIN” by IDE.
Now, we can work on our first form.
First we can give a name to it.
But what happening?
There isn’t “Name” in the properties list of our form !
Yes, this is correct; because:
– Basic rule 3: Every HMG form has their own name. Only exception is: a form to be LOAD, has a unchangeable name: TEMPLATE.
In other hand, you give an “alias” to a loaded form. The way of this is using “AS” close in the LOAD command. FE:
Load Window Main AS frmIDEBS_01
In this case you have change “Center” and “Activate” commands too :
frmIDEBS_01.Center
frmIDEBS_01.Activate
If you don’t use an “alias” in that way, you will use in all references of form by its file name; in this example : “Main”.
Now, its time to give a “Title” to the form.
For this, we will use “TITLE” property of form:
Double click “Title” and give a title in the open Input Box, say “It’s a Wonderful Life”
We can change easily background color of form:
Double click BackColor in the properties list.
Click “Custom“.
In the Color Select Form select your favorite background color or simply enter these tree values. : 64, 220, 210
Press RUN button and look to your application in work.
BROWSE is a control a few complicated than others. However HMG-IDE successfully support it.
In this sample we will build a Browse based application in a few steps using HMG-IDE.
Step – 1 : Make a folder for this sample.
Step – 2 : Copy TEST.DBF and TEST.DBT from \hmg\SAMPLES\TUTORIAL folder to your new folder.
Step – 3 : Run HMG-IDE and chose “New Project”.
IDE will ask you location and name for the new project; denote the folder you had build in the first step and give a name, say “IDEBrowse”.
IDE will build a new main module named “Main.Prg” and a new main form named “Main.fmg”
Step – 4 :
Double click “Main.prg” in the “Modules” tab of “Project Browser” window for editing this “main” module:
IDE send this module (.prg) file to your programing editor.
You will see your main program written by IDE :
#include <hmg.ch>
Function Main
Load Window Main Main.Center Main.Activate Return
Step – 5 :
Since BROWSE is a table based control, we must have a table and files opening/closing routines; these aren’t duties of IDE.
So add this two little procedures to the main.prg for opening and closing table:
Procedure OpenTables() Use Test Shared Return Procedure CloseTables() Use Return
Step – 6 :
Now, it’s time for making some arrangements on the form:
Title :
– Click “Object Inspector [Main.Fmg]\Form\Properties\Title” :
– Give a “Title”, say “IDE Browse Sample” to form :
On Init Procedure :
– By clicking “Object Inspector [Main.Fmg]\Form\Events\OnInit” ;
– Assign OpenTables() procedure name to this event:
On Release Procedure :
– By clicking “Object Inspector [Main.Fmg]\Form\Events\OnRelease”;
– Assign CloseTables() procedure name to this event:
Step – 7 :
Now, we can place BROWSE control in our form:
– Click BROWSE button in the Toolbox:
– Then click anywhere in the form :
– Re-size control by dragging “resize” mark at the lower rigth corner :
– If required, change placement of control by using “replace” mark ( at the upper-left corner )
– By using these two marks, you can place control in the form whatever you like:
Step – 8 :
And now, we will make some arrangements on the BROWSE control :
After activating ( by clicking on it ) BROWSE control;
By selecting “Object Inspector[Main.Fmg]\Browse_1\Properties” give these properties to Browse_1 control:
– “Fields” property :
{‘Test->Code’,’Test->First’,’Test->Last’,’Test->Birth’,’Test->Married’,’Test->Bio’}
– “Headers” property :
{ ‘Code’, ‘First Name’, ‘Last Name’, ‘Birth Date’, ‘Married’, ‘Biography’ }
– “Widths” property :
{ 150, 150, 150, 150, 150, 150 }
– “Work Area” property :
Test
Note that “array” properties requires open and close curly-braces (‘{}’), character properties doesn’t requires quotation marks (“”).
.
If you want allow editing abilities to user, you have change default values (.F.) of these properties to .T.
ALLOWEDIT
ALLOWAPPEND
ALLOWDELETE
Last Step :
That is All !
Click “Run” button ( or select “Run” from Project menu or simply press F5 key) for see results :
You have now a BROWSE based HMG application generated by IDE.
When you use “Run” command or attempt to closing your form by clicking “X” button, IDE ask you saving it ( if any change you have made ). You may also use Project\Save Form menu command.
Since IDE is a “Two-Way Form Designer”, you can edit .fmg files by double clicking its name in the “Forms” tab of “Project Browser” window.
And since .fmg files are pure HMG source code, you can open a .fmg file by your editor to see form source code generated by IDE. Inspecting this code may be useful for better understanding and learning HMG.
You can also edit this file manually, but under your own risk ! Some modifications may not suitable to the standards of Form Designer.
Hexadecimal file viewer.
This is a experimental project with first intend of point out the power of Harbour and HMG. So, HexView is considerably slow on large files, please be patient.
Download here ( source only ).