XProfan 11 - Die Neuerungen:

XProfan ohne Grenzen

Auch wenn man die folgende Änderung auf dem ersten Blick nicht "sieht", so ist sie doch die bislang aufwändigste Erweiterung der neuen Version:
  • Die Anzahl der Programmzeilen ist nun unbegrenzt.*
  • Die Anzahl der Variablen pro Typ und die maximale Anzahl der Elemente von Arrays eines Typs ist nun unbegrenzt.*
  • Die PROC-ENDPROC-Verschachtelung, und damit die Rekursionstiefe ist unbegrenzt.*
  • Die WHILE-WEND-Verschachtelung ist unbegrenzt.*
  • Die Anzahl der XPGL-Daten im Speicher ist unbegrenzt. *
  • Die maximale Anzahl der Spalten bei SQL-Abfragen (bislang 1024) ist unbegrenzt. *
* Aus technischen Gründen gibt es noch eine Grenze, die bei etwas über 2 Milliarden liegt (maximaler Wert eines vorzeichenbehafteten Longint), aber dies dürfte in der Praxis wohl in keinem Fall erreichbar sein, bevor der Rechner wegen mangelnden Speichers aufgibt.

Diese "Grenzenlosigkeit" wurde durch eine dynamischere Speicherverwaltung erzielt und hat zur Folge, dass die meisten Programme in Zukunft mit deutlich weniger Hauptspeicher auskommen werden.

Komfortableres Importieren externer Funktionen + CDECL-Aufrufe

a& = importFunc(hDLL&, Func$, Alias$)
Mit dieser Funktion wird eine externe Funktion importiert. 

h& = importDLL(DLL$, Name$)
Mit dieser Funktion werden alle Funktionen einer DLL importiert. 

CDECL-Aufrufe
Der Aufrufmodus für externe Funktionen kann nun auch vom unter Windows üblichen STDCALL auf CDECL umgestellt werden:
Set("CallConv", Modus$)
Modus$: Aufrufkonvention - "STDCALL" oder "CDECL"

Array-Zuweisungen und Matrix-Befehle

A&[] = B&[]
Ein Array kann einem anderen zugewiesen werden, wenn es den gleichen Typ und die gleichen Dimensionen hat, bzw. beide dynamisch sind.

A$[] = Explode(text$, d$)
Der Inhalt von text$ wird in Einzelstrings zerlegt, die durch den Delimiter d$ getrennt sind. A$[] enthält die Einzelstrings.
Explode liefert ein dynamisches Stringarray zurück. A$[] muß daher ein dynamisches Stringarray sein. 
Parameters A&[]
Einer Prozedur kann über Parameters ein Array übergeben werden.

PType() um Arrays ergänzt
Ist der Parameter ein dynamisches Array, ist das Ergebnis der Parametertyp gefolt von leeren eckigen Klammern, z.B. "$[]". Ist der Parameter ein Array mit definierter Größe, stehen in den eckigen Klammern die Dimensionsgrößen, etwa "%[8,8,2]".

Return A&[]
Eine Prozedur kann ein Array zurückgeben. Das Ergebnis muß einem Array gleichen Typs zugewiesen werden.

A&[] = <Ausdruck> / &Index
Allen Elementen das Arrays wird <Ausdruck> zugewiesen. Im Ausdruck darf die Systemvariable &Index vorkommen, die den jeweiligen Indexwert hat.

MAT A&[] = <Ausdruck>

Allen Elementen des Arrays A& wird der Wert <Ausdruck> zugewiesen.

MAT A&[] + <Ausdruck>
Zu allen Elementen des Arrays A& wird <Ausdruck> addiert. Im Falle von Stringarrays wird der String <Ausdruck> angehängt.

MAT A&[] - <Ausdruck>
Von allen Elementen des Arrays A& wird <Ausdruck> subtrahiert. Für Stringarrays ist das nicht möglich.

MAT A&[] / <Ausdruck>
Alle Elemente des Arrays A& werden durch <Ausdruck> dividiert. Für Stringarrays ist das nicht möglich. <Ausdruck> darf nicht den Wert 0 haben.

MAT A&[] * <Ausdruck>
Alle Elemente des Arrays A& werden mit <Ausdruck> multipliziert. Für Stringarrays ist das nicht möglich.

MAT A&[] = B&[]
Allen Elementen des Arrays A& wird der entsprechende Wert des Arrays B& zugewiesen.

MAT A&[] + B&[]
Zu allen Elementen des Arrays A& wird der entsprechende Wert des Arrays B& addiert. Im Falle von Stringarrays wird er angehängt.

MAT A&[] - B&[]
Von allen Elementen des Arrays A& wird der entsprechende Wert des Arrays B& subtrahiert. Für Stringarrays ist das nicht möglich.

MAT A&[] / B&[]
Alle Elemente des Arrays A& werden durch den entsprechenden Wert des Arrays B& dividiert. Für Stringarrays ist das nicht möglich. Im Array B& darf kein Wert 0 vorkommen!

MAT A&[] * B&[]
Alle Elemente des Arrays A& werden mit dem entsprechenden Wert des Arrays B& multipliziert. Für Stringarrays ist das nicht möglich.
Dynamische Arrays (Open Arrays)

Bei eindimensionale Arrays kann man nun auf die Angabe einer festen Größe verzichten, um ein Dynamisches Array zu erzeugen.
Ein so erzeugtes Array hat zunächst eine Größe von 0. Sobald jedoch ein Element zugewiesen wird, wird das Array auf die entsprechende Größe erweitert. Immer, wenn ein Element zugewiesen wird, dass die Größe des bisherigen Arrays überschreitet, wird es auf diese Weise erweitert. Um das Array wieder auf 0 zu verkleinern, ist der Clear-Befehl zu verwenden.  Um die Größe des Arrays beliebig einzustellen, ist der neue Befehl SetSize zu verwenden. 
Einschränkungen gegenüber "normalen" Arrays:
- Es ist nur eine Dimension möglich
- der MAT-Befehl funktioniert nicht mit dynamischen Arrays
- Arrays von Bereichsvariablen (auch Strukturen, Objekte) können nicht dynamisch sein
Übernahme von Strukturen in Klassen und Strukturen

Es können zusätzlich zur Vererbung Strukturen unter einem frei zu wählenden Namen eingefügt werden. Der Name der Struktur in der Struktur wird von einem Ausrufezeichen getrennt vor dem Strukturnamen angegeben. Ein Beispiel:
   STRUCT Punkt = X%, Y%
STRUCT Linie = von!Punkt, bis!Punkt
Die Struktur Punkt wird hier zwei mal mit verschiedenen Namen hinzugefügt. Beim Zugriff auf die Elemente ist dieser Name mit zu verwenden:
   LINE von!x%, von!y% - bis!x%, bis!y%
Auch Klassen können auf diese Weise mehrere Strukturen hinzugefügt werden. Es können sogar die Eigenschaften weiterer Klassen so hinzugefügt werden.
Prozess-IDs und Exit-Codes

END [exitcode%]
Hinter dem END kann ein Exitcode angegeben werden. Dieser kann z.B. vom aufrufenden Programm abgefragt werden. 

pid% = WinExec(programm&, mode%)
Diese Funktion liefert jetzt die Prozeß-ID des gestarteten Programmes zurück, wie es im Taskmanager angezeigt wird. Im Fehlerfall ist es wie bisher der Wert 0.

getExitcode(pid%)
Der Exitcode des Prozesses pid% wird ermittelt. Ist das Ergebinis 259 (= STILL_ALIVE) ist das Programm noch nicht beendet.

&pid
Prozess-ID des laufenden XProfan-Programmes

%ExitCode
Der Exitcode des zuletzt mit WinExecWait gestarten Programmes
Bitmaps

set("PicBackCol", farbe%)
farbe% = get("PicBackCol")
Das Bitmapformat von Windows kennt von Hause aus keine Transparenz, daher legt XProfan bei create("hPic",..), create("hSizedPic",...), DrawPic und MLoadBMP intern für transparente Bitmaps der Formate *.gif, *.ico, *cur, *.emf und *.wmf eine Hintergrundfarbe fest. Bislang wurde hier immer reines Weiß genommen. Das erschwert aber die transparente Darstellung, wenn das Motiv selber Weiß enthält und auf einem nicht weißen Hintergrund gezeichnet werden soll. Mit dieser Set-Funktion kann nun eine beliebige interne Hintergrundfarbe angegeben werden, die im Motiv nicht vorkommt sollte. Nutzt man diese beim transparenen zeichnen, z.B. mit DrawPic, als Transparenzfarbe, wird das Motiv komplett wiedergegeben.

