Re: [fpc-pascal] generic class helper and class references

2013-09-29 Thread Sven Barth

On 29.09.2013 05:30, Xiangrong Fang wrote:

type
   generic TTreeT = class
 ... ...
   end;
   TTreeType = class of TTree;


This is illegal code and compiled by pre-2.7.1 FPC only because of bugs 
in the generic implementation. TTree is not a legal type outside of 
the generic's declaration or implementation (and no, TTreeT is neither).



1) is it possible to define class helper for generic classes?


No. I recently had the thought to allow this as well, but not now.


2) why class helper require a class and we cannot use a class reference?


A class helper always work on variables (or return values) of the type 
you specified. So if you'd be able to define a class helper for 
TTreeType you'd only be able to use it on variables of type TTreeType or 
e.g. TTreeType(Self.ClassType), but not on instances of TTree.


Regards,
Sven
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] class inheritance and type incompatibility

2013-09-29 Thread Sven Barth

On 29.09.2013 04:47, Xiangrong Fang wrote:

2013/9/29 Sven Barth pascaldra...@googlemail.com
mailto:pascaldra...@googlemail.com


If you want to override the virtual Clone method of TTreeLongInt
in TIntTree you need to use the same result type + override or
otherwise you gain nothing, because the compiler will not consider
the method as overloaded and use the Clone method of TTreeLongInt
inside TTreeLongInt's methods instead.


​Yes, you are right, for virtual method, you need have exactly same
type... But this leads me to think how the generics are implemented?


The important things about generics:
- The generic type itself (in this case TTree) does *not* exist inside 
the code (bugs not withstanding...), only the textual representation of 
the generic exists as metadata inside the PPU (which you can not access 
from a program)
- When specializing a generic the compiler loads this metadata and 
reparses the textual representation whereby the generic type parameters 
are replaced by the types you specified, so in code a specialize 
TTreeInteger looks like a TTreeT which you manually have made 
non-generic and replaced each occurence of T with Integer.



For
example:

=== snippet 1 ===
type
   TIntTree = class(specialize TTreeInteger)
   public
 function Clone: TTree; override;
   end;
=== end of snippet 1 ===

This will leads to a compile error: Generics without specialization
cannot be used as a type for a variable.


TTree is not valid anywhere except inside the declaration of the 
generic (and only in non-Delphi modes).




If so, why in the code TTree can be used everywhere, for example:

=== snippet 2 ===
function TTree.Level: Cardinal;
var
   n: TTree;  -- here TTree is not specialized.
begin
   ... ...
end;
=== end of snippet 2 ===

In snippet 1, why the compiler don't treat the TTree same as its own
type i.e. TIntTree? I imagine that TTree in snippet 1 is logically
similar to TObject. I mean, a class's method is of course possible to
return a value of its parent's type or any other class's instance?


In case of generics in non-Delphi modes the own class name without 
generic parameters (here TTree) is a place holder for the own type of 
the generic. The compiler replaces any reference to this type with 
references to the generic you are declaring. If you now specialize a 
generic (e.g. specialize TTreeLongInt) all those references are now 
handled as references to TTreeLongInt.




Would you please show how exactly you changed the code? With all
those methods calling each other it's a bit hard to imagine in my
head what you changed. ;)


​With your TSelfClass solution in TTree, I mean either:

=== solution 1 ===
type
   TIntTree = class(specialize TTreeInteger
   public
 function Clone: TIntTree;
   end;
   function TIntTree.Clone: TIntTree;
   begin
 Result := TIntTree(inherited Clone); //typecast in TIntTree
   end;
​=== end of solution 1===
or:
=== solution 2 ===
type
   TIntTree = class(specialize TTreeInteger)
   end;
begin //main
   it2 := TIntTree(it1.Clone);  //typecast in main program
end.
=== end of solution 2 ===​
​
Are both solutions correct?


Yes, correct are both.

Regards,
Sven

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] class inheritance and type incompatibility

2013-09-29 Thread Sven Barth

On 29.09.2013 05:49, Xiangrong Fang wrote:

2013/9/28 Sven Barth pascaldra...@googlemail.com
mailto:pascaldra...@googlemail.com

On second sight your solution is not correct, because you are using
Clone inside your parent class which would not use the (non-virtual)
Clone you created.

I've now played around with 2.6.2 myself and this should solve this
problem:

=== code begin ===

type
   generic TTreeT = class
   private type
 TSelfType = TTree;
 TSelfClass = class of TSelfType; // earlier I suggested TTree
which 2.6.2 does not support=== code end ===


​I think this solution only fixed the problem with 2.6.2 that you have
to use TSelfType, but the logic is still not correct.

Using your modified version, I try to achieve some complex Clone​
​strategy, for example, either one of the following:

1) the descendant has added a field other than Data that needs to be cloned;
2) the clone is non-verbatim, it will multiple Data by 2 when cloning.

Let's use the 2nd one as an example, the following does not work:

type
   TIntTree = class(specialize TTreeInteger)
   public
 function Clone: TIntTree;
   end;

function TIntTree.Clone: TIntTree;
begin
   Result := TIntTree(inherited Clone);
   Result.Data *= 2;
end;

It only multiple the ROOT node of the cloned tree, not every node.


I would suggest you to add an additional protected virtual method to 
TTree which is called from TTree.Clone and you override that in your 
descendant classes.


Regards,
Sven

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


[fpc-pascal] GUI confusion

2013-09-29 Thread Patrick

Hi Everyone

I really like the pascal code I have looked at and I am very excited 
about FPC. I hope this email won't upset anyone, it is a bit negative.


I don't really like IDEs. I used gvim and I suppose it could almost be 
called an IDE as well but I mean I would rather use the shellr then 
clicking on a build button.


I am trying to learn what Lazarus is all about but I am still clueless.

There are screen shots of it being used to develop GTK and QT 
applications but I have also read that GTK 2 is new and buggy and then 
there is this line:


The FPC Qt4 Binding is not meant to create Qt applications in FPC. But 
it should allow the Lazarus LCL developers to create a Qt Widget set for 
Lazarus


Can I build GTK 2 (or 3) and QT applications in this? Could anyone point 
me to resources on how to build GUI applications without Lazarus?


Please don't RTFM me, I am trying, there just seems to be a lot of 
conflicting information and I am confused-Patrick

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


[fpc-pascal] Re: GUI confusion

2013-09-29 Thread Reinier Olislagers
On 29/09/2013 15:24, Patrick wrote:
 I am trying to learn what Lazarus is all about but I am still clueless.
 
 There are screen shots of it being used to develop GTK and QT
 applications but I have also read that GTK 2 is new and buggy and then
 there is this line:
snip
 Can I build GTK 2 (or 3) and QT applications in this? Could anyone point
 me to resources on how to build GUI applications without Lazarus?


This sounds like a blast from the past.

Yes, Lazarus has been able to build GTK applications for quite a while
now, as well as Qt and Windows applications.
GTK2 is the default widgetset for Lazarus on Linux; GTK3 support
probably is more experimental.

I'd suggest simply installing it and trying it.

About building GUI applications without Lazarus: Graeme, this is your
cue! Try looking into fpgUI, MSEIDE+MSEGUI.
Presumably you could handcode pascal using the bindings to create forms
etc as well but why you would want to do that escapes me.

Good luck.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] class inheritance and type incompatibility

2013-09-29 Thread Sven Barth

On 29.09.2013 11:47, Xiangrong Fang wrote:

2013/9/29 Sven Barth pascaldra...@googlemail.com
mailto:pascaldra...@googlemail.com


I would suggest you to add an additional protected virtual method to
TTree which is called from TTree.Clone and you override that in
your descendant classes.


Could
​ you please give an example how to do this?  I tried the following:

=== code start ===
function TTree.DoClone: TTree; //protected, virtual
begin
   Result := TSelfClass(Self.ClassType).Create(Data, FParent);
end;

function TTree.Clone: TTree;
var
   node: TTree;
begin
   Result := DoClone;
   node := FirstChild;
   while node  nil do begin
 node.Clone.Remove(Result);
 node := node.NextSibling;
   end;
end;
=== code end ===

However, this does not work, because it seems that I cannot make any
generic method virtual!  In TIntTree, I have to write:

function TIntTree.DoClone: TIntTree;

As it is not possible to write TTree outside of the generic definition.


This should do it:

=== code begin ===

type
  generic TTreeT = class
  protected type
TSelfType = TTree;
  protected
procedure DoClone(aNode: TSelfType); virtual;
  public
function Clone: TSelfType;
  end;

procedure TTree.DoClone(aNode: TSelfType);
begin
  (* empty *)
end;

function TTree.Clone: TSelfType;
var
  n: TTree;
begin
  Result := TSelfType(Self.ClassType).Create(Data, FParent);

  node := FirstChild;
  while node  nil do begin
node.Clone.Remove(Result);
node := node.NextSibling;
  end;

  DoClone(Result);
end;


type
  TIntTree = class(specialize TTreeInteger)
  protected
procedure DoClone(aNode: TSelfType; override;
  end;

procedure TIntTree.DoClone(aNode: TSelfType);
begin
  inherited;
  (* whatever *)
end;

=== code end ===

Regards,
Sven
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] GUI confusion

2013-09-29 Thread Sven Barth

On 29.09.2013 15:24, Patrick wrote:

Hi Everyone

I really like the pascal code I have looked at and I am very excited
about FPC. I hope this email won't upset anyone, it is a bit negative.

I don't really like IDEs. I used gvim and I suppose it could almost be
called an IDE as well but I mean I would rather use the shellr then
clicking on a build button.


IDEs are less about build buttons, but about the additional features 
they provide:

- integrated debugging
- error location highlighting
- code completion
- code refactoring tools



I am trying to learn what Lazarus is all about but I am still clueless.

There are screen shots of it being used to develop GTK and QT
applications but I have also read that GTK 2 is new and buggy and then
there is this line:


It seems that this wasn't updated for quite some time...GTK2 is no 
problem today and is the standard GUI interface for Lazarus on Linux




The FPC Qt4 Binding is not meant to create Qt applications in FPC. But
it should allow the Lazarus LCL developers to create a Qt Widget set for
Lazarus


I would say scratch that sentence. The first part can be more or less 
considered nonsense...




Can I build GTK 2 (or 3) and QT applications in this?


GTK 3 is not yet supported, but GTK 2 and QT are.


Could anyone point
me to resources on how to build GUI applications without Lazarus?


You could take a look at the packages/gtk2/examples directory of a FPC 
source distribution.


Regards,
Sven
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] SSE instructions

2013-09-29 Thread Florian Klämpfl
Am 27.09.2013 23:48, schrieb August Oktobar:
 Are there any plans to add support for SSE intrinsic instructions,
 similar to MMX?

Planned is a lot, when it happens is a another question.

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] GUI confusion

2013-09-29 Thread Patrick

Thanks again to Reinier and Sven

I just bought Getting Started with Lazarus IDE.

I actually tried to get started with FPC back In January. I felt that 
the language was too tied to Lazarus and that I didn't want to use an 
IDE so I gave up.


I will report back when I am a little further along this time. It is 
possible that the language is not being presented exactly as is intended 
or that there is too much room for people to misinterpret how the 
programming environment works.


-Patrick




On 09/29/2013 12:50 PM, Sven Barth wrote:

On 29.09.2013 15:24, Patrick wrote:

Hi Everyone

I really like the pascal code I have looked at and I am very excited
about FPC. I hope this email won't upset anyone, it is a bit negative.

I don't really like IDEs. I used gvim and I suppose it could almost be
called an IDE as well but I mean I would rather use the shellr then
clicking on a build button.


IDEs are less about build buttons, but about the additional features 
they provide:

- integrated debugging
- error location highlighting
- code completion
- code refactoring tools



I am trying to learn what Lazarus is all about but I am still clueless.

There are screen shots of it being used to develop GTK and QT
applications but I have also read that GTK 2 is new and buggy and then
there is this line:


It seems that this wasn't updated for quite some time...GTK2 is no 
problem today and is the standard GUI interface for Lazarus on Linux




The FPC Qt4 Binding is not meant to create Qt applications in FPC. But
it should allow the Lazarus LCL developers to create a Qt Widget set for
Lazarus


I would say scratch that sentence. The first part can be more or less 
considered nonsense...




Can I build GTK 2 (or 3) and QT applications in this?


GTK 3 is not yet supported, but GTK 2 and QT are.


Could anyone point
me to resources on how to build GUI applications without Lazarus?


You could take a look at the packages/gtk2/examples directory of a FPC 
source distribution.


Regards,
Sven
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal



___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] GUI confusion

2013-09-29 Thread Sven Barth

