CDoW()

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

CDoW()

Beitrag von AUGE_OHR »

hi,

CDoW() scheint auf die SET DATE Typen "beschränkt" zu sein.

obwohl es ja nun kein Problem ist eine eigene Function MyCDoW() zu schreiben,
wüsste ich gerne ob man das per Win API machen könnte ?
gruss by OHR
Jimmy
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Rolf Ramacher »

Hi Jimmy,

irgendwie weiß ich nicht worauf du hinauswillst. Wenn man mit Datumswerten arbeitet muß man doch einen Set Data - Angeben.
Steht in der Hilfe auch beschrieben das dies für CDow() notwendig ist.

Wolltest du das haben ohne Set Data ??? Wie soll denn dann ein vernünftiger Wert rauskommen ?
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Tom »

Ich nehme an, dass Jimmy die Funktion für Datumsangaben im julianischen oder anderen nichtkonformen Formaten benötigt. Dafür wäre aber eine Umrechnungsfunktion (derlei gibt es) sinnvoller, auf die dann CDoW() aufsetzen kann.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Jan »

Tom,

mit dem julianischen Kalender wäre das ja noch einfach. Da muß man halt einfach um 8 Tage verschieben (ich mache das in meinem Genealogieprogramm so). Aber wenn ich mir das Posting von Jimmy in der NG ansehe, dann scheint mir das Problem woanders zu liegen. Wobei ich nicht wirklich verstanden habe, was er da meint. Denn der chinesische westliche Kalender ist der gregorianische Kalender, also wäre da keine Umrechnung notwendig. Man muß "nur" den gregorianischen nach chinesisch umrechnen. Ich habe zwar einige Umrechnungsformeln, aber den nun wirklich nicht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: CDoW()

Beitrag von Günter Beyes »

Hi Jimmy,

willst du darauf hinaus, die Wochentagsnamen in einer anderen Sprache als der in Windows
eingestellten zu bekommen? Das wäre per Win API machbar.

Lass hören...

Gruss
Günter
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CDoW()

Beitrag von AUGE_OHR »

Günter Beyes hat geschrieben:willst du darauf hinaus, die Wochentagsnamen in einer anderen Sprache als der in Windows
eingestellten zu bekommen? Das wäre per Win API machbar.
JA genau das ist meine Frage.

Sorry das ich bei der Fragestellung so ungenau war den es ging um das hier
CDOW_CHINA.JPG
CDOW_CHINA.JPG (24.62 KiB) 9384 mal betrachtet
die WochenTagNamen kommen falsch raus wenn ich chinesisch verwende, deshalb suche ich eine API
die mir das vom System wiedergeben kann den das ist wohl in der XppNAT.DLL verankert.
What would you like to achieve by having CDow() in xppsys? If you need to
change the character-strings or want to create a different culture/locale
you can create a copy of the xppnat.dll and use a resource-editor such as resource
hack. Edit the resource-ids 10050 - 10056 and you are all set.

In general xppnat is per definition the only part of the Xbase++ runtime
which is allowed to hold constants which are culture/locale specific.
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Jan »

Hallo Jimmy,

das Bild kennen wir ja aus der NG schon. Aber mangels umfassender Chinesischkenntnisse konnte ich da keinen Fehler dan erkennen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CDoW()

Beitrag von AUGE_OHR »

Jan hat geschrieben:das Bild kennen wir ja aus der NG schon. Aber mangels umfassender Chinesisch kenntnisse konnte ich da keinen Fehler da erkennen.
hm ... ja ... "Chinesisch kenntnisse" ... :)

Code: Alles auswählen

   SET EPOCH TO YEAR( DATE() ) - 50
   SET CENTURY ON
   IF ID_CHINA
      SET DATE SYSTEM
      SET DATE FORMAT TO "mm-dd-yyyy"
   ELSE
      SET DATE GERMAN
      SET DATE FORMAT TO "dd.mm.yyyy"
   ENDIF

   CDOW((::FAHRBUCH)->DATUM)+" "+DtoC( (::FAHRBUCH)->DATUM )}
es geht um die Zeile im Browser.
beim Calender stehen die Tage doch in der oberen Reihe
CDOW_GERMAN.JPG
CDOW_GERMAN.JPG (22.35 KiB) 9376 mal betrachtet
und die stimmen unter chinesichem OS() dann nicht
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Jan »

Jimmy,

