Announcement

Collapse
No announcement yet.

Assign vs. :=

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Assign vs. :=

    Hallo!

    Wer kann mir den unterschied zwischen
    StrListA := StrListB;
    und
    StrListB.assign(StrListB);
    erklären?

  • #2
    Hi Sebastian,<br>
    <br>
    für Einzelheiten kannst Du mal versuchen in der Hilfe nach<br>
    TPersistent.Assign suchen, und sehen, inwieweit Du damit klarkommst.<br>
    <br>
    Kernaussage ist:<br>
    Bei der Verwendung von Assign erhält das Ziel (StrListA) eine Kopie<br>
    der Quelle (StrListB), bei der Verwendung von := wird nur ein neuer<br>
    Verweis auf die gleichen Daten erzeugt.<br>
    Hast Du also die Daten mit := zugewiesen, wirken sich Änderungen in<br>
    StrListA genauso auf die Daten in StrListB aus, bei Assign nicht.<br>
    Ich gehe mal davon aus, dass StrListA und B vom Typ TStringList sind.<br>
    Weist Du mit := zu und gibst StrListB mit Free wieder frei, laufen<br>
    Zugriffe auf StrListA auf Fehler, da die Stringliste nicht mehr existiert<br>
    bei Zuweisung mit Assign geschieht das nicht, da StrListA eine Kopie enthält.<br>
    <br>
    Ciao<br>
    Chri

    Comment


    • #3
      Hallo Christian,<br>grundsätzlich stimmt es schon. Aber wie immer gibt es auch Ausnahmen. Bei der Anweisung Canvas.Font:=aFont wird die SetFont Methode von Canvas aufgerufen. <br>
      procedure TCanvas.SetFont(Value: TFont);<br>
      begin<br>
      FFont.Assign(Value);<br>
      end;<br>
      Dort wird dann implizit Assign aufgerufen. Der Aufruf hat dann fast den gleichen Effekt wie Canvas.Font.Assign(aFont). Aber nur fast. Denn bei Canvas.Font.Assign(aFont) wird <u>nicht</u> die SetMethode aufgerufen. Das könnte dann zu Problemen führen, wenn die SetMethode noch etwas mehr machen soll als die Zuweisung der Schriftart.<br>Jens Schuman

      Comment


      • #4
        Hallo,<br>
        StrListA := StrListB ist eine reine Zeigerzuweisung,<br>
        dh. danach zeigen beide auf das gleiche Objekt.<br>
        Wurde vorher mit StrListA:=TStringList.Create eine Instanz erzeugt,<br>
        so ist nach der obigen Zuweisung darauf kein Zugriff mehr möglich,<br>
        da der Objektzeiger ja mit StrListB überschrieben wurde.<br>
        Wenn nun zB. dieses Objekt mit StrListA.Free freigegeben wird,<br>
        zeigt StrListB auf ein nicht mehr gültiges Objekt und ein Zugriff<br>
        über StrListB.Irgendwas führt zum Rumms.<br>
        Die Assign-Methode dagegen kopiert je nach Implementation (siehe Hilfe) bestimmte Felder des Quellobjekts in das Zielobjekt.<br>
        Das Verhalten von Assign ist abhängig vom Objekttyp,<br>
        wer absolute Kontrolle braucht sollte sich die jeweilige<b>
        Implementation in der VCL anschauen.
        Bei TStringList bzw. TStrings werden die Strings kopiert,<br>
        dabei werden beim Zielobjekt vorher vorhandene Strings mit Clear gelöscht.<br>
        Ich hoffe das war jetzt einigermaßen verständlich:-)<br>
        <br>
        Gruß<br>
        Harr

        Comment

        Working...
        X