Board index » delphi » Newbie with Delphi need some pointers

Newbie with Delphi need some pointers

I've got a question on Delphi, wonder if anyone out there could kindly
assist.

I created a class and i tried to allow the class methods to share a
class level variable. However, I realise that Delphi does not support
sharing of class level variable by class methods like Java as i get the
error "instance variable <variable_name> inaccessible here".

I wonder if there is a way around this. Would using friend of classes
help? I really need to encapsulate the variable in a class so that i can
instantiate as many instances of the class as possible. I can't do this
if i use the interface portion.

A million thanks in advance.

Regards
Nicholas

 

Re:Newbie with Delphi need some pointers


Quote
so_exci...@e{*word*277}.com wrote:

> I've got a question on Delphi, wonder if anyone out there could kindly
> assist.

> I created a class and i tried to allow the class methods to share a
> class level variable. However, I realise that Delphi does not support
> sharing of class level variable by class methods like Java as i get the
> error "instance variable <variable_name> inaccessible here".

> I wonder if there is a way around this. Would using friend of classes
> help? I really need to encapsulate the variable in a class so that i can
> instantiate as many instances of the class as possible. I can't do this
> if i use the interface portion.

> A million thanks in advance.

> Regards
> Nicholas

If I understood you correctly, you want a class variable. But why is a
normal variable not enough? It offers almost the same possiblities as a
class variable. But if you really want it, you can simulate it by using
class methods, which access the variable.

unit myunit;

interface

var myvar:Integer;

type myunit=class
       class function getvar:Integer;
       class procedure setvar(i:Integer);
     end;

implementation

class function myunit.getvar:Integer;
  begin
    Result:=myvar;
  end;

class procedure myunit.setvar(i:Integer);
  begin
    myvar:=i;
  end;

end.

Alex
--
Author of the free Chatsystem PINO! || Website: http://www.alcomp.net
Available at http://pino.cjb.net    || Chat   : pinochat.dhs.org:8080

Re:Newbie with Delphi need some pointers


No, Alexander. This wouldn't work. Suppose i have to create 2 instances of
the same class now. If the variable myvar is default to something say, 15
upon initialisation. Now the 1st instance would have 15 as the value on
calling classObject1.getvar. Suppose i use classObject1.setvar to set the
value to 50.

And now if i create a 2nd instance of the same class and if i use
classObject2.getvar for the value of myvar. I get 50 instead of 15. What i'm
trying to do is to separate it such that both 1st class instance and 2nd
class instance have their own private class variables that is not affected by
either instances.

Thank you.

Regards
Nicholas

Quote
Alexander Mueller wrote:

> If I understood you correctly, you want a class variable. But why is a
> normal variable not enough? It offers almost the same possiblities as a
> class variable. But if you really want it, you can simulate it by using
> class methods, which access the variable.

> unit myunit;

> interface

> var myvar:Integer;

> type myunit=class
>        class function getvar:Integer;
>        class procedure setvar(i:Integer);
>      end;

> implementation

> class function myunit.getvar:Integer;
>   begin
>     Result:=myvar;
>   end;

> class procedure myunit.setvar(i:Integer);
>   begin
>     myvar:=i;
>   end;

> end.

> Alex
> --
> Author of the free Chatsystem PINO! || Website: http://www.alcomp.net
> Available at http://pino.cjb.net    || Chat   : pinochat.dhs.org:8080

Re:Newbie with Delphi need some pointers


That is normal class behaviour:

unit MyUnit;

interface

type
  TMyClass = class
  public
    MyVar: Integer;
    constructor Create;
  end;

implementation

constructor TMyClass.Create;
begin
  MyVar := 15;
end;

end.

or (using properties):

unit MyUnit;

interface

type
  TMyClass = class
  private
    FMyVar: Integer;
    function GetMyVar: Integer;
    procedure SetMyVar(Value: Integer);
  public
    constructor Create;
    property MyVar: Integer read GetMyVar write SetMyVar default 15;
    // you can also use FMyVar directly e.g.
    // property MyVar: Integer read FMyVar write FMyVar;
  end;

implementation

constructor TMyClass.Create;
begin
  MyVar := 15;
end;

