Nachtrag:
Zu diesem Thema findet man ja nicht nur hier etwas. Allerdings liest man einerseits "Ja, geht auch ohne Form" (tuts ja anscheinend auch) und andererseits wird da so was wie ein Dummy-Fenster dazugebasltet.
Bei letzterem bezieht man sich darauf, das ja eine WIndoof-Botschaft irgendwo bleiben muss.
Welche ? In einem normalen Fenster wird doch auch nur die Ereignisfunktion aufgerufen .... oder ist da noch mehr zu beachten ?
Jetzt muss ich natürlich hier auch noch erwähnen, das die Logger-Klasse zwar ein Fenster besitzt, dieses aber nur bei Bedarf erzeugt wird und mit dem Timer eigentlich so keinen "Kontakt" hat - ausser das beide Variablen in der Klasse definiert sind. Das sieht so aus (Auszug):
Delphi-Quellcode:
....
type
TLOGWIN = class(TForm)
lb_LOG : TListBox;
cb_W2Log : TCheckBox;
cb_AOT : TCheckBox;
BitBtn2 : TBitBtn;
procedure BitBtn2Click(Sender: TObject);
private
public
published
end;
TLOG = class
private
protected
....
FLogTimer : TTimer; // internal timer to read from list
FLOGWIN : TLOGWIN; // the Logger-Window
.....
procedure SetLogWin(Mode : boolean);
procedure SetLogFile(Mode : boolean);
procedure OnTimer(Sender: TObject);
public
constructor Create(APath, AName : string; WinShow, FileLog, WriteOver : boolean);
destructor Destroy; override;
.....
published
....
end;
constructor TLOG.Create(APath, AName : string; WinShow, FileLog, WriteOver : boolean);
//var
// AppPath : string;
begin
inherited Create;
....
FShowWin := WinShow; // default: yes/no by calling application
// init Timer
FLogTimer := TTimer.Create(nil);
FLogTimer.Enabled := false;
FLogTimer.Interval := 250;
FLogTimer.OnTimer := OnTimer;
// now initalize window and / or filewriter
SetLogWin(FShowWin); // creats/opens window, if true
SetLogFile(FLogFile); // opens file, if true
FLogTimer.Enabled := true;
end;
destructor TLOG.Destroy;
begin
....
SetLogWin(false); // closes window, if open
if Assigned(FLOGWIN) then FLOGWIN.Free;
....
FLogTimer.Free;
....
inherited destroy;
end;
SetLogWin(true/false) prüft, ob das Fenster bereits erzeugt wurde oder nicht und öffnet/schliesst es.
In OnTimer werden zwischenzeitlich in einer Liste aufgelaufene LOG-Texte je nach Einstellung des Loggers am Stück in die ListBox des Fensters geschoben (sofern erzeugt) oder in eine Textdatei geschrieben.
Es passiert also m.M.n. nichts absonderliches in diesem kleinen Tool - es funzt ja auch schon in div Appls bei mir seit langer Zeit.
In der DDAPI-Klasse sieht es nahezu genauso aus - nur keine Form dabei:
Delphi-Quellcode:
....
type
....
TDDAPI = class
private
protected
....
FCI_Timer : TTimer;
procedure CamMenu_Poll(Sender: TObject);
procedure _LOG(S1, S2 : string);
public
constructor Create;
destructor Destroy; override;
....
published
....
end;
implementation
uses
SysUtils,
Logger; // hier binde ich den Logger ein !
procedure TDDAPI._LOG(S1, S2 : string);
begin
if Assigned(LOG) then LOG.Log('DDAPI', S1, S2); // Text an Logger in die Liste
end;
constructor TDDAPI.Create;
begin
inherited Create;
....
FCI_Timer := TTimer.Create(nil); // Hier fliegt alles aus der Kurve .....
FCI_Timer.Enabled := false;
FCI_Timer.Interval := 100;
FCI_Timer.OnTimer := CamMenu_Poll;
end;
destructor TDDAPI.Destroy;
begin
....
FCI_Timer.Free;
inherited destroy;
end;
In CamMenu_Poll steht momentan nix drin.
Noch ein Nachtrag:
Nun habe ich in die DDAPI-Klasse auch noch so ein Fenster wie im Logger (ein leeres) eingebaut.
.... leider keine Änderung - alos hat es, wie ich es mir dachte, damit nix zu tun.