![]() |
IF Assigned(EventMethode) zur DesignTime
Ich habe da ein winziges Problemchen,
Assigned liefert falsche Werte, also False obwohl es True sein müsste. Minimalbeispiel:
Delphi-Quellcode:
Wie kann ich zur DesignTime feststellen, ob irgendwas zugewiesen ist, wenn Assigned nicht hilft? (in einem Setter/Getter/StoredProc)
type
TMyComp = class(TComponent) private FTest: TNotifyEvent; function TestStored: Boolean; published property TestProp: TNotifyEvent read FTest write FTest stored TestStored; end; function TMyComp.TestStored: Boolean; begin Result := Assigned(TestProp); end; Wenn ich hier einen Setter an dem Property habe und da im ObjektInspector ein Event zuweise, dann wird der Setter auch aufgerufen. Auch eine Prüfung ob ein bestimmtes Event zugewiesen ist (im Contructor zugewiesen und im OI überschreibbar) funktioniert da nicht.
Delphi-Quellcode:
Und nein, ich muß mich leider so an die Events hängen, da die Komponenten keine Möglichkeit einer überschreibbaren virtuellen Methode bietet.
function TMyConnection.BeforeConnectStored: Boolean;
begin Result := Assigned(BeforeConnect) and (TMethod(BeforeConnect).Code <> @TMyConnection.DoBeforeConnect); end; constructor TMyConnection.Create(Owner: TComponent); begin inherited; BeforeConnect := DoBeforeConnect; end; (TPgConnection, aber der Schrott fängt schon bei DB Access von Devart an) |
AW: IF Assigned(EventMethode) zur DesignTime
Tritt das Problem nur zur Designtime auf?
in normalem Code kann ich es nicht nachvollziehen |
AW: IF Assigned(EventMethode) zur DesignTime
Delphi-Quellcode:
type
TMyComp = class(TComponent) private FTest: TNotifyEvent; function TestStored: Boolean; published property TestProp: TNotifyEvent read FTest write FTest stored TestStored; end; function TMyComp.TestStored: Boolean; var MyTest: TNotifyEvent; begin MyTest := Self.TestProp; Result := Assigned(MyTest); end; |
AW: IF Assigned(EventMethode) zur DesignTime
Ich check grad die Sinnhaftigkeit davon nicht.
Events werden doch eh nur in die dfm geschrieben, wenn sie assigned sind. |
AW: IF Assigned(EventMethode) zur DesignTime
Das scheint nur in der IDE zu passieren, für Komponenten auf der Form, welche Methoden der Form referenzieren.
Doch, ich schreibe sie zurück (unter bestimmten Voraussetzungen anderer Property), die Eigenschaft wird sogar gelesen und auch in die DFM geschrieben, aber in Getter/Setter/StoredProc sagt Assigned es sei nichts zugewiesen, obwohl es das ist. :wall: Wenn ich da fest True oder False in der StoredProc definiere, dann wird das Property gespeichert oder nicht. Aber wie gesagt, das hier ist eine Kurzfassung für nen Testcode. Original hängt die StoredProc an z.B. einem String-Property, welches nur gespeichert wird, wenn auch das passende Event vorhanden ist. |
AW: IF Assigned(EventMethode) zur DesignTime
schonmal geloggt bei was für ComponentState die TestStored aufgerufen wird?
aber brauchst du den aufruf von stored ? warum geht nicht:
Delphi-Quellcode:
?
property TestProp: TNotifyEvent read FTest write FTest;// stored TestStored;
|
AW: IF Assigned(EventMethode) zur DesignTime
Zitat:
StoredProc wird beim Speichern der Form aufgerufen und beim Anzeigen des Property im ObjectInspector. (steuert dort, ob das Property fett geschrieben wird) Bitte nicht darauf versteifen, dass im vereinfachten "Beispiel" das eine Property sich selber regelt, ob es gespeichert wird. Und das Selbe passiert auch innerhalb der Setter und Getter. Ich dachte Anfangs es wäre ein neueres Problem, aber ich habe seit über einem Jahr auch einen Bereinigungscode, der ständig etwas löscht, obwohl es nicht passieren sollte. Nur fand ich da nie raus warum. (hatte auch nicht so intensiv gesucht und das über einen Kommentar im SVN erledigt -> da rückgängig machen, wenn es fehlt < knallt beim Kompilieren und passiert nur selten ... hatte schon fast die Vermutung, dass wir irgendwo noch ein Stück alten Löschcode vergessen hatten, bei den letzten Aufräum-/Umbauaktionen dieser Codes > es gab mehrere Stellen wo sowas gemacht wurde und das wurde an einer Stelle zusammengefasst) Da werden in DBGrids alte Columns gelöscht, welche man daran erkennt, dass kein FieldName zugewiesen ist, welcher beim DFM-Laden verschwindet, bzw. aus alten GridLayouts stammt, wenn im DataSet das TField fehlt. Bei inaktivem Dataset wird Column.Fieldname in einem String gespeichert und ist das DataSet vorhanden/aktiv, dann wird intern TField.FieldName referenziert, was leer ist, wenn das Field fehlt) Es gibt aber noch zwei Stellen, wo Columns mit Livedaten existieren, die nicht auf das DataSet verweisen und daran erkannt werden, dass dort ein bestimmtes Event zugewiesen ist -> hier auch das Problem mit dem Assigned. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 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