Bei Windows die Systemzeit verändern?

Antworten
ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Bei Windows die Systemzeit verändern?

Beitrag von ErnstVolker »

Hallo zusammen,

ich hatte Freitag Abend eine Idee für ein Lazarusprogrämmchen. Also erst mal Free Pascal Buch studiert.

Ich möchte die Systemzeit auslesen (das geht prima -DecodeTime-), verändern und dann zurückschreiben. Also die Uhr stellen sozusagen.

Hier mein Code:

Code: Alles auswählen

procedure TForm1.ZeitTimer(Sender: TObject);
begin
  LabUhr.Caption:=TimeToStr(Time); //Einfach nur die Zeit ineinem Label ausgeben.
end;


Code: Alles auswählen

procedure TForm1.StelleClick(Sender: TObject);
var AHH, AMM, ASS, AMS, NHH, NMM, NSS, NMS: Word;
    UhrZeit: TDateTime;
begin
  randomize;
  DecodeTime(Time,AHH,AMM,ASS,AMS);
  NMM:= StrToInt(Minuten.Caption); //Hier werden aus einer Combobox die Minuten erstmal vorgegeben
  NSS:= random(9) + ASS; // Hier zu den "alten Sekunden ASS" welche hinzugefügt...
  if (NSS>=60) then
     begin
       NMM:= NMM + 1; //NMM sind "Neue Minuten"
       NSS:= NSS - 60;
     end;
  NMM:= AMM + NMM + random(9);
  NHH:= AHH;
  if (NMM>=60) then
     begin
       NHH:= NHH + 1;
       NMM:= NMM - 60;
     end;
  UhrZeit:= EncodeTime(NHH,NMM,NSS,AMS); //Hier wird die Uhrzeit zusammengebaut...
  SetLocalTime(UhrZeit); //... und hier wollte ich sie dem System füttern.
end;


SetLocalTime kennt Lazarus scheinbar nicht. Und die Variable "Uhrzeit" müsste hierfür auch vom Typ TSystemTime und nicht TDateTime sein. Aber das könnte man sicherlich umwandeln. Hilft da DateUtils weiter?

Hat vielleicht jemand eine Idee?
Vielen Dank!!!

Gruß
Volker

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bei Windows die Systemzeit verändern?

Beitrag von ErnstVolker »

Nach ein wenig suchen im Delphi-Forum Hab's mit Delphi erledigt.

Hier der Code:

Code: Alles auswählen

procedure TForm1.StelleClick(Sender: TObject);
var AHH, AMM, ASS, NHH, NMM, NSS: Word;
    UhrZeit, SystemZeit: TSystemTime;
begin
  randomize;
  GetLocalTime(SystemZeit);
  AHH:=SystemZeit.wHour;
  AMM:=SystemZeit.wMinute;
  ASS:=SystemZeit.wSecond;
  NMM:= StrToInt(Minuten.Text);
  NSS:= random(9) + ASS;
  if (NSS>=60) then
     begin
       NMM:= NMM + 1;
       NSS:= NSS - 60;
     end;
  NMM:= AMM + NMM + random(9);
  NHH:= AHH;
  if (NMM>=60) then
     begin
       NHH:= NHH + 1;
       NMM:= NMM - 60;
     end;
  UhrZeit:=SystemZeit;
  UhrZeit.wHour:=NHH;
  UhrZeit.wMinute:=NMM;
  UhrZeit.wSecond:=NSS;
  SetLocalTime(UhrZeit);
  PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
end;


Den Umtausch von SystemZeit nach UhrZeit braucht man wahrscheinlich nicht.

GetLocalTime gibt's in Lazarus. SetLocalTime allerdings nicht, auch nicht im Free Pascal Buch. Das liegt wohl an der Plattformunabhängigkeit.

Apropos Plattform:

Ich nutze hier auf meinem Rechner vom Nahrungsmittelgrundversorgungspunkt auch Eine OpenSuse11 Distribution. (Man glaubt es kaum)
Zunächst Platte formatiert, XP rauf und hinterher OpenSuse mit Bootmanager usw. Auch wie immer Bücher dazu gekauft...
Lazarus habe ich ebenfalls installiert nur kann ich mit der IDE nicht arbeiten weil die Grafik so mies ist, daß ich die Menüleiste nicht identifizieren kann. Auch das Nachinstallieren von Grafiktreibern hat nix geholfen.
Hat da vielleicht noch jemand einen Tipp?

Gruß und Danke

Volker

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Bei Windows die Systemzeit verändern?

Beitrag von knight »

ErnstVolker hat geschrieben:
Ich nutze hier auf meinem Rechner vom Nahrungsmittelgrundversorgungspunkt auch Eine OpenSuse11 Distribution. (Man glaubt es kaum)
Zunächst Platte formatiert, XP rauf und hinterher OpenSuse mit Bootmanager usw. Auch wie immer Bücher dazu gekauft...
Lazarus habe ich ebenfalls installiert nur kann ich mit der IDE nicht arbeiten weil die Grafik so mies ist, daß ich die Menüleiste nicht identifizieren kann. Auch das Nachinstallieren von Grafiktreibern hat nix geholfen.
Hat da vielleicht noch jemand einen Tipp?

Gruß und Danke

Volker


Zunächst wären da die üblichen Fragen nach den verwendeten Versionen sowie der Installationsart. Wie mies ist denn die Grafik? Fehlt es an der Auflösung, sind die Farben nicht in Ordnung oder lassen sich die Schriften nicht lesen?

knight

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bei Windows die Systemzeit verändern?

Beitrag von ErnstVolker »

Hallo knight,

meine OpenSuse ist die 11.1-2.6.27.39-0.2.
Grafikkarte NVIDIA Geforce GT140.

Die Farben sin in Ordnung. Die Schriftauflösung und Darstellung ist kaum leserlich.
Die Buchstaben des Objektinspektors, CodeExplorer, Menüleiste usw. srehen verwaschen nebeneinander. Kaum zu Entziffern.
Im Quelltexteditor geht's einigermaßen, weil Schriftart groß genug.

Gruß

Volker

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Bei Windows die Systemzeit verändern?

Beitrag von knight »

Ich meinte vor allem die Versionen von Lazarus und FPC und die Frage, wie du sie installiert hast (Pakete, SVN, ...). Wenn es Probleme mit den Schriften gibt - hast du schon versucht, eine andere Schriftart einzustellen?

knight

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bei Windows die Systemzeit verändern?

Beitrag von ErnstVolker »

Hallo, hier nochmal was zum ursprünglichenThema:

Mit Visual Basic konnte ich meinen Zeitmanipulator ebenfalls realisieren. Durch googeln fand ich das hier:

Code: Alles auswählen

Declare Function SetSystemTime Lib "kernel32" _
        (ByRef lpSystemTime As SYSTEMTIME) As UInt32
    Declare Function GetSystemTime Lib "kernel32" _
        (ByRef lpSystemTime As SYSTEMTIME) As UInt32


Damit war es möglich Datum und Zeit zu lesen, ändern, und wieder zurück. Da es sich bei kernel32 un eine dll handelt, dachte ich in Lazarus folgendes zu probieren:

Code: Alles auswählen

private
    { private declarations }
  public
    { public declarations }
  end;
 
procedure SetSystemTime(var SetZeit: TSystemTime); external 'kernel32';   //Sitzen die Prozeduren...
procedure GetSystemTime(var GetZeit: TSystemTime); external 'kernel32'//... an der falschen Stelle im Quelltext?
var
  Form1: TForm1;
 
implementation

Das Projekt wird auch tadellos gebaut, nur bei der Ausführung gibt es: "Access violation"
Ich habe auch Testweise die kernel32.dll aus windows\system32 herauskopiert und in mein Projektverzeichnis getan. Aber immer Access violation...

Das kann doch nicht sein, daß so was wie die Uhrzeit zu verstellen mit Lazarus nicht geht. Es funzt mit Delphi 7 und mit VB 2008. Das sollte doch auch hier funktionieren.
Daß meine ActiveX Geschichten nicht gehen, das konnt ich dem Lazarus-Buch entnehmen. Aber das daß hier nicht gehen will...

Hat jemand evtl. eine Idee? Ich danke im voraus!!!

Gruß

Volker

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Bei Windows die Systemzeit verändern?

Beitrag von Hitman »

ErnstVolker hat geschrieben:

Code: Alles auswählen

procedure SetSystemTime(var SetZeit: TSystemTime); external 'kernel32';   //Sitzen die Prozeduren...
procedure GetSystemTime(var GetZeit: TSystemTime); external 'kernel32'//... an der falschen Stelle im Quelltext?


Das is mit Sicherheit falsch. Wenn du das selbst deklarierst, dann als stdcall! Aber warum nicht einfach uses Windows; ?

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bei Windows die Systemzeit verändern?

Beitrag von ErnstVolker »

Hallo Hitman,

wird die Windows-unit nicht automatisch unter uses eingefügt wenn man eine Windows-Form Anwendung auswählt?

Ich habe meinen Quelltext momentan nicht zur Verfügung, deshalb kann ich nicht reingucken.

Aber SetLocalTime oder SetSystemTime gibt es bei Lazaraus scheinbar nicht. Die Zeiten und Datum auslesen geht, zurückschreiben nicht.

Oder geht es bei Dir?

Gruß

Volker

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Bei Windows die Systemzeit verändern?

Beitrag von theo »

