Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   FreePascal TTimer will nicht wie er soll (https://www.delphipraxis.net/202006-ttimer-will-nicht-wie-er-soll.html)

Moombas 18. Sep 2019 09:37

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;

ghubi01 18. Sep 2019 15:49

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.

Moombas 19. Sep 2019 07:19

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.

Schokohase 19. Sep 2019 08:22

AW: TTimer will nicht wie er soll
 
Wenn du uns mitgeteilt hättest, dass du den DirectoryWatcher verwendest, dann hätten wir gewusst, dass der Aufruf von
Delphi-Quellcode:
TTools.OnNotify
nicht im MainThread-Kontext erfolgt und dann hätten (wenigstens bei mir) alle Alarmglocken geläutet.

Und ja, wenn du den Timer synchronisiert im MainThread-Kontext einschaltest, dann wird auch der Timer-Event ausgelöst.

Moombas 19. Sep 2019 09:58

AW: TTimer will nicht wie er soll
 
Ich musste zu https://forum.lazarus.freepascal.org...?topic=37415.0 wechseln wegen Lazarus.

Das mit der Synchronisierung ist für mich neu, wie müsste ich das für

Timer3.Enabled := True;

umsetzen?

Schokohase 19. Sep 2019 10:15

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);
...

Moombas 19. Sep 2019 12:57

AW: TTimer will nicht wie er soll
 
Bekomme im Compiler dann folgende Fehlermeldung: Error: Variable identifier expected

Schokohase 19. Sep 2019 13:24

AW: TTimer will nicht wie er soll
 
Zitat:

Zitat von Moombas (Beitrag 1447078)
Bekomme im Compiler dann folgende Fehlermeldung: Error: Variable identifier expected

Ich gehe halt davon aus, dass bei FreePascal die units auf
Delphi-Quellcode:
{$mode objfpc}
eingestellt sind. Ansonsten musst du mir das mitteilen oder eben selber adaptieren.

Moombas 19. Sep 2019 13:31

AW: TTimer will nicht wie er soll
 
ich habe {$MODE Delphi} eingestellt.

Schokohase 19. Sep 2019 13:39

AW: TTimer will nicht wie er soll
 
Zitat:

Zitat von Moombas (Beitrag 1447093)
ich habe {$MODE Delphi} eingestellt.

Und du hast noch nie in deinem Leben im Delphi-Mode unter Lazarus/FreePascal einen Methoden-Zeiger als Parameter übergeben, oder einer Variablen oder einem Event zugewiesen?

Denn mehr passiert da nicht.

Des Rätsels Lösung:

Lass das
Delphi-Quellcode:
@
Zeichen im
Delphi-Quellcode:
{$mode delphi}
weg.

Moombas 19. Sep 2019 13:59

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

Luckie 19. Sep 2019 14:06

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.

Moombas 19. Sep 2019 14:17

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.

Luckie 19. Sep 2019 15:35

AW: TTimer will nicht wie er soll
 
Dann wird es das Framework sein.

ghubi01 19. Sep 2019 15:53

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)

Schokohase 19. Sep 2019 16:37

AW: TTimer will nicht wie er soll
 
Zitat:

Zitat von ghubi01 (Beitrag 1447112)
Versuch mal über Werkzeuge -> Einstellungen -> Umgebung -> Allgemein -> Sprache

Damit stellst du die Sprache der Lazarus IDE ein, aber nicht die von deinem Projekt.

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:
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 };
Projekt erzeugen

In dem
Delphi-Quellcode:
locale
Ordner die
Delphi-Quellcode:
.po
Datei kopieren und für die gewünschte Sprache eine Kopie erstellen.

Code:
MeinProkekt.po
MeinProkekt.de.po
Eine Übersetzung muss jetzt noch nicht zwingend erfolgen, nur diese Datei muss da sein.

Im Verzeichnis wo sich jetzt die erzeugte .exe befindet einen Ordner
Delphi-Quellcode:
locale
anlegen.
In diesen Ordner die
Delphi-Quellcode:
.po
Datei aus dem
Delphi-Quellcode:
locale
Projekt-Ordner kopieren.
Zusätzlich die
Delphi-Quellcode:
.po
Dateien aus dem
Delphi-Quellcode:
<Lazarus-Verzeichnis>\lcl\languages
ebenfalls in das
Delphi-Quellcode:
locale
Verzeichnis der Anwendung kopieren.

Das sollte dann ungefähr so aussehen
Code:
MeinProjekt.exe
locale\MeinProjekt.po
locale\MeinProjekt.de.po
locale\lclstrconsts.po
locale\lclstrconsts.de.po
locale\lclstrconsts.*.po
Anwendung starten.

ghubi01 19. Sep 2019 16:59

AW: TTimer will nicht wie er soll
 
OK,

war auch nur so eine Idee. :|

Moombas 20. Sep 2019 07:27

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 16:29 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