Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Timer zur Laufzeit erstellen und einsetzen


matt1 - Mo 02.02.09 22:31
Titel: Timer zur Laufzeit erstellen und einsetzen
Hallo,
ich brauche einen Timer für eine Art "crawler" program, also ohne Forms, ohne Paletten. Läuft alles batch. Mein Problem ist dass ich den Timer zwar zur Laufzeit erstellen kann, aber wie kriege ich den OnTimer Event richtig hin?

also etwa so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TParserDemoF.ProcessBatch(parm1:String; parm2:String) ;
var
   myTimer: TTimer ;
begin
     myTimer := TTimer.Create(self) ;
     myTimer.Enabled := True ;
     myTimer.Interval := 20000 ;
     myTimer.OnTimer(myTimer) ;
end ;

Der Compiler schluckt das soweit, aber ich versteh nicht, wo ich jetzt den OnTimer event codieren soll und bin auch nicht sicher, ob der obige Code überhaupt so funktionieren wird. Hat jemand ein kleines Beispiel? vermutlich ist meine Frage eher dumm, aber ich brauche Delphi nur gelegentlich.

Vielen Dank schonmal.
Matt

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Narses - Mo 02.02.09 22:36
Titel: Re: Timer zur Laufzeit erstellen und einsetzen
Moin und :welcome: im Forum!

user profile iconmatt1 hat folgendes geschrieben Zum zitierten Posting springen:
also ohne Forms, ohne Paletten. Läuft alles batch.
Du willst eine Konsolenanwendung schreiben? Dann verabschiede dich schonmal vom TTimer, der läuft da nicht, dafür brauchst du eine MessageLoop, und die ist erst im TApplication-Objekt drin. :idea:

Wenn es denn unbedingt eine Kommandozeilenanwendung werden soll, dann brauchst du schon einen Thread, um einen Timer nachzubilden. :nixweiss:

user profile iconmatt1 hat folgendes geschrieben Zum zitierten Posting springen:
Mein Problem ist dass ich den Timer zwar zur Laufzeit erstellen kann, aber wie kriege ich den OnTimer Event richtig hin?
Möglicherweise hat sich dein "Problem" grade erledigt ;) ansonsten mach eine VCL-Anwendung und verstecke das Hauptformular. :idea:

cu
Narses


Dunkel - Mo 02.02.09 23:04

Nabend!

Wie Narses schon schrieb, ist ein TTimer in einer Konsolen-Applikation nicht möglich. Nichts desto trotz, der Vollständigkeit halber, ein Beispiel einer manuellen Zuweisung einer Event-Behandlung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
{ ... }
Type 
  TParserDemoF = class(TForm)
  { ... }
  private
    myTimer: TTimer ;
    procedure MyTimerEvent(Sender: TObject);
  end;

{ ... }

procedure TParserDemoF.MyTimerEvent(Sender: TObject);
begin
  {... mach und tu ...}
end;

procedure TParserDemoF.ProcessBatch(parm1:String; parm2:String) ;
begin
     myTimer := TTimer.Create(self) ;
     myTimer.Enabled := True ;
     myTimer.Interval := 20000 ;
     myTimer.OnTimer := MyTimerEvent ;
end ;


matt1 - Mo 02.02.09 23:19
Titel: Re: Timer zur Laufzeit erstellen und einsetzen
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Möglicherweise hat sich dein "Problem" grade erledigt ;) ansonsten mach eine VCL-Anwendung und verstecke das Hauptformular. :idea:
vielen Dank euch beiden. Ja das mit dem versteckten Hauptformular wäre vermutlich am einfachsten, da ich eine bestehende Applikation einfach umschreiben muss, so dass sie in Batch läuft. Einfach ohne User-Input, alles über Parms gesteuert. Aber wie geht das mit dem verstecken - so grob ausgedrückt.

tx,
Matt


Dunkel - Mo 02.02.09 23:23

Neue Frage, neuer Thread!

Nur, weil es ein Einzeiller ist, antworte ich mal drauf:

Delphi-Quelltext
1:
  Self.Hide();                    


jaenicke - Di 03.02.09 01:43

user profile iconDunkel hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  Self.Hide();                    
Dann muss es aber schon angezeigt gewesen sein. Am einfachsten ist es, einfach den Projektquelltext umzuschreiben und das Formular zwar zu erzeugen, aber gar nicht erst anzuzeigen. ;-)

Dann ist es quasi wie ein unsichtbares Fensterhandle zum Botschaftsempfang. Das wäre die andere Möglichkeit, die aber etwas mehr Aufwand bedeutet. ;-)


JayEff - Di 03.02.09 11:16

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Am einfachsten ist es, einfach den Projektquelltext umzuschreiben und das Formular zwar zu erzeugen, aber gar nicht erst anzuzeigen. ;-)
Was sich, wenn ich nicht irre, über ShowMainForm := False erreichen lässt, oder? Diese Zeile schreibe man in die .dpr-Datei vor das Application.Run (oder doch vor die CreateForms?) und freue sich über ein nicht angezeigtes Fenster :zustimm: wie sie sehn, sehn sie nix


jaenicke - Di 03.02.09 11:34

Aber nur bei sehr neuen Delphiversionen ;-).


JayEff - Di 03.02.09 13:36

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Aber nur bei sehr neuen Delphiversionen ;-).
Delphi 7 ist sehr neu? :nixweiss:


jaenicke - Di 03.02.09 14:57

Sorry, ich habe das mit MainFormOnTaskbar verwechselt. :oops:
Das gibt es erst bei neueren Versionen.


Delete - Di 03.02.09 16:17

...oder man nimmt eine DLL, da kann man auch Timer nutzen und hat kein Formular.


Chemiker - Di 03.02.09 19:42

Hallo matt1,

vielleicht noch ein Hinweis.

Wenn Du den Timer zur Laufzeit erstellen willst, solltest Du in auch einen Namen geben.


Delphi-Quelltext
1:
myTimer.Name:= 'myTimer';                    


Bis bald Chemiker


jaenicke - Di 03.02.09 21:47

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
...oder man nimmt eine DLL, da kann man auch Timer nutzen und hat kein Formular.
Und wer soll die DLL dann laden? :gruebel:


matt1 - Mi 04.02.09 15:45

dank an alle, Problem ist gelöst. Ich starte die Applikation normal, FormCreate() wird ausgeführt, doch bevor die Form am Bildschirm erscheint, rufe ich die Batch Routine auf, und aktiviere den Timer. Am Schluss dann einfach

myTimer.Enabled := false ;
self.Hide ;
close ;

und die Applikation endet ohne Fehlermeldung. Während der Laufzeit ist die Form zwar sichtbar, aber man kann nichts eingeben und daher stört es micht nicht.

Matt