Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi published set > 32bit (https://www.delphipraxis.net/150594-published-set-32bit.html)

RSE 21. Apr 2010 14:51


published set > 32bit
 
Hallo,

obwohl das Thema sicherlich nicht allzu neu ist, finde ich bei Google doch nur Junk dazu, der mir nicht weiterhilft. Ich möchte die Eigenschaft
Delphi-Quellcode:
TKeySet = set of Char;
property AllowedKeys: TKeySet read FAllowedKeys write FAllowedKeys;
gerne published machen. Da mein set zu groß ist, geht das nicht. Grund: Die Standard-Streaming-Methoden, die für published-Elemente verwendet werden, kommen nur mit Sets bis max. 32bit zurande. Mehr macht auch keinen Sinn, wenn man den Standard-Property-Editor verwendet. Ich möchte aber sowieso einen eigenen Dialog Property Editor dafür bauen und würde auch eigene Routinen zum Schreiben und Lesen der Eigenschaften schreiben (mit TPersistent.DefineProperties), aber die Absicht alleine hält ja Delphi noch lange nicht von diesem Fehler ab...

Unter den von mir genannten Voraussetzungen sehe ich nun keinen Grund mehr für den Compilerfehler. Kann man den irgendwie abstellen? Wie würdet ihr an dieses Problem herangehen?

himitsu 21. Apr 2010 14:56

Re: published set > 32bit
 
Der Grund ist, daß die Verwaltungs- und Streamingmethoden für die Publisched-Dinge nunmal nur mit Integer arbeiten und mit allem, was da irgendwie reinpaßt. (inklusive Typen mit internen Zeigern, wie Strings und Co.)

Dü könntest dein SET aber in einer Klasse kapseln.

RSE 21. Apr 2010 15:34

Re: published set > 32bit
 
Eine eigene Klasse ist schon irgendwie mit Kanonen auf Spatzen schießen, zumal ein Set eben so schön handlebar ist mit dem in-Operator usw., aber wenn man die Standard Verwaltungs- und Streamingmethoden nicht anders aushebeln kann... Ich dachte es gäbe vielleicht eine Vorgehensweise ähnlich DefineProperties, für mein TKeySet speziell eigene Read- und Write-Methoden zu setzen, die den Standardmethoden zuvorkommen. Dann wäre das Problem ja schon gelöst. Aber dann müsste diese Vorgehensweise natürlich auch sicherstellen, dass ich einen eigenen Property Editor registriere... ist sicher so nicht lösbar. Dann werd ich mich wohl morgen mal an die Klasse machen.

uligerhardt 21. Apr 2010 15:50

Re: published set > 32bit
 
Wenn ich dich recht verstanden habe, musst du AllowedKeys einfach public statt published machen. Gestreamt wird's ja eh wegen DefineProperties.

himitsu 21. Apr 2010 15:54

Re: published set > 32bit
 
Zitat:

[DCC Fehler] Unit2.pas(19): E2187 Größe von Published-Menge 'i' ist >4 Byte
Was mich aber grade irritiert ist, daß man ein Publisched-Property als Int64 (8 Byte), Double (auch 8 Byte) oder Extended (10 Byte) deklarieren kann. :shock:

RSE 21. Apr 2010 16:23

Re: published set > 32bit
 
Als public wär das kein Problem, aber dann wirds ja auch nicht im OI angezeigt ;-)

Das Problem ist, dass (zumindest in D5) TSetProperty von TOrdinalProperty abgeleitet ist und dieses mit GetOrdValue arbeitet, welches Longint zurückliefert, also 32bit.

uligerhardt 21. Apr 2010 17:32

Re: published set > 32bit
 
Zitat:

Zitat von RSE
Als public wär das kein Problem, aber dann wirds ja auch nicht im OI angezeigt ;-)

Ups. Ich dachte, DefineProperties würde dafür sorgen, dass... :oops: Das kommt davon, wenn man nicht testet. 8-)

Zitat:

Zitat von RSE
Das Problem ist, dass (zumindest in D5) TSetProperty von TOrdinalProperty abgeleitet ist und dieses mit GetOrdValue arbeitet, welches Longint zurückliefert, also 32bit.

Schuss ins Blaue: Vielleicht kannst du ein "THugeSetProperty" schreiben, dass nicht von TOrdinalProperty abgeleitet ist, und selbiges für dein Set registrieren. (Ich teste schon wieder nicht.)

RSE 21. Apr 2010 21:15

Re: published set > 32bit
 
DefineProperties sorgt nur für die Speicherung im DFM, sonst nix. Für die Anzeige im OI ist published zuständig, genau das ist der Unterschied zwischen public und published.

Ob die Registrierung eines neuen Property Editors den Precompiler davon abhält, einen Fehler auszugeben, habe ich noch nicht ausprobiert, ich wage es aber schwer zu bezweifeln. Morgen früh werd ich es mal ausprobieren.

Edit:
Eben habe ich noch Folgendes gefunden, man beachte besonders Punkt 5:
Tutorial Warnungen und Hinweise vom Delphi Compiler
Vielleicht wird der Fehler ja auf diese Weise erzeugt. Ich schau mir die VCL-Quellen morgen früh noch mal genau an.

RSE 22. Apr 2010 07:37

Re: published set > 32bit
 
Wie erwartet hält die Registrierung eines neuen Property Editors den Precompiler nicht davon ab, einen Fehler auszugeben ;-) Große Sets sind damit von vornherein im published ausgeschlossen. Also werde ich jetzt eine Klasse dafür bauen.

Mit der Message-Direktive wird übrigens in der VCL gar nicht gearbeitet.

himitsu 22. Apr 2010 07:54

Re: published set > 32bit
 
Zitat:

Zitat von RSE
Mit der Message-Direktive wird übrigens in der VCL gar nicht gearbeitet.

Meinst du das {$MESSAGE ...} ?

Mit sowas kann man auch nicht geziehlt Nachrichten z.B. via IF und CASE in einem laufendem Programm ausgeben, denn diese wird immer ausgegeben, wenn der Compiler dort vorbei kommt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz