Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - published-properties und Reihenfolge beim Laden
Narses - Di 06.03.12 00:13
Titel: published-properties und Reihenfolge beim Laden
Moin!
Folgende Situation:
- Ich habe eine Komponente mit ein paar published-Eigenschaften, bei der es Abhängigkeiten im Wertebereich untereinander gibt:
- Es gibt eine boolean-Eigenschaft B (default=FALSE), die erstmal weiter nichts tut, als zu existieren
- Es gibt eine Eigenschaft A, deren Wertebereich von B abhängt. Ist B=FALSE (default), dann darf A nicht z.B. $4711 zugewiesen werden, entsprechende Versuche werden per Exception abgefangen, der Wert nicht übernommen.
- Wird B aber TRUE, dann gibt es keine Einschränkung für A.
- Stelle ich B nun im OI zur Designzeit auf TRUE und setze A auf $4711, kriege ich beim nächsten Laden des Projekts in der IDE eine Exception: scheinbar wird B nach A geladen, so dass der verbotene Wert für A noch nicht "freigeschaltet" ist! :shock:
Wie löst man so ein Problem? Ich habe jetzt auch nicht wirklich gute Suchwörter gefunden, um zu recherchieren... :? In der Konsistenz-Prüfung bei der Wertzuweisung habe ich bereits die Ausnahme:
or (csLoading in Self.ComponentState) drin, das scheint es aber nicht zu tun. :nixweiss: Ist es generell nicht vorgesehen, Abhängigkeiten in den Eigenschaften eines Objekts zu haben? :gruebel:
cu
Narses
jaenicke - Di 06.03.12 00:39
Narses hat folgendes geschrieben : |
| In der Konsistenz-Prüfung bei der Wertzuweisung habe ich bereits die Ausnahme: or (csLoading in Self.ComponentState) drin, das scheint es aber nicht zu tun. :nixweiss: |
Das kann ich nicht reproduzieren. Gerade kurz eine neue Komponente erzeugt, das funktioniert absolut problemlos. :nixweiss:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| TComponent1 = class(TComponent) strict private var FB: Boolean; FA: Integer; procedure SetA(const Value: Integer); procedure SetB(const Value: Boolean); published property A: Integer read FA write SetA; property B: Boolean read FB write SetB; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('none', [TComponent1]); end;
procedure TComponent1.SetA(const Value: Integer); begin if (Value > 0) and not B and not (csLoading in ComponentState) then raise Exception.Create('Fehlermeldung'); FA := Value; end;
procedure TComponent1.SetB(const Value: Boolean); begin FB := Value; end; |
Ich habe da B auf True, A auf 500 und B wieder auf False gesetzt, das Formular gespeichert und geschlossen und wieder geladen. Ohne die Prüfung auf csLoading geht es wie erwartet nicht, mit problemlos.
Narses - Di 06.03.12 01:11
Moin!
Danke für deinen Einsatz! :zustimm: :beer:
Ich hab das Package neu compiliert, jetzt geht´s bei mir auch... :nut: Heisenbug... :nixweiss:
cu
Narses
BenBE - Di 06.03.12 23:08
Man kann IIRC die Serialisierung und Deserialisierung der Properties zum Teil auch selber handhaben. Damit kann man da ggf. auch mit herumarbeiten, indem man die besagten Properties manuell selber deserialisiert/serialisiert in der richtigen Reihenfolge.
Narses - Mi 07.03.12 00:46
Moin!
Danke für den Hinweis. :)
Mittlerweile habe ich auch nachvollziehen können, was da passiert ist: ich hatte die Komponente bereits in der IDE registriert und an einer neuen Version gearbeitet, indem ich den Quelltext in einem Projekt separat eingebunden habe, normal halt, sonst muss man ja dauernd zwischen dem Package und dem Testprojekt hin und herswitchen. :nixweiss: Und genau da ist das Problem: im erstellten Test-Binary ist dann zwar die neue Version des Codes enthalten, aber in der IDE wird noch die alte Version aus dem Package verwendet. :idea: Also Package aktualisiert und - siehe da, "Fehler" ist weg... :roll: :autsch: Also, eigene Doofheit... :oops:
cu
Narses
jaenicke - Mi 07.03.12 00:52
Das mache ich sehr einfach:
Ich definiere das Package mit der Komponente als Abhängigkeit zu dem Testprojekt und zack, schon wird das Package jedesmal mit dem Programm neu kompiliert und auch in der IDE ist die Komponente ständig aktuell. :zwinker:
Narses - Mi 07.03.12 00:56
Moin!
jaenicke hat folgendes geschrieben : |
| Ich definiere das Package mit der Komponente als Abhängigkeit zu dem Testprojekt |
Spannend, und wo/wie macht man das? :lupe:
cu
Narses
jaenicke - Mi 07.03.12 01:06
Im Projektmanager kann man auf das Projekt mit rechts klicken und dann unter Abhängigkeiten die Projekte der Projektgruppe auswählen, die automatisch vor dem betreffenden Projekt kompiliert werden sollen.
Ich habe aber mal zur Sicherheit bei Delphi 7 nachgeschaut. Da gibt es den Punkt zumindest in der Personal Edition nicht. Den gibt es also entweder erst ab der Professional oder erst ab Delphi 2005 (dort existiert er). Du kannst ja schauen, ob du den hast.
Narses - Mi 07.03.12 01:21
Moin!
jaenicke hat folgendes geschrieben : |
| Im Projektmanager kann man auf das Projekt mit rechts klicken und dann unter Abhängigkeiten die Projekte der Projektgruppe auswählen, die automatisch vor dem betreffenden Projekt kompiliert werden sollen. |
Mal langsam, ich stelle die Abhängigkeit im Testprojekt ein? Also füge ich das Package dem Testprojekt als Abhängigkeit hinzu? :gruebel:
jaenicke hat folgendes geschrieben : |
| Ich habe aber mal zur Sicherheit bei Delphi 7 nachgeschaut. Da gibt es den Punkt zumindest in der Personal Edition nicht. Den gibt es also entweder erst ab der Professional oder erst ab Delphi 2005 (dort existiert er). Du kannst ja schauen, ob du den hast. |
Wenn ich einen Rechtsklick auf dem Testprojekt in der Projektverwaltung mache, habe ich dieses Kontextmenü (D7pro):
cu
Narses
jaenicke - Mi 07.03.12 01:29
Narses hat folgendes geschrieben : |
| Mal langsam, ich stelle die Abhängigkeit im Testprojekt ein? Also füge ich das Package dem Testprojekt als Abhängigkeit hinzu? :gruebel: |
Richtig, so wäre es richtig.
Narses hat folgendes geschrieben : |
| Wenn ich einen Rechtsklick auf dem Testprojekt in der Projektverwaltung mache, habe ich dieses Kontextmenü (D7pro): |
Damit hat sich das dann wohl leider erledigt. Ich glaube nicht, dass die Funktionalität woanders versteckt war, das gibt es wohl wirklich erst ab Delphi 2005. Heute sieht das Kontextmenü ähnlich aus, aber mit diesem und ein paar anderen Punkten mehr:
Nichtsdestotrotz hilft der Projektmanager ja auch schon bei Delphi 7 zumindest dabei die Projekte parallel offen zu haben um das Package so verhältnismäßig einfach aktualisieren zu können.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!