Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   IF Assigned(EventMethode) zur DesignTime (https://www.delphipraxis.net/194286-if-assigned-eventmethode-zur-designtime.html)

himitsu 6. Nov 2017 13:48

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:
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;
Wie kann ich zur DesignTime feststellen, ob irgendwas zugewiesen ist, wenn Assigned nicht hilft? (in einem Setter/Getter/StoredProc)

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:
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;
Und nein, ich muß mich leider so an die Events hängen, da die Komponenten keine Möglichkeit einer überschreibbaren virtuellen Methode bietet.
(TPgConnection, aber der Schrott fängt schon bei DB Access von Devart an)

Fritzew 6. Nov 2017 15:08

AW: IF Assigned(EventMethode) zur DesignTime
 
Tritt das Problem nur zur Designtime auf?
in normalem Code kann ich es nicht nachvollziehen

TiGü 6. Nov 2017 15:09

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;

Stevie 6. Nov 2017 15:25

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.

himitsu 6. Nov 2017 15:25

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.

4dk2 6. Nov 2017 15:59

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;
?

himitsu 6. Nov 2017 16:32

AW: IF Assigned(EventMethode) zur DesignTime
 
Zitat:

Zitat von 4dk2 (Beitrag 1385405)
aber brauchst du den aufruf von stored ?

Wenn die Einstellungen aus einer anderen Komponente übernommen werden, dann sollen sie bei dieser Komponente nicht (nochmal) in der DFM gespeichert werden.

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