![]() |
Pointer beim Komponentenprogrammieren
Hallöle alle miteinander und nen schönen 2. Advent erstmal :-D !
Aber jetzt zu meinem Problemchen: Sitze gerade mal wieder an einer Komponente. Die Kompo hat unter anderem folgendes property:
Delphi-Quellcode:
Wenn ich jetzt im weiteren Quelltext der komponente auf die StringGrid zugreifen möchte, muss ich dann FGrid oder Grid benutzen?
private
FGrid: TStringGrid; published property Grid: TStringGrid read FGrid write FGrid; Also z.B.:
Delphi-Quellcode:
Danke schonmal!
if FGrid <> NIL then
FGrid.Cells[X, Y] := 'XY'; //oder if Grid <> NIL then Grid.Cells[X, Y] := 'XY'; |
Re: Pointer beim Komponentenprogrammieren
du musst:
Code:
benutzen
if FGrid <> NIL then
FGrid.Cells[X, Y] := 'XY'; |
Re: Pointer beim Komponentenprogrammieren
es ist egal. du kannst auch "Grid" benutzen da "Grid" auf "fGrid" verweist. Richtiger ist es "fGrid" zu nutzen.
|
Re: Pointer beim Komponentenprogrammieren
Zitat:
"Besser ist es "fGrid zu nutzen" :mrgreen: :warn: aber abgesehen davon: ich hätte spontan gesagt "nimm Grid, weil wenn du schonmal ne property gemacht hast, kannst du die ja auch nutzen"...oder nicht? |
Re: Pointer beim Komponentenprogrammieren
Genaugenommen ist der direkte Zugriff auf die Eigenschaftsdaten falsch:
Zitat:
|
Re: Pointer beim Komponentenprogrammieren
Zitat:
|
Re: Pointer beim Komponentenprogrammieren
Also die letzten 2 Posts versteh ich nicht ganz, speziell das letzte:
Beim Componentenproggen muss man doch als Eigenschaft property X: Integer read FX write FX das dann auf eine privatedeklarierte Variable mit (vorbildlich) F vorangestellt, damit man den Überblick leichter halten kann. Wie soll ich denn sonst eine Grid hinbekommen, die man bei bedarf mit aufs Formular setzt und dann in meiner Komponente auf sie Verlinkt? :gruebel: |
Re: Pointer beim Komponentenprogrammieren
Sauber wäre es dann, wenn du innerhalb der Implementierung der Klasse ihre private-Variable "FGrid" ansprichst, aus allen anderen Klassen heraus aber die Property "Grid". Auch wenn sie in der selben Unit liegen!
Das ist dem OOP-Konzept imho am besten zuträglich. |
Re: Pointer beim Komponentenprogrammieren
Zitat:
Gruß, teebee |
Re: Pointer beim Komponentenprogrammieren
Zitat:
Ich würd trotzdem über die Property gehen. grüße, daniel |
Re: Pointer beim Komponentenprogrammieren
Hallo,
dem kann ich nur zustimmen Zitat:
Hast die Methode Notification des Vorfahren überschrieben? Wenn nein kann es innerhalb der IDE zu schweren Schutzverletzungen kommen ein TStringGrid, dass mit Komponente verlinkt ist, gelöscht wird. |
Re: Pointer beim Komponentenprogrammieren
Zitat:
Zumal mit deiner Variante die Getter/Setter ihrer Existenzberechtigung enthoben würden (wenn es nur um einfache Wertzuweisung geht!). Dann kann ich genau so gut ein public-Feld nehmen ;). [ot] Ich frage mich ohnehin warum das Geheimnisprinzip bei der OOP so überaus wichtig sein soll. Wenn es um Felder geht denen einfach zugewiesen wird, und die auch weiter vererbt werden sollen, warum dann nicht public? Ich mach's zwar auch nicht, aber warum ist das so? Nur damit die armen C'ler und Javaisten (C# mal ausgenommen) die von Properties nur träumen können immer schön einheitlich "SetXXX()" schreiben können, und nicht mal "SetVar(Wert)" und mal "Var = Wert"? Irgendwie doof :D [/ot] Der Propertyzugriff ist imho ohnehin eines der tollsten Features der DL! |
Re: Pointer beim Komponentenprogrammieren
meiner meinung nach die daten direkt nur da wo unabdinglich (bei der implementation der property) verwenden und an allen anderen stellen die property zu nutzen. die einzige mir bekannt ausnahme besteht da, wo es _wirklich_ auf speed ankommt, und der property-overhead stören würde. das ist aber bei 08/15 fällen nie der fall.
|
Re: Pointer beim Komponentenprogrammieren
Zitat:
Und ja, du hast recht, es kommt zu Zugriffsverletzungen. In der Kompo stekt noch ein propery, dass die Spaltenzahlen angibt, allerdings nicht nur für die Grid, die Grid ist ja nur zusätzlich zur Ausgabe. Wenn also das Property in der Designtime verändert wird, wird auf die Grid zugegriffen, ihre Spaltenzahl verändert und sie wird mit nullen gefüllt (in jede Zelle eine "0"). Das Spaltenändern macht er noch, das sieht man ja, aber mit nullen füllen scheint nicht zu funktionieren, ich kann nichts genaueres sagen, [ot] ich nicht weiß wie oder besser nicht weiß ob überhaupt: man bei Komponenten in der Designtime Haltepunkte setzt oder so was in der Art, wie kann ich rausbekommen, was das für ein Fehler ist oder welcher? Zugriffsverletzung an Adresse xxx sagt mir nicht viel! Kann man da irgendwie nachgucken? [/ot] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 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