Einzelnen Beitrag anzeigen

Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Timer ohne Form mehrfach - nur Fehler ....

  Alt 5. Mai 2013, 12:36
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.

Geändert von TERWI ( 5. Mai 2013 um 13:32 Uhr)
  Mit Zitat antworten Zitat