[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