klar, die Wochentage stehen oben. Aber mit welchem Tag fängt die chinesische Woche an? Montag wie bei uns? Oder Sonntag wie bei den Amis? Oder noch was anderes? und da ich die chinesischen Schriftzeichen wie gesagt nicht wirklich entziffern kann hat das Bild mir eigentlich nix gesagt in Bezug auf Dein Problem.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Tom »

Und was spricht dagegen, das hardcodiert zu machen? Immerhin liefert DoW() ja immer die selbe Nummer, und anhand dieser könnte man (ID_CHINA) die entsprechenden Texte in einer überlagerten Funktion CDoW() retournieren.
Herzlich,
Tom
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: CDoW()

Beitrag von Günter Beyes »

Hi Jimmy,

das müsste ganz ohne Resource Hacker ( :shock: ) mit GetLocaleInfoA aus kernel32.dll gehen, siehe auch

http://msdn.microsoft.com/en-us/library ... nd%29.aspx

also in etwa

Code: Alles auswählen

/* Diese Funktion gibt einen Leerstring zurück, 
falls das System eine gegebene Sprachkennung nicht unterstützt, 
oder falls ein Parameterfehler vorliegt.*/

FUNCTION GetLocaleInfo( nLanguage, nInfoType )

local rc
local cData
local nLen

nLen := 50 // nehmen wir mal an

cData := space( nLen )

rc := GetLocaleInfoA( nLanguage, nInfoType, @cData, nLen )

/*
Korrekterweise müsste man die Länge des Strings, der per Referenz zurück erwartet wird, vorher ermitteln:

nLen  := GetLocaleInfoA( nLanguage, nInfoType, " ", 0 )
cData := space( nLen )

rc := GetLocaleInfoA( nLanguage, nInfoType, @cData, nLen )

*/

return left( cData, rc )
mit

Code: Alles auswählen

dllfunction GetLocaleInfoA( nLanguage, nInfoType, @cData, nLenData ) ;
using stdcall from kernel32.dll
Parameter nLanguage gibt die Sprache und Sprachvariante (genauer gesagt Kombination aus Sprache und Region) an.

Welche Sprachen (zumindest für die Anzeige von Tages- und Monatsnamen und ähnliche Zwecke) auf einem System verfügbar sind, zeigt z.B. das Tool LocaleExplorer von http://www.flounder.com in den Tab-Panels "EnumSystemLocales" und "CalendarInfo". Auch zeigt das Tab-Panel "EnumLanguageGroupLocales" die unterschiedlichen Kennungen nach Sprachfamilien untergliedert und nach Sprachen sortiert. Das Tool -- das einzige seiner Art, das ich kenne -- kann man unter http://www.flounder.com/localeexplorer.zip kostenlos herunterladen; nach dem Entpacken findest du LocaleExplorer.exe im Unterverzeichnis mvp_tips\LocaleExplorer\Unicode_Release.

Damit kannst du auch die Kennung deiner benötigten Chinesisch-Variante ermitteln.

Die Wochentagsnamen erhältst du, wenn du als Parameter nInfoType einen der Werte aus dem Bereich 0x2A ... 0x30 übergibst
( 0x2A = Montag ).

Gibt es im Chinesischen auch Abkürzungen für die Wochentagsnamen? Dann wären stattdessen 0x31 bis 0x37 angesagt.

Andere Parameterwerte (für Monatsnamen und vieles mehr) findest du bei Bedarf unter
http://msdn.microsoft.com/en-us/library ... nd%29.aspx

Gruss
Günter
Zuletzt geändert von Günter Beyes am Do, 23. Jul 2009 14:38, insgesamt 1-mal geändert.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CDoW()

Beitrag von AUGE_OHR »

Jan hat geschrieben:klar, die Wochentage stehen oben. Aber mit welchem Tag fängt die chinesische Woche an? Montag wie bei uns? Oder Sonntag wie bei den Amis? Oder noch was anderes? und da ich die chinesischen Schriftzeichen wie gesagt nicht wirklich entziffern kann hat das Bild mir eigentlich nix gesagt in Bezug auf Dein Problem.
Analog "denken" :)
beide Bilder sind doch gleich, also muss die Beschriftung "analog" sein

@Tom
klar habe ich ja

FUNCTION MYCDOW(dDate)
LOCAL nTag := DOW(dDate)
LOCAL cRet := ""

