diff --git a/C#/fpCefSharp/fpEventSubscriber.cs b/C#/fpCefSharp/fpEventSubscriber.cs new file mode 100644 index 0000000..dfe18fe --- /dev/null +++ b/C#/fpCefSharp/fpEventSubscriber.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; + +namespace fpCefSharp +{ + /// + /// FoxPro interop access to .NET events. Handles all events of a source object for subsequent retrieval by a FoxPro client. + /// + /// For a FoxPro program to be notified of events, it should use `wwDotNetBridge.InvokeMethodAsync` to call + /// . When asynchronously completes, the FoxPro program should + /// handle the event it returns and then call again to wait for the next event. + /// The FoxPro class `EventSubscription`, which is returned by `SubscribeToEvents`, encapsulates this async wait loop. + /// + /// NOTE: This code is based on wwDotNetBridge from Rick Strahl and Edward Brey. It's the same code as in pull request + /// #26 for wwDotNetBridge, the class name aside. This code can be removed after the pull request is merged and + /// the FoxPro code has been updated to use the built-in mechanism of wwDotNetBridge. + /// + public class fpEventSubscriber : IDisposable + { + private readonly object _source; + private readonly List _eventHandlers = new List(); + private readonly ConcurrentQueue _raisedEvents = new ConcurrentQueue(); + private TaskCompletionSource _completion = new TaskCompletionSource(); + + public fpEventSubscriber(object source, String prefix = "", dynamic vfp = null) + { + // Indicates that initially the client is not waiting. + _completion.SetResult(null); + + // For each event, adds a handler that calls QueueInteropEvent. + _source = source; + foreach (var ev in source.GetType().GetEvents()) + { + // handler is a PRIVATE variable defined in EventSubscription.Setup(). + Boolean hasMethod = vfp?.Eval($"PEMSTATUS(m.handler, '{prefix}{ev.Name}', 5)"); + if (!hasMethod) + continue; + + var eventParams = ev.EventHandlerType.GetMethod("Invoke").GetParameters().Select(p => Expression.Parameter(p.ParameterType)).ToArray(); + var eventHandlerLambda = Expression.Lambda(ev.EventHandlerType, + Expression.Call( + instance: Expression.Constant(this), + method: typeof(fpEventSubscriber).GetMethod(nameof(QueueInteropEvent), BindingFlags.NonPublic | BindingFlags.Instance), + arg0: Expression.Constant(ev.Name), + arg1: Expression.NewArrayInit(typeof(object), eventParams.Select(p => Expression.Convert(p, typeof(object))))), + eventParams); + var eventHandler = eventHandlerLambda.Compile(); + ev.AddEventHandler(source, eventHandler); + _eventHandlers.Add(new DelegateInfo(eventHandler, ev)); + } + } + + class DelegateInfo + { + public DelegateInfo(Delegate handler, EventInfo eventInfo) + { + Delegate = handler; + EventInfo = eventInfo; + } + + public Delegate Delegate { get; } + public EventInfo EventInfo { get; } + } + + public void Dispose() + { + foreach (var item in _eventHandlers) + item.EventInfo.RemoveEventHandler(_source, item.Delegate); + _completion.TrySetCanceled(); + } + + private void QueueInteropEvent(string name, object[] parameters) + { + var interopEvent = new fpRaisedEvent { Name = name, Params = parameters }; + if (!_completion.TrySetResult(interopEvent)) + _raisedEvents.Enqueue(interopEvent); + } + + /// + /// Waits until an event is raised, or returns immediately if a queued event is available. + /// + /// The next event, or null if this subscriber has been disposed. + public fpRaisedEvent WaitForEvent() + { + if (_raisedEvents.TryDequeue(out var interopEvent)) return interopEvent; + _completion = new TaskCompletionSource(); + var task = _completion.Task; + + task.Wait(); + + return task.IsCanceled ? null : task.Result; + } + } +} diff --git a/C#/fpCefSharp/fpRaisedEvent.cs b/C#/fpCefSharp/fpRaisedEvent.cs new file mode 100644 index 0000000..6a256ba --- /dev/null +++ b/C#/fpCefSharp/fpRaisedEvent.cs @@ -0,0 +1,8 @@ +namespace fpCefSharp +{ + public class fpRaisedEvent + { + public string Name { get; internal set; } + public object[] Params { get; internal set; } + } +} \ No newline at end of file diff --git a/Demos/Demo_Events.PRG b/Demos/Demo_Events.PRG new file mode 100644 index 0000000..5f8af12 --- /dev/null +++ b/Demos/Demo_Events.PRG @@ -0,0 +1,41 @@ +*======================================================================================== +* Respond to events in the browser +*======================================================================================== + + LOCAL loConfig, loEvents + loConfig = CREATEOBJECT("MyHandler") + loEvents = CreateObject("MyEvents") + + Local loForm + DO FORM ShowHtml WITH "https://myApp/index.html", m.loConfig Name loForm + loEvents.AddProperty ("oCefSharpBrowser", m.loForm.oCefSharpBrowser) + loForm.oCefSharpBrowser.HandleEvents (m.loEvents) + +DEFINE CLASS MyHandler as Custom + + index_html = "" + + PROCEDURE Init + TEXT TO This.index_html NoShow + + + + + ENDTEXT + + Procedure TitleChangedEvent (m.tcTitle) + MessageBox("TitleChangedEvent: " + m.tcTitle) + +ENDDEFINE + + +Define Class MyEvents as Custom + +Procedure OnTitleChanged (toSender, toEventArgs) + This.oCefSharpBrowser.HandleTitleChangedEvent (m.toSender, m.toEventArgs) + +EndDefine \ No newline at end of file diff --git a/Demos/aco_lde.h b/Demos/aco_lde.h new file mode 100644 index 0000000..6525c29 --- /dev/null +++ b/Demos/aco_lde.h @@ -0,0 +1,425 @@ +*==================================================================== +* Diese Datei enthält alle deutschen Sprachdefinitionen, die in +* Acodey verwendet werden. Wenn Sie eine deutschsprachige Anwendung +* erstellen wollen, setzen Sie die Eigenschaft __ACODEY_LANGUAGE auf +* "de" (Standardeinstellung). Ändern Sie niemals diese Datei, da +* sie bei zukünftigen Versionen angepaßt wird. +*==================================================================== + + #UNDEF __INCLUDE_OK + + #IFNDEF LOC_X5C_FileExists + #DEFINE LOC_X5C_FileExists "existiert bereits. Überschreiben?" + #ENDIF + #IFNDEF LOC_ERR_Error + #DEFINE LOC_ERR_Error "Fehler: " + #ENDIF + #IFNDEF LOC_ERR_Method + #DEFINE LOC_ERR_Method "Methode: " + #ENDIF + #IFNDEF LOC_ERR_Line + #DEFINE LOC_ERR_Line "Zeile: " + #ENDIF + #IFNDEF LOC_ERR_RuntimeError + #DEFINE LOC_ERR_RuntimeError "Ablauffehler: " + #ENDIF + #IFNDEF LOC_IONAV_RevertQuestion + #DEFINE LOC_IONAV_RevertQuestion "Wollen Sie alle Änderungen verwerfen?" + #ENDIF + #IFNDEF LOC_IONAV_SaveQuestion + #DEFINE LOC_IONAV_SaveQuestion "Wollen Sie alle Änderungen speichern?" + #ENDIF + #IFNDEF LOC_IONAV_DeleteQuestion + #DEFINE LOC_IONAV_DeleteQuestion "Sind Sie sicher, daß Sie diesen Eintrag löschen wollen?" + #ENDIF + #IFNDEF LOC_IONAV_SaveRevertQuestion + #DEFINE LOC_IONAV_SaveRevertQuestion "Wollen Sie die Änderungen speichern?" + #ENDIF + #IFNDEF LOC_DATAB_InvalidValue + #DEFINE LOC_DATAB_InvalidValue "Ungültiger Wert!" + #ENDIF + #IFNDEF LOC_DATAB_CorrectAndTryAgain + #DEFINE LOC_DATAB_CorrectAndTryAgain "Bitte korrigieren Sie diesen Eintrag und versuchen Sie erneut zu speichern." + #ENDIF + #IFNDEF LOC_DATAB_RecordLockErrorMessage + #DEFINE LOC_DATAB_RecordLockErrorMessage "Der Datensatz konnte nicht gesperrt werden." + #ENDIF + #IFNDEF LOC_DATAB_UpdateError + #DEFINE LOC_DATAB_UpdateError "Beim Speichern trat ein Fehler auf. Korrigieren Sie die Daten und versuchen Sie erneut zu speichern." + #ENDIF + #IFNDEF LOC_ERR_Suspend + #DEFINE LOC_ERR_Suspend "Programmablauf unterbrechen?" + #ENDIF + #IFNDEF LOC_DATAB_RecordValidationErrorMessage + #DEFINE LOC_DATAB_RecordValidationErrorMessage "Die Gültigkeitsregel für Datensätze wurde verletzt." + #ENDIF + #IFNDEF LOC_DATAB_UpdateConflict + #DEFINE LOC_DATAB_UpdateConflict "Ein anderer Anwender hat zwischenzeitlich die von Ihnen bearbeiteten Daten ebenfalls geändert." + #ENDIF + #IFNDEF LOC_DATAB_FLockInTransaction + #DEFINE LOC_DATAB_FLockInTransaction "Zugriff auf die Tabelle beim Versuch verweigert, diese zu sperren." + #ENDIF + #IFNDEF LOC_DATAB_UniquenessViolated + #DEFINE LOC_DATAB_UniquenessViolated "Die Eindeutigkeit des Indizes wurde verletzt." + #ENDIF + #IFNDEF LOC_DATAB_AddTrigger + #DEFINE LOC_DATAB_AddTrigger "Dieser Datensatz enthält ungültige Bezüge. Wahrscheinlich haben Sie ein Pflichtfeld nicht ausgefüllt." + #ENDIF + #IFNDEF LOC_DATAB_DeleteTrigger + #DEFINE LOC_DATAB_DeleteTrigger "Dieser Satz kann nicht gelöscht werden, da noch Daten existieren, die von diesem Satz abhängig sind." + #ENDIF + #IFNDEF LOC_DATAB_EditTrigger + #DEFINE LOC_DATAB_EditTrigger "Folgedaten können nicht aktualisiert werden. Wahrscheinlich befinden sich diese gerade selbst in der Bearbeitung! Warten Sie, bis die Bearbeitung des anderen Datensatzes abgeschlossen ist." + #ENDIF + + #IFNDEF __SET_ANSI + #DEFINE __SET_ANSI OFF + #ENDIF + #IFNDEF __SET_AUTOSAVE + #DEFINE __SET_AUTOSAVE OFF + #ENDIF + #IFNDEF __SET_BELL + #DEFINE __SET_BELL ON + #ENDIF + #IFNDEF __SET_BELL_TO + #DEFINE __SET_BELL_TO TO '', 1 + #ENDIF + #IFNDEF __SET_BLOCKSIZE_TO + #DEFINE __SET_BLOCKSIZE_TO TO 64 + #ENDIF + #IFNDEF __SET_CARRY + #DEFINE __SET_CARRY OFF + #ENDIF + #IFNDEF __SET_CENTURY + #DEFINE __SET_CENTURY ON + #ENDIF + #IFNDEF __SET_CLOCK + #DEFINE __SET_CLOCK STATUS + #ENDIF + #IFNDEF __SET_COLLATE_TO + #DEFINE __SET_COLLATE_TO TO 'MACHINE' + #ENDIF + #IFNDEF __SET_COMPATIBLE + #DEFINE __SET_COMPATIBLE OFF + #ENDIF + #IFNDEF __SET_CONFIRM + #DEFINE __SET_CONFIRM OFF + #ENDIF + #IFNDEF __SET_CPDIALOG + #DEFINE __SET_CPDIALOG ON + #ENDIF + #IFNDEF __SET_CURRENCY + #DEFINE __SET_CURRENCY LEFT + #ENDIF + #IFNDEF __SET_CURRENCY_TO + #DEFINE __SET_CURRENCY_TO TO 'DM' + #ENDIF + #IFNDEF __SET_DATE_TO + #DEFINE __SET_DATE_TO TO GERMAN + #ENDIF + #IFNDEF __SET_DECIMALS_TO + #DEFINE __SET_DECIMALS_TO TO 2 + #ENDIF + #IFNDEF __SET_DELETED + #DEFINE __SET_DELETED ON + #ENDIF + #IFNDEF __SET_DELIMITERS + #DEFINE __SET_DELIMITERS OFF + #ENDIF + #IFNDEF __SET_DEVELOPMENT + #DEFINE __SET_DEVELOPMENT OFF + #ENDIF + #IFNDEF __SET_ECHO + #DEFINE __SET_ECHO OFF + #ENDIF + #IFNDEF __SET_ESCAPE + #DEFINE __SET_ESCAPE ON + #ENDIF + #IFNDEF __SET_EXACT + #DEFINE __SET_EXACT OFF + #ENDIF + #IFNDEF __SET_EXCLUSIVE + #DEFINE __SET_EXCLUSIVE OFF + #ENDIF + #IFNDEF __SET_FDOW_TO + #DEFINE __SET_FDOW_TO TO 2 + #ENDIF + #IFNDEF __SET_FIELDS + #DEFINE __SET_FIELDS OFF + #ENDIF + #IFNDEF __SET_FIXED + #DEFINE __SET_FIXED OFF + #ENDIF + #IFNDEF __SET_FWEEK_TO + #DEFINE __SET_FWEEK_TO TO 2 + #ENDIF + #IFNDEF __SET_HEADINGS + #DEFINE __SET_HEADINGS ON + #ENDIF + #IFNDEF __SET_HOURS_TO + #DEFINE __SET_HOURS_TO TO 24 + #ENDIF + #IFNDEF __SET_KEYCOMP_TO + #DEFINE __SET_KEYCOMP_TO TO WINDOWS + #ENDIF + #IFNDEF __SET_LOGERRORS + #DEFINE __SET_LOGERRORS ON + #ENDIF + #IFNDEF __SET_LOCK + #DEFINE __SET_LOCK OFF + #ENDIF + #IFNDEF __SET_MARK_TO + #DEFINE __SET_MARK_TO TO '.' + #ENDIF + #IFNDEF __SET_MEMOWIDTH_TO + #DEFINE __SET_MEMOWIDTH_TO TO 1024 + #ENDIF + #IFNDEF __SET_MULTILOCKS + #DEFINE __SET_MULTILOCKS ON + #ENDIF + #IFNDEF __SET_NEAR + #DEFINE __SET_NEAR ON + #ENDIF + #IFNDEF __SET_NOTIFY + #DEFINE __SET_NOTIFY ON + #ENDIF + #IFNDEF __SET_NULL + #DEFINE __SET_NULL OFF + #ENDIF + #IFNDEF __SET_OPTIMIZE + #DEFINE __SET_OPTIMIZE ON + #ENDIF + #IFNDEF __SET_ODOMETER_TO + #DEFINE __SET_ODOMETER_TO TO 100 + #ENDIF + #IFNDEF __SET_PALETTE + #DEFINE __SET_PALETTE OFF + #ENDIF + #IFNDEF __SET_POINT_TO + #DEFINE __SET_POINT_TO TO ',' + #ENDIF + #IFNDEF __SET_REFRESH_TO + #DEFINE __SET_REFRESH_TO TO 0,5 + #ENDIF + #IFNDEF __SET_REPROCESS_TO + #DEFINE __SET_REPROCESS_TO TO 0 + #ENDIF + #IFNDEF __SET_SAFETY + #DEFINE __SET_SAFETY OFF + #ENDIF + #IFNDEF __SET_SECONDS + #DEFINE __SET_SECONDS ON + #ENDIF + #IFNDEF __SET_SEPARATOR_TO + #DEFINE __SET_SEPARATOR_TO TO "." + #ENDIF + #IFNDEF __SET_STATUS_BAR + #DEFINE __SET_STATUS_BAR ON + #ENDIF + #IFNDEF __SET_SYSFORMATS + #DEFINE __SET_SYSFORMATS ON + #ENDIF + #IFNDEF __SET_TALK + #DEFINE __SET_TALK OFF + #ENDIF + #IFNDEF __SET_UNIQUE + #DEFINE __SET_UNIQUE OFF + #ENDIF + #IFNDEF LOC_SBE_TRACKINFO_CAPTION + #DEFINE LOC_SBE_TRACKINFO_CAPTION "letzte Änderungen" + #ENDIF + #IFNDEF LOC_SBE_TEXT_CAPTION + #DEFINE LOC_SBE_TEXT_CAPTION "Information" + #ENDIF + + *-------------------------------------------------------------------------------------- + * Menus (menuRightClick) + *-------------------------------------------------------------------------------------- + #IFNDEF LOC_MENURIGHTCLICK_PRINT + #DEFINE LOC_MENURIGHTCLICK_PRINT "\ = Feld ist größer oder gleich" + Chr(13) + ; + "=HEUTE = heutiges Datum" + Chr(13) + ; + "=HEUTE(-10) = vor zehn Tagen" + Chr(13) + ; + "=MONAT = aktueller Monat" + Chr(13) + ; + "=MONAT(-10) = vor zehn Monaten" + #ENDIF + #IFNDEF LOC_PEFILTERCONTROLIO_TYPENUMBER + #DEFINE LOC_PEFILTERCONTROLIO_TYPENUMBER "Nach einer Zahl suchen" + Chr(13) + ; + ", = Nach mehreren Werten gleichzeitig suchen" + Chr(13) + ; + "< = Feld ist kleiner oder gleich" + Chr(13) + ; + "> = Feld ist größer oder gleich" + #ENDIF + #IFNDEF LOC_PEFILTERCONTROLIO_TYPEGENERIC + #DEFINE LOC_PEFILTERCONTROLIO_TYPEGENERIC ; + ", = Nach mehreren Werten gleichzeitig suchen" + #ENDIF + + *-------------------------------------------------------------------------------------- + * pcrSidebarFilter + *-------------------------------------------------------------------------------------- + #IFNDEF LOC_PCRSIDEBARFILTER_CLEAREXTERNAL + #DEFINE LOC_PCRSIDEBARFILTER_CLEAREXTERNAL ; + "Möchten sie den externen Filter auch löschen?" + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_REPLACEFILTER + #DEFINE LOC_PCRSIDEBARFILTER_REPLACEFILTER ; + "Möchten Sie den bestehenden Filter '"+m.tuPar1+"' überschreiben?" + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_DELETEFILTER + #DEFINE LOC_PCRSIDEBARFILTER_DELETEFILTER ; + "Möchten Sie den Filter '"+m.tuPar1+"' löschen?" + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITSNULL + #DEFINE LOC_PCRSIDEBARFILTER_HITSNULL ; + "Bitte geben Sie einen Suchbegriff ein und klicken Sie auf Suchen." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_NOHITSINV + #DEFINE LOC_PCRSIDEBARFILTER_NOHITSINV ; + "Bitte geben Sie einen Suchbegriff ein und klicken sie auf Suchen. Ihre letzte Suchanfrage lieferte kein Ergebnis." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_NOHITS + #DEFINE LOC_PCRSIDEBARFILTER_NOHITS "Ihre Suchanfrage lieferte kein Ergebnis" + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITSONEINV + #DEFINE LOC_PCRSIDEBARFILTER_HITSONEINV ; + "Bitte geben Sie einen Suchbegriff ein und klicken Sie auf Suchen. Ihre letzte Suchanfrage lieferte Treffer in " + m.lcDuration + "." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITSONE + #DEFINE LOC_PCRSIDEBARFILTER_HITSONE ; + "Ein Eintrag gefunden in " + m.lcDuration + "." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITSINV + #DEFINE LOC_PCRSIDEBARFILTER_HITSINV ; + "Bitte geben Sie einen Suchbegriff ein und klicken Sie auf Suchen. Ihre letzte Suchanfrage lieferte " + Alltrim(Str(m.lnHits)) + ; + " Einträge in " + m.lcDuration + "." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITS + #DEFINE LOC_PCRSIDEBARFILTER_HITS ; + Alltrim(Str(m.lnHits)) + " Einträge gefunden in " + m.lcDuration + "." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_BUTTONCLEAR + #DEFINE LOC_PCRSIDEBARFILTER_BUTTONCLEAR "\ = field is equal or larger" + Chr(13) + ; + "=TODAY = current date" + Chr(13) + ; + "=TODAY(-10) = 10 days ago" + Chr(13) + ; + "=MONTH = current month" + Chr(13) + ; + "=Month(-10) = 10 months ago" + #ENDIF + #IFNDEF LOC_PEFILTERCONTROLIO_TYPENUMBER + #DEFINE LOC_PEFILTERCONTROLIO_TYPENUMBER "Search for a number" + Chr(13) + ; + ", = search for multiple alternative values" + Chr(13) + ; + "< = field is less or equal" + Chr(13) + ; + "> = field is equal or larger" + #ENDIF + #IFNDEF LOC_PEFILTERCONTROLIO_TYPEGENERIC + #DEFINE LOC_PEFILTERCONTROLIO_TYPEGENERIC ; + ", = search for multiple alternative values" + #ENDIF + + *-------------------------------------------------------------------------------------- + * pcrSidebarFilter + *-------------------------------------------------------------------------------------- + #IFNDEF LOC_PCRSIDEBARFILTER_CLEAREXTERNAL + #DEFINE LOC_PCRSIDEBARFILTER_CLEAREXTERNAL ; + "Do you want to clear the external filter, as well?" + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_REPLACEFILTER + #DEFINE LOC_PCRSIDEBARFILTER_REPLACEFILTER ; + "Do you want to replace the existing filter '"+m.tuPar1+"'?" + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_DELETEFILTER + #DEFINE LOC_PCRSIDEBARFILTER_DELETEFILTER ; + "Do you want to delete filter '"+m.tuPar1+"'?" + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITSNULL + #DEFINE LOC_PCRSIDEBARFILTER_HITSNULL ; + "Enter a search term and click the Search button." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_NOHITSINV + #DEFINE LOC_PCRSIDEBARFILTER_NOHITSINV ; + "Enter a search term and click the Search button. Your last search did not match any records." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_NOHITS + #DEFINE LOC_PCRSIDEBARFILTER_NOHITS "Your search did not match any records." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITSONEINV + #DEFINE LOC_PCRSIDEBARFILTER_HITSONEINV ; + "Enter a search term and click the Search button. Your last search returned one match " + m.lcDuration + "." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITSONE + #DEFINE LOC_PCRSIDEBARFILTER_HITSONE ; + "Found one matching record in " + m.lcDuration + "." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITSINV + #DEFINE LOC_PCRSIDEBARFILTER_HITSINV ; + "Enter a search term and click the Search button. Your last search returned " + Alltrim(Str(m.lnHits)) + ; + " records in " + m.lcDuration + "." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_HITS + #DEFINE LOC_PCRSIDEBARFILTER_HITS ; + Alltrim(Str(m.lnHits)) + " records found in " + m.lcDuration + "." + #ENDIF + #IFNDEF LOC_PCRSIDEBARFILTER_BUTTONCLEAR + #DEFINE LOC_PCRSIDEBARFILTER_BUTTONCLEAR "C\= "06.00.8492.00") + #DEFINE __VFP6SP4 (__VFP6 and Version(4) >= "06.00.8862.00") + #DEFINE __VFP6SP5 (__VFP6 and Version(4) >= "06.00.8961.00") + + #DEFINE __VFP7 (__VFP6 and Left(Version(4),5) >= "07.00") + #DEFINE __VFP7ONLY (__VFP6 and Left(Version(4),5) == "07.00") + #DEFINE __VFP7SP1 (__VFP7 and Version(4) >= "07.00.0000.9262") + + #DEFINE __VFP8 (__VFP6 and Left(Version(4),5) >= "08.00") + #DEFINE __VFP8ONLY (__VFP6 and Left(Version(4),5) == "08.00") + #DEFINE __VFP8SP1 (__VFP8 and Version(4) >= "08.00.0000.3117") + + #DEFINE __VFP9 (__VFP6 and Left(Version(4),5) >= "09.00") + #DEFINE __VFP9ONLY (__VFP6 and Left(Version(4),5) == "09.00") + + #DEFINE __VFPX5C __VFP5ONLY + #DEFINE __VFPX6C (__VFP5ONLY or __VFP6ONLY) + #DEFINE __VFPX7C (__VFP5ONLY or __VFP6ONLY or __VFP7ONLY) + #DEFINE __VFPX8C (__VFP5ONLY or __VFP6ONLY or __VFP7ONLY or __VFP8ONLY) + + *----------------------------------------------------------------- + * Die nachfolgenden DEFINEs regeln die Konvertierung der Ersatz- + * funktionen von älteren VFP-Produkten. Dadurch daß sie beim + * Kompilieren umbenannt werden, können auch neuere VFP Versionen + * die APPs ausführen, die für die alte Version kompiliert worden + * sind, ohne daß sie einen Fehler liefern, weil angeblich eine + * Funktion nicht gefunden werden können. Diese Funktionen können + * nicht umbenannt werden (noch nicht). + *----------------------------------------------------------------- + #DEFINE GPF_X5C_INT_GETPATHANDNAME x5c_INT_GetPathAndName + #IF __VFP5 + #DEFINE VarType x5c_Vartype + #DEFINE JustFName x5c_JustFName + #DEFINE JustPath x5c_JustPath + #DEFINE JustExt x5c_JustExt + #DEFINE JustStem x5c_JustStem + #DEFINE ForceExt x5c_ForceExt + #DEFINE AddBS x5c_AddBS + #DEFINE StrToFile x5c_StrToFile + #DEFINE FileToStr x5c_FileToStr + #DEFINE NewObject x5c_NewObject + #ENDIF + + *----------------------------------------------------------------- + * Gibt an, in welcher Umgebung wir uns gerade befinden. + * + * __VFPENV_RUNTIME Laufzeitumgebung, die einige Features nicht + * bereitstellt. + * __VFPENV_DEVELOP Entwicklungsumgebung + * + *----------------------------------------------------------------- + #DEFINE __VFPENV_RUNTIME (Version(2) == 0) + #DEFINE __VFPENV_DEVELOP (not Version(2) == 0) + + *----------------------------------------------------------------- + * Fehlernummern in VFP + * (...) Bislang noch nicht komplett + *----------------------------------------------------------------- + #DEFINE ERR_NO_ERROR 0 + #DEFINE ERR_FILE_NOT_FOUND 1 + #DEFINE ERR_FILE_IN_USE 3 + #DEFINE ERR_CONTINUE_WITHOUT_LOCATE 42 + #DEFINE ERR_TYPE_MISMATCH 107 + #DEFINE ERR_RECORD_IN_USE 109 + #DEFINE ERR_USERDEFINED 1098 + #DEFINE ERR_TOO_FEW_ARGUMENTS 1229 + #DEFINE ERR_MISSING_OPERAND 1231 + #DEFINE ERR_DIVISION_BY_ZERO 1307 + #DEFINE ERR_CONNECTIVITY 1526 + #DEFINE ERR_TRIGGER_FAILED 1539 + #DEFINE ERR_FIELD_NO_NULL_VALUES 1581 + #DEFINE ERR_FIELD_VALIDATION_VIOLATED 1582 + #DEFINE ERR_RECORD_VALIDATION_VIOLATED 1583 + #DEFINE ERR_UPDATE_CONFLICT 1585 + #DEFINE ERR_FLOCK_IN_TRANSACTION 1594 + #DEFINE ERR_FILE_ACCESS_DENIED 1705 + #DEFINE ERR_UNIQUENESS_VIOLATED 1884 + #DEFINE ERR_NO_SETFOCUS_IN_VALID 2012 + + *----------------------------------------------------------------- + * Fehlernummern für die LLFF (Low Level File Functions). Diese + * werden durch FERROR() zurückgegeben. + *----------------------------------------------------------------- + #DEFINE FERROR_NO_ERROR 0 + #DEFINE FERROR_FILE_NOT_FOUND 2 + #DEFINE FERROR_TOO_MANY_FILES 4 + #DEFINE FERROR_ACCESS_DENIED 5 + #DEFINE FERROR_INVALID_HANDLE 6 + #DEFINE FERROR_OUT_OF_MEMORY 8 + #DEFINE FERROR_SEEK_ERROR 25 + #DEFINE FERROR_DISK_FULL 29 + #DEFINE FERROR_ERROR_OPEN_FILE 31 + + *----------------------------------------------------------------- + * Parameter für die ZOrder() Methode + *----------------------------------------------------------------- + #DEFINE ZORDER_BRINGTOFRONT 0 + #DEFINE ZORDER_SENDTOBACK 1 + + *----------------------------------------------------------------- + * Datentypen verwendet by TYPE(), VARTYPE(), AFIELDS(), usw. + *----------------------------------------------------------------- + #DEFINE T_CHARACTER "C" + #DEFINE T_NUMERIC "N" + #DEFINE T_DOUBLE "B" + #DEFINE T_DATE "D" + #DEFINE T_DATETIME "T" + #DEFINE T_MEMO "M" + #DEFINE T_GENERAL "G" + #DEFINE T_OBJECT "O" + #DEFINE T_SCREEN "S" + #DEFINE T_LOGICAL "L" + #DEFINE T_CURRENCY "Y" + #DEFINE T_UNDEFINED "U" + #DEFINE T_OPTIONAL "L" + #DEFINE T_INTEGER "I" + #DEFINE T_FLOAT "F" + #DEFINE T_NULL "X" + #DEFINE T_VARCHAR "V" + #DEFINE T_ARRAY "A" + #DEFINE T_COLLECTION "C" + #DEFINE T_VARBINARY "Q" + #DEFINE T_BLOB "W" + #DEFINE T_XML T_CHARACTER+T_OBJECT + + *----------------------------------------------------------------- + * Der Sinn der folgenden Konstanten ist derzeit unklar und Micro- + * soft hat dazu keinerlei Informationen. Sie stammen aus der + * FoxPro.H und waren mit "QueryUnload" dokumentiert. Allerdings + * hat QueryUnload keinen Parameter und ReleaseType angeblich + * andere Werte. + *----------------------------------------------------------------- + #DEFINE FORM_CONTROLMENU 0 + #DEFINE FORM_CODE 1 + #DEFINE APP_WINDOWS 2 + #DEFINE APP_TASKMANAGER 3 + #DEFINE FORM_MDIFORM 4 + + *----------------------------------------------------------------- + * Die Spalten des von AVCXCLASSES() zurückgegebenen Arrays. + *----------------------------------------------------------------- + #DEFINE AVCX_CLASS 1 + #DEFINE AVCX_BASECLASS 2 + #DEFINE AVCX_PARENTCLASS 3 + #DEFINE AVCX_PARENTCLASSLIB 4 + #DEFINE AVCX_CLASSICON 5 + #DEFINE AVCX_CONTAINERICON 6 + #DEFINE AVCX_SCALEMODE 7 + #DEFINE AVCX_CLASSDESCRIPTION 8 + #DEFINE AVCX_INCLUDEFILE 9 + #DEFINE AVCX_USERINFO 10 + #DEFINE AVCX_OLEPUBLIC 11 + + *----------------------------------------------------------------- + * Werte die die zweite Spalte des aCommand Arrays annehmen kann, + * daß an CommandTargetQuery übergeben wird. + *----------------------------------------------------------------- + #DEFINE CMDF_NOTSUPPORTED 0 + #DEFINE CMDF_SUPPORTED 1 + #DEFINE CMDF_ENABLED 2 + #DEFINE CMDF_LATCHED 4 + #DEFINE CMDF_NINCHED 8 + + *----------------------------------------------------------------- + * Werte von nCommandTextFlag (2. Parameter) der Methode + * CommandTargetQuery eines ActiveDocument Objektes. + *----------------------------------------------------------------- + #DEFINE CMDTEXTF_NONE 0 + #DEFINE CMDTEXTF_NAME 1 + #DEFINE CMDTEXTF_STATUS 2 + + *----------------------------------------------------------------- + * nCommandID für das CommandTargetExec Ereignis eines Active + * Documents und auch in der ersten Spalte von CommandTargetQuery + * verwendet. Die gleichen Konstanten werden auch von anderen + * Funktionen und Methoden verwendet, zum Beispiel von ExecWB() + * des Internet Explorers. + *----------------------------------------------------------------- + #DEFINE CMDID_OPEN 1 + #DEFINE CMDID_NEW 2 + #DEFINE CMDID_SAVE 3 + #DEFINE CMDID_SAVEAS 4 + #DEFINE CMDID_SAVECOPYAS 5 + #DEFINE CMDID_PRINT 6 + #DEFINE CMDID_PRINTPREVIEW 7 + #DEFINE CMDID_PAGESETUP 8 + #DEFINE CMDID_SPELL 9 + #DEFINE CMDID_PROPERTIES 10 + #DEFINE CMDID_CUT 11 + #DEFINE CMDID_COPY 12 + #DEFINE CMDID_PASTE 13 + #DEFINE CMDID_PASTESPECIAL 14 + #DEFINE CMDID_UNDO 15 + #DEFINE CMDID_REDO 16 + #DEFINE CMDID_SELECTALL 17 + #DEFINE CMDID_CLEARSELECTION 18 + #DEFINE CMDID_ZOOM 19 + #DEFINE CMDID_GETZOOMRANGE 20 + #DEFINE CMDID_UPDATECOMMANDS 21 + #DEFINE CMDID_REFRESH 22 + #DEFINE CMDID_STOP 23 + #DEFINE CMDID_HIDETOOLBARS 24 + #DEFINE CMDID_SETPROGRESSMAX 25 + #DEFINE CMDID_SETPROGRESSPOS 26 + #DEFINE CMDID_SETPROGRESSTEXT 27 + #DEFINE CMDID_SETTITLE 28 + #DEFINE CMDID_SETDOWNLOADSTATE 29 + #DEFINE CMDID_STOPDOWNLOAD 30 + #DEFINE CMDID_ONTOOLBARACTIVATED 31 + #DEFINE CMDID_ENABLE_INTERACTION 36 + #DEFINE CMDID_ONUNLOAD 37 + + *----------------------------------------------------------------- + * nExecOption (2. Parameter) für das CommandTargetExec Ereignis + * des ActiveDocument Objektes. + *----------------------------------------------------------------- + #DEFINE CMDEXECOPT_DODEFAULT 0 + #DEFINE CMDEXECOPT_PROMPTUSER 1 + #DEFINE CMDEXECOPT_DONTPROMPTUSER 2 + #DEFINE CMDEXECOPT_SHOWHELP 3 + + *----------------------------------------------------------------- + * Rückgabewerte für das CommandTargetExec Ereignis + *----------------------------------------------------------------- + #DEFINE CMD_OK 0 + #DEFINE CMD_NOTSUPPORTED 1 + #DEFINE CMD_DISABLED 2 + #DEFINE CMD_NOHELP 3 + #DEFINE CMD_CANCELED 4 + + *----------------------------------------------------------------- + * nBuildAction (2. Parameter) für die Build() Methode des + * ProjectHook Objektes. + *----------------------------------------------------------------- + #DEFINE BUILDACTION_REBUILD 1 + #DEFINE BUILDACTION_BUILDAPP 2 + #DEFINE BUILDACTION_BUILDEXE 3 + #DEFINE BUILDACTION_BUILDDLL 4 + #DEFINE BUILDACTION_BUILDMTDLL 5 + + *----------------------------------------------------------------- + * SCCStatus Eigenschaft + *----------------------------------------------------------------- + #DEFINE SCCFILE_NOTCONTROLLED 0 + #DEFINE SCCFILE_NOTCHECKEDOUT 1 + #DEFINE SCCFILE_CHECKEDOUTCU 2 + #DEFINE SCCFILE_CHECKEDOUTOU 3 + #DEFINE SCCFILE_MERGECONFLICT 4 + #DEFINE SCCFILE_MERGE 5 + #DEFINE SCCFILE_CHECKEDOUTMU 6 + + *----------------------------------------------------------------- + * Type Eigenschaft des File Objektes + *----------------------------------------------------------------- + #DEFINE FILETYPE_DATABASE "d" + #DEFINE FILETYPE_FREETABLE "D" + #DEFINE FILETYPE_QUERY "Q" + #DEFINE FILETYPE_FORM "K" + #DEFINE FILETYPE_REPORT "R" + #DEFINE FILETYPE_LABEL "B" + #DEFINE FILETYPE_CLASSLIB "V" + #DEFINE FILETYPE_PROGRAM "P" + #DEFINE FILETYPE_APILIB "L" + #DEFINE FILETYPE_APPLICATION "Z" + #DEFINE FILETYPE_MENU "M" + #DEFINE FILETYPE_TEXT "T" + #DEFINE FILETYPE_OTHER "x" + + *----------------------------------------------------------------- + * Instancing Eigenschaft des Server Objektes + *----------------------------------------------------------------- + #DEFINE SERVERINSTANCE_SINGLEUSE 1 + #DEFINE SERVERINSTANCE_NOTCREATABLE 2 + #DEFINE SERVERINSTANCE_MULTIUSE 3 + + *----------------------------------------------------------------- + * OLEDropEffect Eigenschaft + *----------------------------------------------------------------- + #DEFINE DROPEFFECT_NONE 0 + #DEFINE DROPEFFECT_COPY 1 + #DEFINE DROPEFFECT_MOVE 2 + #DEFINE DROPEFFECT_LINK 4 + + *----------------------------------------------------------------- + * OLEDropMode Eigenschaft + *----------------------------------------------------------------- + #DEFINE DROP_DISABLED 0 + #DEFINE DROP_ENABLED 1 + #DEFINE DROP_PASSTOCONTAINER 2 + + *----------------------------------------------------------------- + * OLEDropHasData Eigenschaft + *----------------------------------------------------------------- + #DEFINE DROPHASDATA_VFPDETERMINE -1 + #DEFINE DROPHASDATA_NOTUSEFUL 0 + #DEFINE DROPHASDATA_USEFUL 1 + + *----------------------------------------------------------------- + * Globale Clipboard Formate. + *----------------------------------------------------------------- + #DEFINE CF_TEXT 1 + #DEFINE CF_BITMAP 2 + #DEFINE CF_METAFILEPICT 3 + #DEFINE CF_SYLK 4 + #DEFINE CF_DIF 5 + #DEFINE CF_TIFF 6 + #DEFINE CF_OEMTEXT 7 + #DEFINE CF_DIB 8 + #DEFINE CF_PALETTE 9 + #DEFINE CF_PENDATA 10 + #DEFINE CF_RIFF 11 + #DEFINE CF_WAVE 12 + #DEFINE CF_UNICODETEXT 13 + #DEFINE CF_ENHMETAFILE 14 + #DEFINE CF_FILES 15 + #DEFINE CF_HDROP 15 + #DEFINE CF_LOCALE 16 + #DEFINE CF_MAX 17 + + *----------------------------------------------------------------- + * Sonstige Clipboard Formate + *----------------------------------------------------------------- + #DEFINE CFSTR_HYPERLINK "Hyperlink" + #DEFINE CFSTR_BIFF "Biff" + #DEFINE CFSTR_BIFF3 "Biff3" + #DEFINE CFSTR_BIFF4 "Biff4" + #DEFINE CFSTR_BIFF5 "Biff5" + #DEFINE CFSTR_BIFF7 "Biff7" + #DEFINE CFSTR_BIFF8 "Biff8" + #DEFINE CFSTR_XLTABLE "XlTable" + #DEFINE CFSTR_CSV "CSV" + #DEFINE CFSTR_WK1 "Wk1" + #DEFINE CFSTR_URL "UniformResourceLocator" + #DEFINE CFSTR_RTF "Rich Text Format" + #DEFINE CFSTR_RTFNOOBJS "Rich Text Format Without Objects" + #DEFINE CFSTR_RETEXTOBJ "RichEdit Text and Objects" + + *----------------------------------------------------------------- + * Clipboardformate, die in VFP verwendet werden. + *----------------------------------------------------------------- + #DEFINE CFSTR_OLEVARIANTARRAY "OLE Variant Array" + #DEFINE CFSTR_OLEVARIANT "OLE Variant" + #DEFINE CFSTR_VFPSOURCEOBJECT "VFP Source Object" + + *----------------------------------------------------------------- + * Status (4. Parameter) des DragOver() Ereignisses + *----------------------------------------------------------------- + #DEFINE DRAG_ENTER 0 + #DEFINE DRAG_LEAVE 1 + #DEFINE DRAG_OVER 2 + + *----------------------------------------------------------------- + * Parameter für die Drag() Methode + *----------------------------------------------------------------- + #DEFINE DRAG_CANCEL 0 + #DEFINE DRAG_BEGIN 1 + #DEFINE DRAG_END 2 + + *----------------------------------------------------------------- + * DragMode Eigenschaft + *----------------------------------------------------------------- + #DEFINE DRAG_MANUAL 0 + #DEFINE DRAG_AUTOMATIC 1 + + *----------------------------------------------------------------- + * RGB-Werte der gebräuchlichsten Farben. + *----------------------------------------------------------------- + #DEFINE COLOR_WHITE 16777215 + #DEFINE COLOR_BLACK 0 + #DEFINE COLOR_GRAY 12632256 + #DEFINE COLOR_DARK_GRAY 8421504 + #DEFINE COLOR_RED 255 + #DEFINE COLOR_DARK_BLUE 8388608 + #DEFINE COLOR_CYAN 16776960 + #DEFINE COLOR_DARK_CYAN 8421376 + #DEFINE COLOR_GREEN 65280 + #DEFINE COLOR_DARK_GREEN 32768 + #DEFINE COLOR_YELLOW 65535 + #DEFINE COLOR_DARK_YELLOW 32896 + #DEFINE COLOR_BLUE 16711680 + #DEFINE COLOR_DARK_RED 128 + #DEFINE COLOR_MAGENTA 16711935 + #DEFINE COLOR_DARK_MAGENTA 8388736 + + *----------------------------------------------------------------- + * MousePointer Eigenschaft + *----------------------------------------------------------------- + #DEFINE MOUSE_DEFAULT 0 + #DEFINE MOUSE_ARROW 1 + #DEFINE MOUSE_CROSSHAIR 2 + #DEFINE MOUSE_IBEAM 3 + #DEFINE MOUSE_ICON_POINTER 4 + #DEFINE MOUSE_SIZE_POINTER 5 + #DEFINE MOUSE_SIZE_NE_SW 6 + #DEFINE MOUSE_SIZE_N_S 7 + #DEFINE MOUSE_SIZE_NW_SE 8 + #DEFINE MOUSE_SIZE_W_E 9 + #DEFINE MOUSE_UP_ARROW 10 + #DEFINE MOUSE_HOURGLASS 11 + #DEFINE MOUSE_NO_DROP 12 + #DEFINE MOUSE_HIDE_POINTER 13 + #DEFINE MOUSE_ARROW2 14 + #DEFINE MOUSE_HAND 15 + #DEFINE MOUSE_DOWN_ARROW 16 + #DEFINE MOUSE_MAGNIGLASS 17 + #DEFINE MOUSE_CUSTOM 99 + + *----------------------------------------------------------------- + * ScrollBars Eigenschaft + *----------------------------------------------------------------- + #DEFINE SCROLLBARS_NONE 0 + #DEFINE SCROLLBARS_HORIZONTAL 1 + #DEFINE SCROLLBARS_VERTICAL 2 + #DEFINE SCROLLBARS_BOTH 3 + + *----------------------------------------------------------------- + * DrawMode Eigenschaft + *----------------------------------------------------------------- + #DEFINE DRAWMODE_BLACKNESS 1 && 1 - Blackness + #DEFINE DRAWMODE_NOT_MERGE_PEN 2 && 2 - Not Merge Pen + #DEFINE DRAWMODE_MASK_NOT_PEN 3 && 3 - Mask Not Pen + #DEFINE DRAWMODE_NOT_COPY_PEN 4 && 4 - Not Copy Pen + #DEFINE DRAWMODE_MASK_PEN_NOT 5 && 5 - Mask Pen Not + #DEFINE DRAWMODE_INVERT 6 && 6 - Invert + #DEFINE DRAWMODE_XOR_PEN 7 && 7 - Xor Pen + #DEFINE DRAWMODE_NOT_MASK_PEN 8 && 8 - Not Mask Pen + #DEFINE DRAWMODE_MASK_PEN 9 && 9 - Mask Pen + #DEFINE DRAWMODE_NOT_XOR_PEN 10 && 10 - Not Xor Pen + #DEFINE DRAWMODE_NOP 11 && 11 - Nop + #DEFINE DRAWMODE_MERGE_NOT_PEN 12 && 12 - Merge Not Pen + #DEFINE DRAWMODE_COPY_PEN 13 && 13 - Copy Pen + #DEFINE DRAWMODE_MERGE_PEN_NOT 14 && 14 - Merge Pen Not + #DEFINE DRAWMODE_MERGE_PEN 15 && 15 - Merge Pen + #DEFINE DRAWMODE_WHITENESS 16 && 16 - Whiteness + + *----------------------------------------------------------------- + * DrawStyle Eigenschaft + *----------------------------------------------------------------- + #DEFINE DRAWSTYLE_SOLID 0 && 0 - Solid + #DEFINE DRAWSTYLE_DASH 1 && 1 - Dash + #DEFINE DRAWSTYLE_DOT 2 && 2 - Dot + #DEFINE DRAWSTYLE_DASH_DOT 3 && 3 - Dash-Dot + #DEFINE DRAWSTYLE_DASH_DOT_DOT 4 && 4 - Dash-Dot-Dot + #DEFINE DRAWSTYLE_INVISIBLE 5 && 5 - Invisible + #DEFINE DRAWSTYLE_INSIDE_SOLID 6 && 6 - Inside Solid + + *----------------------------------------------------------------- + * FillStyle Eigenschaft + *----------------------------------------------------------------- + #DEFINE FILLSTYLE_SOLID 0 && 0 - Solid + #DEFINE FILLSTYLE_TRANSPARENT 1 && 1 - Transparent + #DEFINE FILLSTYLE_HORIZONTAL_LINE 2 && 2 - Horizontal Line + #DEFINE FILLSTYLE_VERTICAL_LINE 3 && 3 - Vertical Line + #DEFINE FILLSTYLE_UPWARD_DIAGONAL 4 && 4 - Upward Diagonal + #DEFINE FILLSTYLE_DOWNWARD_DIAGONAL 5 && 5 - Downward Diagonal + #DEFINE FILLSTYLE_CROSS 6 && 6 - Cross + #DEFINE FILLSTYLE_DIAGONAL_CROSS 7 && 7 - Diagonal Cross + + *----------------------------------------------------------------- + * ScaleMode Eigenschaft + *----------------------------------------------------------------- + #DEFINE SCALEMODE_PIXELS 3 && 3 - Pixel + #DEFINE SCALEMODE_FOXELS 0 && 0 - Foxels + + *----------------------------------------------------------------- + * WindowState Eigenschaft + *----------------------------------------------------------------- + #DEFINE WINDOWSTATE_NORMAL 0 + #DEFINE WINDOWSTATE_MINIMIZED 1 + #DEFINE WINDOWSTATE_MAXIMIZED 2 + + *----------------------------------------------------------------- + * BorderStyle Eigenschaft für Formulare + *----------------------------------------------------------------- + #DEFINE BORDER_NONE 0 + #DEFINE BORDER_SINGLE 1 + #DEFINE BORDER_DOUBLE 2 + #DEFINE BORDER_SYSTEM 3 + + *----------------------------------------------------------------- + * DockPosition Eigenschaft + *----------------------------------------------------------------- + #DEFINE TOOL_NOTDOCKED -1 + #DEFINE TOOL_TOP 0 + #DEFINE TOOL_LEFT 1 + #DEFINE TOOL_RIGHT 2 + #DEFINE TOOL_BOTTOM 3 + + *----------------------------------------------------------------- + * Button Parameter für Ereignisse wie MouseDown(), MouseUp(), usw. + *----------------------------------------------------------------- + #DEFINE BUTTON_LEFT 1 + #DEFINE BUTTON_RIGHT 2 + #DEFINE BUTTON_MIDDLE 4 + + *----------------------------------------------------------------- + * Messagebox() Parameter. Aus jedem Block kann jeweils ein Wert + * verwendet und zu den Werten aus den anderen Blöcken addiert + * werden. + *----------------------------------------------------------------- + #DEFINE MB_OK 0 && OK button only + #DEFINE MB_OKCANCEL 1 && OK and Cancel buttons + #DEFINE MB_ABORTRETRYIGNORE 2 && Abort, Retry, and Ignore buttons + #DEFINE MB_YESNOCANCEL 3 && Yes, No, and Cancel buttons + #DEFINE MB_YESNO 4 && Yes and No buttons + #DEFINE MB_RETRYCANCEL 5 && Retry and Cancel buttons + + #DEFINE MB_ICONSTOP 16 && Critical message + #DEFINE MB_ICONQUESTION 32 && Warning query + #DEFINE MB_ICONEXCLAMATION 48 && Warning message + #DEFINE MB_ICONINFORMATION 64 && Information message + + #DEFINE MB_APPLMODAL 0 && Application modal message box + #DEFINE MB_DEFBUTTON1 0 && First button is default + #DEFINE MB_DEFBUTTON2 256 && Second button is default + #DEFINE MB_DEFBUTTON3 512 && Third button is default + #DEFINE MB_SYSTEMMODAL 4096 && System Modal + + *----------------------------------------------------------------- + * Rückgabewerte der MessageBox() Funktion. + *----------------------------------------------------------------- + #DEFINE IDOK 1 && OK button pressed + #DEFINE IDCANCEL 2 && Cancel button pressed + #DEFINE IDABORT 3 && Abort button pressed + #DEFINE IDRETRY 4 && Retry button pressed + #DEFINE IDIGNORE 5 && Ignore button pressed + #DEFINE IDYES 6 && Yes button pressed + #DEFINE IDNO 7 && No button pressed + + *----------------------------------------------------------------- + * Konstanten für den Modus bei FOPEN() und FCREATE() + *----------------------------------------------------------------- + #DEFINE F_READONLY 0 + #DEFINE F_WRITEONLY 1 + #DEFINE F_READWRITE 2 + #DEFINE F_READONLY_UNBUFF 10 + #DEFINE F_WRITEONLY_UNBUFF 11 + #DEFINE F_READWRITE_UNBUFF 12 + + *----------------------------------------------------------------- + * Gültige Parameterwerte für die PrtInfo() Funktion. + *----------------------------------------------------------------- + #DEFINE PRT_ORIENTATION 1 + #DEFINE PRT_PAPERSIZE 2 + #DEFINE PRT_PAPERLENGTH 3 + #DEFINE PRT_PAPERWIDTH 4 + #DEFINE PRT_SCALE 5 + #DEFINE PRT_COPIES 6 + #DEFINE PRT_DEFASOURCE 7 + #DEFINE PRT_PRINTQUAL 8 + #DEFINE PRT_COLOR 9 + #DEFINE PRT_DUPLEX 10 + #DEFINE PRT_YRESOLUTION 11 + #DEFINE PRT_TTOPTION 12 + #DEFINE PRT_COLLATE 13 + + *----------------------------------------------------------------- + * PrtInfo() Rückgabewerte: Papiergrößen + *----------------------------------------------------------------- + #DEFINE PRTPAPER_LETTER 1 && Letter 8 1/2 x 11 in + #DEFINE PRTPAPER_LETTERSMALL 2 && Letter Small 8 1/2 x 11 in + #DEFINE PRTPAPER_TABLOID 3 && Tabloid 11 x 17 in + #DEFINE PRTPAPER_LEDGER 4 && Ledger 17 x 11 in + #DEFINE PRTPAPER_LEGAL 5 && Legal 8 1/2 x 14 in + #DEFINE PRTPAPER_STATEMENT 6 && Statement 5 1/2 x 8 1/2 in + #DEFINE PRTPAPER_EXECUTIVE 7 && Executive 7 1/4 x 10 1/2 in + #DEFINE PRTPAPER_A3 8 && A3 297 x 420 mm + #DEFINE PRTPAPER_A4 9 && A4 210 x 297 mm + #DEFINE PRTPAPER_A4SMALL 10 && A4 Small 210 x 297 mm + #DEFINE PRTPAPER_A5 11 && A5 148 x 210 mm + #DEFINE PRTPAPER_B4 12 && B4 250 x 354 + #DEFINE PRTPAPER_B5 13 && B5 182 x 257 mm + #DEFINE PRTPAPER_FOLIO 14 && Folio 8 1/2 x 13 in + #DEFINE PRTPAPER_QUARTO 15 && Quarto 215 x 275 mm + #DEFINE PRTPAPER_10X14 16 && 10x14 in + #DEFINE PRTPAPER_11X17 17 && 11x17 in + #DEFINE PRTPAPER_NOTE 18 && Note 8 1/2 x 11 in + #DEFINE PRTPAPER_ENV_9 19 && Envelope #9 3 7/8 x 8 7/8 + #DEFINE PRTPAPER_ENV_10 20 && Envelope #10 4 1/8 x 9 1/2 + #DEFINE PRTPAPER_ENV_11 21 && Envelope #11 4 1/2 x 10 3/8 + #DEFINE PRTPAPER_ENV_12 22 && Envelope #12 4 \276 x 11 + #DEFINE PRTPAPER_ENV_14 23 && Envelope #14 5 x 11 1/2 + #DEFINE PRTPAPER_CSHEET 24 && C size sheet + #DEFINE PRTPAPER_DSHEET 25 && D size sheet + #DEFINE PRTPAPER_ESHEET 26 && E size sheet + #DEFINE PRTPAPER_ENV_DL 27 && Envelope DL 110 x 220mm + #DEFINE PRTPAPER_ENV_C5 28 && Envelope C5 162 x 229 mm + #DEFINE PRTPAPER_ENV_C3 29 && Envelope C3 324 x 458 mm + #DEFINE PRTPAPER_ENV_C4 30 && Envelope C4 229 x 324 mm + #DEFINE PRTPAPER_ENV_C6 31 && Envelope C6 114 x 162 mm + #DEFINE PRTPAPER_ENV_C65 32 && Envelope C65 114 x 229 mm + #DEFINE PRTPAPER_ENV_B4 33 && Envelope B4 250 x 353 mm + #DEFINE PRTPAPER_ENV_B5 34 && Envelope B5 176 x 250 mm + #DEFINE PRTPAPER_ENV_B6 35 && Envelope B6 176 x 125 mm + #DEFINE PRTPAPER_ENV_ITALY 36 && Envelope 110 x 230 mm + #DEFINE PRTPAPER_ENV_MONARCH 37 && Envelope Monarch 3.875 x 7.5 in + #DEFINE PRTPAPER_ENV_PERSONAL 38 && 6 3/4 Envelope 3 5/8 x 6 1/2 in + #DEFINE PRTPAPER_FANFOLD_US 39 && US Std Fanfold 14 7/8 x 11 in + #DEFINE PRTPAPER_FANFOLD_STD_GERMAN 40 && German Std Fanfold 8 1/2 x 12 in + #DEFINE PRTPAPER_FANFOLD_LGL_GERMAN 41 && German Legal Fanfold 8 1/2 x 13 in + + *----------------------------------------------------------------- + * PrtInfo() Rückgabewerte: Papierschächte + *----------------------------------------------------------------- + #DEFINE PRTBIN_UPPER 1 + #DEFINE PRTBIN_ONLYONE 1 + #DEFINE PRTBIN_LOWER 2 + #DEFINE PRTBIN_MIDDLE 3 + #DEFINE PRTBIN_MANUAL 4 + #DEFINE PRTBIN_ENVELOPE 5 + #DEFINE PRTBIN_ENVMANUAL 6 + #DEFINE PRTBIN_AUTO 7 + #DEFINE PRTBIN_TRACTOR 8 + #DEFINE PRTBIN_SMALLFMT 9 + #DEFINE PRTBIN_LARGEFMT 10 + #DEFINE PRTBIN_LARGECAPACITY 11 + #DEFINE PRTBIN_CASSETTE 14 + + *----------------------------------------------------------------- + * PrtInfo() Rückgabewerte: Druckqualität + *----------------------------------------------------------------- + #DEFINE PRTRES_DRAFT -1 + #DEFINE PRTRES_LOW -2 + #DEFINE PRTRES_MEDIUM -3 + #DEFINE PRTRES_HIGH -4 + + *----------------------------------------------------------------- + * PrtInfo() Rückgabewerte: Farbdrucker + *----------------------------------------------------------------- + #DEFINE PRTCOLOR_MONOCHROME 1 + #DEFINE PRTCOLOR_COLOR 2 + + *----------------------------------------------------------------- + * PrtInfo() Rückgabewerte: Duplex-Druck + *----------------------------------------------------------------- + #DEFINE PRTDUP_SIMPLEX 1 + #DEFINE PRTDUP_VERTICAL 2 + #DEFINE PRTDUP_HORIZONTAL 3 + + *----------------------------------------------------------------- + * PrtInfo() Rückgabewerte: TrueType Fonts + *----------------------------------------------------------------- + #DEFINE PRTTT_BITMAP 1 + #DEFINE PRTTT_DOWNLOAD 2 + #DEFINE PRTTT_SUBDEV 3 + + *----------------------------------------------------------------- + * Parameter für die FontMetric() Funktion. + *----------------------------------------------------------------- + #DEFINE TM_HEIGHT 1 + #DEFINE TM_ASCENT 2 + #DEFINE TM_DESCENT 3 + #DEFINE TM_INTERNALLEADING 4 + #DEFINE TM_EXTERNALLEADING 5 + #DEFINE TM_AVECHARWIDTH 6 + #DEFINE TM_MAXCHARWIDTH 7 + #DEFINE TM_WEIGHT 8 + #DEFINE TM_ITALIC 9 + #DEFINE TM_UNDERLINED 10 + #DEFINE TM_STRUCKOUT 11 + #DEFINE TM_FIRSTCHAR 12 + #DEFINE TM_LASTCHAR 13 + #DEFINE TM_DEFAULTCHAR 14 + #DEFINE TM_BREAKCHAR 15 + #DEFINE TM_PITCHANDFAMILY 16 + #DEFINE TM_CHARSET 17 + #DEFINE TM_OVERHANG 18 + #DEFINE TM_ASPECTX 19 + #DEFINE TM_ASPECTY 20 + + *----------------------------------------------------------------- + * Parameter für die SysMetric() Funktion + *----------------------------------------------------------------- + #DEFINE SYSMETRIC_SCREENWIDTH 1 && Screen width + #DEFINE SYSMETRIC_SCREENHEIGHT 2 && Screen width + #DEFINE SYSMETRIC_SIZINGBORDERWIDTH 3 + #DEFINE SYSMETRIC_SIZINGBORDERHEIGHT 4 + #DEFINE SYSMETRIC_VSCROLLBARWIDTH 5 + #DEFINE SYSMETRIC_VSCROLLBARHEIGHT 6 + #DEFINE SYSMETRIC_HSCROLLBARWIDTH 7 + #DEFINE SYSMETRIC_HSCROLLBARHEIGHT 8 + #DEFINE SYSMETRIC_WINDOWTITLEHEIGHT 9 + #DEFINE SYSMETRIC_WINDOWBORDERWIDTH 10 + #DEFINE SYSMETRIC_WINDOWBORDERHEIGHT 11 + #DEFINE SYSMETRIC_WINDOWFRAMEWIDTH 12 + #DEFINE SYSMETRIC_WINDOWFRAMEHEIGHT 13 + #DEFINE SYSMETRIC_THUMBBOXWIDTH 14 + #DEFINE SYSMETRIC_THUMBBOXHEIGHT 15 + #DEFINE SYSMETRIC_ICONWIDTH 16 + #DEFINE SYSMETRIC_ICONHEIGHT 17 + #DEFINE SYSMETRIC_CURSORWIDTH 18 + #DEFINE SYSMETRIC_CURSORHEIGHT 19 + #DEFINE SYSMETRIC_MENUBAR 20 + #DEFINE SYSMETRIC_CLIENTWIDTH 21 + #DEFINE SYSMETRIC_CLIENTHEIGHT 22 + #DEFINE SYSMETRIC_KANJIWINHEIGHT 23 + #DEFINE SYSMETRIC_MINDRAGWIDTH 24 + #DEFINE SYSMETRIC_MINDRAGHEIGHT 25 + #DEFINE SYSMETRIC_MINWINDOWWIDTH 26 + #DEFINE SYSMETRIC_MINWINDOWHEIGHT 27 + #DEFINE SYSMETRIC_TITLEBARBUTTONWIDTH 28 + #DEFINE SYSMETRIC_TITLEBARBUTTONHEIGHT 29 + #DEFINE SYSMETRIC_MOUSEPRESENT 30 + #DEFINE SYSMETRIC_DEBUGVERSION 31 + #DEFINE SYSMETRIC_MOUSEBUTTONSWAP 32 + #DEFINE SYSMETRIC_HALFHEIGHTBUTTONWIDTH 33 + #DEFINE SYSMETRIC_HALFHEIGHTBUTTONHEIGHT 34 + + *----------------------------------------------------------------- + * Konstanten für die Windows API Funktion GetSysMetric() + *----------------------------------------------------------------- + #DEFINE SM_CXSCREEN 0 + #DEFINE SM_CYSCREEN 1 + #DEFINE SM_CXVSCROLL 2 + #DEFINE SM_CYHSCROLL 3 + #DEFINE SM_CYCAPTION 4 + #DEFINE SM_CXBORDER 5 + #DEFINE SM_CYBORDER 6 + #DEFINE SM_CXDLGFRAME 7 + #DEFINE SM_CYDLGFRAME 8 + #DEFINE SM_CYVTHUMB 9 + #DEFINE SM_CXHTHUMB 10 + #DEFINE SM_CXICON 11 + #DEFINE SM_CYICON 12 + #DEFINE SM_CXCURSOR 13 + #DEFINE SM_CYCURSOR 14 + #DEFINE SM_CYMENU 15 + #DEFINE SM_CXFULLSCREEN 16 + #DEFINE SM_CYFULLSCREEN 17 + #DEFINE SM_CYKANJIWINDOW 18 + #DEFINE SM_MOUSEPRESENT 19 + #DEFINE SM_CYVSCROLL 20 + #DEFINE SM_CXHSCROLL 21 + #DEFINE SM_DEBUG 22 + #DEFINE SM_SWAPBUTTON 23 + #DEFINE SM_RESERVED1 24 + #DEFINE SM_RESERVED2 25 + #DEFINE SM_RESERVED3 26 + #DEFINE SM_RESERVED4 27 + #DEFINE SM_CXMIN 28 + #DEFINE SM_CYMIN 29 + #DEFINE SM_CXSIZE 30 + #DEFINE SM_CYSIZE 31 + #DEFINE SM_CXFRAME 32 + #DEFINE SM_CYFRAME 33 + #DEFINE SM_CXMINTRACK 34 + #DEFINE SM_CYMINTRACK 35 + #DEFINE SM_CMETRICS 36 + + *----------------------------------------------------------------- + * Buffermodi die von CursorSetProp() und CursorGetProp() bei der + * Eigenschaft "Buffering" verwendet werden. + *----------------------------------------------------------------- + #DEFINE DB_BUFOFF 1 + #DEFINE DB_BUFLOCKRECORD 2 + #DEFINE DB_BUFOPTRECORD 3 + #DEFINE DB_BUFLOCKTABLE 4 + #DEFINE DB_BUFOPTTABLE 5 + + *----------------------------------------------------------------- + * Werte für die "UpdateType" Eigenschaft der Funktionen + * DBSetProp(), DBGetProp(), CursorSetProp() und CursorGetProp(). + *----------------------------------------------------------------- + #DEFINE DB_UPDATE 1 + #DEFINE DB_DELETEINSERT 2 + + *----------------------------------------------------------------- + * Werte für die "WhereType" Eigenschaft der Funktionen + * DBSetProp(), DBGetProp(), CursorSetProp() und CursorGetProp(). + *----------------------------------------------------------------- + #DEFINE DB_KEY 1 + #DEFINE DB_KEYANDUPDATABLE 2 + #DEFINE DB_KEYANDMODIFIED 3 + #DEFINE DB_KEYANDTIMESTAMP 4 + + *----------------------------------------------------------------- + * Werte für die "DispLogin" Eigenschaft der Funktionen DBSetProp() + * und DBGetProp(). + *----------------------------------------------------------------- + #DEFINE DB_PROMPTCOMPLETE 1 + #DEFINE DB_PROMPTALWAYS 2 + #DEFINE DB_PROMPTNEVER 3 + + *----------------------------------------------------------------- + * Werte für die Eigenschaft "Transactions" der Funktionen + * DBSetProp() und DBGetProp(). + *----------------------------------------------------------------- + #DEFINE DB_TRANSAUTO 1 + #DEFINE DB_TRANSMANUAL 2 + + *----------------------------------------------------------------- + * Werte für die Eigenschaft "SourceType" der Funktion + * CursorGetprop(). + *----------------------------------------------------------------- + #DEFINE DB_SRCLOCALVIEW 1 + #DEFINE DB_SRCREMOTEVIEW 2 + #DEFINE DB_SRCTABLE 3 + + *----------------------------------------------------------------- + * Sprach ID (Language ID) + * + * Die Sprach-ID ist ein 16 bit Wert, der eine Kombination der + * primären Sprach-ID und der sekundären Sprach-ID beinhaltet. + * Die primäre SPrach-ID gibt die eigentliche Sprache an, die se- + * kundäre ID gibt Unterarten der gleichen Sprache an. Die Bits in + * diesem 16-Bit Wert sind wie folgt belegt: + * + * +-----------------------+-------------------------+ + * | Sublanguage ID | Primary Language ID | + * +-----------------------+-------------------------+ + * 15 10 9 0 bit + * + * Die folgenden Kombinationen aus primärer Sprach-ID und sekun- + * därer Sprach-ID haben spezielle Bedeutungen: + * + * Primary Lang ID Sublanguage ID Result + * --------------- --------------- ----------------------- + * LANG_NEUTRAL SUBLANG_NEUTRAL Language neutral + * LANG_NEUTRAL SUBLANG_DEFAULT User default language + * LANG_NEUTRAL SUBLANG_SYS_DEFAULT System default language + * + * Um eine Sprach-ID zu erhalten, müssen jeweils die primäre + * Sprach-ID und die sekundäre Sprach-ID bitweise UND verknüpft + * werden. Dies kann in VFP durch eine Addition der beiden Werte + * erfolgen. + *----------------------------------------------------------------- + + *----------------------------------------------------------------- + * Primäre Sprach-IDs. + *----------------------------------------------------------------- + #DEFINE LANG_NEUTRAL 0x00 + #DEFINE LANG_AFRIKAANS 0x36 + #DEFINE LANG_ALBANIAN 0x1c + #DEFINE LANG_ARABIC 0x01 + #DEFINE LANG_BASQUE 0x2d + #DEFINE LANG_BELARUSIAN 0x23 + #DEFINE LANG_BULGARIAN 0x02 + #DEFINE LANG_CATALAN 0x03 + #DEFINE LANG_CHINESE 0x04 + #DEFINE LANG_CROATIAN 0x1a + #DEFINE LANG_CZECH 0x05 + #DEFINE LANG_DANISH 0x06 + #DEFINE LANG_DUTCH 0x13 + #DEFINE LANG_ENGLISH 0x09 + #DEFINE LANG_ESTONIAN 0x25 + #DEFINE LANG_FAEROESE 0x38 + #DEFINE LANG_FARSI 0x29 + #DEFINE LANG_FINNISH 0x0b + #DEFINE LANG_FRENCH 0x0c + #DEFINE LANG_GERMAN 0x07 + #DEFINE LANG_GREEK 0x08 + #DEFINE LANG_HEBREW 0x0d + #DEFINE LANG_HUNGARIAN 0x0e + #DEFINE LANG_ICELANDIC 0x0f + #DEFINE LANG_INDONESIAN 0x21 + #DEFINE LANG_ITALIAN 0x10 + #DEFINE LANG_JAPANESE 0x11 + #DEFINE LANG_KOREAN 0x12 + #DEFINE LANG_LATVIAN 0x26 + #DEFINE LANG_LITHUANIAN 0x27 + #DEFINE LANG_NORWEGIAN 0x14 + #DEFINE LANG_POLISH 0x15 + #DEFINE LANG_PORTUGUESE 0x16 + #DEFINE LANG_ROMANIAN 0x18 + #DEFINE LANG_RUSSIAN 0x19 + #DEFINE LANG_SERBIAN 0x1a + #DEFINE LANG_SLOVAK 0x1b + #DEFINE LANG_SLOVENIAN 0x24 + #DEFINE LANG_SPANISH 0x0a + #DEFINE LANG_SWEDISH 0x1d + #DEFINE LANG_THAI 0x1e + #DEFINE LANG_TURKISH 0x1f + #DEFINE LANG_UKRAINIAN 0x22 + #DEFINE LANG_VIETNAMESE 0x2a + + *----------------------------------------------------------------- + * Sekundäre Sprach-ID. + * + * Der Name, der direkt hinter SUBLANG_ folgt, bestimmt, welche + * primäre Sprach-ID mit dieser sekundären Sprach-ID kombiniert + * werden kann, um eine gültige Sprach-ID zu erhalten. + *----------------------------------------------------------------- + #DEFINE SUBLANG_NEUTRAL 0x0000 + #DEFINE SUBLANG_DEFAULT 0x0400 + #DEFINE SUBLANG_SYS_DEFAULT 0x0800 + #DEFINE SUBLANG_ARABIC_SAUDI_ARABIA 0x0400 + #DEFINE SUBLANG_ARABIC_IRAQ 0x0800 + #DEFINE SUBLANG_ARABIC_EGYPT 0x0C00 + #DEFINE SUBLANG_ARABIC_LIBYA 0x1000 + #DEFINE SUBLANG_ARABIC_ALGERIA 0x1400 + #DEFINE SUBLANG_ARABIC_MOROCCO 0x1800 + #DEFINE SUBLANG_ARABIC_TUNISIA 0x1C00 + #DEFINE SUBLANG_ARABIC_OMAN 0x2000 + #DEFINE SUBLANG_ARABIC_YEMEN 0x2400 + #DEFINE SUBLANG_ARABIC_SYRIA 0x2800 + #DEFINE SUBLANG_ARABIC_JORDAN 0x2C00 + #DEFINE SUBLANG_ARABIC_LEBANON 0x3000 + #DEFINE SUBLANG_ARABIC_KUWAIT 0x3400 + #DEFINE SUBLANG_ARABIC_UAE 0x3800 + #DEFINE SUBLANG_ARABIC_BAHRAIN 0x3C00 + #DEFINE SUBLANG_ARABIC_QATAR 0x4000 + #DEFINE SUBLANG_CHINESE_TRADITIONAL 0x0400 + #DEFINE SUBLANG_CHINESE_SIMPLIFIED 0x0800 + #DEFINE SUBLANG_CHINESE_HONGKONG 0x0C00 + #DEFINE SUBLANG_CHINESE_SINGAPORE 0x1000 + #DEFINE SUBLANG_DUTCH 0x0400 + #DEFINE SUBLANG_DUTCH_BELGIAN 0x0800 + #DEFINE SUBLANG_ENGLISH_US 0x0400 + #DEFINE SUBLANG_ENGLISH_UK 0x0800 + #DEFINE SUBLANG_ENGLISH_AUS 0x0C00 + #DEFINE SUBLANG_ENGLISH_CAN 0x1000 + #DEFINE SUBLANG_ENGLISH_NZ 0x1400 + #DEFINE SUBLANG_ENGLISH_EIRE 0x1800 + #DEFINE SUBLANG_ENGLISH_SOUTH_AFRICA 0x1C00 + #DEFINE SUBLANG_ENGLISH_JAMAICA 0x2000 + #DEFINE SUBLANG_ENGLISH_CARIBBEAN 0x2400 + #DEFINE SUBLANG_ENGLISH_BELIZE 0x2800 + #DEFINE SUBLANG_ENGLISH_TRINIDAD 0x2C00 + #DEFINE SUBLANG_FRENCH 0x0400 + #DEFINE SUBLANG_FRENCH_BELGIAN 0x0800 + #DEFINE SUBLANG_FRENCH_CANADIAN 0x0C00 + #DEFINE SUBLANG_FRENCH_SWISS 0x1000 + #DEFINE SUBLANG_FRENCH_LUXEMBOURG 0x1400 + #DEFINE SUBLANG_GERMAN 0x0400 + #DEFINE SUBLANG_GERMAN_SWISS 0x0800 + #DEFINE SUBLANG_GERMAN_AUSTRIAN 0x0C00 + #DEFINE SUBLANG_GERMAN_LUXEMBOURG 0x1000 + #DEFINE SUBLANG_GERMAN_LIECHTENSTEIN 0x1400 + #DEFINE SUBLANG_ITALIAN 0x0400 + #DEFINE SUBLANG_ITALIAN_SWISS 0x0800 + #DEFINE SUBLANG_KOREAN 0x0400 + #DEFINE SUBLANG_KOREAN_JOHAB 0x0800 + #DEFINE SUBLANG_NORWEGIAN_BOKMAL 0x0400 + #DEFINE SUBLANG_NORWEGIAN_NYNORSK 0x0800 + #DEFINE SUBLANG_PORTUGUESE 0x0800 + #DEFINE SUBLANG_PORTUGUESE_BRAZILIAN 0x0400 + #DEFINE SUBLANG_SERBIAN_LATIN 0x0800 + #DEFINE SUBLANG_SERBIAN_CYRILLIC 0x0C00 + #DEFINE SUBLANG_SPANISH 0x0400 + #DEFINE SUBLANG_SPANISH_MEXICAN 0x0800 + #DEFINE SUBLANG_SPANISH_MODERN 0x0C00 + #DEFINE SUBLANG_SPANISH_GUATEMALA 0x1000 + #DEFINE SUBLANG_SPANISH_COSTA_RICA 0x1400 + #DEFINE SUBLANG_SPANISH_PANAMA 0x1800 + #DEFINE SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x1C00 + #DEFINE SUBLANG_SPANISH_VENEZUELA 0x2000 + #DEFINE SUBLANG_SPANISH_COLOMBIA 0x2400 + #DEFINE SUBLANG_SPANISH_PERU 0x2800 + #DEFINE SUBLANG_SPANISH_ARGENTINA 0x2C00 + #DEFINE SUBLANG_SPANISH_ECUADOR 0x3000 + #DEFINE SUBLANG_SPANISH_CHILE 0x3400 + #DEFINE SUBLANG_SPANISH_URUGUAY 0x3800 + #DEFINE SUBLANG_SPANISH_PARAGUAY 0x3C00 + #DEFINE SUBLANG_SPANISH_BOLIVIA 0x4000 + #DEFINE SUBLANG_SPANISH_EL_SALVADOR 0x4400 + #DEFINE SUBLANG_SPANISH_HONDURAS 0x4800 + #DEFINE SUBLANG_SPANISH_NICARAGUA 0x4C00 + #DEFINE SUBLANG_SPANISH_PUERTO_RICO 0x5000 + #DEFINE SUBLANG_SWEDISH 0x0400 + #DEFINE SUBLANG_SWEDISH_FINLAND 0x0800 + + *----------------------------------------------------------------- + * Visual FoxPro Systemkapazitäten + * + * Anmerkung: Es gibt keine Dokumentation darüber, wie viele Data- + * Sessions tatsächlich zur Verfügung stehen. + * + *----------------------------------------------------------------- + #DEFINE CAPACITY_MAX_DATASESSIONS 32768 + #DEFINE CAPACITY_MAX_ARRAYELEMENTS 65000 + #IF __VFP5 + #DEFINE CAPACITY_MAX_MEMOWIDTH 1024 + #ELSE + #DEFINE CAPACITY_MAX_MEMOWIDTH 8192 + #ENDIF + #DEFINE CAPACITY_MAX_TXNLEVEL 5 + #DEFINE CAPACITY_MAX_PRGLEVEL 128 + + *----------------------------------------------------------------- + * Misc constants + *----------------------------------------------------------------- + #DEFINE DEFAULT_DATASESSION 1 + #DEFINE SELECT_NEW_WORKAREA 0 + + *----------------------------------------------------------------- + * Array columns for AFIELDS() + *----------------------------------------------------------------- + #DEFINE AFIELDS_Name 1 + #DEFINE AFIELDS_Type 2 + #DEFINE AFIELDS_Width 3 + #DEFINE AFIELDS_Decimals 4 + #DEFINE AFIELDS_Null 5 + #DEFINE AFIELDS_NoCPTrans 6 + #DEFINE AFIELDS_FieldValidExpr 7 + #DEFINE AFIELDS_FieldValidText 8 + #DEFINE AFIELDS_DefaultValue 9 + #DEFINE AFIELDS_TableValidExpr 10 + #DEFINE AFIELDS_TableValidText 11 + #DEFINE AFIELDS_LongName 12 + #DEFINE AFIELDS_InsertTrigger 13 + #DEFINE AFIELDS_UpdateTrigger 14 + #DEFINE AFIELDS_DeleteTrigger 15 + #DEFINE AFIELDS_TableComment 16 + #DEFINE AFIELDS_ArraySize 16 + + *----------------------------------------------------------------- + * Constants for the third parameter of PEMSTATUS() + *----------------------------------------------------------------- + #DEFINE PEM_CHANGED 0 + #DEFINE PEM_READONLY 1 + #DEFINE PEM_PROTECTED 2 + #DEFINE PEM_TYPE 3 + #DEFINE PEM_USER_DEFINED 4 + #DEFINE PEM_EXIST 5 + #DEFINE PEM_INHERITED 6 + + *----------------------------------------------------------------- + * All possible key strokes as the are coded by INKEY() and are + * used in the KeyPress event. + * (...) noch nicht vollständig + *----------------------------------------------------------------- + #DEFINE KEY_0 48 + #DEFINE KEY_1 49 + #DEFINE KEY_2 50 + #DEFINE KEY_3 51 + #DEFINE KEY_4 52 + #DEFINE KEY_5 53 + #DEFINE KEY_6 54 + #DEFINE KEY_7 55 + #DEFINE KEY_8 56 + #DEFINE KEY_9 57 + #DEFINE KEY_A 97 + #DEFINE KEY_B 98 + #DEFINE KEY_BACKSPACE 127 + #DEFINE KEY_C 99 + #DEFINE KEY_COMMA 44 + #DEFINE KEY_D 100 + #DEFINE KEY_DEL 7 + #DEFINE KEY_DOWNARROW 24 + #DEFINE KEY_E 101 + #DEFINE KEY_ENTER 13 + #DEFINE KEY_F 102 + #DEFINE KEY_G 103 + #DEFINE KEY_H 104 + #DEFINE KEY_I 105 + #DEFINE KEY_INS 22 + #DEFINE KEY_J 106 + #DEFINE KEY_K 107 + #DEFINE KEY_L 108 + #DEFINE KEY_M 109 + #DEFINE KEY_N 110 + #DEFINE KEY_O 111 + #DEFINE KEY_P 112 + #DEFINE KEY_POINT 46 + #DEFINE KEY_Q 113 + #DEFINE KEY_R 114 + #DEFINE KEY_S 115 + #DEFINE KEY_SPACEBAR 32 + #DEFINE KEY_T 116 + #DEFINE KEY_U 117 + #DEFINE KEY_UPARROW 5 + #DEFINE KEY_V 118 + #DEFINE KEY_W 119 + #DEFINE KEY_X 120 + #DEFINE KEY_Y 121 + #DEFINE KEY_Z 122 + + *----------------------------------------------------------------- + * All possible combinations for the nShiftAltCtrl parameter in the + * Keypress event. + * (...) noch nicht vollständig + *----------------------------------------------------------------- + #DEFINE KEY_SAC_NONE 0 + + *----------------------------------------------------------------- + * Werte für den dritten Parameter von AMEMBERS(). + *----------------------------------------------------------------- + #DEFINE AMEMBERS_ALLPEMS 1 + #DEFINE AMEMBERS_OBJECTS 2 + + *----------------------------------------------------------------- + * Werte für den zweiten Parameter der Funktion ALEN() + *----------------------------------------------------------------- + #DEFINE ALEN_LINES 1 + #DEFINE ALEN_ROWS 1 + #DEFINE ALEN_COLS 2 + + *----------------------------------------------------------------- + * BackStyle property + *----------------------------------------------------------------- + #DEFINE BACKSTYLE_TRANSPARENT 0 + #DEFINE BACKSTYLE_OPAQUE 1 + + *----------------------------------------------------------------- + * Konstanten für alle SYS() Funktionen. Bitte lesen Sie die Hilfe + * zu den einzelnen Konstanten, um nähere Informationen zu erhal- + * ten. Die folgenden SYS() Funktionen sind undokumentiert. Die + * hier gebotene Erklärung hat keinen Anspruch auf Richtigkeit: + * + * SYS_DIALOGRESOURCES + * + * Zeigt alle Dialogresourcen in VFP an. Diese Dialoge sind funk- + * tionslos. Der zweite (numerische) Parameter gibt an, welche + * Resource angezeigt werden soll. Sie können die Pfeiltasten + * verwenden, um durch die Resourcen zu blättern. + * + * SYS_MEMORYHANDLESINUSE + * + * Gibt die Anzahl der von Visual FoxPro angeforderten Memory- + * handles zurück. Wenn diese Zahl zwar steigt, aber nach Ab- + * schluß einer Funktion nicht mehr sinkt, liegt ein Speicherleck + * vor. + * + * SYS_MEMORYAVAILABLE + * + * Gibt in Bytes den Speicher zurück, der für Visual FoxPro noch + * zur Verfügung steht. In etwa gilt die folgende Gleichung: + * + * SYS_VFPMEMORY = SYS_MEMORYINUSE + SYS_MEMORYAVAILABLE + * + *----------------------------------------------------------------- + #DEFINE SYS_MACHINE_USER 0 + #DEFINE SYS_JULIANSYSTEMDATE 1 + #DEFINE SYS_SECONDS 2 + #DEFINE SYS_FILENAME 3 + #DEFINE SYS_DEFAULTDRIVE 5 + #DEFINE SYS_SETPRINTERTO 6 + #DEFINE SYS_SETFORMAT 7 + #DEFINE SYS_PRODUCTID 9 + #DEFINE SYS_JULIANTODATE 10 + #DEFINE SYS_DATETOJULIAN 11 + #DEFINE SYS_MEMORY 12 + #DEFINE SYS_PRINTSTATUS 13 + #DEFINE SYS_KEY 14 + #DEFINE SYS_CHARTRANSLATE 15 + #DEFINE SYS_PROGRAM 16 + #DEFINE SYS_CPU 17 + #DEFINE SYS_VARREAD 18 + #DEFINE SYS_TRANSLATEGERMAN 20 + #DEFINE SYS_MASTERINDEX 21 + #DEFINE SYS_MASTERTAG 22 + #DEFINE SYS_EMSUSAGE 23 + #DEFINE SYS_EMSLIMIT 24 + #DEFINE SYS_SETCONSOLE 100 + #DEFINE SYS_SETDEVICE 101 + #DEFINE SYS_SETPRINTER 102 + #DEFINE SYS_SETTALK 103 + #DEFINE SYS_DIALOGRESOURCES 999 + #DEFINE SYS_VFPMEMORY 1001 + #DEFINE SYS_MEMORYHANDLESINUSE 1011 + #DEFINE SYS_MEMORYAVAILABLE 1013 + #DEFINE SYS_MEMORYINUSE 1016 + #DEFINE SYS_HELPDIAGNOSTICON 1023 + #DEFINE SYS_HELPDIAGNOSTICOFF 1024 + #DEFINE SYS_PAGESETUP 1037 + #DEFINE SYS_PROPERTYINFO 1269 + #DEFINE SYS_OBJECTREFERENCE 1270 + #DEFINE SYS_OBJECTSCXFILE 1271 + #DEFINE SYS_OBJECTHIERARCHY 1272 + #DEFINE SYS_DOMENU 1500 + #DEFINE SYS_FILESEARCH 2000 + #DEFINE SYS_SET 2001 + #DEFINE SYS_SETCURSOR 2002 + #DEFINE SYS_CURDIR 2003 + #DEFINE SYS_HOME 2004 + #DEFINE SYS_SETRESOURCE 2005 + #DEFINE SYS_VIDEO 2006 + #DEFINE SYS_CHECKSUM 2007 + #DEFINE SYS_FILES 2010 + #DEFINE SYS_LOCKSTATUS 2011 + #DEFINE SYS_BLOCKSIZE 2012 + #DEFINE SYS_SYSMENU 2013 + #DEFINE SYS_MINIMUMPATH 2014 + #DEFINE SYS_RANDOMPROCNAME 2015 + #DEFINE SYS_SHOWGETSWINDOW 2016 + #DEFINE SYS_DISPLAYSIGNONSCREEN 2017 + #DEFINE SYS_ERRORPARAMETER 2018 + #DEFINE SYS_CONFIGFPW 2019 + #DEFINE SYS_DISKSIZE 2020 + #DEFINE SYS_INDEXFILTER 2021 + #DEFINE SYS_CLUSTERSIZE 2022 + #DEFINE SYS_TEMPPATH 2023 + #DEFINE SYS_TABLETYPE 2029 + #DEFINE SYS_VTABLEBINDING 2333 + #DEFINE SYS_INVOCATIONMODE 2334 + #DEFINE SYS_UNATTENDEDMODE 2335 + #DEFINE SYS_GETLOCALEID 3004 + #DEFINE SYS_SETLOCALEID 3005 + #DEFINE SYS_SETLANGUAGE 3006 + #DEFINE SYS_CACHE 3050 + #DEFINE SYS_LOCKINTERVAL 3051 + #DEFINE SYS_OVERRIDEREPROCESS 3052 + #DEFINE SYS_ODBCHANDLE 3053 + #DEFINE SYS_RUSHMORE 3054 + #DEFINE SYS_WHERECOMPLEXITY 3055 + #DEFINE SYS_READREGISTRY 3056 + #DEFINE SYS_ACTIVEDOCUMENT 4204 + + *----------------------------------------------------------------- + * Zweiter Parameter für SYS(3050), SYS_CACHE + *----------------------------------------------------------------- + #DEFINE SYS_CACHE_FOREGROUND 1 + #DEFINE SYS_CACHE_BACKGROUND 2 + + *----------------------------------------------------------------- + * Set( "Date", 1 ) returns the date format using the following + * constants. + *----------------------------------------------------------------- + #DEFINE SET_DATE1_MDY 0 + #DEFINE SET_DATE1_DMY 1 + #DEFINE SET_DATE1_YMD 2 + + *----------------------------------------------------------------- + * Constants for the DataSession property. + *----------------------------------------------------------------- + #DEFINE DATASESSION_DEFAULT 1 + #DEFINE DATASESSION_PRIVATE 2 + + *----------------------------------------------------------------- + * The second parameter for OBJTOCLIENT() + *----------------------------------------------------------------- + #DEFINE OBJTOCLIENT_TOP 1 + #DEFINE OBJTOCLIENT_LEFT 2 + #DEFINE OBJTOCLIENT_WIDTH 3 + #DEFINE OBJTOCLIENT_HEIGHT 4 + + *----------------------------------------------------------------- + * The BorderStyle property for many objects + *----------------------------------------------------------------- + #DEFINE BORDERSTYLE_TRANSPARENT 0 + #DEFINE BORDERSTYLE_SOLID 1 + #DEFINE BRODERSTYLE_DASH 2 + #DEFINE BORDERSTYLE_DOT 3 + #DEFINE BORDERSTYLE_DASH_DOT 4 + #DEFINE BORDERSTYLE_DASH_DOT_DOT 5 + #DEFINE BORDERSTYLE_INSIDE_SOLID 6 + #DEFINE BORDERSTYLE_DEFAULT BORDERSTYLE_SOLID + + *----------------------------------------------------------------- + * The following define can be used in the Init of objects in order + * to prevent instanciating them. Due to a bug in VFP .F. might not + * be sufficient and the object won't be released. By manually + * firing Destroy(), we can be sure that the object is released + * properly through the CascadingDestroy. In addition, firing + * Destroy() is necessary when the reference tracking feature is + * used. + *----------------------------------------------------------------- + #DEFINE DONTCREATE This.CleanUp() and This.Destroy() and .F. + + *----------------------------------------------------------------- + * Colors for the GetSysColor() API function + *----------------------------------------------------------------- + #DEFINE COLOR_SCROLLBAR 0 + #DEFINE COLOR_BACKGROUND 1 + #DEFINE COLOR_ACTIVECAPTION 2 + #DEFINE COLOR_INACTIVECAPTION 3 + #DEFINE COLOR_MENU 4 + #DEFINE COLOR_WINDOW 5 + #DEFINE COLOR_WINDOWFRAME 6 + #DEFINE COLOR_MENUTEXT 7 + #DEFINE COLOR_WINDOWTEXT 8 + #DEFINE COLOR_CAPTIONTEXT 9 + #DEFINE COLOR_ACTIVEBORDER 10 + #DEFINE COLOR_INACTIVEBORDER 11 + #DEFINE COLOR_APPWORKSPACE 12 + #DEFINE COLOR_HIGHLIGHT 13 + #DEFINE COLOR_HIGHLIGHTTEXT 14 + #DEFINE COLOR_BTNFACE 15 + #DEFINE COLOR_BTNSHADOW 16 + #DEFINE COLOR_GRAYTEXT 17 + #DEFINE COLOR_BTNTEXT 18 + #DEFINE COLOR_INACTIVECAPTIONTEXT 19 + #DEFINE COLOR_BTNHIGHLIGHT 20 + #DEFINE COLOR_3DDKSHADOW 21 + #DEFINE COLOR_3DLIGHT 22 + #DEFINE COLOR_INFOTEXT 23 + #DEFINE COLOR_INFOBK 24 + #DEFINE COLOR_HOTLIGHT 26 + #DEFINE COLOR_GRADIENTACTIVECAPTION 27 + #DEFINE COLOR_GRADIENTINACTIVECAPTION 28 + #DEFINE COLOR_DESKTOP COLOR_BACKGROUND + #DEFINE COLOR_3DFACE COLOR_BTNFACE + #DEFINE COLOR_3DSHADOW COLOR_BTNSHADOW + #DEFINE COLOR_3DHIGHLIGHT COLOR_BTNHIGHLIGHT + #DEFINE COLOR_3DHILIGHT COLOR_BTNHIGHLIGHT + #DEFINE COLOR_BTNHILIGHT COLOR_BTNHIGHLIGHT + + *----------------------------------------------------------------- + * Die möglichen Rückgabewerte für die Funktion GetFldState(). + *----------------------------------------------------------------- + #DEFINE GETFLDSTATE_NOCHANGE 1 + #DEFINE GETFLDSTATE_EDIT 2 + #DEFINE GETFLDSTATE_APPEND 3 + #DEFINE GETFLDSTATE_APPENDEDIT 4 + + *----------------------------------------------------------------- + * GetFldState() kann zwei spezielle Parameter entgegennehmen, die + * nicht einer Feldnummer entsprechen. + *----------------------------------------------------------------- + #DEFINE GETFLDSTATE_DELETECHANGED 0 + #DEFINE GETFLDSTATE_ALLFIELDS -1 + #DEFINE GETFLDSTATE_RECORD_INFO 0 + + *----------------------------------------------------------------- + * Die einzelnen Arrayspalten für AError() + *----------------------------------------------------------------- + #DEFINE AERROR_COLUMNS 7 + #DEFINE AERROR_ERRORCODE 1 + #DEFINE AERROR_MESSAGE 2 + #DEFINE AERROR_PARAMETER 3 + #DEFINE AERROR_NULLFIELD 3 + #DEFINE AERROR_WORKAREA 4 + #DEFINE AERROR_DATASESSION 4 + #DEFINE AERROR_TRIGGER 5 + #DEFINE AERROR_OLE_MESSAGE 3 + #DEFINE AERROR_OLE_APPLICATION 4 + #DEFINE AERROR_OLE_HELPFILE 5 + #DEFINE AERROR_OLE_CONTEXTID 6 + #DEFINE AERROR_OLE_EXCEPTION 7 + #DEFINE AERROR_ODBC_MESSAGE 3 + #DEFINE AERROR_ODBC_SQL_STATE 4 + #DEFINE AERROR_ODBC_ERROR 5 + #DEFINE AERROR_ODBC_CONNECTION_HANDLE 6 + + *-------------------------------------------------------------------------------------- + * Konstanten für AEVENTS() + *-------------------------------------------------------------------------------------- + #DEFINE AEVENTS_SOURCE 0 + #DEFINE AEVENTS_MESSAGES 1 + #DEFINE AEVENTS_WINMSG 1 + + *-------------------------------------------------------------------------------------- + * Konstanten für die vfpCrypt Komponente + *-------------------------------------------------------------------------------------- + *** + *** Algorithm Classes + *** + #DEFINE dnALG_CLASS_ANY 0 + #DEFINE dnALG_CLASS_SIGNATURE BITLSHIFT(1,13) + #DEFINE dnALG_CLASS_MSG_ENCRYPT BITLSHIFT(2,13) + #DEFINE dnALG_CLASS_DATA_ENCRYPT BITLSHIFT(3,13) + #DEFINE dnALG_CLASS_HASH BITLSHIFT(4,13) + #DEFINE dnALG_CLASS_KEY_EXCHANGE BITLSHIFT(5,13) + + *** + *** Algorithm Types + *** + #DEFINE dnALG_TYPE_ANY 0 + #DEFINE dnALG_TYPE_DSS BITLSHIFT(1,9) + #DEFINE dnALG_TYPE_RSA BITLSHIFT(2,9) + #DEFINE dnALG_TYPE_BLOCK BITLSHIFT(3,9) + #DEFINE dnALG_TYPE_STREAM BITLSHIFT(4,9) + + *** + *** Generic Sub-ID + *** + #DEFINE dnALG_SID_ANY 0 + + *** + *** Some RSA sub-ids + *** + #DEFINE dnALG_SID_RSA_ANY 0 + #DEFINE dnALG_SID_RSA_PKCS 1 + #DEFINE dnALG_SID_RSA_MSATWORK 2 + #DEFINE dnALG_SID_RSA_ENTRUST 3 + #DEFINE dnALG_SID_RSA_PGP 4 + + *** + *** Some DSS sub-ids + *** + #DEFINE dnALG_SID_DSS_ANY 0 + #DEFINE dnALG_SID_DSS_PKCS 1 + #DEFINE dnALG_SID_DSS_DMS 2 + + *** + *** Block cipher sub ids + *** DES sub_ids + *** + #DEFINE dnALG_SID_DES 1 + #DEFINE dnALG_SID_3DES 3 + #DEFINE dnALG_SID_DESX 4 + #DEFINE dnALG_SID_IDEA 5 + #DEFINE dnALG_SID_CAST 6 + #DEFINE dnALG_SID_SAFERSK64 7 + #DEFINE dnALD_SID_SAFERSK128 8 + + *** + *** KP_MODE + *** + #DEFINE dnCRYPT_MODE_CBCI 6 && ANSI CBC Interleaved + #DEFINE dnCRYPT_MODE_CFBP 7 && ANSI CFB Pipelined + #DEFINE dnCRYPT_MODE_OFBP 8 && ANSI OFB Pipelined + #DEFINE dnCRYPT_MODE_CBCOFM 9 && ANSI CBC + OF Masking + #DEFINE dnCRYPT_MODE_CBCOFMI 10 && ANSI CBC + OFM Interleaved + + *** + *** RC2 sub-ids + *** + #DEFINE dnALG_SID_RC2 2 + + *** + *** Stream cipher sub-ids + *** + #DEFINE dnALG_SID_RC4 1 + #DEFINE dnALG_SID_SEAL 2 + + *** + *** Hash sub ids + *** + #DEFINE dnALG_SID_MD2 1 + #DEFINE dnALG_SID_MD4 2 + #DEFINE dnALG_SID_MD5 3 + #DEFINE dnALG_SID_SHA 4 + #DEFINE dnALG_SID_MAC 5 + #DEFINE dnALG_SID_RIPEMD 6 + #DEFINE dnALG_SID_RIPEMD160 7 + #DEFINE dnALG_SID_SSL3SHAMD5 8 + + *** + *** algorithm identifier definitions + *** + #DEFINE dnCALG_MD2 BITOR(BITOR(dnALG_CLASS_HASH,dnALG_TYPE_ANY),dnALG_SID_MD2) + #DEFINE dnCALG_MD4 BITOR(BITOR(dnALG_CLASS_HASH,dnALG_TYPE_ANY),dnALG_SID_MD4) + #DEFINE dnCALG_MD5 BITOR(BITOR(dnALG_CLASS_HASH,dnALG_TYPE_ANY),dnALG_SID_MD5) + #DEFINE dnCALG_SHA BITOR(BITOR(dnALG_CLASS_HASH,dnALG_TYPE_ANY),dnALG_SID_SHA) + #DEFINE dnCALG_MAC BITOR(BITOR(dnALG_CLASS_HASH,dnALG_TYPE_ANY),dnALG_SID_MAC) + #DEFINE dnCALG_RSA_SIGN BITOR(BITOR(dnALG_CLASS_SIGNATURE,dnALG_TYPE_RSA),dnALG_SID_RSA_ANY) + #DEFINE dnCALG_DSS_SIGN BITOR(BITOR(dnALG_CLASS_SIGNATURE,dnALG_TYPE_DSS),dnALG_SID_DSS_ANY) + #DEFINE dnCALG_RSA_KEYX BITOR(BITOR(dnALG_CLASS_KEY_EXCHANGE,dnALG_TYPE_RSA),dnALG_SID_RSA_ANY) + #DEFINE dnCALG_DES BITOR(BITOR(dnALG_CLASS_DATA_ENCRYPT,dnALG_TYPE_BLOCK),dnALG_SID_DES) + #DEFINE dnCALG_RC2 BITOR(BITOR(dnALG_CLASS_DATA_ENCRYPT,dnALG_TYPE_BLOCK),dnALG_SID_RC2) + #DEFINE dnCALG_RC4 BITOR(BITOR(dnALG_CLASS_DATA_ENCRYPT,dnALG_TYPE_STREAM),dnALG_SID_RC4) + #DEFINE dnCALG_SEAL BITOR(BITOR(dnALG_CLASS_DATA_ENCRYPT,dnALG_TYPE_STREAM),dnALG_SID_SEAL) + + *** + *** dwFlags definitions for CryptAquireContext + *** + #DEFINE dnCRYPT_VERIFYCONTEXT 0xF0000000 + #DEFINE dnCRYPT_NEWKEYSET 0x8 + #DEFINE dnCRYPT_DELETEKEYSET 0x10 + + *** + *** dwFlag definitions for CryptGenKey + *** + #DEFINE dnCRYPT_EXPORTABLE 0x00000001 + #DEFINE dnCRYPT_USER_PROTECTED 0x00000002 + #DEFINE dnCRYPT_CREATE_SALT 0x00000004 + #DEFINE dnCRYPT_UPDATE_KEY 0x00000008 + + *** + *** exported key blob definitions + *** + #DEFINE dnSIMPLEBLOB 0x1 + #DEFINE dnPUBLICKEYBLOB 0x6 + #DEFINE dnPRIVATEKEYBLOB 0x7 + + #DEFINE dnAT_KEYEXCHANGE 1 + #DEFINE dnAT_SIGNATURE 2 + + #DEFINE dnCRYPT_USERDATA 1 + + *** + *** dwParam + *** + #DEFINE dnKP_IV 1 && Initialization vector + #DEFINE dnKP_SALT 2 && Salt value + #DEFINE dnKP_PADDING 3 && Padding values + #DEFINE dnKP_MODE 4 && Mode of the cipher + #DEFINE dnKP_MODE_BITS 5 && Number of bits to feedback + #DEFINE dnKP_PERMISSIONS 6 && Key permissions DWORD + #DEFINE dnKP_ALGID 7 && Key algorithm + #DEFINE dnKP_BLOCKLEN 8 && Block size of the cipher + + *** + *** KP_PADDING + *** + #DEFINE dnPKCS5_PADDING 1 && PKCS 5 (sec 6.2) padding method + + *** + *** KP_MODE + *** + #DEFINE dnCRYPT_MODE_CBC 1 && Cipher block chaining + #DEFINE dnCRYPT_MODE_ECB 2 && Electronic code book + #DEFINE dnCRYPT_MODE_OFB 3 && Output feedback mode + #DEFINE dnCRYPT_MODE_CFB 4 && Cipher feedback mode + #DEFINE dnCRYPT_MODE_CTS 5 && Ciphertext stealing mode + + *** + *** KP_PERMISSIONS + *** + #DEFINE dnCRYPT_ENCRYPT 0x0001 && Allow encryption + #DEFINE dnCRYPT_DECRYPT 0x0002 && Allow decryption + #DEFINE dnCRYPT_EXPORT 0x0004 && Allow key to be exported + #DEFINE dnCRYPT_READ 0x0008 && Allow parameters to be read + #DEFINE dnCRYPT_WRITE 0x0010 && Allow parameters to be set + #DEFINE dnCRYPT_MAC 0x0020 && Allow MACs to be used with key + + #DEFINE dnHP_ALGID 0x0001 && Hash algorithm + #DEFINE dnHP_HASHVAL 0x0002 && Hash value + #DEFINE dnHP_HASHSIZE 0x0004 && Hash value size + + *** + *** CryptGetProvParam + *** + #DEFINE dnPP_ENUMALGS 1 + #DEFINE dnPP_ENUMCONTAINERS 2 + #DEFINE dnPP_IMPTYPE 3 + #DEFINE dnPP_NAME 4 + #DEFINE dnPP_VERSION 5 + #DEFINE dnPP_CONTAINER 6 + + #DEFINE dnCRYPT_FIRST 1 + #DEFINE dnCRYPT_NEXT 2 + + #DEFINE dnCRYPT_IMPL_HARDWARE 1 + #DEFINE dnCRYPT_IMPL_SOFTWARE 2 + #DEFINE dnCRYPT_IMPL_MIXED 3 + #DEFINE dnCRYPT_IMPL_UNKNOWN 4 + + *** + *** CryptSetProvParam + *** + #DEFINE dnPP_CLIENT_HWND 1 + + #DEFINE dnPROV_RSA_FULL 1 + #DEFINE dnPROV_RSA_SIG 2 + #DEFINE dnPROV_DSS 3 + #DEFINE dnPROV_FORTEZZA 4 + #DEFINE dnPROV_MS_EXCHANGE 5 + #DEFINE dnPROV_SSL 6 + + *** + ***STT defined Providers + *** + #DEFINE dnPROV_STT_MER 7 + #DEFINE dnPROV_STT_ACQ 8 + #DEFINE dnPROV_STT_BRND 9 + #DEFINE dnPROV_STT_ROOT 10 + #DEFINE dnPROV_STT_ISS 11 + + + #DEFINE dsMS_DEF_PROV_A "Microsoft Base Cryptographic Provider v1.0" + + #DEFINE dnMAXUIDLEN 64 + + #DEFINE dnCUR_BLOB_VERSION 2 + + *** Format Message Constants (Part of Window.h) + #DEFINE dnFORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100 + #DEFINE dnFORMAT_MESSAGE_IGNORE_INSERTS 0x00000200 + #DEFINE dnFORMAT_MESSAGE_FROM_STRING 0x00000400 + #DEFINE dnFORMAT_MESSAGE_FROM_HMODULE 0x00000800 + #DEFINE dnFORMAT_MESSAGE_FROM_SYSTEM 0x00001000 + #DEFINE dnFORMAT_MESSAGE_ARGUMENT_ARRAY 0x00002000 + #DEFINE dnFORMAT_MESSAGE_MAX_WIDTH_MASK 0x000000FF + + #DEFINE dcCREATECRYPTKEYS_ERR_LOC 'Cryptographic Service Provider could not be found or'+chr(13)+chr(10)+'Failed to Create Key Container or'+chr(13)+chr(10)+'Failed to Create Keys in CSP Container' + #DEFINE dcB 'B' + #DEFINE dcBR 'BR' + #DEFINE dcCompleted 'Completed' + #DEFINE dcCRYPTINITIALIZE_ERR_LOC 'Crypt Service Provider Failed to Acquire' + #DEFINE dcCRYPTSIGGENKEY_ERR_LOC 'Crypt Service Provider Failed to Create an Signature Key Container' + #DEFINE dcCRYPTSIGGETKEY_ERR_LOC 'Crypt Service Provider Failed to Return an Signature Key Container' + #DEFINE dcCRYPTEXCGENKEY_ERR_LOC 'Crypt Service Provider Failed to Create an Exchange Key Container' + #DEFINE dcCRYPTEXCGETKEY_ERR_LOC 'Crypt Service Provider Failed to Return an Exchange Key Container' + #DEFINE dcCRYPTPROVTYP_ERR_LOC 'Crypt Service Provider Not Installed or Not Found' + #DEFINE dcCRYPTNEWKEYCONTAINER_ERR_LOC 'New Crypt Key Container Could not be Created' + #DEFINE dcCRYPTDELETEKEYCONTAINER_ERR_LOC 'Crypt Key Container Could not be Deleted' + #DEFINE dcCRYPTUSEKEYCONTAINER_ERR_LOC 'Crypt Key Container Could not be Opened for Use' + #DEFINE dcDecryptSessionFileParameter_ERR_LOC 'Must Enter an Encrypted File Name and a Decrypted File Name and'+chr(13)+chr(10)+'a Password'+chr(13)+chr(10)+'in a parameter of this Function' + #DEFINE dcDecryptSessionFileNoFile_ERR_LOC 'Encrypted File Could Not be Opened'+chr(13)+chr(10)+'Please Enter a File that Exists and is Not Already Open' + #DEFINE dcDecryptSessionFileExists_ERR_LOC 'Decrypted File Exists' + chr(13)+chr(10) + 'Do you wish to OverWrite it?' + #DEFINE dcDecryptSessionFileCreate_ERR_LOC 'Decrypted File Could not be Created/Overwritten' + #DEFINE dcDecryptSessionFileWrite_ERR_LOC 'Error Occured During Write of Decryption File' + #DEFINE dcDecryptSessionFileComplete_LOC 'File Decryption Completed' + #DEFINE dcEmpty '' + #DEFINE dcEncryptSessionFileParameter_ERR_LOC 'Must Enter a Decrypted File Name and an Encrypted File Name and'+chr(13)+chr(10)+'a Password'+chr(13)+chr(10)+'in a parameter of this Function' + #DEFINE dcEncryptSessionFileNoFile_ERR_LOC 'Decrypted File Could Not be Opened'+chr(13)+chr(10)+'Please Enter a File that Exists and is Not Already Open' + #DEFINE dcEncryptSessionFileExists_ERR_LOC 'Encrypted File Exists' + chr(13)+chr(10) + 'Do you wish to OverWrite it?' + #DEFINE dcEncryptSessionFileCreate_ERR_LOC 'Encrypted File Could not be Created/Overwritten' + #DEFINE dcEncryptSessionFileWrite_ERR_LOC 'Error Occured During Write of Encryption File' + #DEFINE dcEncryptSessionFileComplete_LOC 'File Encryption Completed' + #DEFINE dcError 'ERROR' + #DEFINE dcErrorCode 'Error Facility - ' + #DEFINE dcErrorFacility 'Error Facility - ' + #DEFINE dcErrorIn 'Error in ' + #DEFINE dcErrorSeverity 'Error Severity - ' + #DEFINE dcErrorSigningData 'Error Signing Data' + #DEFINE dcFileExists 'File Exists' + #DEFINE dcFOXPRO_APP 'FOXPRO_APP' + #DEFINE dcgetcryptsessionkeyhandleparam 'B,S,BR,SR' + #DEFINE dcgetcryptsessionkeyhandleERR_LOC " must be called with parameter picType = 'B' or 'S' or 'BR' or 'SR'" + #DEFINE dcSignFileParamter_ERR_LOC 'Must Enter a Signature Reference, a Decrypted File Name, and'+chr(13)+chr(10)+'a password'+chr(13)+chr(10)+'as a parameter to This Function' + #DEFINE dcSignFileDecryptedFile_ERR_LOC 'Decrypted File Could not be Opened' + #DEFINE dcSignFileHashObjcet_ERR_LOC 'Error Creating Hash Object for Signature' + #DEFINE dcSignFileHashing_ERR_LOC 'Error Hashing Data' + #DEFINE dcS 'S' + #DEFINE dcSR 'SR' + + *-------------------------------------------------------------------------------------- + * Konstanten (diese Werte stammen aus der WiaDef.h, die mit dem Windows 10 SDK + * installiert wird). + *-------------------------------------------------------------------------------------- + #define WIA_DIP_FIRST 2 + #define WIA_RESERVED_FOR_NEW_PROPS 1024 + #define WIA_DPA_FIRST (WIA_DIP_FIRST + WIA_RESERVED_FOR_NEW_PROPS) + #define WIA_DPC_FIRST (WIA_DPA_FIRST + WIA_RESERVED_FOR_NEW_PROPS) + #define WIA_DPS_FIRST (WIA_DPC_FIRST + WIA_RESERVED_FOR_NEW_PROPS) + #define WIA_DPS_DOCUMENT_HANDLING_STATUS (WIA_DPS_FIRST + 13) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT (WIA_DPS_FIRST + 14) + #define WIA_DPS_PAGES (WIA_DPS_FIRST + 22) + + *-------------------------------------------------------------------------------------- + * Werte für WIA_DPS_DOCUMENT_HANDLING_SELECT + *-------------------------------------------------------------------------------------- + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_FEEDER (0x001) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_FLATBED (0x002) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_DUPLEX (0x004) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_FRONT_FIRST (0x008) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_BACK_FIRST (0x010) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_FRONT_ONLY (0x020) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_BACK_ONLY (0x040) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_NEXT_PAGE (0x080) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_PREFEED (0x100) + #define WIA_DPS_DOCUMENT_HANDLING_SELECT_AUTO_ADVANCE (0x200) + + *-------------------------------------------------------------------------------------- + * Werte für WIA_DPS_DOCUMENT_HANDLING_STATUS + *-------------------------------------------------------------------------------------- + #define WIA_DPS_DOCUMENT_HANDLING_STATUS_FEED_READY (0x01) + #define WIA_DPS_DOCUMENT_HANDLING_STATUS_FLAT_READY (0x02) + #define WIA_DPS_DOCUMENT_HANDLING_STATUS_DUP_READY (0x04) + #define WIA_DPS_DOCUMENT_HANDLING_STATUS_FLAT_COVER_UP (0x08) + #define WIA_DPS_DOCUMENT_HANDLING_STATUS_PATH_COVER_UP (0x10) + #define WIA_DPS_DOCUMENT_HANDLING_STATUS_PAPER_JAM (0x20) + + *-------------------------------------------------------------------------------------- + * Werte für die Bildformate + *-------------------------------------------------------------------------------------- + #define FORMATID_wiaFormatBMP "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}" + #define FORMATID_WIAFORMATPNG "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}" + #define FORMATID_wiaFormatGIF "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}" + #define FORMATID_wiaFormatJPEG "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}" + #define FORMATID_wiaFormatTIFF "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}" + + *----------------------------------------------------------------- + * Allgemeine Konstanten für eine eine simulierte ControlSource. Da + * wir verschiedene Befehle für Variablen und Felder benötigen, + * müssen wir zuvor den Typen ermitteln. + *----------------------------------------------------------------- + #DEFINE ccAco_CtrlSource_Auto 0 + #DEFINE ccAco_CtrlSource_Var 1 + #DEFINE ccAco_CtrlSource_Field 2 + #DEFINE ccAco_CtrlSource_Expression 3 + + *----------------------------------------------------------------- + * Mögliche Werte für die Eigenschaft nOpenMode der Komponenten + * DataBehavior. + *----------------------------------------------------------------- + #DEFINE ccAco_DataB_NoOpen 0 + #DEFINE ccAco_DataB_Open 1 + #DEFINE ccAco_DataB_Apply 2 + #DEFINE ccAco_DataB_AutoOpenApply 3 + #DEFINE ccAco_DataB_OnDemand 4 + #DEFINE ccAco_DataB_InOrder 5 + + *----------------------------------------------------------------- + * verschiedene Konstanten des DataBehaviors + *----------------------------------------------------------------- + #DEFINE ccAco_DataB_RecordTable 0 + + *----------------------------------------------------------------- + * Die Fehlercodes für das Update. Die Konstante + * ccAco_DataB_Err_User können Sie als Ausgangspunkt für eigene + * Fehlernummern verwenden. Dies ist die erste Nummer, die zur Ver- + * fügung steht. + *----------------------------------------------------------------- + #DEFINE ccAco_DataB_Err_Transaction_Failed 100000 + #DEFINE ccAco_DataB_Err_Update_Not_Allowed 100001 + #DEFINE ccAco_DataB_Err_Update_Failure 100002 + #DEFINE ccAco_DataB_Err_User 200000 + + *----------------------------------------------------------------- + * Die Möglichen Werte der Eigenschaft nQueryMode der Komponente + * DataBehavior. + *----------------------------------------------------------------- + #DEFINE ccAco_DataB_SourceNone 0 + #DEFINE ccAco_DataB_SourceProperties 1 + #DEFINE ccAco_DataB_SourceValues 2 + #DEFINE ccAco_DataB_SourceValuesFallBack 3 + + *----------------------------------------------------------------- + * Mögliche Werte für die Eigenschaft nSkipMode der Komponente + * IONavControl. + *----------------------------------------------------------------- + #DEFINE ccAco_IONav_SkipCycle 0 + #DEFINE ccAco_IONav_SkipEnable 1 + #DEFINE ccAco_IONav_SkipDisable 2 + + *----------------------------------------------------------------- + * Mögliche Werte für die Eigenschaft nAutoRefreshType der Kompo- + * nente IONavControl. + *----------------------------------------------------------------- + #DEFINE ccAco_IONav_RefreshContainer 1 + #DEFINE ccAco_IONav_RefreshControl 2 + + *----------------------------------------------------------------- + * Mögliche Werte für die Eigenschaft nAskQueryUnload der Kompo- + * nente IONavControl. + *----------------------------------------------------------------- + #DEFINE ccAco_IONav_OnCloseAsk 0 + #DEFINE ccAco_IONav_OnCloseSave 1 + #DEFINE ccAco_IONav_OnCloseRevert 2 + + *----------------------------------------------------------------- + * Mögliche Werte der Eigenschaft nGetData der Komponente + * LocalViewBehavior + *----------------------------------------------------------------- + #DEFINE ccAco_ViewDB_NoData 0 + #DEFINE ccAco_ViewDB_Use 1 + #DEFINE ccAco_ViewDB_UseAndRequery 2 + + *----------------------------------------------------------------- + * Die diversen Arrays in der Komponente UpdateConflictHandler + *----------------------------------------------------------------- + #DEFINE ccAco_UpCnfHnd_ConflictColumns 5 + #DEFINE ccAco_UpCnfHnd_ConflictRef 1 + #DEFINE ccAco_UpCnfHnd_ConflictRecNo 2 + #DEFINE ccAco_UpCnfHnd_ConflictTryAgain 3 + #DEFINE ccAco_UpCnfHnd_ConflictType 4 + #DEFINE ccAco_UpCnfHnd_ConflictData 5 + + *----------------------------------------------------------------- + * Das Array aContainer des MultiContainerController's + *----------------------------------------------------------------- + #DEFINE ccAco_MCC_Columns 5 + #DEFINE ccAco_MCC_Name 1 + #DEFINE ccAco_MCC_Class 2 + #DEFINE ccAco_MCC_Reference 3 + #DEFINE ccAco_MCC_DE_Name 4 + #DEFINE ccAco_MCC_DE_Class 5 + + *----------------------------------------------------------------- + * Das Array aPipes der Komponente srvNamedPipeManager + *----------------------------------------------------------------- + #DEFINE ccAco_Pipe_Columns 4 + #DEFINE ccAco_Pipe_Name 1 + #DEFINE ccAco_Pipe_Count 2 + #DEFINE ccAco_Pipe_Receiver 3 + #DEFINE ccAco_Pipe_Sender 4 + + *----------------------------------------------------------------- + * Intermediate Layer. Es gibt zwei Intermediate-Dateien. Die Datei + * iAcodey.H wird für die eigentliche Programmversion verwendet. + * Die Datei iAcodeyD.H enthält die Konstanten, die in der Debug- + * Version verwendet werden sollen. Umgeschaltet werden zwischen + * den beiden kann über die Eigenschaft _SCREEN.AcodeyBuild, die + * bei Bedarf hinzugefügt werden kann. Sie kann die Werte RELEASE + * oder DEBUG annenehmen. Alle andere Werte werden als RELEASE ge- + * wertet. Die Namen der Include-Dateien sind selbstverständlich + * ebenfalls konfigurierbar. + * + * WICHTIG: In VFP 5 ist dies auf Grund eines Bugs nicht möglich. + * Dort führt jeder Zugriff auf eine Variable innerhalb + * einer #IF Zeile sofort zu einem GPF. Daher wird in + * VFP 5 immer die Datei iAcodey.H inkludiert. Sollten Sie + * unterschiedliche Werte benötigen, müssen Sie dort über + * #IF selbst andere Werte setzen. + * + *----------------------------------------------------------------- +*!* #IF __VFP6 +*!* #DEFINE ccLocalSelectFile ; +*!* Type("_Screen.AcodeyBuild") == T_CHARACTER +*!* #ELSE + #DEFINE ccLocalSelectFile .F. +*!* #ENDIF + #IF ccLocalSelectFile + #UNDEF ccLocalSelectFile + #DEFINE ccLocalSelectFile ; + Upper(_Screen.AcodeyBuild) == "DEBUG" + #ELSE + #UNDEF ccLocalSelectFile + #DEFINE ccLocalSelectFile .F. + #ENDIF + #IF ccLocalSelectFile + __FILE_IACODEYD + #ELSE + __FILE_IACODEY + #ENDIF + #UNDEF ccLocalSelectFile + + *:IFFEAT ActiveDebugging + *----------------------------------------------------------------- + * Assertion message. This macro already includes some general + * information about the object, causing the assertion. + *----------------------------------------------------------------- + #IF __VFP5 + #DEFINE ASSMSG MESSAGE ; + "Assertion failed on " + ; + Iif( ; + Type("m.This") == "O", ; + "object " + Lower(Sys(1272,m.This)), ; + "current program" ; + ) + ; + ", line number " + Alltrim(Str(LineNo(1))) + ; + ":" + + #ELSE + #DEFINE ASSMSG MESSAGE ; + "Assertion failed on " + ; + Iif( Type("m.This")=="O", "object ", "program " ) + ; + Lower(Program(Program(-1))) + ; + ", line number " + Alltrim(Str(LineNo(1))) + ; + ":" + + #ENDIF + + *----------------------------------------------------------------- + * Common assertions and conditions. + *----------------------------------------------------------------- + #DEFINE ASSERT_ACODEY_FLL ; + Type("AcodeyGetVersion()") == T_NUMERIC + #DEFINE ASSERT_FOXTOOLS_FLL ; + Type("_WMainWind()") == T_NUMERIC + #DEFINE ASSERT_GPFPRG ; + Upper([__GLOBALPROCEDUREFILE.]) $ Upper(Set("Procedure")) + + *----------------------------------------------------------------- + * Defines how much Acodey supports you in debugging. There are + * 4 defined levels: + * + * 0 no debugging at all. Produces the fastest code, but only + * should be used in the release version. + * __DEBUG_NONE + * + * 1 regular debugging. Parameters are asserted, a few checks + * are performed + * __DEBUG_REGULAR + * + * 2 advanced debugging. Whenver possible, Acodey helps you + * with debugging, but Acodey doesn't try finding bugs on its + * own. Recommended setting during development. + * __DEBUG_ADVANCED + * + * 3 ActiveDebugging. Acodey actively locates bugs, verifies + * data integrity, etc. + * __DEBUG_ACTIVE + * + *----------------------------------------------------------------- + #IfnDef __DEBUGLEVEL + #Define __DEBUGLEVEL __DEBUG_ADVANCED + #Endif + #IF Type( [__DEBUGLEVEL] ) # T_NUMERIC + __ERRMSG "__DEBUGLEVEL" must be numeric + __SHOWERROR + #UNDEF __DEBUGLEVEL + #DEFINE __DEBUGLEVEL __DEBUG_ADVANCED + #ENDIF + #IF not InList( __DEBUGLEVEL, ; + __DEBUG_NONE, ; + __DEBUG_REGULAR, ; + __DEBUG_ADVANCED, ; + __DEBUG_ACTIVE ; + ) + __ERRMSG "__DEBUGLEVEL" must be between 0 ("__DEBUG_NONE") ; + and 3 ("__DEBUG_ACTIVE"). It's currently ; + <__DEBUGLEVEL> + __SHOWERROR + #UNDEF __DEBUGLEVEL + #DEFINE __DEBUGLEVEL __DEBUG_ADVANCED + #ENDIF + + *----------------------------------------------------------------- + * Defensive programming means that whenever possible, Acodey + * tries to resolve conflicts itself. This could be wrong + * parameters, a not loaded procedure file, etc. if you set the + * following define to .T., Acodey will behave defensively, with + * .F. it expects everything to be all right and crash if it's not. + * The advantage of defensive programming is that it makes an + * application more stable. The disadvantages are that it first of + * all hides bugs. This means, there might be bugs in your code + * that need to be fixed, but you won't find them, because Acodey + * tries to fix them itself. This could be a bad thing if the + * solution of Acodey is not what you intended. The second dis- + * advantage is that it makes the program slower. If you really + * need performance, turn off defensive programming. Whenever + * Acodey attempts to fix something, it will warn you by + * displaying an assertion dialog. If you SET ASSERT ON and you get + * such a dialog, you should fix the bug and not ignore this + * message! + * If you tested the code thoroughfully and haven't got such a + * message, chances are good, your code don't need defensive + * programming. Then turn it off. + *----------------------------------------------------------------- + #IFNDEF __DEFENSIVE_PROGRAMMING + #DEFINE __DEFENSIVE_PROGRAMMING .T. + #ENDIF + #IF Type( [__DEFENSIVE_PROGRAMMING] ) # "L" + __ERRMSG "__DEFENSIVE_PROGRAMMING" must be logical. + __SHOWERROR + #UNDEF __DEFENSIVE_PROGRAMMING + #DEFINE __DEFENSIVE_PROGRAMMING .T. + #ENDIF + + *----------------------------------------------------------------- + * Bei __BACKWARD_WARN geben wir eine Assert-Meldung aus, sobald + * wir auf einen Fall treffen, wo die Rückwärtskompatibilität zum + * tragen kommt. Es muß immer im Anschluß die Nummer angegeben wer- + * den. + *----------------------------------------------------------------- + #DEFINE ASSERTBACKWARD Assert .F. ASSMSG ; + "Backward compatibility issue discovered: "+ + + *:ENDFEAT + + *:IFFEAT ReferenceTracking + *----------------------------------------------------------------- + * Reference Tracking ist ein Feature von Acodey, mit dessen Hilfe + * Sie schnell hängende Referenzen und ähnliche Probleme entdecken + * können. Aufgrund von Fehlern in VFP wird ein Objekt manchmal + * nicht freigegeben oder das Cascading Destroy versagt. Wenn Sie + * diese Option auf .T. setzen, registriert sich jede Klasse, die + * auf den Acodey-Basisklassen basiert sobald es erzeugt und wenn + * es freigegeben wird. In der Tracking-Tabelle können Sie sehen, + * welche Objekte derzeit noch existieren. + *----------------------------------------------------------------- + #IFNDEF __REFERENCE_TRACKING + #DEFINE __REFERENCE_TRACKING .F. + #ENDIF + #IF Type([__REFERENCE_TRACKING]) # T_LOGICAL + __ERRMSG "__REFERENCE_TRACKING" must be logical. + __SHOWERROR + #UNDEF __REFERENCE_TRACKING + #DEFINE __REFERENCE_TRACKING .F. + #ENDIF + + *----------------------------------------------------------------- + * Die folgende Konstante definiert den Namen und Ort der Tracking- + * Tabelle. Standardmäßig ist dies das HOME() Verziechnis von VFP. + * In der Entwicklungsumgebung ist dies das Verzeichnis, in das Sie + * VFP installiert haben, in der Laufzeitversion das Verzeichnis, + * in dem sich die Runtimebibliothek befindet (normalerweise das + * \WINDOWS\SYSTEM Verzeichnis). Wenn Sie einen eigenen Pfad defi- + * nieren, stellen Sie sicher, daß es sich um einen absoluten Pfad + * handelt, damit dieser unabhängig vom aktuellen Verzeichnis in + * der Applikation ist. + *----------------------------------------------------------------- + #IFNDEF __REFERENCE_TRACKING_TABLE + #DEFINE __REFERENCE_TRACKING_TABLE ; + Home() + "RefTrack.Dbf" + #ENDIF + #IF Type([__REFERENCE_TRACKING_TABLE]) # T_CHARACTER + __ERRMSG "__REFERENCE_TRACKING_TABLE" must be a string. + __SHOWERROR + #UNDEF __REFERENCE_TRACKING_TABLE + #DEFINE __REFERENCE_TRACKING_TABLE ; + Home() + "RefTrack.Dbf" + #ENDIF + + *----------------------------------------------------------------- + * Das ReferenceTracking funktioniert, indem es ein Objekt zu + * _SCREEN hinzufügt. Dies gibt Ihnen mehr Kontrolle über den + * Tracking-Verlauf, da Sie diese Möglichkeit jederzeit ein- bzw. + * ausschalten können. Diese Konstante definiert den Namen des + * Tracking-Objektes in _SCREEN. Standardmäßig ist das __RefTrack, + * aber Sie können jden gültigen Namen wählen, den Sie möchten. + *----------------------------------------------------------------- + #IFNDEF __REFERENCE_TRACKING_OBJ + #DEFINE __REFERENCE_TRACKING_OBJ __RefTrack + #ENDIF + #IF not ( Empty(ChrTran( ; + [__REFERENCE_TRACKING_OBJ],__VALID_NAME_CHARS,"")); + and ( IsAlpha([__REFERENCE_TRACKING_OBJ]) ; + or Left([__REFERENCE_TRACKING_OBJ],1) == "_" ) ) + __ERRMSG "__REFERENCE_TRACKING_OBJ": ; + <__REFERENCE_TRACKING_OBJ> is not a valid object name. + __SHOWERROR + #UNDEF __REFERENCE_TRACKING_OBJ + #DEFINE __REFERENCE_TRACKING_OBJ __RefTrack + #ENDIF + + *----------------------------------------------------------------- + * Sie können jede beliebige Klasse als ReferenceTracking Objekt + * definieren. Diese Klasse muß folgende Bedingungen erfüllen: + * - Es muß eine AddTracking() Methode haben + * - Es muß eine RemoveTracking() Methode haben + * - Es muß eine lEnabled Eigenschaft haben. + * - Es darf nicht auf einer Acodey-Basisklasse basieren, da diese + * Klassen das Reference-Tracking im Init aufrufen. Dies würde + * eine Endlosschleife verursachen. + * Die folgende Konstante enthält die zu verwendende Klasse in + * LC-Notation. + *----------------------------------------------------------------- + #IFNDEF __REFERENCE_TRACKING_CLASS + *:SECTION RefTrackClass + #DEFINE __REFERENCE_TRACKING_CLASS "Reftrack.Vcx;RefTrack" + *:ENDSECTION + #ENDIF + #IF Type([__REFERENCE_TRACKING_CLASS]) # T_CHARACTER + __ERRMSG "__REFERENCE_TRACKING_CLASS" must be a string. + __SHOWERROR + #UNDEF __REFERENCE_TRACKING_CLASS + *:SECTION RefTrackClass + #DEFINE __REFERENCE_TRACKING_CLASS "Reftrack.Vcx;RefTrack" + *:ENDSECTION + #ENDIF + + *----------------------------------------------------------------- + * Standardmäßig wird das ReferenceTracking aktiviert, sobald Sie + * die Prozedur InitReferenceTracking() aufrufen. Sie können es zur + * Laufzeit ein- und ausschalten, in dem Sie die lEnabled Eigen- + * schaft des ReferenceTracking-Objektes ändern. Wenn das Refe- + * renceTracking beim Start deaktiviert sein soll, setzen Sie die + * folgende Konstante auf .F. + *----------------------------------------------------------------- + #IFNDEF __REFERENCE_TRACKING_ENABLED + #DEFINE __REFERENCE_TRACKING_ENABLED .T. + #ENDIF + #IF Type([__REFERENCE_TRACKING_ENABLED]) # T_LOGICAL + __ERRMSG "__REFERENCE_TRACKING_ENABLED" must be logical. + __SHOWERROR + #UNDEF __REFERENCE_TRACKING_ENABLED + #DEFINE __REFERENCE_TRACKING_ENABLED .T. + #ENDIF + *:ENDFEAT + + *:IFFEAT GlobalService + *----------------------------------------------------------------- + * Konstanten für den Global Service Broker + *----------------------------------------------------------------- + #IFNDEF __GLOBAL_SERVICE_BROKER + #DEFINE __GLOBAL_SERVICE_BROKER __Acodey__GSB__ + #ENDIF + #IFNDEF __GLOBAL_SERVICE_BROKER_CLASS + *:SECTION GSBClass + #DEFINE __GLOBAL_SERVICE_BROKER_CLASS ; + "GlobalServiceBroker.Vcx;GlobalServiceBroker" + *:ENDSECTION + #ENDIF + *:ENDFEAT + + *----------------------------------------------------------------- + * Defines the language that your application should use for + * interface operations. This is independant of the runtime version + * you are using. THE LIB uses the ISO 639 code for the language. + * Possible values for this define are + * "de" German + * "en" English + * If you want to create a German application, but use an English + * runtime, or viceversa, check out the _VFP_LANGUAGE define + * below. + *----------------------------------------------------------------- + #IFNDEF __ACODEY_LANGUAGE + #DEFINE __ACODEY_LANGUAGE "de" + #ENDIF + #IF Type( [__ACODEY_LANGUAGE] ) # "C" + #UNDEF __ACODEY_LANGUAGE + #DEFINE __ACODEY_LANGUAGE "de" + __ERRMSG "__ACODEY_LANGUAGE" must be a character + __SHOWERROR + #ENDIF + #IF not InList(__ACODEY_LANGUAGE,"de","en") + __ERRMSG "__ACODEY_LANGUAGE" must be 'de' or 'en', ; + currently it's <__ACODEY_LANGUAGE>. + __SHOWERROR + #UNDEF __ACODEY_LANGUAGE + #DEFINE __ACODEY_LANGUAGE "de" + #ENDIF + + *----------------------------------------------------------------- + * This setting defines the runtime you are using. Usually it is + * determined automatically, so you don't have to change the + * setting, it always matches the version of VFP, you are using. + * Only change this setting if you are using a different version + * of VFP when compiling than when executing the application. + * Changing this value without need, might result in unpredictable + * results. + *----------------------------------------------------------------- + #IF Version(3) == "00" + #DEFINE __VFP_LANGUAGE_Internal "en" + #ELIF Version(3) == "49" + #DEFINE __VFP_LANGUAGE_Internal "de" + #ELSE + #DEFINE __VFP_LANGUAGE_Internal "en" + #ENDIF + #IFNDEF __VFP_LANGUAGE + #DEFINE __VFP_LANGUAGE __VFP_LANGUAGE_Internal + #ENDIF + #IF Type( [__VFP_LANGUAGE] ) # "C" + __ERRMSG "__VFP_LANGUAGE" must be a string. + __SHOWERROR + #UNDEF __VFP_LANGUAGE + #DEFINE __VFP_LANGUAGE __VFP_LANGUAGE_Internal + #ENDIF + #IF not InList(__VFP_LANGUAGE,"de","en") + __ERRMSG "__VFP_LANGUAGE": Unsupported runtime version ; + <__VFP_LANGUAGE>. Using __VFP_LANGUAGE_Internal ; + instead. + __SHOWERROR + #UNDEF __VFP_LANGUAGE + #DEFINE __VFP_LANGUAGE __VFP_LANGUAGE_Internal + #ENDIF + #UNDEF __VFP_LANGUAGE_Internal + + *----------------------------------------------------------------- + * NewObject() und NEWOBJECT() haben beide ein gravierendes Pro- + * blem. Sie laden die angebene Klassenbibliothek immer nach. + * In einigen Applikationen aber ist dies nocht das korrekte Ver- + * halten, weil die Klassenbibliothek unter Umständen gar nicht + * im Zugriff ist. In diesem Fall kann über __USE_NEWOBJECT die + * Verwendung dieser Funktion/Methode deaktiviert werden. + *----------------------------------------------------------------- + #IFNDEF __USE_NEWOBJECT + #DEFINE __USE_NEWOBJECT .T. + #ENDIF + #IF Type( [__USE_NEWOBJECT] ) # T_LOGICAL + #UNDEF __USE_NEWOBJECT + #DEFINE __USE_NEWOBJECT .T. + __ERRMSG "__USE_NEWOBJECT" must be logical + __SHOWERROR + #ENDIF + + *----------------------------------------------------------------- + * Die sprachabängigen Konstanten für die Applikation einbinden. + * Dies umfaßt alle Texte, die in Acodey-Komponenten verwendet + * werden mit Ausnahme der Texte für das Debugging. + *----------------------------------------------------------------- + #IF __ACODEY_LANGUAGE == "de" + __FILE_ACO_LDE + #ELIF __ACODEY_LANGUAGE == "en" + __FILE_ACO_LEN + #ELSE + __ERRMSG "__ACODEY_LANGUAGE" must be 'de' or 'en' + __SHOWERROR + #ENDIF + + *----------------------------------------------------------------- + * Sprachabängige Konstanten für lokalisierte Strings in VFP + * einbinden. Dies hängt von der verwendeten VFP-Version, und + * nicht der Sprache der Appliaktion ab. + *----------------------------------------------------------------- + #IF __VFP_LANGUAGE == "de" + #IFNDEF VFPLOC_TB_ColorPalette + #DEFINE VFPLOC_TB_ColorPalette "Farbpalette" + #ENDIF + #IFNDEF VFPLOC_TB_DatabaseDesigner + #DEFINE VFPLOC_TB_DatabaseDesigner "Datenbank-Designer" + #ENDIF + #IFNDEF VFPLOC_TB_FormControls + #DEFINE VFPLOC_TB_FormControls "Formular-Steuerelemente" + #ENDIF + #IFNDEF VFPLOC_TB_FormDesigner + #DEFINE VFPLOC_TB_FormDesigner "Formular-Designer" + #ENDIF + #IFNDEF VFPLOC_TB_Layout + #DEFINE VFPLOC_TB_Layout "Layout" + #ENDIF + #IFNDEF VFPLOC_TB_PrintPreview + #DEFINE VFPLOC_TB_PrintPreview "Seitenansicht" + #ENDIF + #IFNDEF VFPLOC_TB_QueryDesigner + #DEFINE VFPLOC_TB_QueryDesigner "Abfrage-Designer" + #ENDIF + #IFNDEF VFPLOC_TB_ReportControls + #DEFINE VFPLOC_TB_ReportControls "Bericht-Steuerelemente" + #ENDIF + #IFNDEF VFPLOC_TB_ReportDesigner + #DEFINE VFPLOC_TB_ReportDesigner "Berichts-Designer" + #ENDIF + #IFNDEF VFPLOC_TB_Standard + #DEFINE VFPLOC_TB_Standard "Standard" + #ENDIF + #IFNDEF VFPLOC_TB_ViewDesigner + #DEFINE VFPLOC_TB_ViewDesigner "Ansichts-Designer" + #ENDIF + #ELIF __VFP_LANGUAGE == "en" + #IFNDEF VFPLOC_TB_ColorPalette + #DEFINE VFPLOC_TB_ColorPalette "Color Palette" + #ENDIF + #IFNDEF VFPLOC_TB_DatabaseDesigner + #DEFINE VFPLOC_TB_DatabaseDesigner "Database Designer" + #ENDIF + #IFNDEF VFPLOC_TB_FormControls + #DEFINE VFPLOC_TB_FormControls "Form Controls" + #ENDIF + #IFNDEF VFPLOC_TB_FormDesigner + #DEFINE VFPLOC_TB_FormDesigner "Form Designer" + #ENDIF + #IFNDEF VFPLOC_TB_Layout + #DEFINE VFPLOC_TB_Layout "Layout" + #ENDIF + #IFNDEF VFPLOC_TB_PrintPreview + #DEFINE VFPLOC_TB_PrintPreview "Preview" + #ENDIF + #IFNDEF VFPLOC_TB_QueryDesigner + #DEFINE VFPLOC_TB_QueryDesigner "Query Designer" + #ENDIF + #IFNDEF VFPLOC_TB_ReportControls + #DEFINE VFPLOC_TB_ReportControls "Report Controls" + #ENDIF + #IFNDEF VFPLOC_TB_ReportDesigner + #DEFINE VFPLOC_TB_ReportDesigner "Report Designer" + #ENDIF + #IFNDEF VFPLOC_TB_Standard + #DEFINE VFPLOC_TB_Standard "Standard" + #ENDIF + #IFNDEF VFPLOC_TB_ViewDesigner + #DEFINE VFPLOC_TB_ViewDesigner "View Designer" + #ENDIF + #ELSE + __ERRMSG Unsupported runtime version + __SHOWERROR + #ENDIF + + *----------------------------------------------------------------- + * Wenn __CHECK_DANGLING_REFERENCES auf .T. gesettzt wird, werden + * einige zusätzliche Tests gefahren, um auf hängende Referenzen, + * falsche Shutdown-Reihenfolgen, etc. zu prüfen. Nicht alles, was + * hier gemeldet wird, ist unbedingt ein Fehler, aber es sollte + * alles überprüft werden, und wenn es möglich ist, sollte der Code + * so umgeschrieben werden, daß es keine Meldung mehr gibt. + * + * Wenn nur die Möglichkeit besteht, daß es sich um ein Problem + * handelt, wird die Meldung über DEBUGOUT gemacht, nicht über + * einen ASSERT-Dialog. Nur falls die Wahrscheinlichkeit hoch ist, + * daß es sich tatsächlich um einen Fehler handelt, bekommen Sie + * den Dialog. + * + *----------------------------------------------------------------- + #IFNDEF __CHECK_DANGLING_REFERENCES + #IF __DEBUGLEVEL >= __DEBUG_ACTIVE + #DEFINE __CHECK_DANGLING_REFERENCES .T. + #ELSE + #DEFINE __CHECK_DANGLING_REFERENCES .F. + #ENDIF + #ENDIF + #IF Type( [__CHECK_DANGLING_REFERENCES] ) # T_LOGICAL + #UNDEF __CHECK_DANGLING_REFERENCES + #IF __DEBUGLEVEL >= __DEBUG_ACTIVE + #DEFINE __CHECK_DANGLING_REFERENCES .T. + #ELSE + #DEFINE __CHECK_DANGLING_REFERENCES .F. + #ENDIF + __ERRMSG "__CHECK_DANGLING_REFERENCES" must be logical + __SHOWERROR + #ENDIF + + *----------------------------------------------------------------- + * Acodey bietet eine Optimierung an. Dies wird in der Regel + * dadurch erreicht, das Abfragen für seltene Fälle entfallen. + * Sollten diese Fälle dennoch bei Ihnen auftreten, kann es aller- + * dings uu Fehlverhalten führen. Mögliche Folgeerscheinungen sind + * immer im Quelltext beschrieben, wenn Code optimiert werden kann. + * Die Auswirkung der Optimierung kann durchaus beträchtlich sein. + * So ist beispielsweise das Freigeben von Objekten mit aktivierte + * Optimierung etwa 80% schneller. Zusammen mit dem Deaktivieren + * des Debugmodus und der defensiven Programmierung kann eine App- + * likation durchaus 50% schneller laufen. Allerdings müssen Sie + * dann besondere Vorsicht walten lassen, daß Ihre Applikation + * wirklich fehlerfrei ist, denn eine optimierte Applikation ver- + * gibt Fehler nicht, sondern stürzt einfach ab. + *----------------------------------------------------------------- + #IFNDEF __ACODEY_OPTIMIZATION + #DEFINE __ACODEY_OPTIMIZATION .F. + #ENDIF + #IF Type( [__ACODEY_OPTIMIZATION] ) # "L" + #UNDEF __ACODEY_OPTIMIZATION + #DEFINE __ACODEY_OPTIMIZATION .F. + __ERRMSG "__ACODEY_OPTIMIZATION" must be a logical + __SHOWERROR + #ENDIF + + *----------------------------------------------------------------- + * Zwischen Visual FoxPro 5 und den nachfolgenden Versionen beste- + * hen teilweise gravierende Unterschiede bei der Freigabe von Ob- + * jekten. Die offensichtlichste Erscheinungsform ist, daß das + * Cascading Destroy in VFP 6 nur noch eingeschränkt funktioniert. + * Ohne Abstürze geht es nur von Statten, wenn keine hängenden Re- + * ferenzen vorliegen und außerdem das Release eines Objektes di- + * rekt aus einem im enthaltenen Objekt getriggert wird. Wird da- + * gegen zum Beispiel aus einem Toolbar eine Methode eines Objek- + * tes auf dem Formular aufgerufen, die dann Thisform.Release() + * durchführt, führt dies mit nahezu tödlicher Sicherheit zu einem + * Absturz. + * + * Im Gegensatz zum Vorgängerprodukt THE LIB verwaltet Acodey die + * Referenzen nun anständig und verfügt über ein ausgefeiltes Kon- + * zept zum CleanUp(). Daher ist hier ein Cascading Destroy nicht + * nur überflüssig, sondern oftmals auch erst die Ursache für Ab- + * stürze. + * + * Damit Sie aber dennoch Komponenten aus THE LIB verwenden können + * bzw. in Ihrem Code nicht nach hängenden Referenzen suchen müs- + * sen, gibt es drei Einstellungen: + * + * __CD_ALWAYS Es wird immer ein Cascading Destroy durchge- + * führt. + * + * __CD_NEVER Es wird kein Cascading Destroy durchgeführt + * und der Code wird auch nicht in die Applika- + * tion eingebunden. + * + * __CD_DEPENDS Das Cascading Destroy wird über das Property + * lCascadingDestroy gesteuert, das standardmäßig + * auf .T. gesetzt ist. Für die Komponenten, bei + * denen kein Cascading Destroy notwendig ist, + * können Sie diese Eigenschaft dann auf .F. set- + * zen, bzw. dies in den Basisklassen pauschal + * für alle Komponenten deaktivieren und bei Be- + * darf wieder aktivieren. + * + * Die Standardwerte sind für VFP 5 __CD_ALWAYS und für VFP 6 + * __CD_DEPENDS verwendet, es sei denn, Sie haben die Konstante + * __ACODEY_OPTIMIZATION auf .T. gesetzt. Dann wird in beiden Ver- + * sionen __CD_NEVER verwendet. + * + *----------------------------------------------------------------- + #IF __ACODEY_OPTIMIZATION + #DEFINE ccLocalCascadingDestroy __CD_NEVER + #ELSE + #IF __VFP6 + #DEFINE ccLocalCascadingDestroy __CD_DEPENDS + #ELSE + #DEFINE ccLocalCascadingDestroy __CD_ALWAYS + #ENDIF + #ENDIF + #IFNDEF __CASCADING_DESTROY + #DEFINE __CASCADING_DESTROY ccLocalCascadingDestroy + #ENDIF + #IF Type( [__CASCADING_DESTROY] ) # "N" + #UNDEF __CASCADING_DESTROY + #DEFINE __CASCADING_DESTROY ccLocalCascadingDestroy + __ERRMSG "__CASCADING_DESTROY" must be numeric + __SHOWERROR + #ENDIF + #UNDEF ccLocalCascadingDestroy + + *:IFCOMP PL0001 + *----------------------------------------------------------------- + * KOMPATIBILITÄT PL0001: + * Im Iterator ist das Ereignis eventDrillDown() durch die DO- + * Methode DoHandleObject() ausgetauscht worden. Dies geschah, + * um die Konsistenz zu wahren. + *----------------------------------------------------------------- + #IFNDEF __BACKWARD_PL0001 + #DEFINE __BACKWARD_PL0001 __BACKWARD_YES + #ENDIF + *:ENDCOMP + + *------------------------------------------------------------------ + * Debugoption für die Zeitmessung des IOControl + *------------------------------------------------------------------ + #IFNDEF __DEBUG_IOCONTROL_TIMING + #IF __DEBUGLEVEL >= __DEBUG_ACTIVE + #DEFINE __DEBUG_IOCONTROL_TIMING .T. + #ELSE + #DEFINE __DEBUG_IOCONTROL_TIMING .F. + #ENDIF + #ENDIF + #IF Type( [__DEBUG_IOCONTROL_TIMING] ) # "L" + #UNDEF __DEBUG_IOCONTROL_TIMING + #DEFINE __DEBUG_IOCONTROL_TIMING .F. + __ERRMSG "__DEBUG_IOCONTROL_TIMING" must be a logical + __SHOWERROR + #ENDIF + + *------------------------------------------------------------------ + * Debugoption für die Zeitmessung des DataBehavior + *------------------------------------------------------------------ + #IFNDEF __DEBUG_DATABEHAVIOR_TIMING + #IF __DEBUGLEVEL >= __DEBUG_ACTIVE + #DEFINE __DEBUG_DATABEHAVIOR_TIMING .T. + #ELSE + #DEFINE __DEBUG_DATABEHAVIOR_TIMING .F. + #ENDIF + #ENDIF + #IF Type( [__DEBUG_DATABEHAVIOR_TIMING] ) # "L" + #UNDEF __DEBUG_DATABEHAVIOR_TIMING + #DEFINE __DEBUG_DATABEHAVIOR_TIMING .F. + __ERRMSG "__DEBUG_DATABEHAVIOR_TIMING" must be a logical + __SHOWERROR + #ENDIF + + *------------------------------------------------------------------ + * Einige Operationen gerade bei den Basisklassen sind zwar an sich + * schnell, aber werden so häufig ausgeführt, daß sie in der Gesamt- + * heit spürbar werden. Mit den __ACODEY_FEATURE_ Konstanten können + * Sie diese Optionen gezielt abschalten. Damit wird der Code für + * ein bestimmtes Feature gar nicht mehr in die Klassen hineinkompi- + * liert. Dies erfolgt unabhängig von Einstellungen zu Klassen, die + * Sie im Integrationsassistenten vornehmen können. Wenn Sie im + * Integrationsassisten ein Feature entfernen, dann steht es auch + * nicht im Quellcode zur Verfügung. Wenn Sie hingegen ein Feature + * in einigen Komponenten entfernt, in anderen aber dringelassen + * haben, dann müssen Sie hier das Feature ebenfalls aktiviert + * lassen. + * + * Benötigt eine Komponente ein bestimmtes Feature, so prüft sie + * dies beim Kompilieren und gibt gegebenenfalls eine Fehlermeldung + * aus. + *------------------------------------------------------------------ + + *------------------------------------------------------------------ + * lUsed + * + * CompLabel und CompContainer bieten die Möglichkeit, über die Ei- + * genschaft lUsed während der Initialisierung .F. zurückzugeben. + * Damit wird ein Objekt auf einfache Weise deaktiviert, ohne daß + * Sie Code schreiben müssen. Da lUsed aber umlenkbar ist und für + * jedes Objekt geprüft werden muß, ist das recht Performance inten- + * siv. Hiermit können Sie den entsprechenden Code komplett deakti- + * vieren. + *------------------------------------------------------------------ + #IFNDEF __ACODEY_FEATURE_LUSED + #DEFINE __ACODEY_FEATURE_LUSED .T. + #ENDIF + #IF Type( [__ACODEY_FEATURE_LUSED] ) # "L" + #UNDEF __ACODEY_FEATURE_LUSED + #DEFINE __ACODEY_FEATURE_LUSED .T. + __ERRMSG "__ACODEY_FEATURE_LUSED" must be a logical + __SHOWERROR + #ENDIF + + *-------------------------------------------------------------------------------------- + * Exceptionhandling. Dieses kann optional genutzt werden. + *-------------------------------------------------------------------------------------- + #DEFINE _BEGIN Private __EXCEPTION + #DEFINE _TRY __EXCEPTION = Iif(Empty(JustExt(Program(Program(-1)))),; + JustStem(Program(Program(-1))),JustExt(Program(Program(-1)))) + #DEFINE _THROW Do __Throw with + #DEFINE _CATCH IF Vartype(__EXCEPTION) == "O" + #DEFINE _END Endif + + *-------------------------------------------------------------------------------------- + * In vielen Fällen melden Acodey-Komponenten einen Fehler, indem sie .f. zurückgeben. + * bei einem einfachen Methodenaufruf kann dies leicht geprüft und entsprechend reagiert + * werden. Sobald eine Anwendung aber eine gewisse Komplexität erreicht hat, stehen + * zwischen Ursache und Reaktion aber bereits mehrere Aufrufebenen, so dass nicht mehr + * genau festgestellt werden kann, warum ein Fehler aufgetreten ist, ohne dies im ein- + * zelnen zu debuggen. + * + * Ein konkretes Beispiel aus den Komponenten in Acodey ist hierfür etwa die Update- + * Methode des DataBehavior's. Wenn diese .F. zurückgibt, konnten die Daten nicht ge- + * schrieben werden. Die Ursache läßt sich bei der Übergabe einen UpdateConflictHandlers + * zwar über diesen ermitteln, nicht aber wenn kein solcher Handler verwendet wird. + * + * Das Logging Feature in Acodey bietet eine Alternative. Wenn die Option __ACODEY_LOGGING + * aktiviert, also .T. ist, schreiben Komponenten beim Auftreten eines Fehlers einen + * englischen Protokolleintrag, der über __ACODEY_LOGGING_WRITE ausgegeben wird. In der + * Grundeinstellung handelt es sich dabei um einen Aufruf des Logging Dienstes, wobei + * die Meldung als Kurztext übergeben wird. + * + * Der Logging Service schreibt in der Grundkonfiguration alle Meldungen nur in das + * DEBUGOUT Fenster und an einen Windows Debugger. Ersteres können Sie für die Entwick- + * lung nutzen, letzteres über das Programm DBGVIEW von http://www.sysinternals.com auch + * für die Laufzeitumgebung. Zusätzlich können Sie eigene Handler schreiben und beim + * Logging-Dienst per BINDEVENT() registrieren, um weitere Protokolle zu unterstützen, + * wie etwa das Windows Ereignisprotokoll. + * + * Das Logging-Feature steht erst ab VFP 6 zur Verfügung. Bis einschließlich VFP 7 muss + * die Logging Komponente ausgetauscht werden, da die Acodey Logging-Komponente nur ab + * VFP 8 eingesetzt werden kann. + *-------------------------------------------------------------------------------------- + #IFNDEF __ACODEY_LOGGING + #IF __VFP6 + #DEFINE __ACODEY_LOGGING .T. + #ELSE + #DEFINE __ACODEY_LOGGING .F. + #ENDIF + #ENDIF + #IF Type( [__ACODEY_LOGGING] ) # "L" + #UNDEF __ACODEY_LOGGING + #IF __VFP6 + #DEFINE __ACODEY_LOGGING .T. + #ELSE + #DEFINE __ACODEY_LOGGING .F. + #ENDIF + __ERRMSG "__ACODEY_LOGGING" must be either .T. or .F. + __SHOWERROR + #ENDIF + + *-------------------------------------------------------------------------------------- + * In __ACODEY_LOGGING_WRITE kann der Aufruf hinterlegt werden, mit dem die Komponente + * das Protokoll erstellt. Komponenten, die diese Funktion nutzen, haben Abhängigkeiten + * zu GlobalService und Logging. Sie können diese Befehlszeile durch einen anderen + * Befehl ersetzen. Bitte beachten Sie, dass Sie hier keinen Funktionsaufruf hinterlegen + * können, da die abschließende Klammer zu nicht angegeben wird. + *-------------------------------------------------------------------------------------- + #IFNDEF __ACODEY_LOGGING_WRITE + #IF __ACODEY_LOGGING + #DEFINE __ACODEY_LOGGING_WRITE ; + DO GPF_Service with "Logging", "Do", ; + Iif( Type("m.This")=="O", "object ", "program " ) + ; + Lower(Program(Program(-1))) + ; + " (" + Alltrim(Str(LineNo(1))) + "): " + + #ELSE + #DEFINE __ACODEY_LOGGING_WRITE * + #ENDIF + #ENDIF + + *-------------------------------------------------------------------------------------- + * Oftmals deutet ein Rückgabewert von .F. bei Komponenten einen Entwicklerfehler an, + * ohne dass dies zwangsläufig der Fall sein muss. Beispielsweise ist es ein Fehler, + * wenn eine XML Definition nicht geladen werden kann, die in das Programm eingebunden + * wurde. Wird aber eine XML Definition von extern geladen, kann .F. einen gültigen + * Rückgabewert darstellen. + * + * Wenn Sie __DEBUG_SHOW_WARNINGS auf .T. setzen, wird in solchen Fällen ebenfalls eine + * ASSERT Meldung ausgegeben. Unter Umständen werden dann aber Meldungen angezeigt, die + * nicht zwangsweise auf Fehler hindeuten. Alle derartige ASSERT Meldungen fangen mit + * dem Text "WARNING: " an. Bei Active Debugging ist diese Option standardmäßig akti- + * viert. + *-------------------------------------------------------------------------------------- + #IFNDEF __DEBUG_SHOW_WARNINGS + #IF __DEBUGLEVEL >= __DEBUG_ACTIVE + #DEFINE __DEBUG_SHOW_WARNINGS .T. + #ELSE + #DEFINE __DEBUG_SHOW_WARNINGS .F. + #ENDIF + #ENDIF + #IF Type( [__DEBUG_SHOW_WARNINGS] ) # "L" + #UNDEF __DEBUG_SHOW_WARNINGS + #IF __DEBUGLEVEL >= __DEBUG_ACTIVE + #DEFINE __DEBUG_SHOW_WARNINGS .T. + #ELSE + #DEFINE __DEBUG_SHOW_WARNINGS .F. + #ENDIF + __ERRMSG "__DEBUG_SHOW_WARNINGS" must be a logical value + __SHOWERROR + #ENDIF + + *-------------------------------------------------------------------------------------- + * Über die CLA Notation können Klassen in einer einzigen Eigenschaft angegeben werden. + * Der Integrator erlaubt die Anpassung an die tatsächlichen Namen. Was mit diesen bei- + * den Funktionen jedoch nicht möglich ist, ist die Anpassung der Klassennamen zur Lauf- + * zeit. Das kann aus mehreren Gründen notwendig sein: + * + * - Klassen sollen dynamisch zur Laufzeit ausgetauscht werden können, etwa um Fehler + * zu fixen. + * + * - Die CLA Notation soll unabhägig vom Speicherort der Klasse gestaltet werden. + * + * - Um die Abhängigkeit von Pfaden zu reudzieren, soll Klassenbibliothek oder Anwendung + * um einen Pfad erweitert werden. + * + * Um eine eigene Funktion für die Konvertierung der Klassennamen zu verwenden, defi- + * nieren Sie die Konstante __DECODEALC_HOOK auf den Funktionsausdruck: + * + * #DEFINE __DECODEALC_HOOK MyDecodeHook + *-------------------------------------------------------------------------------------- + #IFNDEF __DECODEALC_HOOK + #DEFINE __DECODEALC_HOOK + #ENDIF + + *-------------------------------------------------------------------------------------- + * Anwendungspfad für PE Anwendungen + *-------------------------------------------------------------------------------------- + #IFNDEF APP_PATH + #DEFINE APP_PATH + #ENDIF + + *-------------------------------------------------------------------------------------- + * Gibt an, unter welchen Bedingungen alle SQL Befehle protokolliert werden sollen. + * Die Protokollierung erfolgt über __ACODEY_LOGGING_WRITE + *-------------------------------------------------------------------------------------- + #IFNDEF __DEBUG_ODBC_STATEMENT_LOGGING + #DEFINE __DEBUG_ODBC_STATEMENT_LOGGING .F. + #ENDIF diff --git a/Demos/demo_basic.PRG b/Demos/demo_basic.PRG new file mode 100644 index 0000000..d2bbf8b --- /dev/null +++ b/Demos/demo_basic.PRG @@ -0,0 +1,6 @@ +*======================================================================================== +* Display a web page +*======================================================================================== + + DO FORM ShowHtml WITH "https://github.com/cwollenhaupt/fpCefSharp" + diff --git a/Demos/demo_evaluateScript.PRG b/Demos/demo_evaluateScript.PRG new file mode 100644 index 0000000..2f8e53f --- /dev/null +++ b/Demos/demo_evaluateScript.PRG @@ -0,0 +1,32 @@ +*======================================================================================== +* Evaluate JavaScript values using EvaluateScript +*======================================================================================== + + LOCAL loConfig + loConfig = CREATEOBJECT("MyHandler") + DO FORM ShowHtml_Examples WITH "https://myApp/index.html", m.loConfig + + +DEFINE CLASS MyHandler as Custom + + index_html = "" + + PROCEDURE Init + TEXT TO This.index_html NoShow + +
+ Text 1:
+ Text 2:
+ +
+ + ENDTEXT + + Procedure Example (toForm, tnSample) + Local lcResult + lcResult = toForm.oCefSharpBrowser.EvaluateScript ( ; + "document.getElementById('myform').innerHTML" ; + ) + MessageBox (m.lcResult) + +ENDDEFINE diff --git a/Demos/showhtml.scx.xml b/Demos/showhtml.scx.xml index d01c4b6..a66a87d 100644 --- a/Demos/showhtml.scx.xml +++ b/Demos/showhtml.scx.xml @@ -251,7 +251,8 @@ LParameter tcUrl, toConfig #ENDIF *-------------------------------------------------------------------------------------- - * Add a reference to the config object for later access. + * Wir fügen eine Referenz auf dieses Formular zum Config-Objekt hinzu, damit wir die + * Queue ansteuern können, wenn wir Daten verarbeiten. *-------------------------------------------------------------------------------------- If Vartype (m.toConfig) == T_OBJECT AddProperty (m.toConfig, "oForm", Thisform) @@ -279,14 +280,6 @@ PROCEDURE Release This.RemoveFormReference () -ENDPROC -PROCEDURE reload -*======================================================================================== -* Reloads the current document -*======================================================================================== - - This.oCefSharpBrowser.Reload (This.oleBrowser) - ENDPROC PROCEDURE removeformreference *======================================================================================== @@ -321,7 +314,6 @@ ENDPROC @@ -349,7 +341,10 @@ Caption = "Go" Name = "Command1" ]]> - + @@ -382,7 +377,10 @@ Caption = "Reload" Name = "Command2" ]]> - + @@ -416,7 +414,7 @@ Name = "oleBrowser" - + diff --git a/Demos/showhtml_examples.scx.xml b/Demos/showhtml_examples.scx.xml new file mode 100644 index 0000000..a3d2872 --- /dev/null +++ b/Demos/showhtml_examples.scx.xml @@ -0,0 +1,573 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ WINDOWS + _5VG0JHYUO + 0 + + + + + + + + + + + + + + + + + + + + + 2 + +
+ WINDOWS + _5VG0JHYUP + 0 + + + + + + + + = __DEBUG_REGULAR + Assert Vartype (m.tcUrl) == T_CHARACTER + Assert not Empty (m.tcUrl) + #ENDIF + + *-------------------------------------------------------------------------------------- + * + *-------------------------------------------------------------------------------------- + If Vartype (m.toConfig) == T_OBJECT + AddProperty (m.toConfig, "oForm", Thisform) + EndIf + + *-------------------------------------------------------------------------------------- + * We add this form's reference to the event object. + *-------------------------------------------------------------------------------------- + If Vartype (m.toEvents) == T_OBJECT + AddProperty (m.toEvents, "oForm", Thisform) + EndIf + + *-------------------------------------------------------------------------------------- + * Load CefSharp browser and bind to container + *-------------------------------------------------------------------------------------- + This.oCefSharpBrowser = NewObject ("CefSharpBrowser", "CefSharpBrowser.fxp") + This.oCefSharpBrowser.BindtoHost (This.oleBrowser, m.tcUrl, m.toConfig) + +ENDPROC +PROCEDURE QueryUnload +*======================================================================================== +* Remove the reference to this form in the config object +*======================================================================================== + + This.RemoveFormReference () + +ENDPROC +PROCEDURE Release +*======================================================================================== +* Remove the reference to this form in the config object +*======================================================================================== + + This.RemoveFormReference () + +ENDPROC +PROCEDURE reload +*======================================================================================== +* Reloads the current document +*======================================================================================== + + This.oCefSharpBrowser.Reload (This.oleBrowser) + +ENDPROC +PROCEDURE removeformreference +*======================================================================================== +* We add this form as a reference to the config object. Remove the reference here. +*======================================================================================== + + *-------------------------------------------------------------------------------------- + * Is cefSharpBrowser still available? + *-------------------------------------------------------------------------------------- + If not Vartype (This.oCefSharpBrowser) == T_OBJECT + Return + EndIf + + *-------------------------------------------------------------------------------------- + * Is there a config object? + *-------------------------------------------------------------------------------------- + If not Vartype (This.oCefSharpBrowser.oConfig) == T_OBJECT + Return + EndIf + + *-------------------------------------------------------------------------------------- + * Clear reference + *-------------------------------------------------------------------------------------- + This.oCefSharpBrowser.oConfig.oForm = null + +ENDPROC +]]> + + + + + + + + + + + + + 3 + +
+ WINDOWS + _5VG0JHYUR + 0 + + + + + + + + + + + + + + + + + + + + + 5 + +
+ WINDOWS + _5VG0JHYUS + 0 + + + + + + + + + + + + + + + + + + + + + 6 + +
+ WINDOWS + _6A10ZFVB5 + 0 + + + + + + + + + + + + + + + + + + + + + 8 + +
+ WINDOWS + _5VH0P16FP + 0 + + + + + + + + + + + + + + + + + + + + + 7 + +
+ WINDOWS + _5VG0JHYUQ + 0 + + + + + + + + + + + + + + + + + + + + + 4 + +
+ COMMENT + Screen + 0 + + + + + + + + + + + + + + + + + + + + + 1 + +
+ COMMENT + RESERVED + 0 + + + + + + + + + + + + + + + + + + + + + 9 + +
diff --git a/FoxPro/cefsharpbrowser.prg b/FoxPro/cefsharpbrowser.prg index 7acdd10..f0edb7d 100644 --- a/FoxPro/cefsharpbrowser.prg +++ b/FoxPro/cefsharpbrowser.prg @@ -384,6 +384,7 @@ Procedure GlobalInit (toBridge) This.RegisterSchemaHandlers (m.toBridge, m.loCefSettings) This.SetLanguage (m.toBridge, m.loCefSettings) loCefCommandLineArgs = toBridge.GetProperty(loCefSettings, "CefCommandLineArgs") + loCefCommandLineArgs = This.UnWrapType (m.toBridge, m.loCefCommandLineArgs) toBridge.InvokeMethod (m.loCefCommandLineArgs, "Add", "enable-media-stream", "1") toBridge.InvokeMethod (m.loCefCommandLineArgs, "Add", ; "--use-fake-ui-for-media-stream", "1") @@ -1168,7 +1169,7 @@ Procedure HandleEvents (toEvents) *-------------------------------------------------------------------------------------- Local loBridge, loSubscription loBridge = This.DotNet () - loSubscription = loBridge.SubscribeToEvents (This.oChromium, m.toEvents) + loSubscription = This.Bridge_SubscribeToEvents (m.loBridge, This.oChromium, m.toEvents) *-------------------------------------------------------------------------------------- * We maintain a collection of all subscriptions, so that we can unsubscribe from all @@ -1212,6 +1213,183 @@ Procedure HandleTitleChangedEvent (toSender, toEventArgs) * Call the config object *-------------------------------------------------------------------------------------- This.oConfig.TitleChangedEvent (m.lcTitle) - + +*======================================================================================== +* wwDotNetBridge wraps certain return values in a ComArray. +*======================================================================================== +Procedure UnWrapType (toBridge, toObject) + + *-------------------------------------------------------------------------------------- + * Assertions + *-------------------------------------------------------------------------------------- + #IF __DEBUGLEVEL >= __DEBUG_REGULAR + Assert Vartype (m.toBridge) == T_OBJECT + Assert Vartype (m.toObject) $ T_OBJECT + T_NULL + #ENDIF + + *-------------------------------------------------------------------------------------- + * Check for null values here so that we don't have to check them on every call. + *-------------------------------------------------------------------------------------- + If IsNull (m.toObject) + Return m.toObject + EndIf + + *-------------------------------------------------------------------------------------- + * Check if .NET Bridge wrapped the native object with a ComArray. + *-------------------------------------------------------------------------------------- + Local loType, lcName, loUnwrapped + loType = m.toObject.GetType () + lcName = toBridge.GetProperty (m.loType, "FullName") + If m.lcName == "Westwind.WebConnection.ComArray" + loUnwrapped = m.toObject.Instance + Else + loUnwrapped = m.toObject + EndIf + +Return m.loUnwrapped + +*======================================================================================== +* The following methods are modified versions of the ones found in Rick Strahl's +* wwDotNetBridge. They are here as a work around until pull request #26 has been merged. +* +* The following changes have been made to this code: +* +* - Changed the name of the EventSubscription class to fpCefSharp_EventSubscription +* +* - Pass in the reference to the wwDotNetBridge instance to replace "this". +* +* - Changed the name and the visibility of the SubscribeToEvents method. +* +*======================================================================================== + +************************************************************************ +* SubscribeToEvents +**************************************** +*** Function: Handles all events of a source object for subsequent retrieval by calling WaitForEvent. +*** loSource: The object for which to subscribe to events. +*** loHandler: An object with a method OnEvent(loEventName, loParams). +*** lcPrefix: The initial part of the event handler function for each event. Defaults to "On". +*** Return: A subscription object. The subscription ends when this object goes out of scope. +************************************************************************ +Protected FUNCTION Bridge_SubscribeToEvents(toBridge, loSource, loHandler, lcPrefix) +IF EMPTY(lcPrefix) + lcPrefix = "On" +ENDIF +LOCAL loSubscription +loSubscription = CREATEOBJECT("fpCefSharp_EventSubscription") +loSubscription.Setup(m.toBridge, loSource, loHandler, lcPrefix) +RETURN loSubscription +ENDFUNC +* SubscribeToEvents + EndDefine + +*======================================================================================== +* This class is a work around for a wwDotNetBridge limitation. wwDotNetBridge only works +* if you implement all events which can have unintended side effects and introduce bugs. +* +* https://github.com/RickStrahl/wwDotnetBridge/pull/26 +* +* We can remove this work around if the above pull request is ever accepted by Rick +* Strahl. For now we implement our own implementation of the subscriber class that uses +* the Subscribtion object in fpCefSharp rather than wwDotNetBrisge. +* +* This class is based on Edward Brey's contribution to wwDotNetBridge +* (https://github.com/breyed). This code relies on other classes implemented in +* wwDotNetBridge. Therefore wwDotNetBridge must be loaded, before this class can be +* instantiated. +* +* The following changes were made to Edward's code: +* +* - Changed the name of the class to avoid conflicts with wwDotNetBridge +* +* - Changed the name of the .NET EventSubscriber class to the one implemented in +* fpCefSharp.dll +* +* - All changes made in pull request #26 for wwDotNetBridge to implement an extra +* check which methods actually exist. +* +*======================================================================================== +DEFINE CLASS fpCefSharp_EventSubscription as AsyncCallbackEvents of wwdotnetbridge.prg +************************************************************* +*: Author: Edward Brey - https://github.com/breyed +*: Usage: Used internally by SubscribeToEvents +************************************************************ +HIDDEN oBridge, oHandler, oSubscriber, oPrefix + +oBridge = null +oHandler = null +oPrefix = null +oSubscriber = null + +************************************************************************ +* Setup +**************************************** +*** Function: Sets up an event subscription. +*** Assume: +*** Pass: loBridge - dnb instance +*** loSource - Source Object fires events +*** loHandler - Target Object that handles events +*** lcPrefix - prefix for event methods +*** implemented on target (defaults to "On") +************************************************************************ +FUNCTION Setup(loBridge, loSource, loHandler, lcPrefix) +this.oBridge = loBridge +this.oHandler = loHandler +this.oPrefix = lcPrefix +Private handler +handler = m.loHandler +this.oSubscriber = loBridge.CreateInstance("fpCefSharp.fpEventSubscriber", loSource, m.lcPrefix, _Vfp) +this.HandleNextEvent() +ENDFUNC + +************************************************************************ +* UnSubscribe +**************************************** +*** Function: Unsubscribes events that are currently subscribed to +************************************************************************ +FUNCTION UnSubscribe() +IF !ISNULL(THIS.oSubscriber) + this.oSubscriber.Dispose() +ENDIF +ENDFUNC + + +FUNCTION HandleNextEvent() +this.oBridge.InvokeMethodAsync(this,this.oSubscriber,"WaitForEvent") +ENDFUNC + +************************************************************************ +* OnComplete +**************************************** +*** Function: Event Proxy that forwards the event to a function +*** named On{Event} with event's parameters. +************************************************************************ +FUNCTION OnCompleted(lvResult, lcMethod) +LOCAL loParams,lParamText,lCount + +IF ISNULL(lvResult) && If the call to WaitForEvent was canceled: + RETURN +ENDIF + + +loParams=CREATEOBJECT("EMPTY") && Workaround to index into array of parameters. +lParamText = "" +IF NOT ISNULL(lvResult.Params) + lCount = 0 + FOR EACH lParam IN lvResult.Params + lCount = lCount + 1 + AddProperty(loParams,"P" + ALLTRIM(STR(lCount)),lParam) + lParamText = lParamText + ",loParams.P" + ALLTRIM(STR(lCount)) + ENDFOR +ENDIF + +IF VARTYPE(THIS.oHandler) = "O" + =EVALUATE("this.oHandler." + this.oPrefix + lvResult.Name + "("+SUBSTR(lParamText,2)+")") + this.HandleNextEvent() +ENDIF + +ENDFUNC + +ENDDEFINE \ No newline at end of file