![]() |
Unit für Verknüpfung von Dateierweiterungen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen.
Nachdem ich auch nach längerem Suchen keine wirklich brauchbare Lösung gefunden habe, eine Dateiendung in der Registry mit meinem Programm zu verknüpfen, habe ich kurzerhand eine eigene Klasse dafür gestrickt. Jede Methode enthält eine kurze Beschreibung, so dass es eigentlich selbsterklärend sein sollte. Ich werde aber noch eine kleine Demo nachliefern. Die Unit ist jetzt mit Compilerschaltern gespickt und sollte auch mit Delphi-Versionen ohne Generics funktionieren (noch ungetestet). Da außer dynamischen Arrays keine großen Spezialitäten verwendet werden, wäre es theoretisch bis Delphi 3 verwendbar. Würde mich über Feedback jeder Art sehr freuen. Noch geplante Features:
Grüße Codewalker |
Re: Unit für den Umgang mit Dateiverknüpfungen
Zitat:
|
Re: Unit für den Umgang mit Dateiverknüpfungen
hm, jetzt wo du es sagst. Gabs die echt erst so spät? Wenn das so ist, werde ich die Unit wohl doch mal umstricken, dass man wahlweise beides einsetzen kann.
|
Re: Unit für den Umgang mit Dateiverknüpfungen
Mein D2007 kennt jedenfalls keine generics ;)
|
Re: Unit für den Umgang mit Dateiverknüpfungen
Zitat:
Echt tolle Unit für Dateiverknüpfungen!?! Reden wir hier über uraltes Delphi oder Lazarus/FPC? Null Ahnung von Nix, echt verwirrt! |
Re: Unit für den Umgang mit Dateiverknüpfungen
Habe die Unit nochmal angepasst (Download im ersten Beitrag). Ich nutze jetzt Compilerschalter und wechsele - falls keine Generics zur Verfügung stehen - auf dynamische Arrays. Scheint soweit zu funktionieren, aber vielleicht kann das mal jemand testen, der ein Delphi < 2009 hat.
Zitat:
|
Re: Unit für den Umgang mit Dateiverknüpfungen
Zitat:
Hallo lieber Codewalker! Habe gerade vor ein paar Stunden auf meiner Vista-Kiste zusätzlich Windows 7 Enterprise (die Demo-Version) aufgesetzt und versuche gerade, Delphi Sieben Pörsonal Edischon zum Laufen zu bringen. Und wie man hier überhaupt richtig zitieren kann, ist mir völlig schleierhaft!!! Kanns nicht. Sollens doch die Besserwisser machen! |
Re: Unit für den Umgang mit Dateiverknüpfungen
Ich gehe mal in Erbsenzählermodus: :mrgreen:
Grüße, Uli. Edit: Noch eine Idee: Die generische Version von TStringPair würde ich rausschmeißen und immer die record-Version nehmen. Und aus dem nichtgenerischen TFileTypeActions könnte man eine Klasse mit zu TDictionary<string, string> quellcode-kompatiblem Interface machen. Dann hättest du bestimmt weniger $IFDEFs und die alle an einer Stelle. |
Re: Unit für den Umgang mit Dateiverknüpfungen
Und letztlich bewirkt
Delphi-Quellcode:
das gleich wie:
if Assigned(FActions) then
FActions.Free;
Delphi-Quellcode:
:mrgreen:
FActions.Free;
|
Re: Unit für den Umgang mit Dateiverknüpfungen
Zitat:
Vermutlich bewirkt es bei ihm nichts, aber dieses wäre praktisch die Entsprechung von UniqueString für dynamische Arrays und sorgt quasi dafür, daß es nur eine Referenz gibt und daß diese Variable als einzige Referenz für dieses Array existiert. |
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] |
Re: Unit für Verknüpfung von Dateierweiterungen
Hallo!
Schöne Unit. Schön übersichtlich und dokumentiert. Funktioniert auch ganz gut - soweit ich das jetzt beurteilen kann. Aber wolltest du nicht noch eine kleine Demo online stellen :gruebel: ? Wäre toll. Danke im Voraus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 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