IF ID_CHINA
DO CASE
CASE nTag = 1 ; cRet := "琍戳ら"
CASE nTag = 2 ; cRet := "琍戳"
CASE nTag = 3 ; cRet := "琍戳"
CASE nTag = 4 ; cRet := "琍戳"
CASE nTag = 5 ; cRet := "琍戳"
CASE nTag = 6 ; cRet := "琍戳き"
CASE nTag = 7 ; cRet := "琍戳せ"

ENDCASE
ELSE
DO CASE
CASE nTag = 1 ; cRet := "Sonntag"
CASE nTag = 2 ; cRet := "Montag"
CASE nTag = 3 ; cRet := "Dienstag"
CASE nTag = 4 ; cRet := "Mittwoch"
CASE nTag = 5 ; cRet := "Donnerstag"
CASE nTag = 6 ; cRet := "Freitag"
CASE nTag = 7 ; cRet := "Samstag"
ENDCASE
ENDIF

RETURN cRet

aber an dem Beispiel, was FALSCH ist, siehst du das Problem. Ich kann es nur auf dem
Notebook wo chinesiches OS() drauf ist, machen. schon ein copy/paste wie hier gibt
falsche Ergebnisse.

die Antwort von Steffen zeigt doch das Alaska da noch was "fehlt"

@Guenter (sorry hier keine Umlaute)
JA ich dachte mir doch doch das da was gehen muss, den der Codejock Calender zeigt es ja "richtig" an.
Ich werde mir erlauben deine Msg an Steffen weiter zu leiten,Danke
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Jan »

AUGE_OHR hat geschrieben:Analog "denken" :)
beide Bilder sind doch gleich, also muss die Beschriftung "analog" sein
Jimmy, ich gebs auf. :dontknow: Ich seh da nix gleiches, und chinesisch kann ich immer noch nicht. Aber da Du ja jetzt eine Lösung hast, können wir das auch lassen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: CDoW()

Beitrag von Günter Beyes »

Hi Jimmy,

hat du mal probiert, was SetLocale( NLS_SDAYNAME1 ) in deiner Anwendungsumgebung auf dem chinesischen und nicht-chinesischen OS ausgibt? Es sollte der Name für "Montag" sein.

Gruss
Günter
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CDoW()

Beitrag von AUGE_OHR »

Günter Beyes hat geschrieben:hat du mal probiert, was SetLocale( NLS_SDAYNAME1 ) in deiner Anwendungsumgebung auf dem chinesischen und nicht-chinesischen OS ausgibt? Es sollte der Name für "Montag" sein.
auf dem German OS() bekomme ich 0407 Montag aber auf dem chinesischen OS() bekomme ich
MYNATION.JPG
MYNATION.JPG (34.1 KiB) 9315 mal betrachtet
und das ist falsch, aber frage mich nicht "was" da steht (das muss ich erst erfragen) ...

da der "Code" aber der selbe ist "müsste" die erste Zeile sowas wie "0407" sein und die 2nd Reihe
sieht mir nicht wie "Donnerstag" aus"

@Jan : die Beschriftung mit "-" (querstrich) ist Montag, die mit "=" (2x querstrich) ist Dienstag
und mit 3x querstrich (habe ich nicht auf der Tastatur) wäre Mittwoch ...

Code: Alles auswählen

#include "DLL.CH"
#include "OS.CH"
#include "NLS.CH"

/* Diese Funktion gibt einen Leerstring zur³ck,
falls das System eine gegebene Sprachkennung nicht unterst³tzt,
oder falls ein Parameterfehler vorliegt.*/

#define Montag                      0x2A
#define Dienstag                    0x2B
#define Mittwoch                    0x2C
#define Donnerstag                  0x2D
#define Freitag                     0x2E
#define Samstag                     0x2F
#define Sonntag                     0x30

#define Mo                          0x31
#define Di                          0x32
#define Mi                          0x33
#define Do                          0x34
#define Fr                          0x35
#define Sa                          0x36
#define So                          0x37

#define LOCALE_INVARIANT            0x007F
#define LOCALE_SYSTEM_DEFAULT       0x0800
#define LOCALE_USER_DEFAULT         0x0400

// VISTA and later

#define LOCALE_CUSTOM_DEFAULT       0x0C00
#define LOCALE_CUSTOM_UI_DEFAULT    0x1400
#define LOCALE_CUSTOM_UNSPECIFIED   0x1000