bitmaphandle& = create("hNewPic", dx%, dy%, farbe%)
Es wird eine neue Bitmap erzeugt mit der gewählten Hintergrundfarbe erzeugt. Die Bitmap wird im Speicher ezeugt.

StartPaint / EndPaint erweitert
Bisher konnte als StartPaint nur das Handle eines Fensters angegeben werden oder -1 für die mit MCLS erstellte Speicherbitmap bzw. die mit MLoadBmp in den Speicher geladene Bitmap. Zusätzlich kann nun ein Bitmap-Handle, Devicekontext oder Metafile-Devicekontext angegeben werden:

Die Transparenzfarbe bei transparenter Darstellung kann beliebig eingestellt werden
Alle Befehle, die die Modusangabe -1 für Transparenz erlauben, erlauben nun einen weiteren Parameter, der die transparente erscheinende Farbe angibt. Wird dieser weggelassen, wird wie bisher die Farbe des untersten linkesten Punktes genommen.

bitmaphandle& = create("hPicCopy", hPic&[, x%, y%, dx%, dy%])
Es wird eine Kopie einer Bitmap erzeugt. Wenn die Parameter x%, y%, dx% und dy% angegeben sind besteht die Kopie lediglich aus dem so bezeichnerten Ausschnitt der Originalbitmap.

SavePic Name$, bitmaphandle& [,qualitaet%]
Das zum Bitmaphandle gehörige Bild wird als BMP, PNG oder JPG-Datei unter dem angegebenen Namen (ggf. mit Pfad) gespeichert:
Wenn die Dateiendung ".PNG" ist, wird das Bild als PNG-Datei gespeichert, wenn der dritte Parameter angegeben ist, wird das Bild als JPG-Datei in entsprechender Qualität (1 - 100) gespeichert. Je geringer die Qualität, desto geringer die Bildgröße. Ein guter Wert ist zwischen 75 und 80.

bitmaphandle& = create("hPic", 0, name$) (erweitert)
Neben dem internen Ressourcennamen "&MEMBMP" gibt es drei weitere vorbelegte Namen:
"&OGLBMP" - Es wird eine Bitmap des aktuellen OpenGL-Bildschirms erstellt.
"&SCRBMP" - Es wird eine Bitmap des aktuellen Hauptfensters erstellt.
"&DSKBMP" - Es wird eine Bitmap des aktuellen Desktops erstellt.
"&CLPBMP" - Es wird eine Bitmapkopie der aktuellen Zwischenablage erstellt, wenn diese eine Bitmap enthält.

bitmaphandle& = create("hPic", -1, dateiname$) (erweitert)
Es können jetzt auch Bilder im PNG-Format geladen werden. Die Dateiendung muß ".PNG" sein.

DrawIcon erweitert
Da die Befehle DrawIcon, DrawSysIcon, DrawLibIcon und DrawExtIcon letztlich nichts anderes machen als der Befehl DrawIcon, nämlich ein Icon auf den Bildschirm zu zeichen, habe ich sie alle zu DrawIcon zusammengefasst und bei der Gelegenheit gleich erweitert, um ein Icon aufgrund des Handles zu zeichnen oder ein Bild aus einer ImageList.

DrawPic und DrawSizedPic erweitert
Da die Befehle DrawPic, LoadsBmp und LoadExtBmp auf der einen und DrawSizedPic, LoadSizedBmp und LoadSizedExtBmp auf der anderen Seite letztlich das Gleiche machen, nämlich eine Bitmap in Originalgröße ider scaliert anzeigen, habe ich sie zu DrawPic bzw. DrawSizedPic zusammengefasst.

TrayIcons

TrayIcon("Add", hWnd&, ID%, hIcon&, Text$)

Es wird ein TrayIcon erzeugt. Da das TrayIcon wissen muß, welches Fenster bei einem Klicken zu benachrichtigen ist, muß diese angegeben werden.

TrayIcon("SetIcon", hWnd&, ID%, hIcon&)
Das Icon des TrayIcons wird ersetzt.

TrayIcon("SetTip", hWnd&, ID%, Text$)
Das Text des TrayIcons wird ersetzt.

