AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Systemzeit Wechsel WM_TIMECHANGE in TComponent
Thema durchsuchen
Ansicht
Themen-Optionen

Systemzeit Wechsel WM_TIMECHANGE in TComponent

Ein Thema von backdraft · begonnen am 24. Nov 2008 · letzter Beitrag vom 2. Dez 2008
Antwort Antwort
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#1

Systemzeit Wechsel WM_TIMECHANGE in TComponent

  Alt 24. Nov 2008, 15:23
Hallo zusammen,

ich habe eine Komponente entwickelt, und möchte gerne mitbekommen, wenn die Systemzeit umgestellt wird.
Die Nachricht WM_TIMECHANGE wird ja nur an alle Komponenten geschickt, die ein Fenster haben.

Gibt es eine andere Möglichkeit, als dass ich mir ein unsichtbares Fenster erzeuge und in dem die Nachricht abfange?
Hab ich keine Chance an die Nachricht anders ranzukommen?

mfg
Oliver
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von MSSSSM
MSSSSM

Registriert seit: 18. Apr 2008
223 Beiträge
 
Delphi 7 Professional
 
#2

Re: Systemzeit Wechsel WM_TIMECHANGE in TComponent

  Alt 24. Nov 2008, 19:13
Nicht dass ich wüsste.
Was ist denn so schlimm, ein unsichtbares Fenster zu erzeugen?
Marius
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#3

Re: Systemzeit Wechsel WM_TIMECHANGE in TComponent

  Alt 25. Nov 2008, 11:33
Dafür gibt es sogenannte MessageOnlyWindows.

z.B.: http://www.delphipraxis.net/internal...t=messageonly*


Im Grunde sind es aber auch "nur" unsichtbare Fenster.

PS: Application/TApplication besitzt soein "unsichtbares" Fenster, damit es die Nachichtenschleife abarbeiten kann ... und wenn du "Application" in deinem Programm nutzt, dann kannst du dich auch in dessen Nachrichten Schleife reinhängen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Systemzeit Wechsel WM_TIMECHANGE in TComponent

  Alt 25. Nov 2008, 12:13
Du solltest Dir für Deine Controls eine Verwaltungsklasse schreiben, die sich in die WndProc einklinkt. In dieser sollte eine Objectlist / TList sein, in die Du in dem gemeinsamen Vorfahren Deiner Controls im constructor jeweils self einträgst. Dann kannst Du beim eintreffen einer für Dich interessanten Nachricht diese an alle verwalteten Objekte weitermelden oder sonstwas mit ihnen machen.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Systemzeit Wechsel WM_TIMECHANGE in TComponent

  Alt 25. Nov 2008, 21:03
Zitat von Union:
Du solltest Dir für Deine Controls eine Verwaltungsklasse schreiben, die sich in die WndProc einklinkt. In dieser sollte eine Objectlist / TList sein, in die Du in dem gemeinsamen Vorfahren Deiner Controls im constructor jeweils self einträgst. Dann kannst Du beim eintreffen einer für Dich interessanten Nachricht diese an alle verwalteten Objekte weitermelden oder sonstwas mit ihnen machen.
Hallo,
das ist eine gute Idee. Ich habe halt mehrere *nicht visuelle* Fenster in diversen Komponenten, die mit sowas arbeiten. Für das WM_TIMECHANGE wollte ich das jetzt nicht auch wieder so machen.

Ich glaube ich mache mir so eine Verwaltungsklasse. Diese muss dann aber Global sein, oder?
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Systemzeit Wechsel WM_TIMECHANGE in TComponent

  Alt 26. Nov 2008, 08:37
Die Verwaltungsklasse muß für Deine Komponenten sichtbar sein. Hier ein Beispiel für die Verwaltungsklasse, das ich gestern erstellt habe:
Delphi-Quellcode:
unit uAppMessages;

interface
   uses classes, Windows, Messages;

   type

   IComponentControllerTimeComponent = interface
   ['{B4B1A347-0D72-433D-BF73-7DA96CBEB9EA}']
      procedure TimeChanged;
   end;

   TComponentController = class
   private
      FList : TList;
      procedure TimeChanged;
   protected
      FWindow : HWND;
      procedure MainWndProc(var Message: TMessage);
      procedure WndProc(var Message: TMessage); virtual;
   public
      constructor Create;
      destructor Destroy; override;
      procedure AddObject(AObject : TObject); virtual;
      procedure RemoveObject(AObject : TObject); virtual;
   end;

function ComponentController : TComponentController;

implementation

uses Forms, StdCtrls, SysUtils;

var
   FComponentController : TComponentController;

function ComponentController : TComponentController;
begin
   if FComponentController = nil then
      FComponentController := TComponentController.Create;
   result := FComponentController;
end;

{ TComponentController }

procedure TComponentController.AddObject(AObject: TObject);
begin
   if FList.IndexOf(AObject) = -1 then
   begin
      if FList.Count = 0 then
         FWindow := Forms.AllocateHWnd(MainWndProc);
      FList.Add(AObject);
   end;
end;

constructor TComponentController.Create;
begin
   inherited Create;
   FList := TList.Create;
end;

destructor TComponentController.Destroy;
begin
  FList.Free;
  inherited;
end;

procedure TComponentController.MainWndProc(var Message: TMessage);
begin
  try
    WndProc(Message);
  except
    Application.HandleException(Self);
  end;
end;

procedure TComponentController.RemoveObject(AObject: TObject);
begin
   FList.Remove(Pointer(AObject));
   if FList.Count = 0 then
      Forms.DeallocateHWnd(FWindow);
end;

procedure TComponentController.TimeChanged;
var
   i : integer;
begin
   for i := 0 to FList.Count-1 do
   begin
      // Besser über ein Interface und Supports realisieren
      // nur als Demo für die Funktionalität
      if TObject(Flist[i]).ClassNameIs('TEdit') then
         TEdit(Flist[i]).Text := TimeToStr(Now);
   end;
end;

procedure TComponentController.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_TIMECHANGE then
  begin
    TimeChanged;
    Message.Result := 0;
    Exit;
  end;
  with Message do Result := DefWindowProc(FWindow, Msg, wParam, lParam);
end;

initialization
finalization
   FComponentController.Free;
   FComponentController := nil;

end.
Und so kann man es benutzen, bei eigenen Komponenten muß das im constructor / destructor passieren:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   ComponentController.AddObject(Edit1);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   ComponentController.RemoveObject(Edit1);
end;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Systemzeit Wechsel WM_TIMECHANGE in TComponent

  Alt 2. Dez 2008, 20:07
Hat super geklappt, vielen Dank.
Oliver
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz