<br><br><div class="gmail_quote">On 16 November 2010 08:35, Bo Berglund <span dir="ltr"><<a href="mailto:bo.berglund@gmail.com">bo.berglund@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
On Mon, 15 Nov 2010 16:36:38 -0500, Steve Smith <<a href="mailto:stevie@collector.org">stevie@collector.org</a>><br>
wrote:<br>
<div class="im"><br>
>Message: 5<br>
>Date: Mon, 15 Nov 2010 16:32:34 +0100<br>
>From: Bo Berglund <<a href="mailto:bo.berglund@gmail.com">bo.berglund@gmail.com</a>><br>
>Subject: Re: [Lazarus] When do I need a component rather than a plain<br>
>    object?<br>
>To: <a href="mailto:lazarus@lists.lazarus.freepascal.org">lazarus@lists.lazarus.freepascal.org</a><br>
>Message-ID: <<a href="mailto:ruj2e61613s285b5pj9ieitbf2qld9d56k@4ax.com">ruj2e61613s285b5pj9ieitbf2qld9d56k@4ax.com</a>><br>
>Content-Type: text/plain; charset=us-ascii<br>
><br>
>On, 15 Nov 2010 16:32:34 +0100, Bo Berglund <<a href="mailto:bo.berglund@gmail.com">bo.berglund@gmail.com</a>><br>
>wrote:<br>
><br>
>> According to what I have read in the WIKI you only install components<br>
>> into Lazarus if they are visual and you really need them to be part of<br>
>> a visual form.<br>
><br>
>> In all other cases you should not install a component in the IDE,<br>
>> instead you instantiate the objects from that component in code.<br>
><br>
>You create and install a component, not because it is visual or<br>
>non-visual<br>
>but because you wish to use it in the visual forms designer in Lazarus,<br>
>just as in Delphi.  For example TTimer is not a visual component, but<br>
>because you wish to add it to the component palette and add it to your<br>
>form, it has to be a descendent of TComponent.<br>
<br>
</div>Yes I understand what you say, but why not create the TTimer in code<br>
instead and not put it into a form where it will not show up in<br>
runtime?<br>
Of course my discussion is not about the built-in IDE components but<br>
rather about self-developed non-visual components. These should NOT be<br>
installed in the IDE and the corresponding objects created in code<br>
instead. Then one gets more control (see below).<br>
<div class="im"><br>
>If you are creating a visual component it should be a descendent of<br>
>TControl or one of it's descendants.<br>
><br>
>TPersistent is the base class that implements support for the streaming<br>
>subsystem used by the forms designer and it's components to save their<br>
>properties in the form file.<br>
><br>
>If you don't wish any of these facilities, you can use TObject.<br>
<br>
</div>What I was getting at is this:<br>
Any component that you want to put visually on a form requires that<br>
component to be installed in the IDE, which also means that its<br>
sources are stored within the Lazarus own folder tree.<br>
But in a software development environment with many developers working<br>
on many projects where these components are used there is a problem of<br>
ensuring that the components are up to date within the projects. We<br>
faced this many times when developing with Delphi because we fell into<br>
the trap of creating "components" instead of ordinary classes for<br>
stuff that had no visuality in teh programs. It was sort of a<br>
convenience that you could drop for instance a logging component onto<br>
your main form and then set its properties in the designer. But the<br>
component had no visual part and should not have been a component in<br>
the first place.<br>
<br>
We stopped this and instead create normal classes based on TObject.<br>
These can then be checked out into a project source tree very much<br>
apart from the IDE folder tree. Here we have full control and can be<br>
sure that we can tag all project files so that we can get back to an<br>
old state when we need to fix user bug reports.<br>
And the classes used in a project will be easily updated to the latest<br>
state as part of the general project source update from CVS (yes we<br>
use CVS...).<br>
In the component case we always had to "know" that we also needed to<br>
update the IDE components in a different place to get the latest and<br>
we could not tag the project in one place and be sure that we tagged<br>
all sources...<br>
<br>
Now that we are stuck with a lot of component stuff from old times we<br>
have stopped installing them in the IDE. We just use tham as normal<br>
classes and we create them as needed in the project start code and it<br>
works just fine. The sources are checked out into each project that<br>
use them and this means that a tag on the project will hit them too.<br>
So we can recreate the exact situation for a user version that has a<br>
bug and fix it.<br>
<br>
Of course this holds for all components tha are non-visual, which most<br>
of ours were. But we do have stuff that are visual too, and here we<br>
have to install in teh IDE but then (in Delphi) we make sure that<br>
there is no global path to the component sources so we can add the<br>
component sources to the project module and check out as usual. Then<br>
we set the project search path to include these local copies. It seems<br>
to work but is a bit of a hassle.<br>
<div class="im"><br>
--<br>
<br>
Bo Berglund<br>
Developer in Sweden<br>
<br>
<br>
--<br>
_______________________________________________<br>
</div><div><div></div><div class="h5">Lazarus mailing list<br>
<a href="mailto:Lazarus@lists.lazarus.freepascal.org">Lazarus@lists.lazarus.freepascal.org</a><br>
<a href="http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus" target="_blank">http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus</a><br>
</div></div></blockquote></div><br><br><br>I realized the wisdom of Bo's approach to creating components at run-time and setting the properties in code only 2 days go.<br><br>I overwrote some of my newer code with older code, and although I restored the *.pas from git, I forgot about the*.lfm where the SQL was stored. It was only hours later that I realized the the update code was in the components that I restored it.<br clear="all">
<br>Initialzing non-visual components from form properties is an evil which is best avoided.<br><br>It will be good if Lazarus can generate the source code to initialize components at the start of a program, rather than stream them in, hopefully in a future version. It makes revision control much easier, a lot more transparent.<br>
<br>-- <br>Frank Church<br><br>=======================<br><a href="http://devblog.brahmancreations.com">http://devblog.brahmancreations.com</a><br>