<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Message</TITLE>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content=2002-11-01 name=date>
<STYLE type=text/css></STYLE>
<META content="MSHTML 6.00.2900.2769" name=GENERATOR></HEAD>
<BODY>
<DIV dir=ltr align=left><SPAN class=359190401-11112005><FONT face=Arial
color=#0000ff>It depends how carried away you want to go.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=359190401-11112005><FONT face=Arial
color=#0000ff></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=359190401-11112005><FONT face=Arial
color=#0000ff>You can simpy do it with carefull placement of units. As the
units are only referenced by name, you could have eg UserRoutines.pas in every
project directory (not on the path) that impliments the project specific
stuff. </FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=359190401-11112005><FONT face=Arial
color=#0000ff> </FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=359190401-11112005><FONT face=Arial
color=#0000ff>Alternately, you can have a base object or interface defined that
includes the relevent routines. That gets overriden for each
project. When the project starts it sets a global varaible (or uses a
factory method etc) with the correct instance.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=359190401-11112005><FONT face=Arial
color=#0000ff></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=359190401-11112005><FONT face=Arial
color=#0000ff>Normally however, I would do something like that with
events. On startup, sete the appropriate event handlers. alternatly
pass them in as part of the method parameters.</FONT></SPAN></DIV><!-- Converted from text/plain format -->
<P><FONT size=2>Regards<BR><BR>Sean<BR>-------------------------<BR>Sean
Cross<BR>CRM<BR>06 835 5868<BR>021 270 3466 </FONT></P>
<DIV> </DIV><BR>
<BLOCKQUOTE dir=ltr
style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #0000ff 2px solid; MARGIN-RIGHT: 0px">
<DIV class=OutlookMessageHeader lang=en-us dir=ltr align=left>
<HR tabIndex=-1>
<FONT face=Tahoma size=2><B>From:</B> delphi-bounces@ns3.123.co.nz
[mailto:delphi-bounces@ns3.123.co.nz] <B>On Behalf Of </B>John
Bird<BR><B>Sent:</B> Friday, 11 November 2005 11:18 a.m.<BR><B>To:</B> 'NZ
Borland Developers Group - Delphi List'<BR><B>Subject:</B> [DUG]User defined
routines...<BR></FONT><BR></DIV>
<DIV></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff size=2>I
use several shared/library routines called from different places in
programs. Sometimes in one of these I want to call a further routine
which executes code that is relevant to the parent application only.
What is the best way to do this in Delphi?</FONT></SPAN></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff size=2>for
example in other languages I could do:</FONT></SPAN></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2>example -1</FONT></SPAN></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2>Program1 calls Libraryroutine1</FONT></SPAN></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2>Libraryroutine1 calls routine with a fixed name eg
UserRoutine1</FONT></SPAN></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff size=2>And
I would have several separate source versions of UserRoutine1, one for each
application and the link file for the application would specify whihch one got
linked in, and hence called and executed.</FONT></SPAN></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff size=2>I
can't do this in Delphi as the unit itself contains the linking information in
the uses clauses.</FONT></SPAN></DIV>
<DIV><FONT face=Arial color=#0000ff size=2></FONT> </DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2>example - 2</FONT></SPAN></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff size=2>In
other languages I have see code like</FONT></SPAN></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2>Callroutine(routinename,arg1,arg2,arg3.....) where
routinename is a string variable that can be set to the value you want in
Application1, and the Callroutine would then call this routine Routinename
with the arguments arg1 arg2 etc (ie the routine name becomes a variable
and can be pointed at different code. Is this possible or recommended in
Delphi?</FONT></SPAN></DIV>
<DIV><SPAN class=859364820-10112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>example - 3</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005></SPAN></FONT> </DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN class=859364820-10112005>This
is one way you can do it in Delphi - you have a shared routine UserRoutine1
containing all the code for all applications that need
it....</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005></SPAN></FONT> </DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN class=859364820-10112005>eg
</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005></SPAN></FONT> </DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>procedure UserRoutine1...</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005></SPAN></FONT> </DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>if
ExtractFileName(Application.exename)='Fred.exe' then</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>begin</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005> ....</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005> ....</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>end</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN class=859364820-10112005>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>if
ExtractFileName(Application.exename)='Joe.exe' then</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>begin</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005> ....</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005> ....</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>end</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005><SPAN class=859364820-10112005>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>if
ExtractFileName(Application.exename)='Bill.exe' then</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>begin</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005> ....</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005> ....</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005>end</SPAN></FONT></DIV></SPAN></SPAN></FONT></DIV></SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005></SPAN></FONT> </DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN class=859364820-10112005>This
works but is very clumsy in that code not relevant to the application is
compiled in, and also objects/forms/globals relevant to one application are
not useable as other applications will not be using them. In some cases
where the UserRoutine is doing very limited local stuff this may be fine, or
limited numbers of these can be passed in as parameters through
LibraryRoutine1 to UserRoutine1.</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005></SPAN></FONT> </DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN class=859364820-10112005>What
is the recommended or most elegant way to do this in Delphi? I am
thinking maybe the easiest is using an include directive to
pick up the relevant library code for LibraryRoutine1 routine directly
into the application unit - which already contains code for
UserRoutine1</SPAN></FONT></DIV>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN
class=859364820-10112005></SPAN></FONT> </DIV>
<DIV class=Section1>
<P class=MsoAutoSig align=left>John<FONT face=arial color=navy
size=1></P></DIV></BLOCKQUOTE></FONT></BODY></HTML>