![]() |
TTimer will nicht wie er soll
Ich bin ja noch dabei mein Programm in Lazarus umzusetzen von Delphi.
Dabei habe ich aktuell folgenbdes Phänomen: Es wird ein Watcher gestartet, welcher einen Ordner überwacht und dann OnNotify auslöst. -> funktioniert Dieser prüft ob es eine logfile ist und führt Aktionen aus. Die letzte der Aktionen ist es einen TTimer zu starten (Timer3), er erhält auch wirklich den Status True (Timer.enabled ist nach dem setzen beim auslesen -1) aber der Timer läuft nicht los. Jemand eine Idee?
Delphi-Quellcode:
procedure TTools.OnNotify(const FilePath: WideString; const Action: TDirectoryEventType);
var start, i : integer; FileName : WideString; begin FileName := ''; start := 1; for i := length(FilePath) downto 1 do begin if FilePath[i] = '\' then begin start := i + 1; break; end; end; for i := start to length(FilePath) do begin FileName := FileName + FilePath[i]; end; if (Split(String(FileName), '2', 0) = 'Log') or (Split(String(FileName), '2', 0) = 'log') then begin case Action of detAdded: begin Instant.Enabled := True; Run.Enabled := False; LogL.Caption := String(Filename + ' gefunden.'); LogL.Left := 72; LogA.Caption := 'Logdatei prüfen...'; LogA.Show; sFileAction := 'Edited'; LogDatei := Filename; LogName := FilePath; LogA.Caption := DateTimeToStr(ReportFileTimes(LogName)); LogA.Left := 72; FileChange := ReportFileTimes(LogName); olddate := FileChange; //showmessage(BoolToStr(Timer3.Enabled)); //Nur temporär zum Prüfen welchen Wert der Timer vorher hat -> False (0) Timer3.Enabled := True; //showmessage(BoolToStr(Timer3.Enabled)); //Nur temporär zum Prüfen ob True gesetzt wird -> ja (-1) end; detRemoved: ; detModified: ; end; end; end; //Timer für Dateidatumsänderung procedure TTools.Timer3Timer(Sender: TObject); function GetProcessHandleFromID(ID: DWORD): THandle; begin result := OpenProcess(SYNCHRONIZE, False, ID); CloseHandle(result); end; begin //showmessage('Timer3'); //Testweise eingefügt, erscheint nicht. if fileexists(String(LogName)) then begin newdate := ReportFileTimes(WideString(LogName)); if newdate <> olddate then begin olddate := newdate; Timer3.Enabled := True; end else begin if AppPID <> 0 then begin if GetProcessHandleFromID(AppPID) = 0 then begin Timer3.Enabled := False; Progress.Visible := False; if FertigC.Checked then begin FertigClick(Sender); end else begin Fertig.Enabled := True; end; Run.Enabled := False; Programs.Enabled := True; Data.Enabled := True; TxTLogs.Enabled := True; Escape.Enabled := False; LogA.Caption := 'Programm fertig.'; Timer3.Enabled := False; AppPID := 0; end; end else begin showmessage('Es wurde kein Programm gefunden!'); Timer3.Enabled := False; Progress.Visible := False; if FertigC.Checked then begin FertigClick(Sender); end else begin Fertig.Enabled := True; end; Run.Enabled := False; Programs.Enabled := True; Data.Enabled := True; TxTLogs.Enabled := True; Escape.Enabled := False; LogA.Caption := 'Programm nicht gefunden!'; Timer3.Enabled := False; end; end; end; end; |
AW: TTimer will nicht wie er soll
Hallo,
welchen Wert hast Du bei Interval stehen? Ist der vielleicht viel zu groß? Oder Interval hat den Wert 0. Dann wird das Timerereignis nicht ausgelößt. |
AW: TTimer will nicht wie er soll
Nein Interval steht auf 1000, also 1 Sekunde. Habe das auch sicherheitshalber per showmessage einmal anzeigen lassen, der bleibt bei 1000.
|
AW: TTimer will nicht wie er soll
Wenn du uns mitgeteilt hättest, dass du den
![]()
Delphi-Quellcode:
nicht im MainThread-Kontext erfolgt und dann hätten (wenigstens bei mir) alle Alarmglocken geläutet.
TTools.OnNotify
Und ja, wenn du den Timer synchronisiert im MainThread-Kontext einschaltest, dann wird auch der Timer-Event ausgelöst. |
AW: TTimer will nicht wie er soll
Ich musste zu
![]() Das mit der Synchronisierung ist für mich neu, wie müsste ich das für Timer3.Enabled := True; umsetzen? |
AW: TTimer will nicht wie er soll
So
Delphi-Quellcode:
procedure TTool.OnNotifySynchronized();
begin Timer3.Enabled := true; end; procedure TTools.OnNotify(const FilePath: WideString; const Action: TDirectoryEventType); ... TThread.Synchronize(nil,@OnNotifySynchronized); ... |
AW: TTimer will nicht wie er soll
Bekomme im Compiler dann folgende Fehlermeldung: Error: Variable identifier expected
|
AW: TTimer will nicht wie er soll
Zitat:
Delphi-Quellcode:
eingestellt sind. Ansonsten musst du mir das mitteilen oder eben selber adaptieren.
{$mode objfpc}
|
AW: TTimer will nicht wie er soll
ich habe {$MODE Delphi} eingestellt.
|
AW: TTimer will nicht wie er soll
Zitat:
Denn mehr passiert da nicht. Des Rätsels Lösung: Lass das
Delphi-Quellcode:
Zeichen im
@
Delphi-Quellcode:
weg.
{$mode delphi}
|
AW: TTimer will nicht wie er soll
Danke@ Schokohase.
Jetzt kann ich weiter testen/andere Abhängigkeitsfehler beheben. Nebenbei: Weißt du wie man die Dialogsprache umstellen kann? Seit Lazarus werden die Dialoge in Englisch ausgegeben (Yes, No,...)? Projekteinstellungen-Versionsinformationen-Sprachauswahl steht auf Deutsch |
AW: TTimer will nicht wie er soll
Wenn die Dialoge vom OS kommen, ist die Sprache des OS maßgebend, zumindest unter Windows. Sind es Framewor eigene, dann die Sprache des Frameworks.
|
AW: TTimer will nicht wie er soll
Also z.B. von showmessage();
OS ist auf Deutsch und in Lazarus habe ich keine weiteren Einstellungen für die Sprache gefunden um dies zu ändern. |
AW: TTimer will nicht wie er soll
Dann wird es das Framework sein.
|
AW: TTimer will nicht wie er soll
Hallo,
@Moobas Versuch mal über Werkzeuge -> Einstellungen -> Umgebung -> Allgemein -> Sprache bzw.: Tools -> Options -> Environment -> General -> Language Nur zur Info: Ich habe hier Lazarus 1.6.2 auf einem Raspi, Betriebssytem Raspian GNU/Linux 9.4 (stretch) |
AW: TTimer will nicht wie er soll
Zitat:
Das geht etwas anders: Menü / Projekt / Projekteinstellungen ... Projekteinstellungen / i18n [x] i18n einschalten PO-Ausgabeverzeichnis: (kann beliebig gewählt werden) locale [x] Force update PO files on next build [OK] drücken Menü / Projekt / .lpr-Datei anzeigen
Delphi-Quellcode:
Projekt erzeugen
uses
{$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset // -- START -- DefaultTranslator, // dieser Eintrag kümmert sich um die Übersetzung // -- ENDE -- Forms, ... { you can add units after this }; In dem
Delphi-Quellcode:
Ordner die
locale
Delphi-Quellcode:
Datei kopieren und für die gewünschte Sprache eine Kopie erstellen.
.po
Code:
Eine Übersetzung muss jetzt noch nicht zwingend erfolgen, nur diese Datei muss da sein.
MeinProkekt.po
MeinProkekt.de.po Im Verzeichnis wo sich jetzt die erzeugte .exe befindet einen Ordner
Delphi-Quellcode:
anlegen.
locale
In diesen Ordner die
Delphi-Quellcode:
Datei aus dem
.po
Delphi-Quellcode:
Projekt-Ordner kopieren.
locale
Zusätzlich die
Delphi-Quellcode:
Dateien aus dem
.po
Delphi-Quellcode:
ebenfalls in das
<Lazarus-Verzeichnis>\lcl\languages
Delphi-Quellcode:
Verzeichnis der Anwendung kopieren.
locale
Das sollte dann ungefähr so aussehen
Code:
Anwendung starten.
MeinProjekt.exe
locale\MeinProjekt.po locale\MeinProjekt.de.po locale\lclstrconsts.po locale\lclstrconsts.de.po locale\lclstrconsts.*.po |
AW: TTimer will nicht wie er soll
OK,
war auch nur so eine Idee. :| |
AW: TTimer will nicht wie er soll
Und nochmal danke@ Schokohase, den Weg hätte ich definitiv so nicht selber gefunden -.-
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz