![]() |
Dialog "Zeitzone ändern" nachbauen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DPler,
ich würde gern in meinem Programm die Option anbieten die Zeitzone des Systems zu ändern, ähnlich dem Windows Dialog. Anhang 43512 Mithilfe der Registry konnte ich mir schon eine ComboBox bauen die die Liste der Zeitzonen enthält, zumindest unter Windows XP hat dies funktioniert für Windows 7 muss ich da wohl noch was anpassen. Aber zu meinem eigentlichen Problem, wie bekomme ich raus welche Zeitzone (also aus der Liste) zur Zeit eingestellt ist? Mit GetTimeZoneInformation() z.B. erhalte ich nur "Mitteleuropäische Zeit" und nicht "(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien" wie komme ich also an letzteres ran? Und wie ändere ich dann die Zeitzone wenn ich eine andere Zone aus der Liste auswähle? Ich bin gerade etwas ratlos. :gruebel: |
AW: Dialog "Zeitzone ändern" nachbauen
Hmmm, es gibt den Dialog doch schon ... einfach in die Systemeinstellung und die Zeitzone ändern, schon wird die Zeitzone des Systems geändert.
Warum willst du einen Dialog nachbauen, obwohl es den schon gibt? Oder kann es evtl. sein, dass du die Zeitzone eigentlich nur für deine Anwendung ändern müsstest (wenn du nur wüsstest wie)? |
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
Der Anwender soll aber ein paar Optionen doch ändern können, Datum und Uhrzeit. Da habe ich gedacht warum nicht auch die Zeitzone, wichtig wäre das nicht ist mehr interessehalber ob es geht. |
AW: Dialog "Zeitzone ändern" nachbauen
Delphi-Quellcode:
Oder so - tut das Gleiche:
uses Shellapi;
... ShellExecute(Handle, 'open', 'control', 'date/time', nil, SW_SHOW); ...
Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
var FN, strParams : String; begin //rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,/ strParams:= 'shell32.dll,Control_RunDLL timedate.cpl,,/'; FN:='rundll32.exe'; ShellExecute(Application.Handle,NIL,PWChar(FN), PWChar(strParams),NIL, SW_Normal); end; |
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
|
AW: Dialog "Zeitzone ändern" nachbauen
Moin,
such mal nach "GetTimeZoneInformation" und "SetTimeZoneInformation" . . . da sollte sich noch was finden lassen. |
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
|
AW: Dialog "Zeitzone ändern" nachbauen
Die erweiterten Informationen stehen in der Registry: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
Die Frage ist jetzt, ob es dafür eine API Funktion gibt oder ob man die selbst zuordnen und auslesen muss. |
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
Die Frage ist eher steht da auch irgendwo welche Zeitzone zur Zeit aktuell eingestellt ist und lässt sich das dort ändern und wenn ja wie? Ich denke einfach etwas in der Registry ändern heißt ja nicht unbedingt das das System die Änderung auch mitbekommt und sofort anwendet. Fragen über Fragen. ;-) |
AW: Dialog "Zeitzone ändern" nachbauen
Was willst du den jetzt machen? Ich dachte dir geht es darum die erweiterten Informationen anzuzeigen? Das diese Information nur zum Lesen und Anzeigen da sind sollte wohl klar sein. Ändern der Zeitzone geht mit SetTimeZone....irgendwas.
|
AW: Dialog "Zeitzone ändern" nachbauen
Was für ein Zufall, da bin ich momentan auch grade dran: Auf einer Kiosk-Anwendung soll der Inbetriebnehmer jetzt auch die lokale Zeitzone einstellen können.
Die im System vorhandenen Zeitzonen findet man anscheinend wirklich nur, wie schon genannt, in der Registry. Dort musst du den Binarblob auslesen und kannst dir anhand der zwei weiteren Schlüssel dort wieder die Zeitzone zusammenbasteln. Wenn man auf die .NET-Gegenseite guckt, kann man echt wieder neidisch werden, da ist alles schon fertig. ![]() Wenn du noch einen Tag wartest, habe ich das fertig. Wenn du nur wissen willst was deine aktuelle Zeitzone ist, das steht auch schon unter
Delphi-Quellcode:
.
System.DateUtils.TTimeZone.Local
Die lokale Zeitzone zu ändern ist etwas kniffeliger, da musste man, meine ich, noch vorher wieder an diesen komischen Prozess-Privilegien drehen. Bis morgen kann ich das mal alles zusammenstellen. |
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
Zitat:
|
AW: Dialog "Zeitzone ändern" nachbauen
Für die Inbetriebnahme des Systems, kann man natürlich auch einen extra Benutzer anlegen mit exakt den Rechten, die der benötigt.
Dann kann der in den "normalen" Dialogen herumwurschteln und das System einstellen. Der Kiosk-Benutzer braucht das nicht zu können. |
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
Zitat:
|
AW: Dialog "Zeitzone ändern" nachbauen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo-
Es war insgesamt doch mehr Aufwand als ich gedacht hätte. Anbei ein kleines Konsolenprogramm was dir alle Zeitzonen im System auflistet (formatiert und lokalisiert) und deine lokale Zone ändern kann. Delphi 2009 war vor meiner Zeit, keine Ahnung wie viel von dem Code man da übernehmen kann. |
AW: Dialog "Zeitzone ändern" nachbauen
Ich gucke es mir Montag auf der Arbeit an. Vielen Dank schon mal das du hier deine Arbeit teilst ;-)
|
AW: Dialog "Zeitzone ändern" nachbauen
So es ist Montag und ich habe mir deinen Code angesehen, soweit sehr gut nur fehlt mir da immer noch die Möglichkeit zu sehen welche Zeitzone zur Zeit im System eingestellt ist. Oder bin ich so blind das ich diese Funktion nicht erkenne !?
|
AW: Dialog "Zeitzone ändern" nachbauen
Ich habe das nicht neu gebaut, sondern würde
Delphi-Quellcode:
aus
TTimeZone.Local
Delphi-Quellcode:
verwenden. Wenn es das bei dir noch nicht gibt, kannst du
System.DateUtils
Delphi-Quellcode:
verwenden.
WinApi.Windows.GetDynamicTimeZoneInformation(..)
Bei der Gelegenheit- Der
Delphi-Quellcode:
könnte vielleicht noch
TTimeZoneHelper
Delphi-Quellcode:
überschreiben um zu prüfen ob zwei Zeitzonen gleich sind.
Equals(..)
|
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
|
AW: Dialog "Zeitzone ändern" nachbauen
Was hast du denn sonst erwartet?
Willst du den String "(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien" haben? |
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
|
AW: Dialog "Zeitzone ändern" nachbauen
Ich hatte anhand von
Delphi-Quellcode:
verglichen und war glücklich damit.
StandardName
Das hatte es nicht mehr in den Upload geschafft.
Delphi-Quellcode:
function TTimeZoneHelper.Equals(Obj: TObject): Boolean;
var asTimeZone: TTimeZone; begin if (not (Obj is TTimeZone)) then Exit(False); asTimeZone := Obj as TTimeZone; Result := ID.Equals(asTimeZone.ID); end; |
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
Delphi-Quellcode:
... der compiler meckert aber das er mit "ID.Equals()" nichts anfangen kann.
TTimeZoneHelper = class helper for System.DateUtils.TTimeZone
protected const registryBasePath = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones'; expectedResFile = 'tzres.dll'; protected class function CreateFromRegistry( const registry: TRegistry; const fetcher: TResourceStringFetcher; const keyName: String ): TPair<TDynamicTimeZoneInformation, String>; /// <summary> /// Sortiert absteigend nach UTC-Bias. Von Greenwhich ausgehend /// also von West nach Ost. /// </summary> class procedure MakeSorted(var items: TArray<TTimeZone>); class function GetNamedSystemZones(): TDictionary<TDynamicTimeZoneInformation, String>; virtual; public class function GetZones(): TArray<TTimeZone>; class procedure SetLocalTimeZone(const value: TTimeZone); static; class function Equals(Obj: TObject): Boolean; end;
Delphi-Quellcode:
Aber naja was solls, es scheint ja irgendwie doch nicht so zu funktionieren wie ich mir das gedacht habe. Ich werde das dann wohl auf unbestimmte Zeit verschieben oder gleich ganz lassen.
class function TTimeZoneHelper.Equals(Obj: TObject): Boolean;
var asTimeZone: TTimeZone; begin if (not (Obj is TTimeZone)) then Exit(False); asTimeZone := Obj as TTimeZone; Result := ID.Equals(asTimeZone.ID); end; Vielen vielen dank Günther für deine mühen und deine Geduld ;-) |
AW: Dialog "Zeitzone ändern" nachbauen
Delphi-Quellcode:
ist ein String. Wenn der kein
ID
Delphi-Quellcode:
kennt hast du
Equals(..)
Delphi-Quellcode:
nicht in der
System.SysUtils
Delphi-Quellcode:
-Liste ;-)
uses
Ich muss aber auch sowieso noch eine grafische Oberfläche dazu bauen, habe es damit aber nicht sonderlich eilig. Wenn ich das mal gemacht habe kann ich dir ja auch nochmal Bescheid geben. Denn ich finde, es geht doch an sich alles bestens: Zeitzone feststellen, Zeitzone einstellen. Was vergessen? |
AW: Dialog "Zeitzone ändern" nachbauen
Zitat:
Windows-Zeitzonen-Hilfsprogramm Syntax: TZUTIL </? | /g | /s TimeZoneID[_dstoff] | /l> Parameter: /? Zeigt Informationen zur Syntax an. /g Zeigt die aktuelle Zeitzonen-ID an. /s TimeZoneID[_dstoff] Legt die aktuelle Zeitzone unter Verwendung der angege- benen Zeitzonen-ID fest. Mit dem Suffix "_dstoff" werden Sommerzeitanpassungen fr die Zeitzone deaktiviert (sofern zutreffend). /l Führt alle gültigen Zeitzonen-IDs und Anzeigenamen auf. Ausgabe: <Anzeigename> <Zeitzonen-ID> Beispiele: TZUTIL /g TZUTIL /s "Pacific Standard Time" TZUTIL /s "Pacific Standard Time_dstoff" Anmerkungen: Durch den Beendigungscode "0" wird angegeben, dass der Befehl erfolgreich ausgeführt wurde. Beispiel: tzutil /l >F:/timezones.txt schreibt alle gültigen Zeitzonen-IDs und Anzeigenamen in ein File. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz