Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList im with übergeben (https://www.delphipraxis.net/147568-tstringlist-im-uebergeben.html)

luke2 11. Feb 2010 15:32


TStringList im with übergeben
 
Hallo,

Wenn ich eine Funktion oder Prozedur habe, die TStrings als Parameter erwartet, muss ich ja eine TStringList ja mit einer Variable erstellen und diese dann übergeben.
Beispiel:
Delphi-Quellcode:
procedure test(s:tstrings);
begin
  [...]
end;

var
  sl:tstringlist;
begin
  sl:=tstringlist.create;
  try
    test(sl);
  finally
    sl.free;
  end;
end;
Wenn ich das Ganze nun mit einem with abkürzen möchte, gibt es dann auch eine Möglichkeit die eigene Instanz zu übergeben?
Beispiel:
Delphi-Quellcode:
procedure test(s:tstrings);
begin
  [...]
end;

begin
  with tstringlist.create do try
    test(<was kommt hier rein?>);
  finally
    free;
  end;
end;
MfG

DeddyH 11. Feb 2010 15:34

Re: TStringList im with übergeben
 
Nö, geht nicht (zumindest hätte ich keine Idee, wie). Hat immerhin den Vorteil, dass man with nicht immer so ohne weiteres verwenden kann und somit eine Fehlerquelle weniger hat.

luke2 11. Feb 2010 15:39

Re: TStringList im with übergeben
 
Schade, ich brauche sowas nämlich relativ häufig und schreibe das gerne mit with, weil ich wenig Lust habe immer erst eine Variable für sowas zu deklarieren... :pale:

DeddyH 11. Feb 2010 15:42

Re: TStringList im with übergeben
 
Nunja, Du könntest höchstens eine Klasse von TStringlist ableiten und eine Methode implementieren, die intern dann test(self) aufruft. Aber da würde ich an Deiner Stelle eher auf with verzichten.

luke2 11. Feb 2010 15:46

Re: TStringList im with übergeben
 
OK, das wäre für sowas dann echt zu viel Aufwand, dann werde ich das with wohl weglassen. Danke trotzdem!

Jaynder 11. Feb 2010 15:48

Re: TStringList im with übergeben
 
vergiss das with, führt nur zu Problemen mit ungewollten/unerkannten Namensüberlagerungen und ist blöd beim Debuggen. Mach lieber ein kleines Template zum Anlegen und wieder freigeben einer kurznamigen temporären Variablen.

himitsu 11. Feb 2010 16:01

Re: TStringList im with übergeben
 
Zitat:

Zitat von DeddyH
Nunja, Du könntest höchstens eine Klasse von TStringlist ableiten und eine Methode implementieren, die intern dann test(self) aufruft.

Mit einem Class-Helper wäre sowas schnell und für alle Objekte nachgerüste, nur daß man da dann halt das Objekt nur als TObjekt bekommt oder man muß eben für bestimmte Klassen einen eigenen Class-Helper erstellen.

Aber schöner wäre es gewesen, wenn Delphi von sich aus bei WITH anbieten würde, wie es mit SELF bei Methoden möglich ist.

DeddyH 11. Feb 2010 16:05

Re: TStringList im with übergeben
 
Trotzdem würde ich eher eine Variable deklarieren, um Verwechslungen auszuschließen (Beispiele für solche Verwechslungen gibt es hier ja haufenweise).

[edit] Z.B. hier [/edit]

himitsu 11. Feb 2010 16:31

Re: TStringList im with übergeben
 
Zitat:

Zitat von DeddyH
Trotzdem würde ich eher eine Variable deklarieren, um Verwechslungen auszuschließen

OK, dann eben Named-With

Delphi-Quellcode:
with xyz: TStringList.Create do
für ein Alias würde mir dieses vorallem gefallen

Delphi-Quellcode:
with kurz: mega_extrem_lange_variable do
  with short: mega_extrem_large_variable do
  begin
    // mach was mit "kurz" und "short"
  end;

Jaynder 11. Feb 2010 16:39

Re: TStringList im with übergeben
 
Man, hast du mich jetzt erschreckt, ich hatte für einen Moment geglaubt die Delphi's wären innovativ gewesen...

himitsu 11. Feb 2010 16:43

Re: TStringList im with übergeben
 
Ja, leider nicht.

Vorallem da es technisch möglich wäre und nichtmal viel Aufwand wäre.

Jaynder 11. Feb 2010 17:17

Re: TStringList im with übergeben
 
wie bei beim exception-handling...

implementation 11. Feb 2010 17:49

Re: TStringList im with übergeben
 
Warum geht das nicht? Ich habe damit keine Probleme:
Delphi-Quellcode:
with TStringList.Create do try
  ...
  test(Self);
  ...
finally
  Free;
end;

himitsu 11. Feb 2010 18:03

Re: TStringList im with übergeben
 
Zitat:

Zitat von implementation
Warum geht das nicht? Ich habe damit keine Probleme:
Delphi-Quellcode:
with TStringList.Create do try
  ...
  test(Self);
  ...
finally
  Free;
end;

Hast du es auch probiert?

implementation 11. Feb 2010 18:07

Re: TStringList im with übergeben
 
Ja - bei mir läufts (na gut, anderer Compiler, vielleicht läufts in Delphi ja auch nicht).
[ADD]
Na gut, im Delphi-Mode und Compiler-Version 2.4.0 willer's auch nicht mehr.
Vorher hatte ich's mit 'ner Uralt-FPC-Version versucht.

himitsu 11. Feb 2010 18:10

Re: TStringList im with übergeben
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  with TEdit.Create(nil) do
    ShowMessage(Self.ClassName);
end;
Ergebnis: "Form1", also die Form und nicht das Edit :zwinker:

PS: In einer normalen Funktion (keiner Methode) würde hier auch der Compiler meckern.

implementation 11. Feb 2010 18:16

Re: TStringList im with übergeben
 
Der Compiler mit dem ich das vorhin versucht hab, war auch irgendsoein uraltes Nightly-Build, mit 2.4.0 geht das auch nicht mehr (hab ich grad installiert und getestet).

Jaynder 11. Feb 2010 19:29

Re: TStringList im with übergeben
 
Siehst du, und genau dass ist das Problem mit dem with: unklare Semantik, nicht portabel usw.. Also lieber Finger weg davon, ich glaube der gute Nikolaus Wi(r)th ärgert sich bis heute darüber die Krätze genau so wie über die nicht explizit mit end abgeschlossen Kontrollstrukturen if und while, weshalb ich heute pro Sekunde fünf mal begin end schreiben kann...

alzaimar 11. Feb 2010 20:56

Re: TStringList im with übergeben
 
Zitat:

Zitat von Jaynder
..das ist das Problem mit dem with: unklare Semantik, nicht portabel usw..

Also hier ist die Definition eindeutig. Es ist sonnenklar, was gemeint ist und sollte portabel sein (so wie die Reihenfolge der Auswertung von Ausdrücken). Ob es lesbar ist, ist eine andere Frage.
Delphi-Quellcode:
With Parameter.UndEinigenFeldern.InklusiveUnwichtigem.Zeugs Do
  Dies := Das;
*Wie* es kompiliert wird, ist klar. Sonnenklar. Aber was ist Dies und wem gehört Das.
Zitat:

Zitat von Jaynder
..ich glaube ...Nikolaus Wi(r)th ärgert sich bis heute .. über die nicht explizit mit end abgeschlossen Kontrollstrukturen if und while..

Aber das ist doch in fast allen modernen strukturierten Programmiersprachen so. Das ist doch kein Problem. Das Problem ist die Formatierung, weswegen man das heutzutage der IDE überlässt und nicht mehr selbst macht.

Beim 'With' gebe ich dir recht, obwohl es mir höchstens 1x pro Jahr Probleme bereitet. Und 'Ja', ich schreibe mehr als 1x pro Jahr eine Zeile Code :zwinker: .

implementation 12. Feb 2010 14:25

Re: TStringList im with übergeben
 
Zitat:

Zitat von Jaynder
über die nicht explizit mit end abgeschlossen Kontrollstrukturen if und while, weshalb ich heute pro Sekunde fünf mal begin end schreiben kann...

Das ist doch sogar eher wieder positiv, nicht so verwirrend wie in einigen BASIC-Dialekten.
If und While erwarten nunmal 1 Anweisung (Aufruf oder Zuweisung), man muss sich dann nur noch merken, dass Begin-End-Blöcke mehrere Anweisungen auch da möglich machen, wo normal nur eine erwartet wird.


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