Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Im with statement obj referenzieren (https://www.delphipraxis.net/101463-im-statement-obj-referenzieren.html)

DGS 13. Okt 2007 20:14


Im with statement obj referenzieren
 
Tach.

ich stehe vor einer Aufgabe und habe Probleme die richtigen Worte zu finden dazu.

Jedenfalls Ausgangslage:
Ich benutze eine with Konstruktion, um u.a. Variablennamen einzusparen. Verwende ich für ein Stream.

Hier ein fetzen des relevaten Codes:

Delphi-Quellcode:
function tForm1.lesen( datei: String; var stream : tStream) : boolean;
var i : int;
begin
  with tFileStream.Create( datei, fmOpenRead) do begin
    {...}
    stream.CopyFrom( XXX, i );
    {...}
    free;
  end;
end;
Was ich nun möchte:
Aus dem erstellten tFileStream will ich ne Stelle in stream kopieren.

Das Problem:
Welche referenz soll ich nutzen? ( Stelle mit XXX markiert )
ein self liefert nur (in diesem Beispiel ) Form1, nicht aber den temporären stream.

Kann man das irgendwie mit with trotzdem lösen, oder komm ich um eine weitere Variable nicht herum?
Also sowas:

Delphi-Quellcode:
function tForm1.lesen( datei: String; var stream : tStream) : boolean;
var
  i : int;
  t : tStream;
begin
  t := tFileStream.Create( datei, fmOpenRead);
  {...}
  stream.CopyFrom( t, i );
  {...}
  t.free;
end;
Also dieser Code tut das, was ich auch will.
Wenn also mit with nicht gehen sollte, dann nehme ich auch den. Nur möcht ich halt wissen, ob es wirklich nicht möglich ist, oder ob doch man was machen kann.

Gruss

Apollonius 13. Okt 2007 20:19

Re: Im with statement obj referenzieren
 
Nein, das geht nicht. Falls doch, würde es mich aber auch interessieren.

DGS 13. Okt 2007 20:27

Re: Im with statement obj referenzieren
 
Tja, schade eigentlich, dass es nicht geht.
Hab aber auch nicht wirklich erwartet, dass es klappen wird.
Dann muss halt ne zusätzliche Variable her.

SirThornberry 13. Okt 2007 21:52

Re: Im with statement obj referenzieren
 
bin ich froh das es nicht geht :-D Ich bin jemand der das Width überhaupt nicht mag weil oft nicht ersichtlich ist ob es innerhalb des blocks um eine Eigenschaft des With-Parameter handelt oder um eine eigenständige Variable. Oft kommt es dort auch zu fehlern.

Bsp.:
Delphi-Quellcode:
procedure TMyComponent.Methode();
begin
  with AnComponent do
  begin
    [...]
    Name := 'irgendwas';
    [...]
    //teilweise auch schon gesehen
    Name = AnComponent.Name;
    [...]
  end;
end;

RavenIV 15. Okt 2007 07:59

Re: Im with statement obj referenzieren
 
Zitat:

Zitat von SirThornberry
bin ich froh das es nicht geht :-D Ich bin jemand der das Width überhaupt nicht mag weil oft nicht ersichtlich ist ob es innerhalb des blocks um eine Eigenschaft des With-Parameter handelt oder um eine eigenständige Variable. Oft kommt es dort auch zu fehlern.

Da schlag ich gleich auch in die selbe Kerbe.
Wenn ich irgendwo im Quellcode (eines Kollegen oder so) auf ein with stosse, wird dies ersatzlos eliminiert.
Vor allem hat der Debugger damit ein Problem, weil er die Variablen nicht auflösen kann. Beim "Drüberfahren" zeigt er den Wert der Variablen nicht an.
Und das menschlische Auge sieht auch nicht sofort, wo eine Property dazugehört. Geil wird es aber erst, bei mehrfachen oder verschachtelten with. Dann kommt weder der Compiler noch der Debugger noch der Mensch mehr klar.

DGS 15. Okt 2007 19:23

Re: Im with statement obj referenzieren
 
Je nach Mensch natürlich. Ich konnte da bisher gut mitverfolgen, was passiert.

Also würdet ihr alle eh generell von der With-Konstruktion abraten?
Dafür lieber eine Variable mehr deklarieren?

mkinzler 15. Okt 2007 19:28

Re: Im with statement obj referenzieren
 
Ohne with ist es eindeutiger und imho leichter zu sehen zu welcher variable die Eigenschaft/Methode gehört

alzaimar 15. Okt 2007 19:48

Re: Im with statement obj referenzieren
 
Ich bin wohl der einzige auf der Welt, der mit 'with' gerne arbeitet.
Statt
Delphi-Quellcode:
Foo.Bar.Grumpy.Steve.Bob.Jim.Arm := 1;
Foo.Bar.Grumpy.Steve.Bob.Jim.Leg := 2;
Foo.Bar.Grumpy.Steve.Bob.Jim.Head := 3;
dann doch lieber

Delphi-Quellcode:
With Foo.Bar.Grumpy.Steve.Bob.Jim do Begin
  Arm := 1;
  Leg := 2;
  Head := 3;
End;
Bei Mehrdeutigkeiten lass ich es natürlich sein und verwende für Jim vielleicht eine lokale Variable, aber Konstrukte wie
Delphi-Quellcode:
With TMyForm.Create (nil) do begin
  If ShowModal = mrOk Then DoSomeThing;
  Release
End;
sind doch echt nett.

Aber es ist egal, ob nun mit 'with' oder nicht. Ihr wollt es übersichtlich und lesbar, ich auch. Und darum geht es letztendlich.

Amateurprofi 15. Okt 2007 19:49

Re: Im with statement obj referenzieren
 
Ich liebe with-Statements und benutze sie immer dann, wenn der Source-Code dadurch kürzer wird.

@Sir T. :
Für mich wird dadurch der Code übersichtlicher.

@RavenIV :
Der Compiler kommt damit sehr wohl klar (und ich auch). Lediglich der Debugger hat damit Probleme, aber die nehme ich gern in Kauf.

Und was denken die Profis (ich bin ja nur ein AmateurProfi)?:
Einfach mal in die Delphi Source Codes schauen.

Whookie 15. Okt 2007 19:56

Re: Im with statement obj referenzieren
 
Also ich würd auch sagen "Finger weg" vom with Statement (obwohl ich es früher auch gerne verwendet habe ... es bringt vor allem langfristig NUR Probleme mit sich!!

@alzaimar so ist es viel besser:

Delphi-Quellcode:
Var
  jim: TFooObject;
Begin
  jim := Foo.Bar.Grumpy.Steve.Bob.Jim;
  jim.Arm := 1;
  jim.Leg := 2;
  jim.Head := 3;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.
Seite 1 von 5  1 23     Letzte »    

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