function TMyClass.GetMyVar: Integer;
begin
  Result := FMyVar;
end;

procedure TMyClass.SetMyVar(Value: Integer);
begin
  FMyVar := Value;
end;

end.

<so_exci...@e{*word*277}.com> schreef in bericht
news:391FEFBF.C025612E@e{*word*277}.com...

Quote
> No, Alexander. This wouldn't work. Suppose i have to create 2 instances of
> the same class now. If the variable myvar is default to something say, 15
> upon initialisation. Now the 1st instance would have 15 as the value on
> calling classObject1.getvar. Suppose i use classObject1.setvar to set the
> value to 50.

> And now if i create a 2nd instance of the same class and if i use
> classObject2.getvar for the value of myvar. I get 50 instead of 15. What
i'm
> trying to do is to separate it such that both 1st class instance and 2nd
> class instance have their own private class variables that is not affected
by
> either instances.

> Thank you.

> Regards
> Nicholas

> Alexander Mueller wrote:

> > If I understood you correctly, you want a class variable. But why is a
> > normal variable not enough? It offers almost the same possiblities as a
> > class variable. But if you really want it, you can simulate it by using
> > class methods, which access the variable.

> > unit myunit;

> > interface

> > var myvar:Integer;

> > type myunit=class
> >        class function getvar:Integer;
> >        class procedure setvar(i:Integer);
> >      end;

> > implementation

> > class function myunit.getvar:Integer;
> >   begin
> >     Result:=myvar;
> >   end;

> > class procedure myunit.setvar(i:Integer);
> >   begin
> >     myvar:=i;
> >   end;

> > end.

> > Alex
> > --
> > Author of the free Chatsystem PINO! || Website: http://www.alcomp.net
> > Available at http://pino.cjb.net    || Chat   : pinochat.dhs.org:8080

Re:Newbie with Delphi need some pointers


Quote
<so_exci...@e{*word*277}.com> wrote in message

news:391FEFBF.C025612E@e{*word*277}.com...

Quote
> No, Alexander. This wouldn't work. Suppose i have to create 2 instances of
> the same class now. If the variable myvar is default to something say, 15
> upon initialisation. Now the 1st instance would have 15 as the value on
> calling classObject1.getvar. Suppose i use classObject1.setvar to set the
> value to 50.

> And now if i create a 2nd instance of the same class and if i use
> classObject2.getvar for the value of myvar. I get 50 instead of 15. What
i'm
> trying to do is to separate it such that both 1st class instance and 2nd
> class instance have their own private class variables that is not affected
by
> either instances.

In your original post I got the distinct impression that you specifically
asked if it was possible to create a variable that could be shared by
multiple instances. Now I get the impression that you want each instance to
have its own copy of the variable.

If you want all instances of a class to share the same variable (i.e. use
the same memory for a variable), Alexander Mueller's solution works.

If you want each instance of a class to have its own copy of a variable do
as MH Avegaart suggests and simply place it within the class declaration.

If you want something else, perhaps you could describe what you are trying
to do using an example.

Quote

> Thank you.

> Regards
> Nicholas

> Alexander Mueller wrote:

> > If I understood you correctly, you want a class variable. But why is a
> > normal variable not enough? It offers almost the same possiblities as a
> > class variable. But if you really want it, you can simulate it by using
> > class methods, which access the variable.

> > unit myunit;

> > interface

> > var myvar:Integer;

> > type myunit=class
> >        class function getvar:Integer;
> >        class procedure setvar(i:Integer);
> >      end;

> > implementation

> > class function myunit.getvar:Integer;
> >   begin
> >     Result:=myvar;
> >   end;

> > class procedure myunit.setvar(i:Integer);
> >   begin
> >     myvar:=i;
> >   end;

> > end.

> > Alex
> > --
> > Author of the free Chatsystem PINO! || Website: http://www.alcomp.net
> > Available at http://pino.cjb.net    || Chat   : pinochat.dhs.org:8080

Re:Newbie with Delphi need some pointers


Quote
so_exci...@e{*word*277}.com wrote:

> No, Alexander. This wouldn't work. Suppose i have to create 2 instances of
> the same class now. If the variable myvar is default to something say, 15
> upon initialisation. Now the 1st instance would have 15 as the value on
> calling classObject1.getvar. Suppose i use classObject1.setvar to set the
> value to 50.

