Autor Beitrag
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.03.12 00:13 
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

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden volle Höhe 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.

Für diesen Beitrag haben gedankt: Narses
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!
_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: BenBE, Narses