Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   nicht-visuelle Komponente mit Top/Left property macht ärger (https://www.delphipraxis.net/205056-nicht-visuelle-komponente-mit-top-left-property-macht-aerger.html)

KodeZwerg 28. Jul 2020 08:34

nicht-visuelle Komponente mit Top/Left property macht ärger
 
In einer selbst erstellten nicht-visuellen Komponente, habe ich Top und Left properties.
Nun habe ich festgestellt das Delphi, wenn ich die Komponente auf ein Formular ziehe und speicher zwei mal diese Eigenschaft samt zwei Unterschiedlichen Werten erzeugt.

In der von Delphi erzeugten dfm Datei:
Die ersten Top/Left Werte beziehen sich auf die Komponenten Eigenschaft.
Die zweiten Top/Left Werte beziehen sich auf die Position vom Icon der Komponente.

Soweit so gut...

Beende ich Delphi und starte es mit diesem Projekt neu malt Delphi die Komponente (das Icon/Bild) immer an Position 0,0.

Mache ich an dieser Stelle etwas falsch oder Delphi?

TBx 28. Jul 2020 08:59

AW: nicht-visuelle Komponente mit Top/Left property macht ärger
 
:glaskugel: Hmm, die ist wohl kaputt ...
Hast Du mal ein bisschen Quellcode?

KodeZwerg 28. Jul 2020 09:02

AW: nicht-visuelle Komponente mit Top/Left property macht ärger
 
Ich erstelle zu morgen eine micro demo, Danke schonmal für's Lesen!

//edit
Es läuft darauf hinaus das ich im "Public" part halt "propery Left: Integer read FLeft write SetLeft default 1" habe. (Das gleiche nochmal für "Top")
Demo kommt morgen, nichts desto trotz um es zu zeigen.

Delphi.Narium 28. Jul 2020 09:33

AW: nicht-visuelle Komponente mit Top/Left property macht ärger
 
Top und Left sind halt Eigenschaften visueller Komponenten, um diese sowohl im Designer, als auch im laufenden Programm an eine bestimmte Stelle eines Formulars ... zu positionieren.

Eventuell hat Delphi ja ein Problem damit, diese Eigenschaften bei nicht visuellen Komponenten richtig "einzuordnen", hier also zu ignorieren.

Welchen Vorfahren hat denn Deine Komponente? Verfügt die auch schon über die Eigenschaften Top und Left, so dass es sich hierbei in Deiner Komponenten um vererbete Eigenschaften handelt?

Benenne Deine Eigenschaften Top und Left doch einfach mal in IconTop und IconLeft um, dann kann man am Namen der Eigenschaft erkennen, dass hier die Position des Icons der Komponente gemeint ist und Delphi kann da kein Irrtum bei der Interpretation der Eigenschaften unterlaufen.

KodeZwerg 28. Jul 2020 09:38

AW: nicht-visuelle Komponente mit Top/Left property macht ärger
 
TComponent ist der Vater.
Left und Top von meiner Komponente wird letzten Endes dafür genutzt um ein dynamisch generiertes Window auf diese Position zu schubsen.

DeddyH 28. Jul 2020 09:51

AW: nicht-visuelle Komponente mit Top/Left property macht ärger
 
Dann nimm doch die geerbten Left und Top zur Positionierung, oder benenne alternativ Deine selbst deklarierten Eigenschaften entsprechend um (WindowLeft und WindowTop oder so).

Delphi.Narium 28. Jul 2020 09:58

AW: nicht-visuelle Komponente mit Top/Left property macht ärger
 
TComponent hat doch garkein Top und Left.

Vermutlich will hier Delphi Top und Left für das nicht existierende dynamische Window nutzen. Und das scheitert kläglich.

Der einfachheithalber Namen von Eigenschaften, die bereits delphiweit für bestimmte Funktionen genutzt werden, nicht für anders zu nutzende Eigenschaften verwenden.

Bei 'ner anderweitigen Nutzung der Eigenschaft Name oder Owner oder ComponentCount oder ... könnte ich mir ähnliche, unspezifizierte "Nebenwirkungen" vorstellen.

Manchmal ist es durchaus sinnvoll, sich an Namenskonventionen zu halten, auch wenn sie im konkreten Einzelfall nicht zwingend als sinnvoll erscheinen.

himitsu 28. Jul 2020 14:25

AW: nicht-visuelle Komponente mit Top/Left property macht ärger
 
Doch, hat es, aber nicht so, wie du denkst.

Top und Left existieren nur "virtuell", da eine nicht-visuelle Komponente "eigentlich" keine Top/Left hat bzw. braucht, aber im FormDesigner doch eine "Position" besitzt.
Intern wird es in Component.DesignInfo gespeichert und die "Property" in der DFM werden erst beim Speichern "generiert".
Delphi-Referenz durchsuchenTComponent.DefineProperties

Lösung: anderer Name
oder DefineProperties überschreiben.

KodeZwerg 28. Jul 2020 14:47

AW: nicht-visuelle Komponente mit Top/Left property macht ärger
 
Krasses Ding @himitsu
Bin mal deinem Link gefolgt und da stehts auch so beschrieben.
Das Umbenennen eine Möglichkeit ist war mir schon klar aber wieso weshalb warum und vor allem woher das kam war mir nicht bewusst da mir TComponent kein Left/Top angezeigt hatte.
Warum ich diese Namen nutzte hat ja Delphi.Narium gut erkannt/beschrieben.
Da ich noch weniger Ahnung habe wie ich TFiler zu benutzen habe werde ich den Vorschlag mit WindowLeft/WindowTop nachkommen.

Aus dem link von himitsu:
Zitat:

TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time.
Damit ist das Thema für mich erfolgreich beendet, eine Demo kommt demzufolge nicht mehr da nun verstanden und geklärt wurde worum es mir ging.

Vielen Dank an alle beteiligten!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr.

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