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

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
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;

{ TComponent1 }

procedure TComponent1.SetA(const Value: Integer);
begin
  if (Value > 0and 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!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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):
ProjectContext

cu
Narses


jaenicke - Mi 07.03.12 01:29

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
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:

RadXE2Abhängigkeiten

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.