On 29.09.2013 20:54, Patrick wrote:

I actually tried to get started with FPC back In January. I felt that
the language was too tied to Lazarus and that I didn't want to use an
IDE so I gave up.


FPC is definitely independant of Lazarus, but Lazarus on the one hand 
simplifies development significantly (I myself am using it e.g. for 
working on the compiler itself) and it also allows to develop user 
application in a way similar to Delphi. Most Object Pascal people are 
using either Delphi or Lazarus to develop GUI applications based on the 
VCL or LCL respectively. Few go the route of using another GUI (e.g. 
mseGUI and fpGUI) or use the native platform API (e.g. direct WinAPI, 
GTK 2, Carbon, etc.).



I will report back when I am a little further along this time. It is
possible that the language is not being presented exactly as is intended
or that there is too much room for people to misinterpret how the
programming environment works.


I've never read the Getting started with Lazarus book, so I can not 
comment on this.


Regards,
Sven
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] GUI confusion

2013-09-29 Thread Graeme Geldenhuys
On 29/09/13 14:24, Patrick wrote:
 Could anyone point 
 me to resources on how to build GUI applications without Lazarus?


There are alternatives, but first a distinction needs to me made. When
you say Lazarus, do you mean simply the IDE, or do you mean the LCL
(Lazarus Component Library)?

From your earlier remard about IDE's I assume you simply don't like IDE,
but you might not mind building LCL-based applications.

Obviously you can create LCL-based GUI applications without using
Lazarus IDE. It is a bit more work though. Just in case you didn't know,
LCL uses other underlying widgetset's. So LCL can target GTK1, GTK2,
Win32, fpGUI and Carbon toolkits.

Another alternatives is to use fpGUI, which is a 100% custom drawn GUI
toolkit, that doesn't rely on any other underlying toolkits. fpGUI talks
directly to X11 or GDI. fpGUI isn't tied to any specific editor or IDE,
so you are free to code with Notepad or VI if you wanted to. fpGUI does
come with its own tools to help you with some tasks, but in is still not
a requirement to use them. For example, fpGUI includes a stand-alone GUI
Designer for visually designing forms. All that the GUI Designer does,
is generated Object Pascal source code, just like you would have done by
had. It doesn't use external files like the *.lfm files which Lazarus
IDE produces - which ain't Object Pascal source files.

Yet another alternative is MSEide+MSEgui, but as the name says, it is
recommended to use the MSEide to write code.

Regards,
  Graeme

-- 
fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal
http://fpgui.sourceforge.net/


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] GUI confusion

2013-09-29 Thread Patrick



There are alternatives, but first a distinction needs to me made. When
you say Lazarus, do you mean simply the IDE, or do you mean the LCL
(Lazarus Component Library)?

From your earlier remard about IDE's I assume you simply don't like IDE,
but you might not mind building LCL-based applications.

Obviously you can create LCL-based GUI applications without using
Lazarus IDE. It is a bit more work though. Just in case you didn't know,
LCL uses other underlying widgetset's. So LCL can target GTK1, GTK2,
Win32, fpGUI and Carbon toolkits.

Another alternatives is to use fpGUI, which is a 100% custom drawn GUI
toolkit, that doesn't rely on any other underlying toolkits. fpGUI talks
directly to X11 or GDI. fpGUI isn't tied to any specific editor or IDE,
so you are free to code with Notepad or VI if you wanted to. fpGUI does
come with its own tools to help you with some tasks, but in is still not
a requirement to use them. For example, fpGUI includes a stand-alone GUI
Designer for visually designing forms. All that the GUI Designer does,
is generated Object Pascal source code, just like you would have done by
had. It doesn't use external files like the *.lfm files which Lazarus
IDE produces - which ain't Object Pascal source files.

Yet another alternative is MSEide+MSEgui, but as the name says, it is
recommended to use the MSEide to write code.

Regards,
   Graeme




Thanks again Sven.

Hi Graeme

This was a very helpful post. I will definitely give fpGUI a try, along 
with Lazarus.


I don't really know anything about using LCL outside of Lazarus yet.

