Sven Barth wrote 48 lines
On 28.02.2014 19:59, Marcos Douglas wrote:
>
> On Fri, Feb 28, 2014 at 3:47 PM, Mattias Gaertner
> wrote:
>>
>>
>> On Fri, 28 Feb 2014 15:29:03 -0300
>> Marcos Douglas 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===