> And now if i create a 2nd instance of the same class and if i use
> classObject2.getvar for the value of myvar. I get 50 instead of 15. What i'm
> trying to do is to separate it such that both 1st class instance and 2nd
> class instance have their own private class variables that is not affected by
> either instances.

> Thank you.

> Regards
> Nicholas

But that seems to be a normal class variable. So where is then the
problem?

Alex
--
Author of the free Chatsystem PINO! || Website: http://www.alcomp.net
Available at http://pino.cjb.net    || Chat   : pinochat.dhs.org:8080

Re:Newbie with Delphi need some pointers


Quote
so_exci...@e{*word*277}.com wrote:

> And now if i create a 2nd instance of the same class and if i use
> classObject2.getvar for the value of myvar. I get 50 instead of 15. What i'm
> trying to do is to separate it such that both 1st class instance and 2nd
> class instance have their own private class variables that is not affected by
> either instances.

> Thank you.

Ohhh ... that's *easy*, and the default way things work. Look:

unit blah;

type
  TMyForm = class (TForm)
  private
    SomeVariable:Integer;
  public
  end;

inplementation

var
  Form1,Form2:TMyForm;

Form1 and Form2 have separate copies of "SomeVariable".

Is this what you meant?

MH.
--
Martin Harvey. mar...@pergolesi.demon.co.uk
     http://www.pergolesi.demon.co.uk

Re:Newbie with Delphi need some pointers


Quote
In article <391FEFBF.C0256...@e{*word*277}.com>, so_exci...@e{*word*277}.com writes:
>What i'm
>trying to do is to separate it such that both 1st class instance and 2nd
>class instance have their own private class variables that is not affected by
>either instances.

It took me a while (when I was a newbie) to realise that the Delphi generated
form code defined a descendant class of TForm and automatically generated an
instance of that descendant.

In Delphi OO, all instances of a particular class use the same method code, but
have separate data storage (one set of properties and variables as defined in
the class type definition, for each instance).

When an instance of a class calls a method, then a reference to that instance
is placed in a hidden method parameter named Self (which you could access).

Alan Lloyd
alangll...@aol.com

Re:Newbie with Delphi need some pointers


Sorry, I didn't return mail earlier...real busy today...but weren't productive
at all, sigh.

Okie, i got a sample program i hope can explain what i am trying to do. This
is a simple program with a form, 4 labels (Label1, Label2......) and 2 command
buttons (button1 and button2). When i click on button1 the getValue class
function with give it a value that should not be affected by what happens in
button2 earlier. Please see the text below. Sorry, it's abit long and messy.

==========A Form called "Test" =======
unit Test;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, TestClass;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Aclass : TClass = nil;
  Bclass : TClass = nil;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
     if not Assigned(Aclass) then
          Aclass := TClass.Create;

     // Label1 should not be influenced by what happen if
     // button 2 is clicked i.e. other than the first time
     // should have a value of 'First' when i click on
     // button1 at all subsequent clicks. Unfortunately not the case.
     Label1.Caption := Aclass.getValue;

     Aclass.setValue('First');

     Label3.Caption := Aclass.getValue;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     if not Assigned(Bclass) then
        Bclass := TClass.Create;

     // Label2 should not be influenced by what happens
     // if button1 is clicked i.e. other than when first initialised
     // should have a value of 'Second' when i click on button2
     // at any other times. Unfortunately not the case.
     Label2.Caption := Bclass.getValue;

     Bclass.setValue('Second');

     Label4.Caption := Bclass.getValue;

end;

end.

==========A class called "TestClass"=======
unit TestClass;

interface

var
   clsTemp : String;

type TClass = class
     constructor Create;
     class function getValue() : String;
     class procedure setValue(str : String);
     end;

implementation
constructor TClass.Create;
begin
     clsTemp := 'ABC';
end;

class function TClass.getValue() : String;
begin
     Result := clsTemp;
end;

class procedure TClass.setValue(str : String);
begin
     clsTemp := str;

end;

end.

Regards
Damon

Re:Newbie with Delphi need some pointers