Your point about LCL is super helpful. I hope no one minds the 
constructive criticism but my lack of understanding of this was the 
tipping point that sent me away last time. I tried Lazarus but it did 
not seem to be creating GTK code or QT, it was just some sort of weirdo 
Lazarus only stuff and then in tandem with the QT binding statement I 
mentioned earlier, it wasn't even obvious whether or not it could 
generate GUI code outside of the IDE.  The FUD circling around Pascal is 
that it is for teaching only. It would be painful to learn an IDE to 
only find out later that it is for teaching purposes.


I have family members with urgent care needs and I don't have too much 
time. However I would really like to start posting on the net about my 
experiences, maybe I can help to clear away the FUD.


BTW, Would it be correct to compare LCL to WxWidgets ? In the sense that 
it is a meta-widget toolkit?


Thanks ! -Patrick


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


[fpc-pascal] Re: GUI confusion

2013-09-29 Thread leledumbo
 I tried Lazarus but it did 
not seem to be creating GTK code or QT, it was just some sort of weirdo 
Lazarus only stuff and then in tandem with the QT binding statement I 
mentioned earlier

http://wiki.freepascal.org/Overview_of_Free_Pascal_and_Lazarus#Lazarus_Architecture

 it wasn't even obvious whether or not it could 
generate GUI code outside of the IDE

http://wiki.freepascal.org/LCL_Tips#Creating_a_GUI_by_code

By logic, there won't be anything that can be done by IDE but not by code,
code is far more superior in terms of capability. After all, code is what
works behind all those abstractions (forms, data module, etc.). The IDE does
almost exactly the same thing as if you code everything by hand (but it does
by reading and interpreting the form's definition).

 It would be painful to learn an IDE to 
only find out later that it is for teaching purposes.

Welcome to the world of Modern Pascal. Nah, Pascal itself has NEVER been
designed for such a purpose only. Free Pascal and Lazarus despite volunteer
only projects are designed for real world application. Both are written in
itself (Free Pascal is bootstrapping compiler, Lazarus is built from LCL,
the same framework you use for building GUI applications with Lazarus) which
shows their power.



--
View this message in context: 
http://free-pascal-general.1045716.n5.nabble.com/GUI-confusion-tp5716891p5716900.html
Sent from the Free Pascal - General mailing list archive at Nabble.com.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] class inheritance and type incompatibility

2013-09-29 Thread Xiangrong Fang
2013/9/30 Sven Barth pascaldra...@googlemail.com


 However, this does not work, because it seems that I cannot make any
 generic method virtual!  In TIntTree, I have to write:

 function TIntTree.DoClone: TIntTree;

 As it is not possible to write TTree outside of the generic definition.


 This should do it:


Right, this worked. My last question for this issue: is the TSelfType a
2.6.2 workaround, or it is required even in 2.7.1? I mean, how about this:

=== code ===
type
  generic TTree = class
  protected
procedure DoClone(aNode: TTree); virtual;  //-- instead of TSelfType
  end;
  TIntTree = class(specialize TTreeInteger)
  protected
procedure DoClone(aNode: TTree); override; //-- instead of TSelfType
  end;
=== end code ===

In another word, use TTree to represent any of its specialization and
their descendants. Is it possible in 2.7.1 or later?

Thanks a lot.

Xiangrong
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] class inheritance and type incompatibility

2013-09-29 Thread Sven Barth
Am 30.09.2013 04:10 schrieb Xiangrong Fang xrf...@gmail.com:

 2013/9/30 Sven Barth pascaldra...@googlemail.com


 However, this does not work, because it seems that I cannot make any
 generic method virtual!  In TIntTree, I have to write:

 function TIntTree.DoClone: TIntTree;

 As it is not possible to write TTree outside of the generic definition.


 This should do it:


 Right, this worked. My last question for this issue: is the TSelfType a
2.6.2 workaround, or it is required even in 2.7.1? I mean, how about this:

 === code ===
 type
   generic TTree = class
   protected
 procedure DoClone(aNode: TTree); virtual;  //-- instead of TSelfType
   end;
   TIntTree = class(specialize TTreeInteger)
   protected
 procedure DoClone(aNode: TTree); override; //-- instead of TSelfType
   end;
 === end code ===

 In another word, use TTree to represent any of its specialization and
their descendants. Is it possible in 2.7.1 or later?

You don't require TSelfType in 2.7.1, but the correct one is not TTree,
but specialize TTreeInteger. If TTree should work then that's a bug...

Regards,
Sven
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal