Delphi-PRAXiS

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.

RSE 22. Apr 2010 08:00

Re: published set > 32bit
 
Beim Definieren der Klasse kam mir die Idee folgendes zu tun:
Delphi-Quellcode:
  TKeys = record
    Keys: set of Char;
  end;
Das ist (fast) das gleiche wie ein großes Set, nur dass der Bezeichner einen Punkt enthält. :stupid:

@himitsu: Hm, da hast du wohl Recht. Es war eben der Strohhalm zum dran festklammern :zwinker:

himitsu 22. Apr 2010 08:02

Re: published set > 32bit
 
Zitat:

Zitat von RSE
Delphi-Quellcode:
TKeys = record
  Keys: set of Char;
end;

Ja, das ist genaus groß, wie das pure Set und demnach sollte doch auch dieses nicht als Published möglich sein? :gruebel:


PS: Dank der Class-Operatoren wäre nichtmal ein Punkt nötig. :angel2:

RSE 22. Apr 2010 10:17

Re: published set > 32bit
 
Es kommt nicht allein auf die Größe an! :smile2: Zuerst schaut Delphi nach dem Typ, und wenn es ein Set ist, dann wird geschaut, ob es auch klein genug für den OI ist. Mein Typ ist jetzt aber ein Record, und die werden offenbar gar nicht im OI angezeigt (zumindest meiner nicht). Also gibt´s da auch kein Problem mit den Property Editoren mehr.

himitsu 22. Apr 2010 10:39

Re: published set > 32bit
 
Zitat:

Zitat von RSE
und die werden offenbar gar nicht im OI angezeigt (zumindest meiner nicht). Also gibt´s da auch kein Problem mit den Property Editoren mehr.

Ich denke du willst das Set im OI haben?

RSE 22. Apr 2010 10:47

Re: published set > 32bit
 
Ich meinte, dass es keinen vordefinierten (eingeschränkten) Standard-Property-Editor dafür gibt, der ggf. Fehler beim Compilieren produziert. Wenn ich einen eigenen Property Editor schreibe, dann wird der benutzt, wenn es eine entsprechende published-Eigenschaft gibt, und genau daran arbeite ich gerade.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 Uhr.

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