I'm not sure that I completely understand what you want. There seem to be
three possibilities.

1. You want each instance to have a unique property that have the same
starting value:

Type

tMyClass = class (tObject)
    private
        fMyValue : string;
    public
        constructor Create;
        property MyValue : string read fMyValue write fMyValue;
    end;

constructor tMyClass.Create;

begin
fMyValue := 'ABC';
end;

2. You want each instance to have its own property instance, but its
starting value should be the last setting of the property by any instance:

Type

tMyClass = class (tObject)
    private
        fMyValue : string;
        procedure SetMyValue (myVal : string);
    public
        constructor Create;
        property MyValue : string read fMyValue write SetMyValue;
    end;

var mySharedValue : string = 'ABC';

constructor tMyClass.Create;

begin
fMyValue := mySharedValue;
end;

procedure tMyClass.SetMyValue (myVal : string);

begin
fMyValue := myVal;
mySharedValue := myVal;
end;

3. You want each instance to have its own property instance but the
property's initial value is determined by an outside influence:

Type

tMyClass = class (tObject)
    private
        fMyValue : string;
    public
        constructor Create;
        property MyValue : string read fMyValue write fMyValue;
    end;

var mySharedValue : String = 'ABCD';

constructor tMyClass.Create;

begin
fMyValue := mySharedValue;
end;

Quote
"So_Funky" <so_exci...@e{*word*277}.com> wrote in message

news:39214414.EB6CCC18@e{*word*277}.com...
Quote
> Sorry, I didn't return mail earlier...real busy today...but weren't
productive
> at all, sigh.

> Okie, i got a sample program i hope can explain what i am trying to do.
This
> is a simple program with a form, 4 labels (Label1, Label2......) and 2
command
> buttons (button1 and button2). When i click on button1 the getValue class
> function with give it a value that should not be affected by what happens
in
> button2 earlier. Please see the text below. Sorry, it's abit long and
messy.

> ==========A Form called "Test" =======
> unit Test;

> interface

> uses
>   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
>   StdCtrls, TestClass;

> type
>   TForm1 = class(TForm)
>     Button1: TButton;
>     Button2: TButton;
>     Label1: TLabel;
>     Label2: TLabel;
>     Label3: TLabel;
>     Label4: TLabel;
>     procedure Button1Click(Sender: TObject);
>     procedure Button2Click(Sender: TObject);
>   private
>     { Private declarations }
>   public
>     { Public declarations }
>   end;

> var
>   Form1: TForm1;
>   Aclass : TClass = nil;
>   Bclass : TClass = nil;
> implementation

> {$R *.DFM}

> procedure TForm1.Button1Click(Sender: TObject);
> begin
>      if not Assigned(Aclass) then
>           Aclass := TClass.Create;

>      // Label1 should not be influenced by what happen if
>      // button 2 is clicked i.e. other than the first time
>      // should have a value of 'First' when i click on
>      // button1 at all subsequent clicks. Unfortunately not the case.
>      Label1.Caption := Aclass.getValue;

>      Aclass.setValue('First');

>      Label3.Caption := Aclass.getValue;
> end;

> procedure TForm1.Button2Click(Sender: TObject);
> begin
>      if not Assigned(Bclass) then
>         Bclass := TClass.Create;

>      // Label2 should not be influenced by what happens
>      // if button1 is clicked i.e. other than when first initialised
>      // should have a value of 'Second' when i click on button2
>      // at any other times. Unfortunately not the case.
>      Label2.Caption := Bclass.getValue;

>      Bclass.setValue('Second');

>      Label4.Caption := Bclass.getValue;

> end;

> end.

> ==========A class called "TestClass"=======
> unit TestClass;

> interface

> var
>    clsTemp : String;

> type TClass = class
>      constructor Create;
>      class function getValue() : String;
>      class procedure setValue(str : String);
>      end;

> implementation
> constructor TClass.Create;
> begin
>      clsTemp := 'ABC';
> end;

> class function TClass.getValue() : String;
> begin
>      Result := clsTemp;
> end;

> class procedure TClass.setValue(str : String);
> begin
>      clsTemp := str;

> end;

> end.

> Regards
> Damon

Re:Newbie with Delphi need some pointers


