Jump to content
Ian Branch

Can I assign an alias????

Recommended Posts

Hi Team,

Let's say I have two units in the App.  Unit1 & Unit 2 where Unit1 is the main unit and Unit2 is a datamodule with a ttable, MyTable, on it.

Is it possible to create an alias for the datamodule/ttable?  i.e. instead of having to type 'Unit2.Mytable.FieldByName......' when calling it from Unit1, instead, something like 'U2MT.FieldByName.....'?

Would save a hell of a lot of typing... :-)

Or, is there an alternative??

Whilst I have been specific here in regards to the units/components, I can see additional usage if the ability exists.

 

Regards & TIA,

Ian

Share this post


Link to post
Guest

for a class, you can create a alias that way:

type
  TMyClassOriginal = class
  public
    function HelloWorld: string;
  end;

  TMyAlias = TMyClassOriginal;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyAlias:TMyAlias;
begin
  MyAlias:=TMyAlias.Create;  // TMyClassOriginal.Create; // it's valid too!
  try
    ShowMessage( MyAlias.HelloWorld );
  finally
    MyAlias.Free;
  end;
end;

{ TMyClassOriginal }

function TMyClassOriginal.HelloWorld: string;
begin
  result := 'Hello cruel world';
end;

now, to units (namespaces... not necessaraly), that's why there is the keyword "uses". That way, whatever the classes or other objects within a unit, you no longer need to indicate "where the object is contained"... the only case, I think, is when there are two objects with the same name or some particularity to each.
A very common case in Delphi is some enumerates that were not created with the "{ENUMSCOPED ON}" compiler directive and can cause unexpected behavior when in use.

 

Edited by Guest

Share this post


Link to post
56 minutes ago, Ian Branch said:

Is it possible to create an alias for the datamodule/ttable?  i.e. instead of having to type 'Unit2.Mytable.FieldByName......' when calling it from Unit1, instead, something like 'U2MT.FieldByName.....'?

Better to use reference...

{ Once instance is created you use references to it..

procedure TForm5.Button1Click(Sender: TObject);
var
  sourceDM: dm5.TDataModule6;
  dmLog: TStrings;
begin
  dmLog := sourceDM.dm6log;
  //or just 
  dmLog := dm5.TDataModule6
  ...

//in dm5's  TDataModule6 has stringlist for logging dm6log: Tstrings;

 

Share this post


Link to post
Guest

non-unnecessary say that: we only use "namespaces... a.k.a    lib.section.classes.TMyClass" when exist "a possible conflict" on place!

for rest, dont try this! it's unreadable!

use "USES"

 

uses
  uMyLib.MySection.MyClass;

...
var
  MyValue: TMyClass;  // into "uMyLib.MySection.MyClass"
begin
 ...
  MyValue := TMyClass.Create;
  ...

 

Share this post


Link to post

Hi All,

Sorry, you are doing things that are over my head. 😞

I'm sure what you are telling me is quite correct, but I'm afraid I don't understand how to apply them to my scenario.  That is my knowledge deficiency.

I really would appreciate it if you could explain in terms of my Unit1/Unit2/TTable example.

Then perhaps I can relate it to what you have above and reach an understanding.

 

Regards,

Ian

Share this post


Link to post

How about mainunit and unit9 listing the DataModule named DM in this example.

 

Button1Click in mainunit calls buildEmailList that has two tables as arguments. 

Note in button1click the tables used are in DM.  

in the buildEmaillList procedure only tables passed are used. 

 

Button2Click should get you started. 🙂  

   

//unit9
//...
//  TDM = class(TDataModule)
//    MyTable: TFDMemTable;
//    emailsTable: TFDMemTable;

Uses unit9;

procedure TForm8.buildEmailList(SourceTable, EmailTable: TfdmemTable);
begin
  EmailTable.Open;
  SourceTable.Close;
end;

procedure TForm8.Button1Click(Sender: TObject);
begin
  buildEmailList(DM.MyTable, DM.emailsTable);
end;

procedure TForm8.Button2Click(Sender: TObject);
var
  bigtable: TFDMemTable;
  EmailsNeedtoSend: TFDMemTable;
begin
  bigtable := DM.MyTable;
  EmailsNeedtoSend := DM.emailsTable;
end;

 

Share this post


Link to post

Hi Pat,

Ahhh.  Now I see/understand.  Thank you for the clarification.  Much Appreciated.

Thank you to all contributors.

So, there is no such thing as a freebee.  What, if any, is the penalty for this construct?

 

Regards,

Ian

Edited by Ian Branch

Share this post


Link to post
7 hours ago, Ian Branch said:

Is it possible to create an alias for the datamodule/ttable?  i.e. instead of having to type 'Unit2.Mytable.FieldByName......' when calling it from Unit1, instead, something like 'U2MT.FieldByName.....'?

Note that Unit2.Mytable.FieldByName will not work because it misses the datamodule where MyTable is declared.

 

Sticking to the concrete example and assuming that the datamodule in Unit2 is named DataModule2, declare a public function in Unit2 like this:

function U2MT: TTable;
begin
  Result := DataModule2.MyTable;
end;

Now in Unit1 and everywhere else you can write things like U2MT.FieldByName as long as Unit2 is in the uses clause.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×