Autor Beitrag
HawkMacs
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 19.04.10 17:48 
Hallo,
als erstes mal der Disclaimer: Habe mich in diesem Forum und woanders blöd gesucht, aber keine Antwort gefunden.
So, jetzt zur Sache.

Ich habe eine Komponente von TStringgrid abgeleiten und als TMyStringGrid in die VCL installiert.
Funktioniert soweit, allerdings mit einer Einschränkung, die wohl in den Bereich Streaming von Eigenschaften fällt.
Meiner Ansicht nach sollten doch veröffentlichte (published) Properties einfachen Typs (z.B. Integer), die in der Basisklasse existieren, automatisch von Delphi gespeichert und geladen werden, oder?

Meine komponente verhält sich so, daß ich ein funktionierendes TMyStringgrid auf ein Formular ziehen kann, es auch, inklusive hinzugefügter Erweiterungen dargestellt wird, aber z.B. die geerbten Eigenschaften FixedRows und FixedCols zwar im Objektinspektor erscheinen, sich dort verändern lassen, aber weder zur Laufzeit, noch im Designmodus wirksam werden.

Das "Warum" ist nach einem Blick in den Quelltext eigentlich auch klar, denn im Constructor von TCustomGrid werden diese mit 1 initialisiert.

Was mir jetzt fehlt, ist das Konzept, an welcher Stelle und mit welchen Mechanismen Delphi die im Objektinspektor eingegebenen und in der passenden DFM Datei auch gespeicherten (hab ich nachgeprüft) Werte läd/initialisiert.
Im constructor von TCustomgrid und TStringgrid finde ich jedenfalls nichts derartiges.

Meine abgeleitete Komponente benutzt "inherited" im Constructor und lässt FixedCols und FixedRows ansonsten in Ruhe. Sollte doch eingetlich reichen, oder?

Vielen Dank für die Ausdauer beim Lesen und ggf. Hilfestellung bei meinem Problem.
Gruß,
Markus
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: Mo 19.04.10 21:38 
Delphi speichert Properties, wenn diese von ihrem Defaultwert abweichen, oder der für das Property definierte Store-Handler True liefert.

Wenn Du einen anderen Defaultwert haben möchtest, müsstest du die Property-Definition überschreiben und deinen neuen Defaultwert setzen. Oder halt besagten Stored-Handler schreiben. Mehr Details dazu findest Du in der Hilfe von Delphi; speziell Object Pascal Reference\Language Reference.

P.S.: Disclaimer sind unwirksam und werden geflissendlich ignoriert.

_________________
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.
HawkMacs Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 20.04.10 10:54 
...
Ja, wenn, aber die Defaults waren ja nicht das Problem, sondern die im Objektinspektor eingetragenen Werte.
Trotzdem vielen Dank für die Hilfestellung.

Habe das Problem Gestern Abend noch gefunden.

Delphi Hilfe:
"Wenn das Streaming-System ein Formular oder Datenmodul aus der entsprechenden Formulardatei lädt, erstellt es zuerst mit Hilfe des zugehörigen Konstruktors die Formularkomponente und initialisiert dann deren Eigenschaften mit den ausgelesenen Werten."

Im Konstruktor sind somit die gespeicherten Werte noch nicht verfügbar, sondern diese werden erst später mittels der Prozedur "Loaded" initialisiert.

Es scheint also so zu sein, daß man Initialisierungscode, der Werte benutzt, die per Objektinspektor eingetragen wurden, nicht im Constructor unterbringt, sonder dafür die Prozedur Loaded überschreibt. Ja..hat geklappt.
Was mich stutzig macht, ist, daß das in keinem der Tutorials zum Thema Komponentenentwicklung, die ich mir angeschaut habe, erwähnt wird.
Gibt es dafür eine empfehlenswerteres Vorgehen?

Falls jemand eine gut verständliche, umfassende Quelle zum Thema Streamingsystem bzw. Hintergründe der VCL hat, wäre ich für einen Hinweis dankbar.
Gruß,
Markus

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Delphi speichert Properties, wenn diese von ihrem Defaultwert abweichen, oder der für das Property definierte Store-Handler True liefert.

Wenn Du einen anderen Defaultwert haben möchtest, müsstest du die Property-Definition überschreiben und deinen neuen Defaultwert setzen. Oder halt besagten Stored-Handler schreiben. Mehr Details dazu findest Du in der Hilfe von Delphi; speziell Object Pascal Reference\Language Reference.

P.S.: Disclaimer sind unwirksam und werden geflissendlich ignoriert.
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 20.04.10 11:00 
Entweder in Loaded oder AfterConstruction - dort mach ich sowas immer.

Allgemein ist das aber so gedacht, dass der Konstruktor erstmal auf Defaults initialisiert und man beim Laden der Properties über die Property-Change-Handler entsprechend drauf reagiert.

_________________
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.
HawkMacs Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 20.04.10 15:50 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Entweder in Loaded oder AfterConstruction - dort mach ich sowas immer.

Allgemein ist das aber so gedacht, dass der Konstruktor erstmal auf Defaults initialisiert und man beim Laden der Properties über die Property-Change-Handler entsprechend drauf reagiert.



Klint interessant, aber unter Property Change Handler find ich weder in der Delphi Hilfe, noch unter Google unmittelbar was Verwertbares.

Ich nehme an, es handelt sich um Events, die durch die VCL ausgelöst werden, sobald sich ein Wert im OI ändert. Nur haben laut Delphi7 Hilfe weder TPersistent, noch TComponent irgendwelche Events und spätestens auf der Ebene müssten die ja vorhanden sein, oder?

Vieleicht bin ich ja Begriffsstutzig, aber könntest du bitte noch ein klein wenig ausführliche auf die Dinger eingehen oder ein kleines Quellcodebsp. bringen, anhand dessen man sich weiterhangeln kann?o

Besten Dank schon mal für bisherigen Antworten.
Gruß,
Markus
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: Mi 21.04.10 10:34 
Nein, meinte die Read und Write-Angaben in der Property-Deklaration.

_________________
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.