Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi With ... do Anweisungen.... (https://www.delphipraxis.net/30292-do-anweisungen.html)

Kedariodakon 23. Sep 2004 00:04


With ... do Anweisungen....
 
So habe mir mal gedacht ich mache meine 30 Labels alle auf einmal leer, aber scheiße was...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Label1, Label2, Label3 {...Hier gings noch weiter :) ...} do Caption := '';
end;
Aber geändert wurde nur das letzte Label :gruebel:
Ich hatte gedacht der macht das mit allen... :wink:

Wie bokomm ich das hin das er alle 30 Label leer macht? ohne jedes einzelne leer zu machen?

MFG Keda

Luckie 23. Sep 2004 00:06

Re: With ... do Anweisungen....
 
Stichwort für die Suche heißt: Hier im Forum suchenFindcomponent.

Kedariodakon 23. Sep 2004 00:47

Re: With ... do Anweisungen....
 
Cool sowas hab ich schon immer gesucht, zwar net in dem zusammenhang aber das kann man ja öfters brauchen =)

aber trotzdem is das doch komisch das der das bei der with ... do Schleife net macht oder?
Was ist wenn ich mit mehreren Objecten arbeite, die zufällig die selbe methode haben? dann wird die letzte angegebene benutzt und die andere net obwohl ich die eigendlich meinte...
Verwirrend...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  With Label1 do
    With Label2 do
      With Label3 do
        With Label4 do
          Caption := 'geändert';
end;
ist ja genau das selbe wie:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  With Label1, Label2, Label3, Label4 do
    Caption := 'geändert';
end;
Geändert wird aber immer das letzte...

Aber warum baut Borland sowas für mehrere ein, wenns verbugt ist? (Jedenfalls nach meiner meinung....)
Hätten sie wenigstens verständlich in die Hilfe schreiben können...
Oder versteht ihr das?

Zitat:

Delphi-Sprachreferenz
In diesem Fall wird jede Variablenreferenz und jeder Methodenname in Anweisung als Element von Objektn-1 behandelt, wenn dies möglich ist. Andernfalls wird die Referenz bzw. der Name als Element von Objektn–1 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.
Naja egal :cheers:

:D

MFG Keda

NicoDE 23. Sep 2004 01:00

Re: With ... do Anweisungen....
 
with-do ist eben kein for-each.

Stell Dir with-do als Namensraum/Scope vor, der verwendet werden soll.
Die Aufzählung ist nur eine Vereinfachung um nicht...
Delphi-Quellcode:
with foo do
begin
  with bar do
  begin
    //...
  end;
end;
...schreiben zu müssen.

dizzy 23. Sep 2004 01:08

Re: With ... do Anweisungen....
 
Zitat:

Delphi-Sprachreferenz

Ist beispielsweise Objektn sowohl ein Element von Objekt1 als auch von Objekt2, wird es als Objekt2.Objektn interpretiert.
Was ist daran unklar?? Das erklärt den Sachverhalt doch optimal. Wenn eine Eigenschaft in mehreren der angegebenen Objekte vorhanden ist, wird immer die Eigenschaft des letzten angegebenen Objektes das passt genommen.
with ist nicht dazu da, um mehrere Objekte gleicher Klasse auf einmal zu behandeln, sondern lediglich zur Vereinfachung des Schreibens.
Anstelle von:
Delphi-Quellcode:
Object1.DoThis;
Object1.DoThat;
Object1.DoSometingElse;
Object1.DoNothing;
ermöglicht with:
Delphi-Quellcode:
with Object1 do
begin
  DoThis;
  DoThat;
  DoSometingElse;
  DoNothing;
end;
Das und nur das macht with. Für deinen Zweck brauchst du FindComponent, oder du erzeugst deine Labels von vorne herein in einem array of TLabel von Hand, und nicht im Formulardesigner. Dann kannst du mit einer for-Schleife über deine Labels iterieren.

Mit Bug-Vorwürfen wäre ich ganz vorsichtig... :zwinker:


gruss,
Fabian

btw: Das Verwenden von mehreren Objekten in with wird im allgemeinen als schlechter Stil angesehen, da man so gut wie garnicht mehr nachvollziehen kann welche Property sich denn nun anuf welchen Objekt bezieht. Bei typgleichen Objekten ists noch einfach: Immer das letzte in der Liste. Aber sonst kann es echt grausam werden. (Wird's je nach Code auch schon mit nur einem Objekt und anderen Feldern der aktuellen Klasse die wohlmöglich gleich heissen.)

Kedariodakon 23. Sep 2004 01:17

Re: With ... do Anweisungen....
 
für sowas nehm ich sie ja auch, aber bei mehrfachen ineinander Anwendungen der With...do - Anweisung kann es passieren, dass es nicht macht was es soll :)
Das an sich ist ja nicht schlimm, aber das man net mal irgendwo darauf hingewiesen wird ist dumm...

Und wenn man net aufpast baut man so Fehler ein weil man schon müde ist und am nächsten Tag findet man ihn einfach net :)


Für mich ist die Sache nu eigendlich gegessen, da ich ja nun weiß das es so nicht geht :)


MFG Keda

dizzy 23. Sep 2004 02:02

Re: With ... do Anweisungen....
 
Zitat:

Zitat von Kedariodakon
aber das man net mal irgendwo darauf hingewiesen wird ist dumm...

:gruebel: Öhm, ist doch eigentlich logisch, dass das "wurschtelig" werden muss wenn zwei angegebene Objekte eine gleichlautende Property haben, dann muss sich der Compiler für eines entscheiden. Und:
Delphi-Quellcode:
type
  TOne = class
    Florida: Integer;
    Paris: Integer;
  end;
  TTwo = class
    Birmingham: Byte;
    Paris: Integer;
  end;
.
.
.
var
  One: TOne;
  Two: TTwo;
.
.
with One, Two do
begin
  // --> viele Zeilen Code hier <--
  Florida := 12;
  Paris := 8;
  Birmingham := 3;
end;
Wüsstest du jetzt ohne immer nachschauen zu müssen, dass "Florida" sich auf "One" bezieht, und "Birmingham" auf "Two", und vor allem "Paris" auf "Two", aber nur, weil es als letztes in der Liste steht?
Ich denke, dass man dafür keinen Hinweis braucht, sondern das ist einfach eine logische konsequenz dieses Konstruktes.

Alle Objekte der Liste bearbeiten haut nicht hin, da with ja (leider) kein Iterator ist wie das neue for each, dass ja noch kommt.
Zitat:

Zitat von Kedariodakon
with ... do Schleife

Genau das ist es nämlich nicht: Eine Schleife. :zwinker:

Guts Nächtle,
Fabian :drunken:


\\edits: Hatte mich erst verlesen -> inhaltliche Korrektur *imhalbschlafbin*

Kedariodakon 23. Sep 2004 02:38

Re: With ... do Anweisungen....
 
Asche über mein Haupt :drunken:



Nu weiß ich es Dizzy :)
Aus Fehlern lernt man ja bekanntlich, oder besser sollte man :)
Wie ist das eigendlich wenn zwei Klassen ne Eigenschaft mit gleichen Namen, aber unterschiedlichen Typen haben? Sucht der sich dann das richtige aus?
müßte er ja oder?


MFG Keda

dizzy 23. Sep 2004 02:49

Re: With ... do Anweisungen....
 
Zitat:

Zitat von Kedariodakon
Asche über mein Haupt :drunken:
Nu weiß ich es Dizzy :)

Okay, Mission erfolgreich :lol:
(Wollte nicht unfreundlich daher kommen; falls es so klang *beteuer*)

Zitat:

Zitat von Kedariodakon
Wie ist das eigendlich wenn zwei Klassen ne Eigenschaft mit gleichen Namen, aber unterschiedlichen Typen haben? Sucht der sich dann das richtige aus?
müßte er ja oder?

Genau das habe ich mich beim Scheiben des letzten beitrags auch gefragt. Wenn Delphi so intelligent ist wie ich es ihm unterstelle, dann ja. Allerdings bin ich noch nie in die Verlegenheit gekommen, dass das der Fall war. Ich vermeide "with" so oft wie möglich, es sei denn es handelt sich um einen Block voll Zuweisungen die nur an dieses eine Objekt gehen. (Ist oftmals beim Zeichnen sehr parktisch: Anstelle von X mal "Bitmap.Canvas.*" nur noch "*" innerhalb des Blocks. Oder aber z.B. bei Open-/Save-Dialogen kann man sich sehr schön eine Variable sparen: "with TOpenDialog.Create do ...", da man den (selben) Dialog selten später noch braucht.)

Wäre also nett von Delphi, wenn es das täte, aber auf der anderen Seite auch wieder gemein, da es die Verwendung von "with" in dieser Art und Weise auch noch fördern würde ;).

with freundlichem Gruß ( 8) )
Fabian

Kedariodakon 23. Sep 2004 04:26

Re: With ... do Anweisungen....
 
Hmm da es jetzt schon so früh ist, werd ich das nu auch net mehr testen :)
Die Ampel-Anlage hat mich schon ganz schön in beschlag genoommen :)

Mal schaun ob ich Heute nochmal zeit für finde, dann poste ich mein Ergebniss :P

MFG Keda


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr.
Seite 1 von 2  1 2      

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