Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit cxScheduler (https://www.delphipraxis.net/169957-problem-mit-cxscheduler.html)

bwolf 22. Aug 2012 12:33

Problem mit cxScheduler
 
Hi,

ich habe ein kleines Problem mit dem cxScheduler.
Ich versuche mal anhand von ein paar Codeschnipseln zu erklären was ich vorhabe und woran es hängt.

Im Ereignis OnEventModified ändere ich ein Event "von Hand" ab. Anschließend wird über PostMessage eine Funktion aufgerufen, um eine "ControlBox" zu aktualiieren. Der Umweg über das PostMessage ist nötig da der Scheduler (oder meine Datebankkomponenten) nicht direkt aktualisiert werden.
Der Code sieht so aus:


Code:
procedure TfrmMain.ssKalenderEventModified(Sender: TObject;
  AEvent: TcxSchedulerEvent; var AHandled: Boolean);
begin
  FEventLastModified := TcxSchedulerControlEvent(AEvent);

   ...

  // Verzögertes updataen der Controlbox
  PostMessage(Handle, WM_AFTERMODIFIED, 0,0);
  AHandled := True;
end;
In der Variablen FEventLastModified wird die Referenz auf das zuletzt geänderte Event gespeichert.
Folgende Funktion wird dann vom PostMessage aufgerufen:

Code:
procedure TfrmMain.doUpdate(var msg : TMessage);
begin
  UpdateControlBox(FEventLastModified);
end;
Und UpdateControlBox sieht dann etwa so aus:

Code:
procedure TfrmMain.UpdateControlBox(AEvent : TcxSchedulerEvent = nil);
begin
  mdWarnungen.Close;
  mdWarnungen.Open;
  tsWarnung.ImageIndex := -1;

  lblBezeichnung.Caption := VarToStr(AEvent.GetCustomFieldValueByName('Bezeichnung'));
  ...

end;
Nun habe ich folgendes Problem:
Wenn ich diesen Code debugge und nach dem Aufruf von UpdateControlBox FEventLastModified.ClassName prüfe, passiert folgendes:
Im Beginn von UpdateControlBox ist FEventLastModified.ClassName = 'TcxSchedulerEvent', was auch korrekt ist.
Soblad ich aber auf die Nächste Zeile "mdWarnungen.Close;" ausführe, ist FEventLastModified.ClassName = 'TcxEditStyle', und daraufhin kriege ich beim Zugriff auf AEvent.GetCustomFieldValueByName natürlich eine Exception.


Wenn ich alle zugriffe auf mdWarnungen entferne, funnktionert alles bestens.
Ich kann mir allerdings überhaupt keinen Reim drauf machen was da schief läuft, mdWarnungen hat rein garnichts mit dem Scheduler zu tun...
Jemand einen Rat für mich?

Vielen Dank schonmal!

bwolf 22. Aug 2012 16:45

AW: Problem mit cxScheduler
 
Das Problem war wohl das AEvent aus ssKalenderEventModified nacg Ablauf der Funktion nicht mehr gelebt hat und der Zeiger wohl sonstwohin gedeutet hat.

Lösung für jett ist, eine Kopie von AEvent anzufertigen und diese an UpdateControlBox zu übergeben.

Furtbichler 22. Aug 2012 22:10

AW: Problem mit cxScheduler
 
Kopiere lieber die Informationen, die im UpdateControlBox angezeigt werden müssen. Du kannst Dir nicht sicher sein, das das Anlegen einer Kopie des Events keine Seiteneffekte verursacht.
Weiterhin glaube ich, das es einfacher ist, deine Daten direkt im Event zu aktualisieren und der Ursache auf den Grund zu gehen, weshalb das nicht ohne Weiteres funktioniert. Fehlt vielleicht nur ein 'Invalidate'?

bwolf 23. Aug 2012 07:33

AW: Problem mit cxScheduler
 
Hi Furtbichler,

inwiefern könnte das problematisch werden? Ich hätte jetzt gedacht da es egal ist, ob ich die Daten "von Hand" zuweise (FEventLastModified.ID = Aevent.ID) oder das eben über Assign mache.
Natürlich würde ich "UpdateControlBox" am liebsten direkt aus dem EventModified-Event aufrufen, aber dummerweise sind die "CustomFields" des Events zu diesem Zeitpunkt noch nicht geupdated. DevExpress kann den Fehler nicht nachvollziehen und meint es liegt wohl an meinen DB-Componenten.
Ich habe schon einiges Probieret um das hinzubekommen aber leider will es nicht, wieso jetzt leider erstmal eine Notlösung herhalten muss.


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