![]() |
Re: Unit für den Umgang mit Dateiverknüpfungen
Zitat:
Delphi-Quellcode:
(ungetestet). Ich bevorzuge hier trotzdem den Einzeiler.
if Assigned(FActions) and Assigned(FActions) or Assigned(FActions) then
FActions.Free; |
Re: Unit für den Umgang mit Dateiverknüpfungen
Zitat:
|
Re: Unit für den Umgang mit Dateiverknüpfungen
Zitat:
|
Re: Unit für den Umgang mit Dateiverknüpfungen
Zitat:
|
Re: Unit für den Umgang mit Dateiverknüpfungen
Zitat:
Nachdem ich mir dann den Quelltext runtergeladen und angeschaut habe, habe ich dann aber begriffen, dass es sich nicht um den "Umgang mit Dateiverknüpfungen" sondern um die "Verknüpfungen von Dateierweiterungen" handelte. Danke für die Unit. :thumb: |
Re: Unit für Verknüpfung von Dateierweiterungen
Erstmal danke für die vielen Postings. Teilweise habe ich es schon anpassen können. Im Detail (Download im ersten Posting):
Version 0.1.1: [*] Unnötiges if-assigned im Destructor von TFileType entfernt [-] In der Berechnung von ActionCount -1 entfernt [-] Vergrößerung der Arraygröße war fehlerhaft @mleyen: Guter Vorschlag, habe den Thread umbenannt Zitat:
@uligerhardt: Erbsenzählermodus ist schon okay, hab ja danach gefragt :mrgreen: . Was deinen Vorschlag mit dem TStringPair angeht: Klingt sehr gut und werde ich vermutlich auch so umsetzen - alleine weil die Compiler-Ifs den Quelltextformatierer (JCF) aus dem Tritt bringen. Das schaffe ich aber vermutlich frühestens morgen. |
Re: Unit für Verknüpfung von Dateierweiterungen
Zitat:
![]()
Delphi-Quellcode:
ist vor Zeile *** A[0] = 1, danach A[0] = 2, obwohl doch auf B[0] zugeweisen wurde. Das liegt daran, das die Zuweisung B := A dafür sorgt, dass B auf den gleichen Speicherbereich wie A zeigt. Das ändert, sich wenn du
procedure Test;
var A, B: array of Integer; begin SetLength(A, 1); A[0] := 1; B := A; B[0] := 2; // *** end;
Delphi-Quellcode:
oder einfacher
B := A;
SetLength(B, Length(B)); // ###
Delphi-Quellcode:
schreibst. Die Variante mit ### meint himitsu.
B := Copy(A);
|
Re: Unit für Verknüpfung von Dateierweiterungen
Zitat:
Delphi-Quellcode:
Bei diesem Code macht Delphi intern
Var S: String;
S[123] := 'a';
Delphi-Quellcode:
daraus, somit ist sichergestellt, daß bei mehreren Referenzen nur der Stringinhalt der aktuellen "Variable" verändert wird.
UniqueString(S);
S[123] := 'a';
Delphi-Quellcode:
Bei dynamischen Arrays ist das leider anders :cry:, denn es gibt blöder Weise kein UniqueArray
Var S, S2: String;
S := '123'; S2 := S; S[2] := 'X'; // S = '1X3' // S2 = '123' und Delphi paßt auch nicht auf, daß hier nicht mehrere Referenzen überschrieben werden.
Delphi-Quellcode:
Also muß man dieses unter Umständen selber einfügen:
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)
Delphi-Quellcode:
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.
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) 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 ![]() ![]() (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:
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.
Var X, X2: Set of AnsiChar;
X2 := X; X := ['a'];
Delphi-Quellcode:
Darum sorge ich hier also manuell für eine Single-Referenz, wärend es in deinem Code nicht nötig ist.
Var X, X2: TDynamicCharSet;
X2 := X; X := ['a']; PS: Was würdest du hier erwarten?
Delphi-Quellcode:
Ich würde das ja für einen Fehler in Delphi/Pascal erachten, aber auf mich hört ja keiner.
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 |
Re: Unit für Verknüpfung von Dateierweiterungen
Zitat:
[OT]Und wenn wir schon beim Thema Konsistenz sind: Warum gibt's eigentlich kein Delete und Insert für Arrays? :roll: Sollte für jemanden, der Compiler magic zur Verfügung hat, leicht zu implementieren sein. Aber für den normalsterblichen Programmierer artet's in Arbeit oder Gehacke aus.[/OT] |
Re: Unit für Verknüpfung von Dateierweiterungen
[ot]
Zitat:
Und mit Class-Operatoren für "Record"-Helper, sowie Class-Operatoren für IN (if x IN y) würde , zusammen mit dem nächsten Punkt, den Rest machen. Blöd ist auch, daß man keine Funktionen anderer Units überladen kann. Wenn man eine Funktion für Include oder Insert erstellt, dann kann man ohne Namespace (System.Include) die System-Funktionen nicht mehr nutzen. Sooo, genug OT :angel2: [/ot] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 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