Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2019-03

how to make a type private to the unit but not defining it in the implementation section?

6 messages · 6 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Dennis
unit frproxyserver;
{$mode objfpc}{$H+}
interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Grids,   frBase;

type

  TMyStringGrid=class(TStringGrid) //how to I make this class visible only to this unit?
  public
  end;

  { TProxyServerFrame }

   TProxyServerFrame = class(TBaseFrame)
     Panel_Top: TPanel;
     StringGrid1: TMyStringGrid;
   private

  public

   end;
implementation
{$R *.lfm}
end.

=============
My reason is I don't want to pollute the name space but if I put the declaration of TMyStringGrid in the implementation section, it cannot be used by the field in the class declaration of TProxyServerFrame.

if there a compiler directive that I can put around TMyStringGrid to make it only visible to the unit frproxyserver?

Dennis

Reply by email

Darius Blaszyk
to Dennis

Make stringgrid1 a pointer and put TMyStringGrid in the implementation section?

Op do 7 mrt. 2019 om 09:11 schreef Dennis

Show quoted text 46 lines
unit frproxyserver; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Grids, frBase; type TMyStringGrid=class(TStringGrid) //how to I make this class visible only to this unit? public end; { TProxyServerFrame } TProxyServerFrame = class(TBaseFrame) Panel_Top: TPanel; StringGrid1: TMyStringGrid; private public end; implementation {$R *.lfm} end. ============= My reason is I don't want to pollute the name space but if I put the declaration of TMyStringGrid in the implementation section, it cannot be used by the field in the class declaration of TProxyServerFrame. if there a compiler directive that I can put around TMyStringGrid to make it only visible to the unit frproxyserver? Dennis _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply by email

Michael Van Canneyt
to Dennis: unit frproxyserver; {$mode objfpc}{$H+} interface uses   Classes, SysUtils, Forms,…
Dennis wrote 23 lines
unit frproxyserver; {$mode objfpc}{$H+} interface uses   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Grids,   frBase; type   TMyStringGrid=class(TStringGrid) //how to I make this class visible only to this unit?   public   end;   { TProxyServerFrame }   TProxyServerFrame = class(TBaseFrame)     Panel_Top: TPanel;     StringGrid1: TMyStringGrid;   private

Use a nested class:

  TProxyServerFrame = class(TBaseFrame)
    Panel_Top: TPanel;
    StringGrid1: TMyStringGrid;
  private
    type
      TMyStringGrid=class(TStringGrid) //how to I make this class visible   only to this unit?
      public
        Procedure SomeMethod;
      end;
   end;
Implementation
Procedure TProxyServerFrame.TMyStringGrid.SomeMethod;

Michael.

Reply by email

Dennis Poon
to Anthony Walter
Anthony Walter wrote 10 lines
type   _PrivateData = class     private type THidden = record Name: string; end;   end; ... and later in the implementation section of the same unit ... var H: _PrivateData.THidden; begin H.Name := 'Hello'; end;
But that will have the same problem of extra long method declaration name
   procedure _PrivateData.THidden.Method1;
   begin
   end;

Dennis

Reply by email

Tony Whyman
to Dennis: unit frproxyserver; {$mode objfpc}{$H+} interface uses   Classes, SysUtils, Forms,…

I would use an "interface" type in this situation.

In the unit's "interface" section define the interface type and a function to create a new instance of the interface.

In the unit's implementation define all your classes including a class that provides the interface. The implementation of the function that creates a new instance of the interface should create and return a new instance of the class that provides the interface.

If you are using COM interfaces then you don't even need to explicitly destroy the interface as they are automatically deleted when all references go out of scope. if you use CORBA interfaces then your interface definition should include a method to free the interface.

Dennis wrote 47 lines
unit frproxyserver; {$mode objfpc}{$H+} interface uses   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Grids,   frBase; type   TMyStringGrid=class(TStringGrid) //how to I make this class visible only to this unit?   public   end;   { TProxyServerFrame }   TProxyServerFrame = class(TBaseFrame)     Panel_Top: TPanel;     StringGrid1: TMyStringGrid;   private   public   end; implementation {$R *.lfm} end. ============= My reason is I don't want to pollute the name space but if I put the declaration of TMyStringGrid in the implementation section, it cannot be used by the field in the class declaration of TProxyServerFrame. if there a compiler directive that I can put around TMyStringGrid to make it only visible to the unit frproxyserver? Dennis _______________________________________________ fpc-pascal maillist  -  http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply by email