Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem bei TJclTaskTrigger (https://www.delphipraxis.net/118022-problem-bei-tjcltasktrigger.html)

Angel4585 30. Jul 2008 08:02


Problem bei TJclTaskTrigger
 
Hallo,

ich möchte mir gerade einen Scheduler basteln und dazu die Aufgabenplanung von Windows nutzen.
Darauf zugreifen möchte ich mit der JCL-Komponente: TJclTaskSchedule;

Aktuell sieht das so aus:

Delphi-Quellcode:
var
t : TJclTaskTrigger;
tlist : TJclTaskTriggers;
LTask : TJclScheduledTask;
begin
FSchedule := TJclTaskSchedule.Create;
LTask := FSchedule.Add('Scheduletest');
tlist := TJclTaskTriggers.Create(LTask);
t := tlist.Add;
with t.Trigger do //Zugriffsverletzung bei Adresse 0
  begin
  wBeginYear:=2008;
  wBeginMonth:=7;
  wBeginDay:=30;
  wStartHour:=8;
  wStartMinute:=30;
  wEndYear:=2008;
  wEndMonth:=7;
  wEndDay:=31;
  Type_.Daily.DaysInterval:=1;
  TriggerType:=TASK_TIME_TRIGGER_DAILY;
  end;
with LTask do
  begin
  ApplicationName:='C:\Programme\Programm.exe';
  WorkingDirectory:='C:\Programme\';
  AccountName:='Benutzer';
  Password:='Passwort';
  Save;
  end;
In der markierten Zeile kommt eben eine Zugriffsverletzung und ich weis nicht warum.

t ist nicht nil, wird ja ne Zeile drüber erst erzeugt und Trigger ist ne Property die über ne Getter Methode ein Record holt.

DeddyH 30. Jul 2008 08:12

Re: Problem bei TJclTaskTrigger
 
Ich weiß nicht, ob das jetzt die Ursache ist, aber ich würde tlist mal umbenennen, es gibt ja bereits eine gleichnamige Klasse.

Angel4585 30. Jul 2008 08:19

Re: Problem bei TJclTaskTrigger
 
ok habs umbenannt in xList aber der Fehler kommt trotzdem noch

DeddyH 30. Jul 2008 09:12

Re: Problem bei TJclTaskTrigger
 
Und wenn Du mal versuchst, auf andere Properties des Triggers zuzugreifen? Syntaktisch scheint der Code jedenfalls korrekt zu sein, hab aber den Jedi-Source nicht hier und kann daher nicht nachsehen.

Angel4585 30. Jul 2008 09:20

Re: Problem bei TJclTaskTrigger
 
ShowMessage(t.DisplayName);

Also das funzt

Allerdings wenn ich

ShowMessage(t.TriggerString);

aufrufe kommt auch die Zugriffsverletzung..

Ich denke es liegt irgendwie am erzeugen der Triggers.
Ich erzeuge ja ne eigene Triggerliste, weil in der TJclScheduledTask keine Methoden sind um Trigger hinzuzufügen. Vllt überseh ich da was *such *nix find :|

Angel4585 30. Jul 2008 10:40

Re: Problem bei TJclTaskTrigger
 
ok, wenn ich beim debuggen mit der Maus über

t.Trigger fahre kommt da als Hint "Die aufzurufende Funktion GetTrigger wurde vom Linker entfernt."

Edit: Komisch auch wenn ich die Optimierung ausschalte kommt die Zugriffsverletzung

Der Jan 30. Jul 2008 12:56

Re: Problem bei TJclTaskTrigger
 
Möglicherweise denk ich grad voll falsch

Delphi-Quellcode:
with t.Trigger do
Trigger ist ein Property vom Typ TTaskTrigger, evtl. liegts daran, vlt. solltest du ne extra Variable deklarieren und es mit der versuchen, nur als Idee.

Angel4585 30. Jul 2008 14:01

Re: Problem bei TJclTaskTrigger
 
hab ich auch schon probiert, kommt aber der gleiche Fehler

Delphi-Quellcode:
t:=xlist.Add;
tt:=t.Trigger;//Hier

alzaimar 30. Jul 2008 14:01

Re: Problem bei TJclTaskTrigger
 
Hast Du denn T.Trigger schon etwas zugewiesen?

Angel4585 30. Jul 2008 14:20

Re: Problem bei TJclTaskTrigger
 
So sieht das aktuell aus:

Delphi-Quellcode:
t:=xlist.Add;
tt:=t.Trigger;//Diese Zeile war mal auskommentiert
with tt do
  begin
  wBeginYear:=2008;
  wBeginMonth:=7;
  wBeginDay:=30;
  wStartHour:=8;
  wStartMinute:=30;
  wEndYear:=2008;
  wEndMonth:=7;
  wEndDay:=31;
  Type_.Daily.DaysInterval:=1;
  TriggerType:=TASK_TIME_TRIGGER_DAILY;
  end;
t.Trigger:=tt;
Die eine Zeile war mal auskommentiert, das ist dass was alzaimar wissen möchte denke ich.

Also es funtkioniert beides nicht.
und bevor ihr fragt: TTasktrigger ist ein Record und muss daher nicht erzeugt werden ;)

