On 19.02.2013 17:49, Mark Morgan Lloyd wrote:
Sven Barth wrote:

OK, so is it possible to set up a constant extended record (i.e. the
work being done entirely at compilation time) that mimics an
instantiated object? Would

if LibCapShim is TObject then
..

be safe where LibCapShim could be either an object (possibly nil) or a
constant extended record?

You could try to overload the "is" operator for your to be defined
static record [AFAIK it should work]. E.g.

=== code begin ===

TLibCapShim = record
  cap_get_proc: tcap_get_proc;
  // ...

  class operator is (aLeft: TLibCapShim; aRight: TClass): Boolean;
inline;
end;

class operator TLibCapShim.Is(aLeft: TLibCapShim; aRight: TClass):
Boolean;
begin
  Result := False;
end;

=== code end ===

Thanks Sven, looks interesting and I'll play with it presently. Can an
extended record's fields/methods be set up at compilation time, or do
they need to be done by code?


The example I've given was for the case that you load the functions dynamically and use the procvars contained in the record. You could do it this way as well:

=== code begin ===

TLibCapShim = record
  function cap_get_proc: tcaps;
end;

//...

function TLibCapShim.cap_get_proc: tcaps;
begin
  Result := UnitContainingImports.cap_get_proc;
end;

=== code end ===

You need to pay attention to call the correct functions, of course.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to