[fpc-pascal] Enum scope

Marcos Douglas md at delfire.net
Fri Feb 28 20:44:57 CET 2014


On Fri, Feb 28, 2014 at 4:22 PM, Sven Barth <pascaldragon at googlemail.com> wrote:
> On 28.02.2014 19:59, Marcos Douglas wrote:
>>
>> On Fri, Feb 28, 2014 at 3:47 PM, Mattias Gaertner
>> <nc-gaertnma at netcologne.de> wrote:
>>>
>>>
>>> On Fri, 28 Feb 2014 15:29:03 -0300
>>> Marcos Douglas <md at delfire.net> wrote:
>>>
>>>> [...]
>>>> These properties are defined in Process unit. My class is in myprocess
>>>> unit
>>>> (or something like that).
>>>> The problem is: I can not use the enums values because they don't exists
>>>> in
>>>> my unit (myprocess) but if these enums were defined inside TProcess
>>>> class
>>>> (public type), I can use them without problem.
>>>>
>>>> So, what do you think about it?
>>>
>>>
>>> Enums are always public and global.
>>> For example:
>>>
>>>    TMyClass = class
>>>    private
>>>      type
>>>        MyEnums = (enum1, enum2);
>>>    public
>>>      e: MyEnums;
>>>    end;
>>>
>>> enum1 can be used in other units.
>>
>>
>> But that's what I'm talking about!  :)
>>
>> So if the  TProcessOptions, TProcessPriority and TStartupOptions was
>> declared as a type inside TProcess I do not needed to import (uses)
>> two units (follow the example: process and myprocess) in a third unit.
>>
>> I propose "migrate" these enums from units to be member of classes.
>
>
> Sidenote: What you propose would work only if {$scopedenums on} is used in
> the unit which defines the enums and in that case you'd have the problem
> with backwards compatibility.

Do not need {$scopedenums on}.
See example bellow. Unit1 uses Unit2 and this uses Unit3.

The problem with backwards compatibility could be resolved using {$IFDEF} IMHO.

Regards,
Marcos Douglas

=== BEGIN ===
unit Unit3;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

type
  TFoo = class
  public type
    TEnum = (fooA, fooB, fooC);
  public
    FValue: TEnum;
  end;

implementation

end.
--------------------------------------------------------------------------------------------
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Unit3;

type
  TNewFoo = class(TFoo)
  end;

implementation

end.
--------------------------------------------------------------------------------------------
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, StdCtrls,
  Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  F: TNewFoo;
begin
  F := TNewFoo.Create;
  try
    F.FValue := TNewFoo.TEnum.fooA;
  finally
    F.Free;
  end;
end;

end.
===END===



More information about the fpc-pascal mailing list