alzaimar 30. Jul 2008 14:35

Re: Problem bei TJclTaskTrigger
 
Zitat:

Zitat von Angel4585
und bevor ihr fragt: TTasktrigger ist ein Record und muss daher nicht erzeugt werden ;)

Ach, und wieso ist das dann nil? :gruebel:

Angel4585 30. Jul 2008 14:47

Re: Problem bei TJclTaskTrigger
 
TTaskTrigger ist ein record. Dieses wird über eine Getter Methode geladen:

In MSTask:
Delphi-Quellcode:

type
{$EXTERNALSYM _TASK_TRIGGER}
  _TASK_TRIGGER = record // SP: removed packed record statement as seemed to affect SetTrigger
    cbTriggerSize: WORD; // Structure size.
    Reserved1: WORD; // Reserved. Must be zero.
    wBeginYear: WORD; // Trigger beginning date year.
    wBeginMonth: WORD; // Trigger beginning date month.
    wBeginDay: WORD; // Trigger beginning date day.
    wEndYear: WORD; // Optional trigger ending date year.
    wEndMonth: WORD; // Optional trigger ending date month.
    wEndDay: WORD; // Optional trigger ending date day.
    wStartHour: WORD; // Run bracket start time hour.
    wStartMinute: WORD; // Run bracket start time minute.
    MinutesDuration: DWORD; // Duration of run bracket.
    MinutesInterval: DWORD; // Run bracket repetition interval.
    rgFlags: DWORD; // Trigger flags.
    TriggerType: TASK_TRIGGER_TYPE; // Trigger type.
    Type_: TRIGGER_TYPE_UNION; // Trigger data.
    Reserved2: WORD; // Reserved. Must be zero.
    wRandomMinutesInterval: WORD; // Maximum number of random minutes
                                   // after start time.

  end;
{$EXTERNALSYM TASK_TRIGGER}
  TASK_TRIGGER = _TASK_TRIGGER;
  TTaskTrigger = _TASK_TRIGGER;
In JclTask:
Delphi-Quellcode:
  TJclTaskTrigger = class(TCollectionItem)
  private
    FTaskTrigger: ITaskTrigger;
    procedure SetTaskTrigger(const Value: ITaskTrigger);
    function GetTrigger: TTaskTrigger;
    procedure SetTrigger(const Value: TTaskTrigger);
    function GetTriggerString: WideString;
  public
    property TaskTrigger: ITaskTrigger read FTaskTrigger;
    property Trigger: TTaskTrigger read GetTrigger write SetTrigger;
    property TriggerString: WideString read GetTriggerString;
  end;
Delphi sagt mir aber das die GetTrigger Methode vom Linker entfernt wurde, obwohl ich die Optimierung ausgeschaltet habe(!) :wall:

alzaimar 30. Jul 2008 14:51

Re: Problem bei TJclTaskTrigger
 
Wie sieht GetTrigger aus? Irgendwoher muss das 'Nil' ja kommen...

Angel4585 30. Jul 2008 14:56