#define CAL_GREGORIAN               1  // Gregorian (localized)
#define CAL_GREGORIAN_US            2  // Gregorian (English strings always)
#define CAL_JAPAN                   3  // Japanese Emperor Era
#define CAL_TAIWAN                  4  // Taiwan calendar
#define CAL_KOREA                   5  // Korean Tangun Era
#define CAL_HIJRI                   6  // Hijri (Arabic Lunar)
#define CAL_THAI                    7  // Thai
#define CAL_HEBREW                  8  // Hebrew (Lunar)
#define CAL_GREGORIAN_ME_FRENCH     9  // Gregorian Middle East French
#define CAL_GREGORIAN_ARABIC        10 // Gregorian Arabic
#define CAL_GREGORIAN_XLIT_ENGLISH  11 // Gregorian transliterated English
#define CAL_GREGORIAN_XLIT_FRENCH   12 // Gregorian transliterated French
#define CAL_UMALQURA                23 // Windows Vista and later: Um Al Qura (Arabic lunar) calendar


DLLFUNCTION GetLocaleInfoA( nLanguage, nInfoType, @cData, nLenData ) using stdcall from kernel32.dll


PROCEDURE MAIN
LOCAL cCountry
LOCAL ID_CHINA
LOCAL x

   cCountry := SetLocale( NLS_ICOUNTRY )
   IF VAL( cCountry ) = 49
      ID_CHINA := .F.

   ELSE
      ID_CHINA := .T.
   ENDIF

   DO CASE
      CASE OS( OS_FAMILY ) == "WIN9X"
         IF ID_CHINA == .T.
            ? x := GetLocaleInfo( LOCALE_USER_DEFAULT, CAL_TAIWAN )
         ELSE
            ? x := GetLocaleInfo( LOCALE_USER_DEFAULT, CAL_GREGORIAN )
         ENDIF

      CASE OS( OS_FAMILY ) == "WINNT"
         IF ID_CHINA == .T.
            ? x := GetLocaleInfo( LOCALE_USER_DEFAULT, CAL_TAIWAN )
         ELSE
            ? x := GetLocaleInfo( LOCALE_USER_DEFAULT, CAL_GREGORIAN )
         ENDIF

      CASE OS( OS_FAMILY ) == "VISTA"
         IF ID_CHINA == .T.
            ? x := GetLocaleInfo( LOCALE_CUSTOM_DEFAULT, CAL_TAIWAN )
         ELSE
            ? x := GetLocaleInfo( LOCALE_CUSTOM_DEFAULT, CAL_GREGORIAN )
         ENDIF

   OTHERWISE
   ENDCASE

   ? SetLocale( NLS_SDAYNAME1 )

   WAIT
RETURN


FUNCTION GetLocaleInfo( nLanguage, nInfoType )
local rc
local cData
local nLen

nLen := 50 // nehmen wir mal an

cData := space( nLen )

rc := GetLocaleInfoA( nLanguage, nInfoType, @cData, nLen )

gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: CDoW()

Beitrag von Günter Beyes »

Hi Jimmy,

Code: Alles auswählen

#define CAL_GREGORIAN               1  // Gregorian (localized)
#define CAL_TAIWAN                  4  // Taiwan calendar

IF ID_CHINA == .T.
   ? x := GetLocaleInfo( LOCALE_USER_DEFAULT, CAL_TAIWAN )
ELSE
   ? x := GetLocaleInfo( LOCALE_USER_DEFAULT, CAL_GREGORIAN )
ENDIF
was erwartest du hier zu sehen?

Der Präprozessor macht aus CAL_GREGORIAN und CAL_TAIWAN die Werte 1 und 4. GetLocaleInfo akzeptiert die zwar, sie haben aber per Dokumentation nichts mit dem Kalender zu tun.

Code: Alles auswählen

#define LOCALE_ILANGUAGE        1 // Language identifier with a hexadecimal value
#define LOCALE_SNATIVELANGNAME  4 // Native name of language
"0407" ist die Sprachkennung für "Deutsch (Deutschland)"; ist
Chinesisch.JPG
Chinesisch.JPG (2.12 KiB) 9262 mal betrachtet
dann "Chinesisch (Taiwan)" ?

Gruss
Günter
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von hschmidt »

Hallo Jimmy,
Analog "denken"
beide Bilder sind doch gleich, also muss die Beschriftung "analog" sein
das stimmt nicht, beim deutschen Kalender fängt die Woche mit Montag (z.B. 20.07) an, bei deinem chinesischen Kalender mit Sonntag (19.07).
Vielleicht stimmen die Beschriftungen doch?

Hans
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Jan »

Hans,

genau das wollte ich weiter oben sagen. Leider war das für Jimmy nicht so eindeutig.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CDoW()

Beitrag von AUGE_OHR »

@Hans und Jan

Ja , jetzt verstehe ich was ihr meint. Ich meinte nur die "analogie" zwischen Calender Beschriftung
und dem Browser wo ich ja das Problem habe.
Günter Beyes hat geschrieben:was erwartest du hier zu sehen?
gute Frage ... keine Ahnung
Günter Beyes hat geschrieben:Der Präprozessor macht aus CAL_GREGORIAN und CAL_TAIWAN die Werte 1 und 4. GetLocaleInfo akzeptiert die zwar, sie haben aber per Dokumentation nichts mit dem Kalender zu tun.
uups ... dann bin ich auf dem "Holzweg" ?

Ich gebe ja zu, wie bei allem neuen, das ich es noch nicht "verstehe" und es einfach nur probiere,
aber ich habe scheinbar ja noch nicht mal die Konstanten die ich wohl benötige.

Nun fange ich aber zumindest an zu verstehen warum Alaska da einen grossen Bogen drumrum
gemacht hat. Eine "worldwide" XppNAT wird wohl doch nicht "so einfach" zu realisieren sein.

Obwohl das wohl eher eine Sache von Alaska ist (habe es ja schon in die Wishgroup geschrieben)
würde ich dennoch gerne raus bekommen "wie" das nun funktioniert und welche Konstanten ich
dafür benötige. also wenn jemand (= Günter) weiter Tips hätte ... danke.
gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: CDoW()

Beitrag von Günter Beyes »

Hallo Jimmy,

die Beschreibung der Funktionsparameter und die Namen und Bedeutung der Konstanten findest du in der MSDN-Doku, leider nicht die dazugehörigen #defines. Ich hänge mal eine passende Include-Datei an.

Deine Bemerkung mit dem Holzweg verstehe ich nicht ganz. Du wolltest doch wohl irgendwas bezüglich des Kalenders abfragen? Ich war nur etwas irritiert, dass du der Funktion "Hausnummern" als Parameter vorsetzt. Die Werte stehen doch auch im Netz...


Den Kalendertyp kannst du mit LOCALE_ICALENDARTYPE ( 0x1009 ) abfragen, den ersten Tag der Woche mit LOCALE_IFIRSTDAYOFWEEK ( 0x100C )

Übrigens holt xppnat.dll laut der Hilfe zu SetLocale() wohl die meisten Einstellungen vom Betriebssystem!

Gruss
Günter
winnls.zip
(1.97 KiB) 186-mal heruntergeladen
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CDoW()

Beitrag von AUGE_OHR »

erstmal DANKE

nun habe ich es wohl begriffen, dein Hinweis zu SetLocale() hat mir die Konstanten gezeigt die ich
verwenden muss. Zusammen mit dem LocaleExplorer ( WOW !!!) denke ich hab ich nun verstanden
was du mit "Hausnummer" meintest.

"analog" zum SetLocale() Help Demo muss man statt den NLS_* die LOCALE_* verwenden wobei
ich NLS_SYES und NLS_SNO ("J","N") nicht finde ... aber das hat ja auch nichts mit dem Datum
zu tun.

hiermit "müsste" man nun die gesuchten Werte bekommen

Code: Alles auswählen

? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_ICOUNTRY    )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SLIST       )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL    )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_STHOUSAND   )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SCURRENCY   )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_ICURRENCY   )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_ICURRDIGITS )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDATE       )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_IDATE       )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_ICENTURY    )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_STIME       )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_ITIME       )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_S1159       )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_S2359       )

? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDAYNAME1 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDAYNAME2 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDAYNAME3 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDAYNAME4 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDAYNAME5 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDAYNAME6 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDAYNAME7 )

? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME1 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME2 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME3 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME4 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME5 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME6 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME7 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME8 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME9 )
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME10)
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME11)
? x := GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SMONTHNAME12)
LOCALE_SYSTEM_DEFAULT oder LOCALE_USER_DEFAULT ist nur noch die Frage
Günter Beyes hat geschrieben:Übrigens holt xppnat.dll laut der Hilfe zu SetLocale() wohl die meisten Einstellungen vom Betriebssystem!
JA ... aber ... es ist im XbpBrowse "falsch"

... irgendwas muss wohl doch was bei Xbase++ "sein", den es gibt Unteschiede
CHINA_DATE_DBCS.JPG
CHINA_DATE_DBCS.JPG (94.75 KiB) 9172 mal betrachtet
ich würde mal sagen das die Jungs von Alaska "nur" mit 2stelligen Country Code rechnen [-X

ich habe mir noch nicht, per Resourcen Hacker, die bestreffenden Stellen angesehen,
was da wohl fuer Konstanten LOCALE_* stehen... hm ...
gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: CDoW()

Beitrag von Günter Beyes »

Hi Jimmy,

zunächst eine kleine Korrektor zu GetLocaleInfo(). Damit dürfte das abwegige Zeichen am Stringende beseitigt sein.

Code: Alles auswählen

FUNCTION GetLocaleInfo( nLCID, nInfoType )

local rc
local cData
local nLen

// Länge des Strings, der per Referenz zurück erwartet wird, ermitteln:

nLen  := GetLocaleInfoA( nLCID, nInfoType, " ", 0 )
cData := space( nLen )

rc := GetLocaleInfoA( nLCID, nInfoType, @cData, nLen )

// abschließende binäre Null beseitigen
return left( cData, rc-1 )
LOCALE_SYSTEM_DEFAULT oder LOCALE_USER_DEFAULT ist nur noch die Frage
LOCALE_USER_DEFAULT dürfe besser passen. Man kann auf einem System mehrere Sprachen installieren, und die Gebietsschemaeinstellung kann benutzerspezifisch sein.

Und nein, Alaska rechnet wohl nicht mit nur zweistelligen Länderkennungen. SetLocale() erkennt dein System offenbar nicht als taiwanesisch an -- NLS_ICOUNTRY = 86 ist die Landeskennung der Volksrepublik China! Andererseits erkennt GetLocaleInfo() ja wie es scheint korrekt die taiwanesischen Einstellungen als Systemdefault, so dass es eventuell doch ein Fall für Alaska wäre. Hoffentlich wird kein Politikum daraus -- SCNR

Gruss
Günter
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CDoW()

Beitrag von AUGE_OHR »

Danke, Danke, Danke
Günter Beyes hat geschrieben:Und nein, Alaska rechnet wohl nicht mit nur zweistelligen Länderkennungen. SetLocale() erkennt dein System offenbar nicht als taiwanesisch an -- NLS_ICOUNTRY = 86 ist die Landeskennung der Volksrepublik China! Andererseits erkennt GetLocaleInfo() ja wie es scheint korrekt die taiwanesischen Einstellungen als Systemdefault, so dass es eventuell doch ein Fall für Alaska wäre.
Tja wer hätte mit sowas gerechnet, die Jungs von Alaska auf jeden Fall nicht.
das mit dem 2-stellig war nur eine Überlegung von mir als ich die 3-stellige sah.

Da aber unser Ergebniss "richtig" ist muss das von Alaska "falsch" sein
Günter Beyes hat geschrieben:Hoffentlich wird kein Politikum daraus -- SCNR
nicht wenn Alaska den BUG eingesteht und ihn schnell "kostenlos" behebt ...
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Martin Altmann »

Hallo Jimmy,
AUGE_OHR hat geschrieben:
Günter Beyes hat geschrieben:Hoffentlich wird kein Politikum daraus -- SCNR
nicht wenn Alaska den BUG eingesteht und ihn schnell "kostenlos" behebt ...
das war sicherlich nicht auf Alaska gemünzt, sondern auf das Problem VR China / Taiwan :!: 8)

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: CDoW()

Beitrag von Martin Altmann »

Jimmy,
Du hast Steffens Antwort in der Newsgroup gelesen und verstanden?
Wenn Du SetLocale() und GetLocalInfo() mit anderen Sprachen nutzen willst, mußt Du sicherstellen, dass Du in ANSI arbeitest :!:
Also SET CHARSET TO ANSI und Schriftart und dessen codepage für Dein Ausgabefenster entsprechend setzen (XbpFont:CodePage)
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Antworten