The light dawns. The problem is one of terminology. In Delphi when you talk
about a class method you are refering to a particular type of method that
can be called using a class reference or an instance reference. What you
want to do is the default behavior in Delphi, i.e. you want to use standard
properties and methods. Your class might look something like:

Type

tStringTokenizer = class (tObject)
    private
        fDelimeter : char;
        fInputString    : string;
    public
        constructor Create (s : string; Delim : char);
        function NextToken : string;
    end;

constructor tStringTokenizer.Create (s : string; Delim : char);

begin
fDelimeter := Delim;
fInputString := s;
end;

function tStringTokenizer.NextToken : string;

var i : integer;

begin
i := pos (fDelimeter, fInputString);
if i < 1
then i := Length (fInputString);
result := Copy (fInputString, 1, i - 1);
if i > 0
then Delete (fInputString, 1, i);
end;

Quote
<so_exci...@e{*word*277}.com> wrote in message

news:392200EB.66246CD3@e{*word*277}.com...
Quote
> Wow, this is bad....either i'm (a bad programmer) or (a bad communicator)
or (a
> bad programmer and a bad communicator).    ;->

> Actually, i'm just trying to create a class called TStringTokenizer
(similar to
> the StringTokenizer class in Java). The idea is to use this class to
tokenize a
> string. Suppose i tried to do the following

> var
>     aTokens : TStringTokenizer;
>     bTokens : TStringTokenizer;
>     aTemp, bTemp : String;
> begin
>     // hyphen delimited
>     aTokens := TStringTokenizer.Create('This-is-a-test-message.', '-');
>     // space delimited
>     bTokens := TStringTokenizer.Create('I don't want any contamination.');

>     aTemp := aTokens.nextToken; // i should be getting the string "This"
> instead of "I"
>     bTemp := bTokens.nextToken; // i get the correct token "I"

> end;

> The above is pretty easy to do in Java. Unfortunately, i could not get the
> above to work because i did not know how to make the class methods able to
> access the class variable during runtime. The created tokens are stored in
a
> class array variable inside the TStringTokenizer. The nextToken class
function
> will return the next token in the array. In my opinion, this nextToken
class
> function absolutely need access the class array variable, but i don't
think
> this is allowed in Delphi, at least not in a way that would ensure
visibility
> of values between separate instances of the same class do not happen.

> For those who used Java, this should be familiar. Please if you know of a
way
> to do the above, let me know.

Re:Newbie with Delphi need some pointers


Im Artikel <391FEFBF.C0256...@e{*word*277}.com>, so_exci...@e{*word*277}.com schreibt:

Quote
>trying to do is to separate it such that both 1st class instance and 2nd
>class instance have their own private class variables that is not affected by
>either instances.

You confused the terms. What you describe here are "fields", or "instance"
variables. The term "class" is misleading here, since in Delphi terminology a
"class" method is the equivalent of a "static" method in C++.

DoDi

Re:Newbie with Delphi need some pointers


Wow, this is bad....either i'm (a bad programmer) or (a bad communicator) or (a
bad programmer and a bad communicator).    ;->

Actually, i'm just trying to create a class called TStringTokenizer (similar to
the StringTokenizer class in Java). The idea is to use this class to tokenize a
string. Suppose i tried to do the following

var
    aTokens : TStringTokenizer;
    bTokens : TStringTokenizer;
    aTemp, bTemp : String;
begin
    // hyphen delimited
    aTokens := TStringTokenizer.Create('This-is-a-test-message.', '-');
    // space delimited
    bTokens := TStringTokenizer.Create('I don't want any contamination.');

    aTemp := aTokens.nextToken; // i should be getting the string "This"
instead of "I"
    bTemp := bTokens.nextToken; // i get the correct token "I"

end;

The above is pretty easy to do in Java. Unfortunately, i could not get the
above to work because i did not know how to make the class methods able to
access the class variable during runtime. The created tokens are stored in a
class array variable inside the TStringTokenizer. The nextToken class function
will return the next token in the array. In my opinion, this nextToken class
function absolutely need access the class array variable, but i don't think
this is allowed in Delphi, at least not in a way that would ensure visibility
of values between separate instances of the same class do not happen.

For those who used Java, this should be familiar. Please if you know of a way
to do the above, let me know.

Re:Newbie with Delphi need some pointers


Actually, my program looks like that below. Please, i don't want to process
everything in one class function only....like what you did. I don't want to have
to feed the original string parameter to every class functions in the class
either. Now i only got 2 class functions....maybe later, i want to have some
other functions like

    class function firstToken(): string;  // return the first token
    class function lastToken(): string; // return last token
    class function searchToken(targetToken : string): integer // return the
position of the token being searched

Thank you very much for your time and trouble.

Regards
Damon

==========TStringTokenizer class========
unit StringTokenizer;

interface

uses
    PSock, mxarrays, Sysutils, Dialogs, MyDataTypes;

type
    TStringTokenizer = class
        constructor Create(str: string); overload;
        constructor Create(str: string; delimiters: string); overload;
        destructor Destroy; override;

        published
        class function nextToken(): string;
        class function countTokens(): integer;

    end;

var
   Words : array of string;
    iPos : integer;

implementation

constructor TStringTokenizer.Create(str: string);
var
    i: integer;
    temp: string;

begin
    i := 0;
    // so that can check without storing in array first
    temp := NthWord(str, ' ', i+1);
    // check here
    while temp <> ''  do
    begin
        // increase array size if not cannot store as new
        // array element
        SetLength(Words, i+1);
        Words[i] := temp;
        i := i + 1;// for going to next word in string
        temp := NthWord(str, ' ', i+1)
    end;

end;

constructor TStringTokenizer.Create(str: string; delimiters: string);
var
    h, i, j: integer;
    charDelimit, charAtPos, charWord: string;
    bFound: boolean;
begin
    bFound := false;
    h := 0;
    for i:=1 to Length(str) do
    begin
        charAtPos := Copy(str, i, 1); // take next character in string

        for j:=1 to Length(delimiters) do
        begin
            charDelimit := Copy(delimiters, j, 1);

            // if the character in string matches a delimiting character
            if charDelimit = charAtPos then
            begin
                bFound := true;
                Break;
            end
        end; { end inner for }

        if bFound then
        begin
            SetLength(Words, h+1);
            Words[h] := charWord;
            // prepare for next element
            h := h + 1;
            charWord := '';
        end
        else
            charWord := charWord + charAtPos; // append to a temp variable

        bFound := false; // reset
    end; { end outer for }

    // capture the last word
    SetLength(Words, h+1);
    Words[h] := charWord;

end;

destructor TStringTokenizer.Destroy;
begin
    iPos := 0;
    Words := nil;
end;

class function TStringTokenizer.nextToken(): string;
begin
    if iPos < Length(Words) then
    begin
    try
        result := Words[iPos];
        // increment for next retrieval
        iPos := iPos + 1;
    except
        on eav: EAccessViolation do
            Result := '';

        on e: Exception do
            ShowMessage(e.ClassName + Chr(10) + e.Message);

    end; { end try..except }
    end
    else
        Result := '';
end;

class function TStringTokenizer.countTokens(): integer;
begin
    result := Length(Words); // stop_here
end;
end.

Re:Newbie with Delphi need some pointers


Quote
In article <392200EB.66246...@e{*word*277}.com>, so_exci...@e{*word*277}.com writes:
>Actually, i'm just trying to create a class called TStringTokenizer (similar
>to
>the StringTokenizer class in Java). The idea is to use this class to tokenize
>a
>string. Suppose i tried to do the following

Have to looked at TParser (in Classes.pas in D3) :-

var
  Str : string;
  SS : TStringStream;
  Psr : TParser;
  Tkn : char;
begin
  Str := 'I dont want any contamination.';
  SS := TStringStream.Create(Str);
  Psr := TParser.Create(SS);
  repeat
    ListBox1.Items.Add(Psr.TokenString);
    Tkn := Psr.NextToken;
  until (Tkn = toEOF);
  Psr.Free;
  SS.Free
end;

This produces a ListBox with a word on every line.

This is more fully described in Ray Lischner's 'Secrets of Delphi 2' (and maybe
3, or 4).

Alan Lloyd
alangll...@aol.com

Go to page: [1] [2]

Other Threads