Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Syntax der with-Anweisung (https://www.delphipraxis.net/122040-syntax-der-anweisung.html)

Namenloser 8. Okt 2008 16:14


Syntax der with-Anweisung
 
Ich habe gerade hier diese Syntax gesehen:
Delphi-Quellcode:
  with ComboBox1, Items do begin
    itemindex := IndexOf(edit1.text)
Bisher habe ich die with-Anweisung in solchen Fällen immer so benutzt:
Delphi-Quellcode:
  with ComboBox1.Items do begin
    itemindex := IndexOf(edit1.text)
Die Onlinehilfe sagt zum Komma in der with-Anweisung folgendes:
Zitat:

Wenn auf with mehrere Objekte oder Records folgen, wird die gesamte Anweisung als Folge von verschachtelten with-Anweisungen behandelt. Die Anweisung:

Delphi-Quellcode:
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.
Was ist da jetzt der Unterschied zu der Schreibweise mit Punkt? :gruebel:

Apollonius 8. Okt 2008 16:20

Re: Syntax der with-Anweisung
 
ItemIndex ist eine Eigenschaft von TCombobox, nicht von TStrings. Daher benötigt auch die Combobox ein With, oder du qualifizierst ItemIndex.

TonyR 8. Okt 2008 16:21

Re: Syntax der with-Anweisung
 
Das würde in diesem Fall bedeuten, dass die with - Anweisung für combobox1 UND für combobox1.items gilt

Edit: ...wie mein Vorredner auch schon geschrieben hat xD

Namenloser 8. Okt 2008 16:24

Re: Syntax der with-Anweisung
 
Zitat:

Zitat von Apollonius
ItemIndex ist eine Eigenschaft von TCombobox, nicht von TStrings. Daher benötigt auch die Combobox ein With, oder du qualifizierst ItemIndex.

Ah, stimmt. Danke :oops:

Whookie 8. Okt 2008 16:26

Re: Syntax der with-Anweisung
 
.. obwohl mir Angst und Bange wird bei einem solchen Beispiel :cry:

Die einzig korrekte Anwendung der with-Anweisung für obiges Beispiel lautet:

Delphi-Quellcode:
    ComboBox1.ItemIndex := ComboBox.Items.IndexOf(edit1.text);
sieht elleganter aus, führt zu keinen Missverständnissen und kommt vor allem ganz ohne with aus :thumb:

Namenloser 8. Okt 2008 16:45

Re: Syntax der with-Anweisung
 
Ich benutze with-Anweisungen auch eher selten, also nur wenn es mindestens drei oder 4 Anweisungen hintereinander gibt. Und ich beziehe mich in der with-Anweisung generell auf den "kleinsten gemeinsamen Nenner", also im Beispiel Combobox1.

omata 8. Okt 2008 18:02

Re: Syntax der with-Anweisung
 
@Whookie: :thumb: :thumb:

nahpets 8. Okt 2008 19:10

Re: Syntax der with-Anweisung
 
Zitat:

Zitat von omata
@Whookie: :thumb: :thumb:

Na, der Beispieltext ist von mir und ich hatte ihn nur aus dem Ursprungspost übernommen und mich beim Probieren ehrlichgesagt darüber gewundert, dass das geht. Ausgeschrieben ist es mir doch deutlich lieber. Gut, schreiben wir was mehr, aber in umfangreichen Quelltexten weiß man dann auch immer, womit man es zu tuen hat und muss nicht erst das vorhergehende oder noch vorhergehendere oder so with suchen, um zu erahnen, womit man es denn im Moment da eigentlich zu tuten haben könnte.

Chemiker 8. Okt 2008 19:45

Re: Syntax der with-Anweisung
 
Hallo,

eine weitere Möglichkeit um Tipparbeit zu sparen ist zum Beispiel mit einer Variablen zu arbeiten.

z.B.:

Delphi-Quellcode:
constructor THPLComPortClass.Create(AOwner: TComponent);
var
  C: TApdCustomComPort;
begin
  inherited Create(AOwner);
  FComPort:= TApdComPort.Create(self);   // Neuer ComPort Erstellen
  c:= FComPort;
  c.AutoOpen:= FALSE;
  c.Baud:= 9600;
  c.BufferFull:= 1;
  c.BufferResume:= 1;
  c.ComNumber:= 0;
  c.HWFlowOptions:= [hwfUseDTR,hwfUseRTS,hwfRequireDSR,hwfRequireCTS];
  c.InSize:= 2;
  c.LogHex:= FALSE;
  c.OutSize:= 2;
  c.RTS:= FALSE;
  c.TapiMode:= tmNone;
statt:

Delphi-Quellcode:
constructor THPLComPortClass.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FComPort:= TApdComPort.Create(self);   // Neuer ComPort Erstellen
  with FComPort do
  begin
    AutoOpen:= FALSE;
    Baud:= 9600;
    BufferFull:= 1;
    BufferResume:= 1;
    ComNumber:= 0;
    HWFlowOptions:= [hwfUseDTR,hwfUseRTS,hwfRequireDSR,hwfRequireCTS];
    InSize:= 2;
    LogHex:= FALSE;
    OutSize:= 2;
    RTS:= FALSE;
    TapiMode:= tmNone;
  end;
Bis bald Chemiker

alzaimar 8. Okt 2008 21:43

Re: Syntax der with-Anweisung
 
Ich habe hier im Forum erfahren, das die Verwendung des 'with'-Statements mit Teeren und Federn bestraft wird. Daher möchte ich nur zwei Anmerkungen zu dieser Diskussion beitragen:
1. Die With-Anweisung von Visual Basic ist besser (Syntax sinngemäß):
Code:
With Foobar do
  .Property1 := bla;
  .Caption := mump;
End Width
Hier gehts um den Punkt: Schöne Idee, die ich mir in Delphi auch wünschen würde.

2. Übersichtlichkeit: Ich arbeite mit den Developer Express Komponenten, und da gibt es einen Bandwurm, um die einen selektierten Wert (die Spalte'MyNameColumn') eines Datengitters zu ermitteln:
Ohne with
Delphi-Quellcode:
SelectedName := MyGridView.DataController.Values[MyGridView.DataController.FocusedRecordIndex, MyNameColumn.Index];
mit:
Delphi-Quellcode:
With MyGridView.DataController do
  SelectedName :=Values[FocusedRecordIndex,MyNameColumn.Index];
Im Bestreben, den Code auf das Wesentliche zu beschränken, finde ich die Variante mit 'with' einfach übersichtlicher. Natürlich unter der Voraussetzung, das das Klassenmodell von DevExpress bekannt ist.

Mein Fazit: Ich verwende 'with', wenn ich Code leserlich gestalten will und würde mir die '.' Notation von VB in Delphi wünschen, damit dieses leidige Thema um die (ach so schlimme) und mißverständliche Verwendung von 'with' endlich ein Ende hat. Was mit einer guten Idee begann (vor 40 Jahren), in dem man eine Compileroptimierung als Sprachbestandteil manifestiert (Verwendung von Registern), ist heute im Kontext von OOP und mehrfach auftretender Eigenschaftsnamen ein Problem: CodeGear! handelt. :cheer:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 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