AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Unit für Verknüpfung von Dateierweiterungen
Thema durchsuchen
Ansicht
Themen-Optionen

Unit für Verknüpfung von Dateierweiterungen

Ein Thema von Codewalker · begonnen am 13. Apr 2010 · letzter Beitrag vom 11. Mai 2010
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.400 Beiträge
 
Delphi 12 Athens
 
#18

Re: Unit für Verknüpfung von Dateierweiterungen

  Alt 14. Apr 2010, 11:24
Zitat von Codewalker:
Kannst du das noch etwas genauer erklären? Ich kann Dir da nicht 100%ig folgen.
Delphi-Quellcode:
Var S: String;

S[123] := 'a';
Bei diesem Code macht Delphi intern
Delphi-Quellcode:
UniqueString(S);
S[123] := 'a';
daraus, somit ist sichergestellt, daß bei mehreren Referenzen nur der Stringinhalt der aktuellen "Variable" verändert wird.

Delphi-Quellcode:
Var S, S2: String;

S := '123';
S2 := S;
S[2] := 'X';

// S = '1X3'
// S2 = '123'
Bei dynamischen Arrays ist das leider anders , denn es gibt blöder Weise kein UniqueArray
und Delphi paßt auch nicht auf, daß hier nicht mehrere Referenzen überschrieben werden.
Delphi-Quellcode:
Var A, A2: Array of Integer;

SetLength(A, 3);
A[0] := 11;
A[1] := 22;
A[2] := 33;

A2 := A;

A[1] := 88;

// A = (11, 88, 33)
// A2 = (11, 88, 33)
Also muß man dieses unter Umständen selber einfügen:
Delphi-Quellcode:
Var A, A2: Array of Integer;

SetLength(A, 3);
A[0] := 11;
A[1] := 22;
A[2] := 33;

A2 := A;

SetLength(A, Length(A)); // oder eben A := Copy(A);
A[1] := 88; // aber bei RefCount=1 wäre SetLength effektiver
                          // und sonst gibt es keinen großen Unterschied

// A = (11, 88, 33)
// A2 = (11, 22, 33)
Normaler Weise fällt dieses Verhalten vielen nicht auf, da selbst bei mehreren referenzvariablen viele eigentlich nur ein Array benötigen ... wie z.B. bei dir.

Es sieht quasi so aus, als wenn ein Array keine Referenzzählung hätte
und ebenso, wie dein Ersatzobjekt (z.B. bei TFileTypeActions) wie ein "einfacher" Pointer reagiert.

Bei meinem Hier im Forum suchenTDynamicCharSet oder meinen BigMathTypen ist es aber so, daß jede Referenz ihre eigenen Daten besitzt
(selbst wenn sich mehrere Referenzen die Daten teilen, wenn der Inhalt gleich bleibt),
aber dennoch Änderungen nur in der eigenen Referenz vorgenommen werden dürfen.

hier wird ja nur X verändert:
Delphi-Quellcode:
Var X, X2: Set of AnsiChar;

X2 := X;
X := ['a'];
Wenn ich das Standardverhalten der dynamischen Arrays (mein Typ nutzt intern Soeines) nicht ändern würde, dann könnte hier quasi auch der Inhalt von X2 geändert werden.
Delphi-Quellcode:
Var X, X2: TDynamicCharSet;

X2 := X;
X := ['a'];
Darum sorge ich hier also manuell für eine Single-Referenz, wärend es in deinem Code nicht nötig ist.


PS:
Was würdest du hier erwarten?
Delphi-Quellcode:
Procedure Text(X: TIntegerDynArray);
// man beachte, daß hier kein VAR-Parameter vorliegt
Begin
  X[1] := 8888;
End;

Var A: TIntegerDynArray;

A := (11, 22, 33);
Test;
// viele würden wohl (11, 22, 33) erwarten
// aber in Wirklichkeit steckt (11, 8888, 33) in dem A
Ich würde das ja für einen Fehler in Delphi/Pascal erachten, aber auf mich hört ja keiner.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr.
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