![]() |
Delphi-Version: 10.3 Rio
Control zuweisen
Hallo,
ich mache das recht oft aber bin mir eigentlich nicht sicher, ob das Nachteile hat. Als Beispiel für eine ListBox in OnDrawItem:
Delphi-Quellcode:
Also ich mache sowas gerne, damit der weitere Verlauf im Code abgekürzt ist. Nicht nur bei einer ListBox. Sonst müsste ich in diesem Fall immer "TListBox(Control)." angeben. So ein DrawItem-Ereignis wird ja oft aufgerufen und die zuweisen erfolgt dann natürlich auch immer sehr oft. Aber denke das ist ok so. Man könnte z.B. noch die Zeile "Var L : TListBox;" Global setzen. Wenn ich darauf achte, dass diese Variable "L" nicht woanders genutzt wird, würde dies dann für "OnDrawItem" ein Vorteil sein? Oder ist das ganz egal? Zuweisen muss ich ja sowieso aber das "Var L : TListBox;" wäre dann woanders. Jedenfalls bringt es mir viel im Code (für die Übersicht):
Procedure ... DrawItem(Control: TWinControl; Index: Integer;...
Var L : TListBox; Begin L := TListBox(Control); If L.Columns = 0 Then... End;
Delphi-Quellcode:
If Index = Ceil(TListBox(Control).ClientHeight / TListBox(Control).ItemHeight)-1+TListBox(Control).TopIndex Then // langer Code
If Index = Ceil(L.ClientHeight / L.ItemHeight)-1+L.TopIndex Then // kurzer Code |
AW: Control zuweisen
Für den Compiler ist es komplett egal und auch vom erzeugten Code ergibt es praktisch keinen Unterschied,
also ob du auf die eine Variable mit einem Casts zugreifst, oder ob das nur einmal in eine andere Variable kopiert und dann Jene benutzt. Einen Unterschied gibt es bei harten Cast
Delphi-Quellcode:
gegenüber einem weichen Cast
TListBox(Control)
Delphi-Quellcode:
.
(Control as TListBox)
Falls mehrmal genutzt und der Weiche, mit "Prüfung" ob der Typ in der Variable wirklich passt, nötig ist, dann braucht man nur beim ersten Zugriff einen Weichen und es kann später Hart sein, da es sich ja nicht ändern wird. PS:
Delphi-Quellcode:
L ist ein "Alias" für den Speicherplatz von Control (kann/darf auch ein anderer Typ sein, aber nur gleichgroß oder kleiner, wie der originale Typ)
Procedure ... DrawItem(Control: TWinControl; Index: Integer;...
Var L : TListBox absolute Control; Begin If L.Columns = 0 Then... End; Dein L ist eine Kopie (des Objektzeiger/Pointer) und mit absolute ist es die "gleiche" Variable. oder ... aber das will niemand machen
Delphi-Quellcode:
begin
with TListBox(Control) do if Columns = 0 then... end; |
AW: Control zuweisen
Danke. "L" war nur ein Beispiel. Nutze es nicht nur bei einer ListBox. Hier in diesem Fall nehme ich "LB" als Variable.
In vielen Code-Bereichen wird der Code dann einfach etwas übersichtlicher Wenn es Delphi wurscht ist, lasse ich die "Var-Zeile", da wo es sie ist. Vielen Dank |
AW: Control zuweisen
Zitat:
Delphi-Quellcode:
oder?
begin
with TListBox(Control) do begin if Columns = 0 then ... end; end; Habe ich mir aber abgewöhnt, da man immer aufpassen muss nicht die falsche Variable / Funktion zu erwischen. Lieber etwas mehr tippen. Es ist dann auch einfacher Code-Fragmente zu kopieren... |
AW: Control zuweisen
ups, ja WITH. :lol:
Ich hatte z.B. in etwa folgenden Code in einer TForm gesehn: Als Kommentare das, was der Entwickler sich dabei dachte, bzw. was der Compiler neuerdings daraus machte.
Delphi-Quellcode:
Das funktionierte super, so lange sich nichts veränderte und TRect so aussah
var Rect: TRect;
with Rect do {Self.}Width := {Rect.}Right - {Rect.}Left;
Delphi-Quellcode:
Und dann wunderte man sich, dass der Code plötzlich nicht mehr funktionierte und die Form ihre Größe nicht mehr anpasste, denn
TRect = record
Left, Top, Right, Bottom: Integer; end; //bzw. TRect = record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint); end;
Delphi-Quellcode:
var Rect: TRect;
with Rect do {Rect.}Width := {Rect.}Right - {Rect.}Left;
Delphi-Quellcode:
Auch TForm und andere Komponenten/Klassen bekommen irgendwann mal neue Funktionen, an die niemand damals dachte.
TRect = record
... public ... property Width: Integer read GetWidth write SetWidth; ... case Integer of 0: (Left, Top, Right, Bottom: FixedInt); 1: (TopLeft, BottomRight: TPoint); end; Zitat:
|
AW: Control zuweisen
Genau das meinte ich. "with" ist immer gefährlich wenn man nicht genau weiß was man macht bzw. wo der Code noch zum Einsatz kommt.
Ich hatte mich früher in C++ aufgeregt, dass es da das "with" in der Form nicht gibt. Mittlerweile bin ich froh drum. Man kann dort aber in ähnliche Probleme mit den "namespaces" laufen... Aber an besten ausschreiben. Und wenn der Bezeichner in den Parametern doch unmöglich lange ist, dann kann man ja immer noch den Weg über "var x: ... absolute ..." gehen... |
AW: Control zuweisen
Zitat:
Auf jeden Fall: machs:!: Die Vorteile vor allem wegen der Übersichtlichkeit überwiegen deutlich. :thumb: |
AW: Control zuweisen
[QUOTE=freimatz;1481997]
Zitat:
|
AW: Control zuweisen
Ja, das mit Soft und Hart hatte ich schon erwähnt.
Der Gedanke des Grundproblems war aber nicht die Art des Castes (auch wenn da deine Aussage stimmt), sondern es ging garum den "mehrfachen" Cast vorher in einer Variable zwischenzuspeichern und dann überall die Variable zu verwenden. * Hier hat die Variable eigentlich mehr Vorteile, gegenüber den 4-8 Byte mehr für die neue Varialbe * Und ja, wenn man das noch für den soften Cast betrachtet, dann ist "einmal" der Cast, gegenüber Mehrmals noch vorteilhafter. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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 by Thomas Breitkreuz