Re: Problem bei TJclTaskTrigger
 
Delphi-Quellcode:
function TJclTaskTrigger.GetTrigger: TTaskTrigger;
begin
  Result.cbTriggerSize := SizeOf(Result);
  OleCheck(TaskTrigger.GetTrigger(Result));
end;
tasktrigger ist ein Interface vllt arbeitet das nichtnkorrekt.. ich probier das ganze mal auf Win XP, bin hier auf Vista..

Angel4585 31. Jul 2008 07:13

Re: Problem bei TJclTaskTrigger
 
OK, habs getestet, aber auf Windows XP kommt der gleiche Fehler :(

frank-wob 31. Jul 2008 08:46

Re: Problem bei TJclTaskTrigger
 
Hallo,

versuchs mal so:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
   myTask:TJclTaskSchedule;
   ATask:TJclScheduledTask;
   piNewTrigger:Word;
   ppTrigger:ITaskTrigger;
   pTrigger:_TASK_TRIGGER;
   myYear:Word;
   myMonth:Word;
   myDay:Word;
   myTriggerTypeUnion:TRIGGER_TYPE_UNION;
   myWeekly:TWeekly;
begin
     myTask:=TJclTaskSchedule.Create;
     ATask:=myTask.Add('Test Task');

     ATask.ApplicationName:='C:\Windows\notepad.exe';
     ATask.WorkingDirectory:='C:\windows\';
     //ATask.AccountName:='';
     //ATask.Password:='';
     ATask.ScheduledWorkItem.CreateTrigger(piNewTrigger,ppTrigger);

     DecodeDate(Now,myYear,myMonth,myDay);

     ZeroMemory(@pTrigger, sizeof(TASK_TRIGGER));
     pTrigger.cbTriggerSize:=sizeof(TASK_TRIGGER);;
     pTrigger.Reserved1:=0;
     pTrigger.wBeginYear:=myYear;
     pTrigger.wBeginMonth:=myMonth;
     pTrigger.wBeginDay:=myDay;
     pTrigger.wEndYear:=0;
     pTrigger.wEndMonth:=0;
     pTrigger.wEndDay:=0;
     pTrigger.wStartHour:=10;
     pTrigger.wStartMinute:=00;
     pTrigger.MinutesDuration := 0;
     pTrigger.MinutesInterval := 0;
     pTrigger.rgFlags := 0;
     pTrigger.TriggerType:= TASK_TIME_TRIGGER_DAILY;
     MyWeekly.WeeksInterval:=1;
     MyWeekly.rgfDaysOfTheWeek:= TASK_SUNDAY +
                                 TASK_MONDAY +
                                 TASK_TUESDAY +
                                 TASK_WEDNESDAY +
                                 TASK_THURSDAY +
                                 TASK_FRIDAY +
                                 TASK_SATURDAY;
     MyTriggerTypeUnion.Weekly:=MyWeekly;
     pTrigger.Type_:= MyTriggerTypeUnion;
     pTrigger.Reserved2:=0;
     pTrigger.wRandomMinutesInterval := 0;

     ppTrigger.SetTrigger(pTrigger);

     ATask.Save;

     FreeAndNil(myTask);
end;
Gruß Frank

Angel4585 31. Jul 2008 08:57

Re: Problem bei TJclTaskTrigger
 
Cool frank-wob, das bringt zumindest schonmal keine Fehlermeldung.

Allerdings wird weder das Programm, noch der Trigger in der Aufgabenplanung angezeigt :gruebel:

Edit: Unter XP gehts, unter Vista nicht :shock: :wall:

Angel4585 31. Jul 2008 09:46

Re: Problem bei TJclTaskTrigger
 
Ach mist und als normaler Benutzer kann man garkeine Tasks anlegen :(

waldforest 7. Sep 2008 15:32

Re: Problem bei TJclTaskTrigger
 
Hallo,
dennoch eine Frage,
mit welchem Flag, Parameter kann ich denn die Checkbox "nur Ausführen wenn angemeldet".setzten


Wenn ich den Task manuell anlege startet er sobal die Checkbox gesetzt ist,

mfg
waldforest


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 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