ErnstVolker hat geschrieben:wird die Windows-unit nicht automatisch unter uses eingefügt wenn man eine Windows-Form Anwendung auswählt?

Nö, soll ja cross platform bleiben soweit möglich.

ErnstVolker hat geschrieben:Aber SetLocalTime oder SetSystemTime gibt es bei Lazaraus scheinbar nicht.


Afaics schon. Wahrsch. In Include Files für die Unit Windows:

So ist das definiert:
procedure GetSystemTime(lpSystemTime:LPSYSTEMTIME); external 'kernel32' name 'GetSystemTime';
procedure GetLocalTime(lpSystemTime:LPSYSTEMTIME); external 'kernel32' name 'GetLocalTime';
function SetSystemTime(lpSystemTime:LPSYSTEMTIME):WINBOOL; external 'kernel32' name 'SetSystemTime';
function SetLocalTime(lpSystemTime:LPSYSTEMTIME):WINBOOL; external 'kernel32' name 'SetLocalTime';

Aber mal ehrlich: Stell doch die Systemuhr mit den Anwendungen des Betriebssystems. Unter Linux brauchst du da sowieso Root-Rechte.

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Bei Windows die Systemzeit verändern?

Beitrag von shokwave »

ErnstVolker hat geschrieben:Ich nutze hier auf meinem Rechner vom Nahrungsmittelgrundversorgungspunkt auch Eine OpenSuse11 Distribution. (Man glaubt es kaum)
Zunächst Platte formatiert, XP rauf und hinterher OpenSuse mit Bootmanager usw. Auch wie immer Bücher dazu gekauft...
Lazarus habe ich ebenfalls installiert nur kann ich mit der IDE nicht arbeiten weil die Grafik so mies ist, daß ich die Menüleiste nicht identifizieren kann. Auch das Nachinstallieren von Grafiktreibern hat nix geholfen.
Hat da vielleicht noch jemand einen Tipp?


Hatte neulich einen ähnlichen Effekt, als ich mir openSUSE 11.2 in 'ner VM eingerichtet hatte. Lazarus und FPC von http://software.opensuse.org/search/ mit "1-Klick" installiert. Das Problem war einfach, dass Lazarus mit GTK2 installiert wurde. Lösung: das Paket "QT4Pas-devel" aus dem Pacman Repository installieren und Lazarus mit QT neu erstellen.
mfg Ingo

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Bei Windows die Systemzeit verändern?

Beitrag von ErnstVolker »

Hallo und Tausend Dank!!

Das Leben kann sooooo einfach sein. Bei uses Windows eingefügt und schon läufts...

Wie ich geschrieben habe, habe ich vorher im Free Pascal 2 Buch über die Funktionen zur Zeit nachgelesen. Und in der Beschreibung zur Unit SysUtils stand das mit GetLocalTime. Und die wird automatisch unter uses eingefügt. Windows nicht, obwohl auf einer Windowsmaschine eine Windows Anwendung gewählt wurde.

Aber eben habe war ich neugierig und wollte mal mit IntelliSense -oder wie sich das nennt wenn nach dem Punkt das Fenster aufklappt- in SysUtils reingucken. Und siehe da, es gibt nicht nur GetLocalTime, sondern auch SetLocalTime sowie Get und Set für SystemTime. In der Windows Unit natürlich auch.

Jetzt wundert mich allerdings, weshalb eine Fehlermeldung beim Compilieren kommt, daß SetLocalTime unbekannt wäre, obwohl doch in SysUtils vorhanden? (sofern die windows unit nicht eingebunden ist).
Und wie kommt es, daß sich SysUtils und Windows nicht in die Quere kommen, wenn beide dieselben Prozeduren und Funktionen enthalten?

Wird das über die Compiler-Direktiven gesteuert?

Was ich noch anmerken muß:
Hier punkten Lazarus und Delphi deutlich vor Visual Basic. Man braucht den "Declare Function Drösel" nicht um die kernel-dll zu laden.
Das wird in Lazarus/Delphi vermutlich in der Windows-unit vorweg erledigt. Denn irgendwie muß die Zeit ja auf's System zurück...

Was mein Linux angeht, werd ich wohl mal einen eigenen Thread eröffnen. Aber momentan bin ich mehr unter Windows aktiv, da mir Linux trotz der Bücher noch nicht wirklich sooo von der Hand geht. So ist das halt mit den DAU's...
Linux wollt ich eigentlich zm Surfen im Internet bzw. für's Online-Banking nehmen. Extra monexplex -windows/linux- besorgt (obwohl es wohl auch recht gute OpenSource Tools gibt) Weils angeblich weniger oder keine Viren, Trojaner und sonst was gibt, die einem die ganze Zeit hinterherschnüffeln und Passwörter, Pinnummern sonstwas haben wollen...

Vielen Dank für Eure Tipps

Volker

Antworten