TrayIcon("Delete", hWnd&, ID%)
Das TrayIcon wird gelöscht.

TrayMsg% = TrayIcon("Msg", ID%)
Nach WaitInput kann mit dieser Funktion abgefragt werden, ob ein Klick auf das Trayicon mit der Nummer ID% das Verlassen des WaitInput ausgelöst hat. In diesem Fall ist das Ergebnis der Funktion größer als 0.
Kollisionen und Überschneidungen

In vielen Spielenm ist die Kollisionskontrolle sehr wichtig. Es wird überprüft, ob sich zwei Spielelemente überschneiden. Auch wenn sich das in ein paar Programmzeilen schon jetzt programmieren läßt, bietet XProfan 11 einige Funktionen, die das Ganze noch erheblich beschleuinigen:

between(x!, vonx!, bisx!)
Das Ergebnis ist 1, wenn sich der Wert von x! nicht kleiner als vonx und nicht größer als bisx! ist.

between(x!, vonx!, bisx!, y!, vony!, bisy!)
Das Ergebnis ist 1, wenn sich der Punkt x!/y! innerhalb der rechtwinkligen Fläche befindet, die durch die Koordinaten vonx!/vony! und bisx!/bisy! beschrieben wird.

between(x!, vonx!, bisx!, y!, vony!, bisy!, z!, vonz!, bisz!)
Das Ergebnis ist 1, wenn sich der Punkt x!/y!/z! innerhalb des rechtwinkligen Raumes (Quader) befindet, der durch die Koordinaten vonx!/vony!/vonz! und bisx!/bisy!/bisz! beschrieben wird.

range(wert!, von!, bis!)
Das Ergebnis ist der Wert in den angegebenen Grenzen. Ist der Wert also kleiner als von, wird er auf von gesetzt, ist er größer als bis, wird er auf bis gesetzt. So wird sichergestellt, dass sich der Wert vor der Weiterverarbeitung innerhalb der angegebenen Grenzen bewegt.

Oftmals reicht es jedoch nicht aus, einen bestimmten Punkt zu überprüfen, sondern man möchte wissen, ob ein Objekt ein anderes berührt oder überschneidet. Auch hierfür gibt es eine neue Funktion:

intersect(typ$, objekt1#, objekt2#)
Das Ergebnis ist 1, wenn sich die Objekte berühren oder überschneiden. Beide Objekte müssen vom angegebenen Objektyp sein oder abgeleitet sein.

TREEVIEW

Ein TreeView ist eine Baumansicht von Texten und/oder Bildern, wobei die einzelnen Zweige dieser Ansicht auf- und zugeklappt werden können. Wie üblich, wird auch dieses Dialogelement mit einer Create-Funktion erstellt:
hTV& = Create("TreeView", hWnd&, hIL&, X%, Y%, DX%, DY%)

Folgende Funktionen gibt es, um das TreeView zu füllen und zu bearbeiten:

Item% = TreeView("InsertItem", hTV&, Parent%, Image%, Text$)
Diese Funktion fügt dem TreeView einen Eintrag hinzu. 

TreeView("SetItemImage", hTV&, Item%, Image%)
Das Bild des Eintrages wird verändert

TreeView("SetChildren", hTV&, Item%, Wert%)
Es wird bestimmt, ob ein Eintrag untergeordnete Einträge (Kinder) hat.

TreeView("Expand", hTV&, Item%, 2)
Wenn der Eintrag Kinder hat, kann er auf- oder zugeklappt werden.

Item% = TreeView("GetSelected", hTV&)
Mit dieser Funktion wird ermittelt, welcher Eintrag augenblicklich selektiert ist.

TreeView("DeleteItem", hTV&, Item%)
Der Eintrag Item% wird aus dem Treeview entfernt. Hat der Eintrag Kinder, werden auch diese entfernt.

TreeView("Select", hTV&, item&)
Mit dieser Funktion wird ein Eintrag selektiert unf gegebenenfalls in den sichtbaren Bereich gescrollt.

SetText hTV&, Item%, Text$
Der Text des Eintrags wird mit Text$ überschrieben.

Text$ = GetText$(hTV&, item&)
Mit dieser Funktion wird der Text des Eintrags ermittelt.

Die Gesamtzahl aller Einträge eines TreeView lässt sich mit GetCount(hTV&) ermitteln.

IMAGELIST

Um Bilder im TreeView anzuzeigen, benötigt man eine ImageList (Bilderliste). Diese wird mit folgender Create-Funktion erzeugt:
hIL& = Create("ImageList", DX%, DY%[, hBmp&[, tCol%]])

Folgende Funktionen gibt es, um das TreeView zu füllen und zu bearbeiten:

ImageList("Add", hIL&, hBmp&[, tCol%])
Die Bitmap hBmp& wird der ImageList hinzugefügt. Sollen die Bilder transparent dargestellt werden, ist mit tCol% die Farbe anzugeben, die transparent sein soll.

ImageList("AddIcon", hIL&, hIcon&)
Das Icon oder der Cursor mit dem Handle hIcon& wird der ImageList hinzugefügt.

hIcon& = ImageList("GetIcon", hIL&, Image%)
Das Bild Image% aus der Imagelist wird zu einem Icon bzw. Cursor.

Es gibt auch eine neue Variante des Befehls DrawIcon, um ein einzelnes Bild einer ImageList anzuzeigen:
DrawIcon hIL&, Image%, X%, Y%
Browser: HTMLWin

Das WebControl "HTMLWin" dient zum Anzeigen von HTML-Seiten, egal ob lokal auf der Platte oder im Internet. Es nutzt das gleiche Control wie der Internet-Explorer. Wie üblich, wird auch dieses Dialogelement mit einer Create-Funktion erstellt:
hWC& = Create("HTMLWin", hWnd&, Ziel$, modus%, X%, Y%, DX%, DY%)

HTMLWin("GoBack", hWC&)
Diese Funktion entspricht dem Zurück-Button des Explorers: Es wird die vorherige HTML-Seite angezeigt.

HTMLWin("GoForward", hWC&)
Nach einem "GoBack" kann man mit dieser Funktion wieder vorwärts blättern.

HTMLWin("GoHome", hWC&)
Es wird die in den Internetoptionen des Betriebssystems eingestellte Startseite aufgerufen.

HTMLWin("GoSearch", hWC&)
Es wird die in den Internetoptionen des Betriebssystems eingestellte Suchseite aufgerufen.

HTMLWin("Stop", hWC&)
Das Laden der aktuellen Seite wird abgebrochen.

HTMLWin("Refresh", hWC&)
Die aktuelle Seite wird erneut geladen.

HTMLWin("Navigate", hWC&, Ziel$)
Es wird neues Tiel gewählt und angezeigt.

busy% = HTMLWin("GetBusy", hWC&)
Mit dieser Funktion kann überprüft werden, ob das Control mit dem Laden und Darstellen einer Seite fertig ist.
Subclassing mit XProfan

Was ist Subclassing?
Jedes Fenster oder Dialogelement in Windows hat eine Fensterprozedur, die die Messages verarbeitet, die an dieses Fenster geschickt werden. Diese Fensterprozedur reagiert entweder selbst auf diese Messages oder reicht sie direkt an Windows zur Verarbeitung weiter. Mit dem SubClassing können wir die Messages für ein (oder mehrere) Fenster ersteinmal zu einer eigenen Prozedur umleiten, in dem wir der Fensterklasse unsere eigene Prozedur als Fensterprozedur unterschieben. Darin können wir dann Messages, die uns interessieren abfangen und entsprechend reagieren. Und damit Windows nicht aus dem Takt kommt, leiten wir die Messages, die wir nicht oder nur teilweise bearbeiten zum Schluß an die Original Windowsprozedur weiter, so dass Windows diese wie üblich behandeln kann.

Um die Messages eines Fensters oder Dialogelementes umzuleiten, gibt es den Befehl SubClass:
SubClass hWnd&, n%
Sobald das Subclassing eingeschaltet ist, werden alle Messages zu unserer Subclassing-Prozedur umgeleitet. In XProfan gibt es eine spezielle Prozedur für das das Bearbeiten der umgeleiteten Messages: SubClassProc. Wie alle Prozeduren wird auch diese mit EndProc beendet. Ganz wichtig hier der Befehl SetWinProc, denn dieser legt fest, ob anschließend die ursprüngliche Windowsprozedur noch aufgerufen wird oder nicht:

Set("WinProc", n%)
Normalerweise muß die Windowsprozedur für alle Fälle aufgerufen werden, die unsere Subclassing-Prozedur nicht abdeckt. Da "WinProc" defaultmäßig auf 1 gesetzt ist, sieht eine minimalistische SubclassingProzedur also so aus:

Damit man auf die umgeleiteten Messages reagieren kann, gibt es vier neue Systemvariablen, die nur innerhalb der SubClassProc gültig sind:
&sWnd: Handle des Fensters, an das die Message gerichtet ist. Das ist wichtig, wenn wir mehrere Fenster/Dialogelemente Subclassen.
%sMessage: Umgeleitete Message
&sWParam: Der WParam-Wert der Message
&sLParam: Der LParam-Wert der Message

Und damit das Abfragen etwas einfacher wird gibt es eine neue Funktion:

n% = SubClassMessage(hWnd&, MsgNr%)
Diese Funktion gibt 1 zurück, wenn die umgeleitete Message die Nummer MsgNr% hat und für das Fenster/Dialogelement mit dem Handle hWnd% bestimmt ist.

Der Vollständigkeit halber:
n% = Get("WinProc")
Hiermit ermitteln wir der aktuellen Wert von WinProc (entweder 0 oder 1)
Sonstige Erweiterungen
  • Var V = Wert : Dieser Befehl kombiniert eine Deklaration mit einer gleichzeitigen Zuweisung und ersetzt somit die folgenden zwei Zeilen:
  • SetEnv Name$, Wert$ : Die Environmentvariable mit dem entsprechenden Namen wird auf Wert$ gesetzt, bzw. mit Wert$ erzeugt, wenn sie noch nicht existiert.
  • Farbe% = ChooseColor(hWnd&, Vorgabe%) : Es wird der Windows-Farbwahldialog aufgerufen. Mit Vorgabe& wird die Farbe bestimmt, die bei Aufruf des Dialoges ausgewählt ist.
  • Error ErrNr%, ErrText$ :  Dieser Befehl erlaub die Erzeugung einer Fehlermeldung.
  • HTML-Download : Eine neue Funktion erlaubt das Laden von Dateien per HTML. Das können beliebige Dateien sein, also z.B. HTML-Dateien oder auch ZIP-Archive.
  • Beschleunigtes Explode(), MoveStrToList(), InStr(), SubStr$() : Bei einem mehrere MB großen String mit mehreren hunderttausend Substrings konnte es bislang einige Minuten dauern, bis Explode() oder MoveStrToList() mit ihrer Arbeit fertig waren. Dieser Vorgang konnte auf unter 1 Sekunde beschleunigt werden!
  • Weitere Unterfunktionen bei Toolbar() : Die Funktion Toolbar() hat einige weitere Unterfunktionen.
  • UserMessage-Stack : Bisher konnte es passieren, dass Usermessages verloren gingen, wenn mehrere Usermessages zwischen zwei WaitInputs auftraten. In diesem Fall kam nur die letzte zum Zuge. Jetzt gibt es einen Stack, der sich die aufgetretenen Usermessages merkt und sie in der Reihenfolge des Eintreffens an WaitInput weitergibt. An der Syntax ändert sich dadurch nichts.
  • Erweiterte Usermessages : Um eine einzelne UserMessage wieder zu entfernen, ist die Messagenummer beim Befel USERMESSAGES negativ einzugeben. Mit der Funktion IsUsermessage(Nr%) kann überprüft werden, ob es die UserMessage Nr% gibt. 
  • Base64-Codierung : In vielen Fällen, z.B. beim Versenden von Mailanhängen, ist es nötig, beliebige Daten in einen String aus darstellbaren Zeichen zu verwandeln. Der bekannteste Code hierfür ist Base64, d.h. alle Werte werden in maximal 64 Zeichen dargestellt. Folgende Funktionen ermöglichen die Kodierung und Dekodierung von beliebigen Inhalten: text$ = Encode64(data$) und
  • data$ = Decode64(text$)
  • SendFile bei SMTP : smtp("SendFile",...) hat die gleiche Syntax wie "SendMail", nur dass zusätzlich noch ein Dateiname angegeben werden muß. Diese Datei wird als Anhang mitgeschickt:.Default-Position des Hauptfensters zentriert
  • nearly(x!, y!, n&) : Vergleich zweier Werte mit definierter Genauigkeit.
Erweiterung bekannter Funktionalitäten

  • Rnd() : Die Funktion Rnd(() kann nun auch ohne Parameter aufgerufen werden und gibt dann eine Zufallszahl zwischen 0.0 und <1.0 als Fließkommazahl zurück!
  • SizeOf(VAR) : Wenn VAR ein gültiges Bitmap- oder Metafilehandle ist, werden die Systemvariablen %BmpX, %XBmpY, %BmpCol und %BmpB beziehungsweise %MfX und %MfY entsprechend gefüllt.
  • RePaint [modus%] : Im Modus 0 wird wie bisher der Bildschirm vor dem Neuzeichnen gelöscht. Im Modus 1 wird nur der veränderte Teil neugezeicnet. Wird Modus nicht angegeben, funktioniert RePaint wie bisher.
  • WinHelp für CHM-Dateien : Der Befehl Winhelp kommt nun auch mit CHM-Dateien klar. Wenn die Dateiendung nicht ".hlp" ist, wird angenommen, dass es sich um eine CHM-Datei (Dateiendung .chm) handelt. Die Sonderfunktionen von "*" und "?" als Suchbegriff gibt es bei CHM-Dateien nicht.
  • ClassOf() wurde erweitert, um Handles zu identifizieren : Folgende Handleklassen werden identifiziert: ImageList,  BitMap, IconModule
  • SetText und GetText$() nun auch für TreeView und TabControl
  • Eine ImageList für die ToolBar : Bei Create("Toolbar",...) kann jetzt anstelle des Bitmaphandles für die Icons auch eine Imagelist angegeben werden.
  • Eine ImageList für das TabControl : Bei Create("TabCtrl",...) kann jetzt anstelle des Textes für den ersten Reiter eine ImageList angegeben werden. Das TabControll wird dann zunächst ohne Reiter, aber mit ImageList erzeugt.
  • TrackMenu(x%,y%) als Funktion : Anstelle des Befehles TrackMenu x%,y% kann nun auch die gleichnamige Funktion verwandt werden. Das Ergebnis ist der gewählte Menüpunkt. Wird die Funktion ohne die Parameter x%,y% mit leerer Klammer aufgerufen, wird die aktuelle Mausposition für das Popup-Menü verwandt.
  • DeleteString() und GetCount() für Listbox-Liste : Wenn bei DeleteString als Handle die 0 angegeben wird, bezieht sich die Funktion auf die Listbos-Liste. Ebenso bezieht sich GetCount() auf die Listbox-Liste, wenn das Handle 0 ist, und gibt die Anzahl der Elemente in der Listbox-Liste wieder.
  • SetText für DateEdit und TimeEdit : Bei "DateEdit"- und "TimeEdit"-Controls kann nun mit SetText der eingestellte Wert geändert werden.
  • SetWindowsPos mit nur zwei Parametern : Das Fenster oder Dialogelement mit dem Handle hWnd& wird ohne die Größe zu verändern an die neue Position verschoben.
  • Dispose für mehrere Beeiche : Bei Dispose können nun mehrere Bereichs-, Objekt- oder Strukturvariablen angegeben werden, deren Speicher freizugeben ist.
  • Clicked() verbessert : Clicked() reagiert jetzt auch auf einige Dialogelemnte, auf die es bisher nicht reagiert hat, wie z.B. auf die Gridbox.
  • Inc und Dec erweitert / Add und Sub abgeschafft : Die Befehle INC und DEC können jetzt einen weiteren Parameter haben.Die Variable wird bei Angabe des optionalen Integer-Parameters um den entsprechenden Wert erhöht oder erniedrigt. Damit werden die bisherigen Befehle ADD und SUB überflüssig.
  • Substr$ erweitert : Wenn bei Substr$ kein Delimiter angegeben wird, wird statt des Substrings ein einzelnes Zeichen ermittelt.
  • Menüeigenschaften auch bei PopUp-Menüs mit TrackMenu
  • SetText kann nun auch den Tooltiptext ändern und mit einer Überschrift samt Icon versehen.
  • create("hIcon", Name$) : Wenn diese Funktion nur einen Parameter hat, dann bezeichnet dieser den Namen eines internen XProfan-Icons.

Mehr Infos: 

Eine ausführliche Hilfedatei mit allen Neuerungen, Verbessserungen und Listings befindet sich hier: XProfan11.chm