<div dir="ltr"><div class="gmail_extra">I just wanted to drop this trick to work around problems with record helpers ..</div><div class="gmail_extra"><br></div><div class="gmail_extra">If you wanted to create a record helper for a type that is not normally allowed, or perhaps you want to have multiple record helpers for the same type, consider defining your own separate type and make it contain said type with implicit conversions to work around those problem.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Example:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra"><div class="gmail_extra"><span style="white-space:pre-wrap">  </span>TArray<T> = array of T;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span style="white-space:pre-wrap">       </span>TArrayList<T> = record</div><div class="gmail_extra"><span style="white-space:pre-wrap">       </span>public</div><div class="gmail_extra"><span style="white-space:pre-wrap">             </span>{ The array acting as a list }</div><div class="gmail_extra"><span style="white-space:pre-wrap">             </span>var Items: TArray<T>;</div><div class="gmail_extra"><span style="white-space:pre-wrap">                </span>{ Convert an array to a list }</div><div class="gmail_extra"><span style="white-space:pre-wrap">             </span>class operator Implicit(const Value: TArray<T>): TArrayList<T>;</div><div class="gmail_extra"><span style="white-space:pre-wrap">                </span>{ Convert an open array to a list }</div><div class="gmail_extra"><span style="white-space:pre-wrap">                </span>class operator Implicit(const Value: array of T): TArrayList<T>;</div><div class="gmail_extra"><span style="white-space:pre-wrap">             </span>{ Convert a list to an array }</div><div class="gmail_extra"><span style="white-space:pre-wrap">             </span>class operator Implicit(const Value: TArrayList<T>): TArray<T>;</div><div><br></div><div>Then in this example you can add all the methods you want to dynamic arrays, because you have your own type which is nothing more than an alias to a dynamic array (<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">array of T</span>). Methods such as:</div><div><br></div><div><div><span style="white-space:pre-wrap">     </span>{ Performs a simple safe copy of up to N elements }</div><div><span style="white-space:pre-wrap">      </span>procedure Copy(out List: TArrayList<T>; N: Integer);</div><div><span style="white-space:pre-wrap">       </span>{ Performs a fast unsafe copy of up to N elements }</div><div><span style="white-space:pre-wrap">      </span>procedure CopyFast(out List: TArrayList<T>; N: Integer);</div><div><span style="white-space:pre-wrap">   </span>{ Returns the lower bounds of the list }</div><div><span style="white-space:pre-wrap"> </span>function Lo: Integer;</div><div><span style="white-space:pre-wrap">    </span>{ Returns the upper bounds of the list }</div><div><span style="white-space:pre-wrap"> </span>function Hi: Integer;</div><div><span style="white-space:pre-wrap">    </span>{ Reverses the items in the list }</div><div><span style="white-space:pre-wrap">       </span>procedure Reverse;</div><div><span style="white-space:pre-wrap">       </span>{ Swap two items in the list }</div><div><span style="white-space:pre-wrap">   </span>procedure Exchange(A, B: Integer);</div><div><span style="white-space:pre-wrap">       </span>{ Adds and item to the end of the list }</div><div><span style="white-space:pre-wrap"> </span>procedure Push(const Item: T);</div><div><span style="white-space:pre-wrap">   </span>{ Appends an array of items to the list }</div><div><span style="white-space:pre-wrap">        </span>procedure PushRange(const Collection: array of T);</div><div><span style="white-space:pre-wrap">       </span>{ Remove an item from the end of the list }</div><div><span style="white-space:pre-wrap">      </span>function Pop: T;</div><div><span style="white-space:pre-wrap"> </span>{ Remove an item randomly from the list }</div><div><span style="white-space:pre-wrap">        </span>function PopRandom: T;</div><div><span style="white-space:pre-wrap">   </span>{ Return a copy of the list with items passing through a filter }</div><div><span style="white-space:pre-wrap">        </span>function Filter(Func: TFilterFunc<T>): TArrayList<T>;</div><div><span style="white-space:pre-wrap">        </span>{ Resurn the first item matching a condition }</div><div><span style="white-space:pre-wrap">   </span>function FirstOf(Func: TFilterFunc<T>): T;</div><div><span style="white-space:pre-wrap"> </span>{ Removes an item by index from the list and decresaes the count by one }</div><div><span style="white-space:pre-wrap">        </span>procedure Delete(Index: Integer);</div><div><span style="white-space:pre-wrap">        </span>{ Removes all items setting the count of the list to 0 }</div><div><span style="white-space:pre-wrap"> </span>procedure Clear;</div><div><span style="white-space:pre-wrap"> </span>{ Sort the items using a comparer }</div><div><span style="white-space:pre-wrap">      </span>procedure Sort(Order: TSortingOrder = soAscend; Comparer: TCompare<T> = nil);</div><div><span style="white-space:pre-wrap">      </span>{ Attempt to find the item using DefaultCompare }</div><div><span style="white-space:pre-wrap">        </span>function IndexOf(const Item: T): Integer; overload;</div></div></div></div></div>