Solved

pointer to objects as parameter of function

Posted on 1998-02-25
3
320 Views
Last Modified: 2011-09-20
Hi,

Is it possible to pass an object of any type as a var parameter of a function?

I am wanting to wrap up the two ideas of:
  Object.Free;
  Object := nil;

I've tried a few incarnations of this, and nothing seems to work out.

I did the obvious:

function FreeObject(var Thing: TObject);
begin
  ...
  Thing.Free;
  Thing := nil;
end;

That fails... It only lets me pass pure TObjects as a parameter.

Then I tried:
 
function FreeObject(var Thing: Pointer);
begin
  ...
  TObject(Thing^).Free;
  Thing := nil;
end;

This fails with the same compiler warning as the first one...

Then I tried:

function FreeObject(var Thing);
begin
  ...
  if Pointer(Thing) = nil then exit;  
  TObject(Thing).Free;
end;

This last one shows the best hope.. but no matter what I put in as a parameter for this, objects, records, integers, etc, it is always nil.. or that is what is reported to me.  Maybe I don't know how to de-reference these correctly.

Is there some other way that I'm missing?

Thanks for your help.

-joe
0
Comment
Question by:greendot
3 Comments
 
LVL 5

Expert Comment

by:inter
ID: 1359801
What about typecasting friend?

procedure FreeIt(var T :Pointer);
begin
  TObject(T).Free;
  T := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  L : TList;
begin
  L := TList.Create;
  FreeIt(Pointer(L));
end;

Igor
0
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1359802
Hi greendot

Greendot, your example of FreeObject comes close to the correct solution:
function FreeObject(var Thing: Pointer);
begin
  TObject(Thing^).Free;
  Thing := nil;
end;

The problem is you need to remove the ^
I.e.  "TObject(Thing^).Free;" becomes "TObject(Thing).Free;"


Here is a routine I wrote for the purpose.
It has the following differences from inter's:
  1. You can call FreeSafe for a nil pointer or a freed object.
  2. You don't need to typecast when calling the procedure.  You just pass in the address of the object.  (See example below.)  This makes coding that little bit faster.  :)

procedure FreeSafe(AObj: Pointer);
begin
      if (Assigned(AObj)) and (Assigned(Pointer(AObj^))) then begin
            TObject(AObj^).Free;
            Pointer(AObj^) := nil;
      end;
end;


To call it:
  FreeSafe(@MyObject);

It won't crash if you do the following:
  FreeSafe(@MyObject);
  FreeSafe(@MyObject);

JB
0
 

Accepted Solution

by:
keyquotes earned 100 total points
ID: 1359803
Try this,

FreeObject(TList as TObject);

function FreeObject(var Thing: TObject);
begin
  ...
  Thing.Free;
  Thing := nil;
end;


0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Connection between libmysql.dll and MySQL Versions 7 112
Delphi Form ownership 4 114
Tidtcpserver listening on multiports? 1 35
Tvertscrollbox like a whatsapp layout 5 36
The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question