AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
Thema durchsuchen
Ansicht
Themen-Optionen

Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen

Ein Thema von aschne1 · begonnen am 26. Jul 2004 · letzter Beitrag vom 30. Mär 2011
Antwort Antwort
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#1

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen

  Alt 29. Mär 2011, 10:34
stimmt nicht! es ist laut Delphi Hilfe effizienter. Aber dann sparsam und nur in performancekritischen Schleifen einsetzen. Der Debugger mag das nicht D2009). Außerdem wird es mit zunehmender Länge der Blöcke schwer verständlich.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#2

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen

  Alt 29. Mär 2011, 10:41
stimmt nicht! es ist laut Delphi Hilfe effizienter.
Wo hast Du das gelesen? Abgesehen davon überwiegen die Nachteile derart, dass man wirklich nur von with abraten kann, Beispiele dafür gibt es haufenweise hier im Forum.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen

  Alt 29. Mär 2011, 11:02
Aus der Delphi 2009 Hilfe: Deklarationen und Anweisungen

Zitat:
with-Anweisungen
Eine with-Anweisung stellt eine einfache und bequeme Möglichkeit dar, die Felder eines Records oder die Felder, Eigenschaften und Methoden eines Objekts zu referenzieren. Die Syntax für eine with-Anweisung lautet

Delphi-Quellcode:
with Objekt do Anweisung, oder
with Objekt1, ..., Objektn do Anweisung
Hierbei ist Objekt ein Ausdruck mit einer Referenz auf einen Record, eine Objektinstanz, eine Klasseninstanz, eine Interface- oder Klassentyp (Metaklassen)-Instanz. Anweisung ist eine einfache oder eine strukturierte Anweisung. Innerhalb von Anweisung brauchen Felder, Eigenschaften und Methoden von Objekt nur über ihren Bezeichner referenziert zu werden. Die Angabe von Qualifizierern ist nicht erforderlich.

Ausgehend von den Deklarationen
Delphi-Quellcode:
type
  TDate = record
    Day: Integer;
    Month: Integer;
    Year: Integer;
  end;

var
  OrderDate: TDate;

with OrderDate do
 if Month = 12 then
   begin
     Month := 1;
     Year := Year + 1;
   end
 else
   Month := Month + 1;
if OrderDate.Month = 12 then
  begin
   OrderDate.Month := 1;
   OrderDate.Year := OrderDate.Year + 1;
  end
else
  OrderDate.Month := OrderDate.Month + 1;
Wenn die Interpretation von Objekt die Indizierung von Arrays oder die Dereferenzierung von Zeigern verlangt, werden diese Aktionen einmal durchgeführt, bevor die Anweisung ausgeführt wird. Dies macht with-Anweisungen sowohl effizient als auch kurz. Außerdem können sich während der aktuellen Ausführung der with-Anweisung Zuweisungen an eine Variable innerhalb von Anweisung nicht auf die Interpretation von Objekt auswirken.

Jede Variablenreferenz und jeder Methodenname in einer with-Anweisung wird, wenn möglich, als Element des angegebenen Objekts bzw. Records interpretiert. Wenn in der with-Anweisung auf eine andere Variable oder Methode mit demselben Namen zugegriffen werden soll, ist ein Qualifizierer erforderlich:

Delphi-Quellcode:
with OrderDate do
  begin
    Year := Unit1.Year;
       ...
  end;
Wenn auf with mehrere Objekte oder Records folgen, wird die gesamte Anweisung als Folge von verschachtelten with-Anweisungen behandelt. Die Anweisung:

with Objekt1, Objekt2, ..., Objektn do Anweisung ist gleichbeudeutend mit

Delphi-Quellcode:
with obj1 do
  with obj2 do
    ...
    with objn do
      // Anweisung
In diesem Fall wird jede Variablenreferenz und jeder Methodenname in Anweisung als Element von Objektn behandelt, wenn dies möglich ist. Andernfalls wird die Referenz bzw. der Name als Element von Objektn1 interpretiert usw. Dieselbe Regel gilt für die Interpretation der Objekte selbst. Ist beispielsweise Objektn sowohl ein Element von Objekt1 als auch von Objekt2, wird es als Objekt2.Objektn interpretiert
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#4

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen

  Alt 29. Mär 2011, 11:40
Ich lese daraus nicht, dass with effizienter sein soll als der Verzicht darauf.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen

  Alt 29. Mär 2011, 12:05
Nun, wir haben es hier mit einer Kollison des Scope zu tun.
Sowohl das dynamisch angelegte TEdit als auch das übergeordnete TForm besitzen teilweise die gleichen Properties (Name, Parent, Autosize, SetBounds).
Durch die Verwendung von With kann der Programmierer nicht mehr zuverlässig unterscheiden, welches Objekt konkret angesprochen wird.

Sobald aber nur die geringste Unsicherheit besteht, sollte man von With die Finger lassen.
Der Gewinn von Zeit im Mikrosekundenbereich ist es einfach nicht wert.
Andreas
  Mit Zitat antworten Zitat
Patito

Registriert seit: 8. Sep 2006
108 Beiträge
 
#6

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen

  Alt 29. Mär 2011, 13:43
Von With-statements sollte man bekanntlich grundsätzlich die Finger lassen.
Von dem Beispiel aus der Delphi 2009 Hilfe kriegt man ja ganz blutige Augen... Aua!

Ausserdem sieht oben im Code die Verwendung von FindComponent() noch ein wenig nach
einer zweiten Sollbruchstelle aus. Normalerweise sollte man Objekte über vernünftige Objekt-Referenzen
verwalten. Zur Laufzeit mit Objekt-Namen herumzuhantieren sieht immer etwas amateurhaft aus.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#7

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen

  Alt 29. Mär 2011, 16:45
es ist laut Delphi Hilfe effizienter.
Wo hast Du das gelesen?
WITH legt eine lokale Variable an, welche als eine Art SELF und somit als aktueller Namespace fungiert.

Wenn an WITH nur eine einfache, lokale Variable übergibt, dann wird wirklich da nichts optimiert.
Übergibt man an WITH aber ein Funktionsresult oder einige Property, dann wird da natürlich so Einiges optimiert, da das Konstruct innerhalb des WITH-DO nur einmal ausgewertet wird.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Patito

Registriert seit: 8. Sep 2006
108 Beiträge
 
#8

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen

  Alt 30. Mär 2011, 09:04
es ist laut Delphi Hilfe effizienter.
Wo hast Du das gelesen?
WITH legt eine lokale Variable an, welche als eine Art SELF und somit als aktueller Namespace fungiert.

Wenn an WITH nur eine einfache, lokale Variable übergibt, dann wird wirklich da nichts optimiert.
Übergibt man an WITH aber ein Funktionsresult oder einige Property, dann wird da natürlich so Einiges optimiert, da das Konstruct innerhalb des WITH-DO nur einmal ausgewertet wird.
In solchen Fällen legt man Funktionsresult oder Property üblicherweise selbst in einer lokalen Variablen ab.
Technisch gibt es eventuell einen theoretischen Vorteil für das With (Stack vs Register für die lokale Variable!?).

Sobald man aber mal die Ineffizienz berücksichtigt, die dadurch entsteht, dass der With-Code schwerer zu maintainen ist, gibt es praktisch keine Rechtfertigung mehr auch nur ein einziges With zu verwenden.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 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