Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wirkliche Unterschiede?? (https://www.delphipraxis.net/192494-wirkliche-unterschiede.html)

Towmuz 24. Apr 2017 11:27

AW: Wirkliche Unterschiede??
 
hier, guckt doch einfach in die Wiki :p

Hobbycoder 24. Apr 2017 11:32

AW: Wirkliche Unterschiede??
 
Zitat:

Zitat von Delbor (Beitrag 1368830)
Hi HobbyCoder
Zitat:

Das hier erzeug aber nur eine Instanz, und das ist dann auch der Unterschied.
Ich fragte nicht nachdem Unterschied von meinem Codeschnipsel zu demjenigen von DeddyH. Die Frage war nach dem Unterschied der Syntax, wie ich sie in der Demo angetroffen habe und meinem Konstrukt:
Delphi-Quellcode:
      with MapRules.Add do begin
        PrecMax := 19;
        PrecMin := 4;
        SourceDataType := dtFmtBCD;
        TargetDataType := dtCurrency;
      end;
Oben das in der Demo angetroffene Konstrukt, unten das Konstrukt, das ich satt dessen zu verwendsen gedachte und das zu einer AV führte.
Delphi-Quellcode:
//        MapRules.Add(PrecMax := 2);
//        MapRules.Add(PrecMin := 0);
//        MapRules.Add(SourceDataType := dtFmtBCD);
//        MapRules.Add(TargetDataType := dtBoolean);
Gruss
Delbor

Zum esten habe ich mich auf den Titel "Wirklich Unterschiede" bezogen.
Zum zweiten, einmal ist es eine Instanz und einmal sind es 4 Instanzen. Ist für mich ein entscheidender unterschied.
Zum dritten, was weiß ich denn, was in der Add-Methode steht, und welche Parameter du da überhaupt übergeben kannst, oder ob es da überladene Methoden gibt. Schau doch mal nach.

Fakt ist jedenfalls, dass With..do alles mit einer Instanz mache und 4 mal x.Add() mit 4.

Delbor 24. Apr 2017 11:44

AW: Wirkliche Unterschiede??
 
HI DeddyH
Zitat:

Add ist keine Klasse! Das ist eine Methode (Funktion) der Klasse, von der MapRules ist (TMapRules vermutlich). Diese Funktion gibt Dir eine Instanz zurück, und dieser Instanz weist Du nun die Werte zu.
Ich ging eigentlich erstmal auch davon aus, dass Add eine Methode von MapRules ist und war deshalb auch erstaunt, dass das Konstrukt
Delphi-Quellcode:
 MapRules.Add(PrecMax := 2);
nicht funktionierte.
Daher auch meine Vermutung, dass Add eine Klasse mit dem Property PrecMax sein müsste. Aber eben: wer nennt seine Klasse schon 'Add'??

@Bernhard Geyer: Die Demo ist das program Indices aus Object Pascal\Database\FireDAC\Samples\Comp Layer\TFDQuery, falls das interessiert.

Gruss
Delbor

bra 24. Apr 2017 11:54

AW: Wirkliche Unterschiede??
 
Jetzt mal blöd gefragt, worum geht es hier eigentlich noch?

Das

Zitat:

Zitat von Delbor (Beitrag 1368801)
Delphi-Quellcode:
      with MapRules.Add do begin
        PrecMax := 19;
        PrecMin := 4;
        SourceDataType := dtFmtBCD;
        TargetDataType := dtCurrency;
      end;

und das

Zitat:

Zitat von Delbor (Beitrag 1368801)
Delphi-Quellcode:
//        MapRules.Add(PrecMax := 2);
//        MapRules.Add(PrecMin := 0);
//        MapRules.Add(SourceDataType := dtFmtBCD);
//        MapRules.Add(TargetDataType := dtBoolean);

ist was vollkommen verschiedenes, sofern sich das zweite überhaupt kompilieren lässt. So das sollte doch inzwischen geklärt sein, oder nicht?

Delbor 24. Apr 2017 12:10

AW: Wirkliche Unterschiede??
 
Hi Hobbycoder

Zitat:

Zum zweiten, einmal ist es eine Instanz und einmal sind es 4 Instanzen. Ist für mich ein entscheidender unterschied.
Hmm....

Delphi-Quellcode:
var Adresslist: TStringlist;

Adresslist.Add(xxxx);
Adresslist.Add(xxxx);
Adresslist.Add(xxxx);
Adresslist.Add(xxxx);
Das ist definitiv immer die gleiche Instanz und auch immer die gleiche Add-Methode.
In einem With-Konstrukt würde ich das allerdings so schhreiben:
Delphi-Quellcode:
with Adresslist do begin
Add(xxxx);
Add(xxxx);
Add(xxxx);
Add(xxxx);
end;
Nach dem Angetroffenen Konstrukt ginge dies offenbar aber auch so:
Delphi-Quellcode:
with Adresslist.Add do begin
y:=xxxx;
y:=xxxx;
fy:=xxxx;
dy:=xxxx;
end;
@bra:
Zitat:

ist was vollkommen verschiedenes, sofern sich das zweite überhaupt kompilieren lässt. So das sollte doch inzwischen geklärt sein, oder nicht?
Ich verstehe es jedenfalls noch nicht. Offenbar wird im with-Konstrukt die Methode 'Add' eines Objektes aufgerufen. Oder übersehe ich da einfach, dass in einem "with Object.Add" - Konstrukt der Compiler alles innerhalb als String interpretiert?

Gruss
Delbor

PS: Das hier hab ich allerdings bis jetzt übersehen (Antwort 11 von Towmuz):
Zitat:

hier, guckt doch einfach in die Wiki :p

DeddyH 24. Apr 2017 12:15

AW: Wirkliche Unterschiede??
 
Delphi-Quellcode:
type
  TMyItem = class
    ...
  end;

  TMyItemList = class
    ...
    function Add: TMyItem;
  end;
So oder so ähnlich dürfte die Konstellation aussehen. Der Aufruf von Add führt dazu, dass TMyItemList eine neue Instanz von TMyItem erzeugt, diese in seiner internen Liste ablegt und zurückgibt. Das bedeutet, dass mit jedem Aufruf von Add eine neue Instanz erzeugt und zurückgegeben wird. Jetzt klarer?

Delbor 24. Apr 2017 12:31

AW: Wirkliche Unterschiede??
 
Hi DeddyH
Zitat:

So oder so ähnlich dürfte die Konstellation aussehen. Der Aufruf von Add führt dazu, dass TMyItemList eine neue Instanz von TMyItem erzeugt, diese in seiner internen Liste ablegt und zurückgibt. Das bedeutet, dass mit jedem Aufruf von Add eine neue Instanz erzeugt und zurückgegeben wird. Jetzt klarer?
Ja, vor allem unter Berücksichtigung meines PS im letzten Beitrag! Vielen Dank!

Mein Fehler war offensichtlich, dass ich die Unterschiede von Collections und Listen bisher nicht kannte. Mit ersteren hab ich noch nicht wirklich aktiv gearbeitet.

Gruss
Delbor

Hobbycoder 24. Apr 2017 12:37

AW: Wirkliche Unterschiede??
 
Zitat:

Zitat von Delbor (Beitrag 1368854)
Delphi-Quellcode:
var Adresslist: TStringlist;

Adresslist.Add(xxxx);
Adresslist.Add(xxxx);
Adresslist.Add(xxxx);
Adresslist.Add(xxxx);

Ist klar, es werden 4 Instanzen von irgendwas unter AddressList

Zitat:

Zitat von Delbor (Beitrag 1368854)
Das ist definitiv immer die gleiche Instanz und auch immer die gleiche Add-Methode.
In einem With-Konstrukt würde ich das allerdings so schhreiben:
Delphi-Quellcode:
with Adresslist do begin
Add(xxxx);
Add(xxxx);
Add(xxxx);
Add(xxxx);
end;

Entspricht dem gleichen wie in Beispiel 1.


Zitat:

Zitat von Delbor (Beitrag 1368854)
Nach dem Angetroffenen Konstrukt ginge dies offenbar aber auch so:
Delphi-Quellcode:
with Adresslist.Add do begin
y:=xxxx;
y:=xxxx;
fy:=xxxx;
dy:=xxxx;
end;

Ist aber eben nur 1 Instanz von Irgendwas, wo jetzt werte für die Eigenschaften y, y, fy und dy zugewiesen werden

Die Frage ist also, was liefert die Methode Add überhaupt zurück?

Denn ich könnte ja folgendes im Sourcecode von TAddresslist schreiben:
Delphi-Quellcode:
function TAdressList.Add(Name: string): integer;
var
  Adress: TAdress;
begin
  Adress: TAdress.create;
  Adress.Name:=Name;
  self.Add(Adress);
  Result:=self.Count-1;
end;
Jetzt kannst du als AdressList.Add('Willi') ausführen,
aber
With AddressList.Add do
Name:='Willi'

hagelt es eine Exception.

Würde da aber stehen:
Delphi-Quellcode:
function TAdressList.Add(Name: string): TAdress;
var
  Adress: TAdress;
begin
  Adress: TAdress.create;
  Adress.Name:=Name;
  self.Add(Adress);
  Result:=Adress;
end;
dann könnte man so oder so arbeiten.

Entscheidet ist aber immer noch dass jedes Add eine neue Instanz erzeugt.
Delphi-Quellcode:
AdressList.Add('Willi');
AdressList.Add('Willi');
AdressList.Add('Willi');
AdressList.Add('Willi');
Erzeugt 4 Adresseinträge die alle Willi heißen

Aber
Delphi-Quellcode:
with AdressList.Add do
begin
  Name:='Willi';
  Name:='Willi';
  Name:='Willi';
  Name:='Willi';
end;
Erzeugt 1 Adresseinttrag der Willi heißt.

Es ist also entscheidend die Methode Add aussieht.

Möglicherweise habe ich auch die Frage falsch verstanden.

Delbor 24. Apr 2017 12:56

AW: Wirkliche Unterschiede??
 
Hi Hobbcoder

Zitat:

Ist klar, es werden 4 Instanzen von irgendwas unter AddressList
Nicht von irgendwas, sondern von Strings - hätte ich vielleicht mit anführungszeichen deutlicher schreiben können. Unter '4 Instanzen' verstehe ich hauptsächlich Objektinstanzen,welche mit Create erzeugt werden müssen. Dies ist bei TStrings-'Instanzen' nicht der Fall.

Zitat:

Es ist also entscheidend die Methode Add aussieht.
Ja, das wurde mir inzwischen klar.
Die TCollectionsmethode Add erzeugt ein TCollectionItemsObject und fügt dieser der Collection hinzu.
Die TStringsmethode Add fügt dem TSringsobjekt einen String oder eben auch eine Stringinstanz hinzu, erzeugt dabei allerdings kein neues Objekt (Item ist ein TString).

Zitat:

Möglicherweise habe ich auch die Frage falsch verstanden.
Aus der Fragestellung ging nicht hervor, dass ich die Unterschiede zwischen einer Collection und einer Liste nicht kannte.

Gruss
Delbor

DeddyH 24. Apr 2017 13:00

AW: Wirkliche Unterschiede??
 
Das hat doch nichts mit Liste oder Collection zu tun, sondern rein damit, wie der Rückgabewert (im Bezug auf den Datentyp) der Add-Methode deklariert ist. TKlasse1 und TKlasse2 können ja beide eine Add-Methode besitzen, die aber völlig unabhängig voneinander sind und auch unterschiedliche Typen besitzen können. Anhand des Codes aus dem Ausgangsbeitrag kann es aber IMO nur so sein, dass ein komplexeres Konstrukt, d.h. entweder eine Klasseninstanz, ein Interface oder ein Record, zurückgegeben wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:30 Uhr.
Seite 2 von 4     12 34      

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-2025 by Thomas Breitkreuz