-
Content Count
2812 -
Joined
-
Last visited
-
Days Won
152
Anders Melander last won the day on May 23
Anders Melander had the most liked content!
Community Reputation
1999 ExcellentTechnical Information
-
Delphi-Version
Delphi 12 Athens
Recent Profile Visitors
The recent visitors block is disabled and is not being shown to other users.
-
SHChangeNotify got me thinking... Assuming a call to SHChangeNotify(SHCNE_ASSOCCHANGED) is all that is needed to rebuild the cache, is there something in Windows that we know makes that call? A quick search of "the source" gave the answer: The assoc command of the Windows shell; All it does is write an entry to the registry and then make the SHChangeNotify call. assoc .foobar=text Voila! If you want to remove the file association entry again then it's just: assoc .foobar= Admin privs required, btw.
-
I used to be able to reset the cache without a reboot with: ie4uinit.exe -ClearIconCache or ie4uinit.exe -show but I haven't had much success with those methods lately. It definitely is possible to clear the cache without a reboot or killing explorer but it seems Microsoft doesn't want to make it easy for us. See: SHChangeNotify
-
If you mean to expose the TModel record from the TModels list encapsulation then you can do so by (also) exposing record pointers: type TModel = record Foo: string; Bar: integer; end; PModel = ^TModel; TModels = class private FItems: TList<TModel>; private function GetModel(Index: integer): TModel; procedure SetModel(Index: integer; const Value: TModel); function GetData(Index: integer): PModel; public property Items[Index: integer]: TModel read GetModel write SetModel; default; property Data[Index: integer]: PModel read GetData; end; function TModels.GetModel(Index: integer): TModel; begin Result := FItems[Index]; end; procedure TModels.SetModel(Index: integer; const Value: TModel); begin FItems[Index] := Value; end; function TModels.GetData(Index: integer): PModel; begin Result := @FItems[Index]; end; var Models: TModels; var Model: TModel; ... Model := Models[0]; ... Models[0] := Model; ... Models.Data[0].Foo := 'Hello world'; Models.Data[0].Bar := 42;
-
Because the TList<T>.Items property getter returns a read-only copy of the record. This is the same for all properties that return a record. You can use the TList<T>.List property to gain access to the internal array of TList<T>.
-
Absolute directive with record and array
Anders Melander replied to DelphiUdIT's topic in Algorithms, Data Structures and Class Design
I agree - but here's a few examples of where I've used it: // Using absolute to rename a public API function while maintaining backward compatibility: // - MyFunction is the old API entrypoint. // - NewNameSameFunction is the new API entrypoint. type TMyDelegate = procedure(X, Y, Z: Single); var NewNameSameFunction: TMyDelegate var MyFunction: TMyDelegate absolute NewNameSameFunction deprecated 'Use NewNameSameFunction instead'; // Same with global vars: type TLUT88 = array[byte, byte] of byte; var DivMul255Table: TLUT88; MulDiv255Table: TLUT88; var RcTable: TLUT88 absolute DivMul255Table; DivTable: TLUT88 absolute MulDiv255Table; // Casting between "uncastable" types without pointers procedure FooBar(const X1, Y1, X2, Y2: Single) var Y1bin: Cardinal absolute Y1; Y2bin: Cardinal absolute Y2; begin // Fast way of testing if a Single is zero; Same as "if (Y1 = 0) and (Y2 = 0) then" but faster. if (Y1bin shl 1 = 0) and (Y2bin shl 1 = 0) then Exit; ... end; -
Absolute directive with record and array
Anders Melander replied to DelphiUdIT's topic in Algorithms, Data Structures and Class Design
If you mean the volatile thing then it's not a problem unless you are doing high performance low-level stuff. AFAIR the worst that can happen is that a value is kept on the stack instead of in a register. -
Absolute directive with record and array
Anders Melander replied to DelphiUdIT's topic in Algorithms, Data Structures and Class Design
Use High(MyArray) instead; It clearly communicates what your intentions are. IMO, using Succ and Pred for anything other than enumerations is like using Assigned on pointers (even object pointers). On delegates it makes sense, but for everything else I think (FooBar <> nil) is more readable and better communicate intention than Assigned(FooBar). I'm sure everybody agrees with me on that 😉 -
Absolute directive with record and array
Anders Melander replied to DelphiUdIT's topic in Algorithms, Data Structures and Class Design
The only issue with absolute that I can think of is that the compiler treats the aliased variables as "volatile" which inhibits certain optimizations - AFAIR. Apart from that it's just like a hard typecast. Of course one has to avoid doing stupid things like using absolute on managed types. -
Absolute directive with record and array
Anders Melander replied to DelphiUdIT's topic in Algorithms, Data Structures and Class Design
What change? You mean a possible future change of the index type? I can't see how any of the Pred used here would survive that: TABLE_DATA: array[0..pred(TABLE_SIZE * 3)] of string Elements : array[0..pred(TABLE_SIZE)] of record Regardless, if I changed the index type I would want to review the implications of that change manually and not assume that it just worked - especially with absolute in the game. -
Absolute directive with record and array
Anders Melander replied to DelphiUdIT's topic in Algorithms, Data Structures and Class Design
I don't understand the question but... while absolute has its uses, in this case it would IMO just be laziness on the part of the developer. And what's up with the use of pred? Since when did that become more readable than -1 ? -
What are the performance profilers for Delphi 12?
Anders Melander replied to dmitrybv's topic in General Help
Ouch. I think that article will do more harm than good (with regard to map2pdb). There are simply too many errors in it; E.g. all the command lines have been mangled. - and map2pdb has moved to Github: https://github.com/andersmelander/map2pdb -
I'm organizing a group trip to Delphi Summit!!!
Anders Melander replied to Moskw@'s topic in Tips / Blogs / Tutorials / Videos
The eel is a critically endangered specie. -
-
What are the performance profilers for Delphi 12?
Anders Melander replied to dmitrybv's topic in General Help
What are the benefits of Superluminal over VTune in your opinion? I looked at Superluminal a few years ago and AFAIR it didn't do anything that VTune couldn't do better - for free. -
Shadow underneath Form does not always appear (CS_DROPSHADOW)
Anders Melander replied to PeaShooter_OMO's topic in Windows API
I don't get it. Isn't CreateParams called before the window handle is created? Then why would RecreateWnd be necessary?