Re: [fpc-pascal] Re: TimSort

2011-05-25 Thread Marco van de Voort
In our previous episode, Mattias Gaertner said:
>  > A quick look at wikipedia will show that timsort has a disadvantage too. It
>  > needs up to N records memory, not just Log(n) records like e.g. Quicksort.
>  It *can* be implemented to need only log(n). But the current fpc 
> implementation
> of QuickSort seems to need O(n) memory on the stack.

Hmm. Then that should be fixed.
 
>  TimSort needs up to N/2 pointer, which is better than a simple MergeSort.

For heavier sorting I usually use heapsort and quicksort routines that date
back to my M2 days

Usually heapsort since it is quite fast for already sorted collections.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


RE : Re[2]: [fpc-pascal] fpWeb and html and uri escaping/unescapingelements

2011-05-25 Thread Ludo Brands
You should not unescape recursively.
Input to EscapeHTML: '<' Output: '<' : Correct
UnescapeHTML: input  '<' Output '<'   Wrong.
This is because you replace '&' with '&' resulting in '<' which is
translated to '< ' in the next line. 
 
Ludo
 
 

-Message d'origine-
De : fpc-pascal-boun...@lists.freepascal.org
[mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de ik
Envoyé : mercredi 25 mai 2011 08:34
À : FPC-Pascal users discussions
Objet : Re: Re[2]: [fpc-pascal] fpWeb and html and uri
escaping/unescapingelements





On Tue, May 24, 2011 at 12:21, José Mejuto  wrote:


Hello FPC-Pascal,

Tuesday, May 24, 2011, 10:09:03 AM, you wrote:

i> I've created a patch with the Escape and unEscape functions, and place it
i> here: http://bugs.freepascal.org/view.php?id=19407

Un/escapeHTML parsing must be in one go, specially the "&" one. Test
against:

"<"



I'm not sure what you mean here.

If you have already html entities you should not escape them. If you do not
have html entities you should escape them.
The Escaping and unescaping works well, I already tested them before I sent
them.

 


Right unescape "<", your code "<".

--
Best regards,
 José



Ido
 



___
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: RE : Re[2]: [fpc-pascal] fpWeb and html and uri escaping/unescapingelements

2011-05-25 Thread ik
On Wed, May 25, 2011 at 10:09, Ludo Brands  wrote:

>  You should not unescape recursively.
> Input to EscapeHTML: '<' Output: '<' : Correct
> UnescapeHTML: input  '<' Output '<'   Wrong.
> This is because you replace '&' with '&' resulting in '<' which is
> translated to '< ' in the next line.
>

So you suggest to place the & translation last.


>
> Ludo
>
>
>
>  -Message d'origine-
> *De :* fpc-pascal-boun...@lists.freepascal.org [mailto:
> fpc-pascal-boun...@lists.freepascal.org] *De la part de* ik
> *Envoyé :* mercredi 25 mai 2011 08:34
> *À :* FPC-Pascal users discussions
> *Objet :* Re: Re[2]: [fpc-pascal] fpWeb and html and uri
> escaping/unescapingelements
>
>
>
>
> On Tue, May 24, 2011 at 12:21, José Mejuto  wrote:
>
>> Hello FPC-Pascal,
>>
>> Tuesday, May 24, 2011, 10:09:03 AM, you wrote:
>>
>> i> I've created a patch with the Escape and unEscape functions, and place
>> it
>> i> here: http://bugs.freepascal.org/view.php?id=19407
>>
>> Un/escapeHTML parsing must be in one go, specially the "&" one. Test
>> against:
>>
>> "<"
>>
>
> I'm not sure what you mean here.
>
> If you have already html entities you should not escape them. If you do not
> have html entities you should escape them.
> The Escaping and unescaping works well, I already tested them before I sent
> them.
>
>
>
>>
>> Right unescape "<", your code "<".
>>
>> --
>> Best regards,
>>  José
>>
>
> Ido
>
>
>>
>> ___
>> 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
>
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Re: TimSort

2011-05-25 Thread Mattias Gaertner
On Wed, 25 May 2011 09:02:46 +0200 (CEST)
mar...@stack.nl (Marco van de Voort) wrote:

> In our previous episode, Mattias Gaertner said:
> >  > A quick look at wikipedia will show that timsort has a disadvantage too. 
> > It
> >  > needs up to N records memory, not just Log(n) records like e.g. 
> > Quicksort.
> >  It *can* be implemented to need only log(n). But the current fpc 
> > implementation
> > of QuickSort seems to need O(n) memory on the stack.
> 
> Hmm. Then that should be fixed.

It must choose the smaller half for the tail call.

  
> >  TimSort needs up to N/2 pointer, which is better than a simple MergeSort.
> 
> For heavier sorting I usually use heapsort and quicksort routines that date
> back to my M2 days
> 
> Usually heapsort since it is quite fast for already sorted collections.

Yes, but Heapsort is not stable too.

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


RE : [fpc-pascal] fpWeb and html and uri escaping/unescaping elements

2011-05-25 Thread Ludo Brands
This is a very minimalistic implementation covering only partial ascii
character escaping. To cover ASCII only in unescapeHTML you should also add
' ' which corresponds with the space character ' '. Also the format
&#entity_number; is missing ('<' or '<' equals '<')
 
To support iso-8859-1 which is default in most browsers you'll need a lot
more. See f.e. http://www.w3schools.com/tags/ref_entities.asp
 
Ludo
 
-Message d'origine-
De : fpc-pascal-boun...@lists.freepascal.org
[mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de ik
Envoyé : mardi 24 mai 2011 10:09
À : FPC-Pascal users discussions
Objet : Re: [fpc-pascal] fpWeb and html and uri escaping/unescaping elements



On Tue, May 24, 2011 at 00:28, ik  wrote:





On Tue, May 24, 2011 at 00:23, Michael Van Canneyt 
wrote:




On Tue, 24 May 2011, ik wrote:



Hello,

Does fpWeb have any method/function that escape and un-escape html and URI
elements ?



Yes.

in fphttpclient:

Function EncodeURLElement(S : String) : String;
Function DecodeURLElement(Const S : String) : String;

We should maybe move them to URIParser or maybe even strutils.



I can not find any HTML encode and decode, I'll make one and open a bug with
the patches.
Where do you think it will be best to place it (I mean the unit) ?



I've created a patch with the Escape and unEscape functions, and place it
here: http://bugs.freepascal.org/view.php?id=19407
 

 


Michael.



Thanks,

Ido
 

___
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[4]: [fpc-pascal] fpWeb and html and uri escaping/unescaping elements

2011-05-25 Thread José Mejuto
Hello FPC-Pascal,

Wednesday, May 25, 2011, 8:33:57 AM, you wrote:

>> "<"
i> I'm not sure what you mean here.

That's an already escaped html. Let it be a mini htmlpage:

-<-

i> If you have already html entities you should not escape them. If you do not
i> have html entities you should escape them.
i> The Escaping and unescaping works well, I already tested them before I sent
i> them.

The right content of  tag is "-<-" when unescaped but the
code unescapehtml produce "-<-". Explanation step by step:

1) The code looks for all '&'
2) When found replace it by '&'
3)  content is now "-<-"
4) Now the code looks for '<'
5) When found replace it by '<'
6) Now title content is "-<-"

--
 Result := StringReplace(s,  '&',  '&', [rfReplaceAll]);
 Result := StringReplace(Result, '<',   '<', [rfReplaceAll]);
--

I hope my explanations are now understandable.

-- 
Best regards,
 José

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


Re[2]: [fpc-pascal] Re: TimSort

2011-05-25 Thread José Mejuto
Hello FPC-Pascal,

Wednesday, May 25, 2011, 9:02:46 AM, you wrote:

MvdV> For heavier sorting I usually use heapsort and quicksort routines that 
date
MvdV> back to my M2 days
MvdV> Usually heapsort since it is quite fast for already sorted collections.

Instead HeapSort you can use SmoothSort which is around 10-20% faster
in almost all conditions (sorted or not) and have the same memory and
best/worst case constraints.

-- 
Best regards,
 José

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


RE : RE : Re[2]: [fpc-pascal] fpWeb and html and uriescaping/unescapingelements

2011-05-25 Thread Ludo Brands
> So you suggest to place the & translation last.

That would be a solution for this problem. My previous comments on the
"minimalistic" approach of the implementation suggest a different approach:
scan the source string once and replace html entities as you find them (with
a look up table for example). This would scale much better when implementing
iso-8859-1 or '&#entity-number;' unescaping .
 
Ludo

-Message d'origine-
De : fpc-pascal-boun...@lists.freepascal.org
[mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de ik
Envoyé : mercredi 25 mai 2011 09:22
À : FPC-Pascal users discussions
Objet : Re: RE : Re[2]: [fpc-pascal] fpWeb and html and
uriescaping/unescapingelements


On Wed, May 25, 2011 at 10:09, Ludo Brands  wrote:


You should not unescape recursively.
Input to EscapeHTML: '<' Output: '<' : Correct
UnescapeHTML: input  '<' Output '<'   Wrong.
This is because you replace '&' with '&' resulting in '<' which is
translated to '< ' in the next line. 


So you suggest to place the & translation last.
 

 
Ludo
 
 

-Message d'origine-
De : fpc-pascal-boun...@lists.freepascal.org
[mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de ik
Envoyé : mercredi 25 mai 2011 08:34
À : FPC-Pascal users discussions
Objet : Re: Re[2]: [fpc-pascal] fpWeb and html and uri
escaping/unescapingelements





On Tue, May 24, 2011 at 12:21, José Mejuto  wrote:


Hello FPC-Pascal,

Tuesday, May 24, 2011, 10:09:03 AM, you wrote:

i> I've created a patch with the Escape and unEscape functions, and place it
i> here: http://bugs.freepascal.org/view.php?id=19407

Un/escapeHTML parsing must be in one go, specially the "&" one. Test
against:

"<"



I'm not sure what you mean here.

If you have already html entities you should not escape them. If you do not
have html entities you should escape them.
The Escaping and unescaping works well, I already tested them before I sent
them.

 


Right unescape "<", your code "<".

--
Best regards,
 José



Ido
 



___
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



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

Re: RE : RE : Re[2]: [fpc-pascal] fpWeb and html and uriescaping/unescapingelements

2011-05-25 Thread ik
On Wed, May 25, 2011 at 14:04, Ludo Brands  wrote:

>  > So you suggest to place the & translation last.
> That would be a solution for this problem. My previous comments on the
> "minimalistic" approach of the implementation suggest a different approach:
> scan the source string once and replace html entities as you find them (with
> a look up table for example). This would scale much better when implementing
> iso-8859-1 or '&#entity-number;' unescaping .
>

For every html entity you need a dictionary, and that's makes your program
with more fat.
converting number entity can be done, but you need to know what is the code
page you wish to convert from/to.


>
> Ludo
>

Ido


>   -Message d'origine-
> *De :* fpc-pascal-boun...@lists.freepascal.org [mailto:
> fpc-pascal-boun...@lists.freepascal.org] *De la part de* ik
> *Envoyé :* mercredi 25 mai 2011 09:22
>
> *À :* FPC-Pascal users discussions
> *Objet :* Re: RE : Re[2]: [fpc-pascal] fpWeb and html and
> uriescaping/unescapingelements
>
> On Wed, May 25, 2011 at 10:09, Ludo Brands  wrote:
>
>>  You should not unescape recursively.
>> Input to EscapeHTML: '<' Output: '<' : Correct
>> UnescapeHTML: input  '<' Output '<'   Wrong.
>> This is because you replace '&' with '&' resulting in '<' which is
>> translated to '< ' in the next line.
>>
>
> So you suggest to place the & translation last.
>
>
>>
>> Ludo
>>
>>
>>
>>  -Message d'origine-
>> *De :* fpc-pascal-boun...@lists.freepascal.org [mailto:
>> fpc-pascal-boun...@lists.freepascal.org] *De la part de* ik
>> *Envoyé :* mercredi 25 mai 2011 08:34
>> *À :* FPC-Pascal users discussions
>> *Objet :* Re: Re[2]: [fpc-pascal] fpWeb and html and uri
>> escaping/unescapingelements
>>
>>
>>
>>
>> On Tue, May 24, 2011 at 12:21, José Mejuto  wrote:
>>
>>> Hello FPC-Pascal,
>>>
>>> Tuesday, May 24, 2011, 10:09:03 AM, you wrote:
>>>
>>> i> I've created a patch with the Escape and unEscape functions, and place
>>> it
>>> i> here: http://bugs.freepascal.org/view.php?id=19407
>>>
>>> Un/escapeHTML parsing must be in one go, specially the "&" one. Test
>>> against:
>>>
>>> "<"
>>>
>>
>> I'm not sure what you mean here.
>>
>> If you have already html entities you should not escape them. If you do
>> not have html entities you should escape them.
>> The Escaping and unescaping works well, I already tested them before I
>> sent them.
>>
>>
>>
>>>
>>> Right unescape "<", your code "<".
>>>
>>> --
>>> Best regards,
>>>  José
>>>
>>
>> Ido
>>
>>
>>>
>>> ___
>>> 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
>>
>
>
> ___
> 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: RE : RE : RE : [fpc-pascal] support for using an activex

2011-05-25 Thread Roberto Padovani
2011/5/24 Ludo Brands :
> The following delphi articles should help creating an event sink:
>
> http://www.informit.com/articles/article.aspx?p=130494&seqNum=5  This is an
> interesting one since it is written for Delphi 3-4 which missed a lot of the
> automated COM handling. This is much closer to where fpc is now.
>
> http://www.blong.com/Conferences/IConUK2000/DelphiMoreAutomation/More%20Auto
> mation%20In%20Delphi.htm#HandcraftedEventSink
>
> A good intruduction to connectable objects:
> http://www.gtro.com/delphi/comevents_e.php
>

Thanks a lot!

I'm reading it all and writing some code.
But in all of those docs there the "InterfaceConnect" routine is
usedbut I can't find it anywhere.
Besides, is there something to convert the tlb to pascal? Or shall I
do it manually?

I might be wrong, but it seems to me that it should be possible to
write a general TSimpleEventSink class which does most of all the COM
work, and exposes a pascal-standard event management.
The TSimpleEventSink class might have an Events property which is a
dynamic array of TNotifyEvents; the client could resize it and link
its event handlers. At the same time the TSimpleEventSink reacts to
the server events by mapping the dispid's to the Events array index,
up to its current maximum dimension.

Well, I'm still quite confused besides the missing
InterfaceConnect method, is there any freepascal example available?
On the web I can only find delphi ones.

Thanks,

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


RE : RE : RE : RE : [fpc-pascal] support for using an activex

2011-05-25 Thread Ludo Brands
Interfaceconnect calls Advice on the objects IConnectionPoint. I can't share
Delphi code here but essentially what you do is:

Get IConnectionPointContainer (CPC) from IUnknown (ActiveXObject) :
  ActiveXObject.QueryInterface(IConnectionPointContainer, CPC);

Get IConnectionPoint (ppcp) for the IID of interest (RIID) from
IConnectionPointContainer :
  CPC.FindConnectionPoint(RIID, ppcp);

Call Advice on IConnectionPoint (ppcp) with the sink interface you created :
  CP.Advise(unkSink, dwCookie);

That's it!  Keep hold of dwCookie as it is used to disconnect later on:
CP.UnAdvise(dwCookie);

Ludo

-Message d'origine-
De : fpc-pascal-boun...@lists.freepascal.org
[mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Roberto
Padovani
Envoyé : mercredi 25 mai 2011 13:18
À : FPC-Pascal users discussions
Objet : Re: RE : RE : RE : [fpc-pascal] support for using an activex


2011/5/24 Ludo Brands :
> The following delphi articles should help creating an event sink:
>
> http://www.informit.com/articles/article.aspx?p=130494&seqNum=5  This 
> is an interesting one since it is written for Delphi 3-4 which missed 
> a lot of the automated COM handling. This is much closer to where fpc 
> is now.
>
> http://www.blong.com/Conferences/IConUK2000/DelphiMoreAutomation/More%
> 20Auto
> mation%20In%20Delphi.htm#HandcraftedEventSink
>
> A good intruduction to connectable objects: 
> http://www.gtro.com/delphi/comevents_e.php
>

Thanks a lot!

I'm reading it all and writing some code.
But in all of those docs there the "InterfaceConnect" routine is usedbut
I can't find it anywhere. Besides, is there something to convert the tlb to
pascal? Or shall I do it manually?

I might be wrong, but it seems to me that it should be possible to write a
general TSimpleEventSink class which does most of all the COM work, and
exposes a pascal-standard event management. The TSimpleEventSink class might
have an Events property which is a dynamic array of TNotifyEvents; the
client could resize it and link its event handlers. At the same time the
TSimpleEventSink reacts to the server events by mapping the dispid's to the
Events array index, up to its current maximum dimension.

Well, I'm still quite confused besides the missing InterfaceConnect
method, is there any freepascal example available? On the web I can only
find delphi ones.

Thanks,

  Roberto
___
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 : RE : RE : RE : [fpc-pascal] support for using an activex

2011-05-25 Thread Ludo Brands
Regarding the tlb to pascal "conversion", AFAIK there is no support in fpc.
Delphi is clearly better equiped to work with COM objects.

I have also been playing around with a generic eventsink class but the
problem is that events can have parameters (and a lot do). Your suggestion
of using TNotifyEvents could work for events without parameters. You could
leave the parameter stuff to the user of the eventsink, eventually helping
him by exposing the number and type of parameters, but that means that the
user has to have a reasonable good understanding of COM, including the data
types compatible with COM marshalling.

Simply mapping dispid's to array index isn't working for all real life
ActiveX objects. Take a look at fe. Comct332.ocx
  _CoolBarDisp = dispinterface
['{38911D91-E448-11D0-84A3-00DD01104159}']
procedure GhostMethod__CoolBar_28_0; dispid 1610743808;
procedure GhostMethod__CoolBar_32_1; dispid 1610743809;
...
procedure OLEDrag; dispid 1610809364;
procedure Refresh; dispid -550;
procedure AboutBox; dispid -552;
  end;

Delphi solves the problem not by creating a generic eventsink type but by
creating a pascal wrapper with the "import ActiveX control" tool. All
parameters are already converted to the correct types. Here the user doesn't
need to understand COM at all.

Here is an excerpt of the Delphi conversion of the aol winampxchat library
(only event related stuff):
Type
  TIWinAmpActiveXChatWinampMsgEvent = procedure(Sender: TObject; msgId:
Integer) of object;
  TIWinAmpActiveXChatWinampStatus = procedure(Sender: TObject; msgId:
Integer; comp: Integer) of object;

  TIWinAmpActiveXChat = class(TOleControl)
  private
FOnWinampMsgEvent: TIWinAmpActiveXChatWinampMsgEvent;
FOnWinampStatus: TIWinAmpActiveXChatWinampStatus;
...
  published
...
property OnWinampMsgEvent: TIWinAmpActiveXChatWinampMsgEvent read
FOnWinampMsgEvent write FOnWinampMsgEvent;
property OnWinampStatus: TIWinAmpActiveXChatWinampStatus read
FOnWinampStatus write FOnWinampStatus;
  end;

procedure TIWinAmpActiveXChat.InitControlData;
const
  CEventDispIDs: array [0..1] of DWORD = (
$0001, $0002);
  CControlData: TControlData2 = (
ClassID: '{E3852604-B619-11D6-94EC-00047521F020}';
EventIID: '{E3852603-B619-11D6-94EC-00047521F020}';
EventCount: 2;
EventDispIDs: @CEventDispIDs;
LicenseKey: nil (*HR:$80004002*);
Flags: $;
Version: 401);
begin
  ControlData := @CControlData;
  TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnWinampMsgEvent)
- Cardinal(Self);
end;

Note CEventDispIDs which holds the dispid values. When an event is invoked
the DISPID is looked up in CEventDispIDs. The index is used to calculate an
offset with FOnWinampMsgEvent. Index 0 points to FOnWinampMsgEvent, 1 to
FOnWinampStatus,...

Ludo

-Message d'origine-
De : fpc-pascal-boun...@lists.freepascal.org
[mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Roberto
Padovani
Envoyé : mercredi 25 mai 2011 13:18
À : FPC-Pascal users discussions
Objet : Re: RE : RE : RE : [fpc-pascal] support for using an activex


2011/5/24 Ludo Brands :
> The following delphi articles should help creating an event sink:
>
> http://www.informit.com/articles/article.aspx?p=130494&seqNum=5  This 
> is an interesting one since it is written for Delphi 3-4 which missed 
> a lot of the automated COM handling. This is much closer to where fpc 
> is now.
>
> http://www.blong.com/Conferences/IConUK2000/DelphiMoreAutomation/More%
> 20Auto
> mation%20In%20Delphi.htm#HandcraftedEventSink
>
> A good intruduction to connectable objects: 
> http://www.gtro.com/delphi/comevents_e.php
>

Thanks a lot!

I'm reading it all and writing some code.
But in all of those docs there the "InterfaceConnect" routine is usedbut
I can't find it anywhere. Besides, is there something to convert the tlb to
pascal? Or shall I do it manually?

I might be wrong, but it seems to me that it should be possible to write a
general TSimpleEventSink class which does most of all the COM work, and
exposes a pascal-standard event management. The TSimpleEventSink class might
have an Events property which is a dynamic array of TNotifyEvents; the
client could resize it and link its event handlers. At the same time the
TSimpleEventSink reacts to the server events by mapping the dispid's to the
Events array index, up to its current maximum dimension.

Well, I'm still quite confused besides the missing InterfaceConnect
method, is there any freepascal example available? On the web I can only
find delphi ones.

Thanks,

  Roberto
___
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: RE : RE : RE : RE : [fpc-pascal] support for using an activex

2011-05-25 Thread Roberto Padovani
2011/5/25 Ludo Brands :
> Regarding the tlb to pascal "conversion", AFAIK there is no support in fpc.
> Delphi is clearly better equiped to work with COM objects.
>
> I have also been playing around with a generic eventsink class but the
> problem is that events can have parameters (and a lot do). Your suggestion
> of using TNotifyEvents could work for events without parameters. You could
> leave the parameter stuff to the user of the eventsink, eventually helping
> him by exposing the number and type of parameters, but that means that the
> user has to have a reasonable good understanding of COM, including the data
> types compatible with COM marshalling.
>

Thanks for the explanation. In fact, that is the reason why I called
it TSimpleEventSink, meaning that it was good for simple situation.
In my case, for example, the activex controls a hardware stuff which
only request the user to take an action sometimes.
In the C++ source code for the class Device I have:

[
uuid(168F5642-5751-49F5-9AA4-B8A7A5F6A5B8),
helpstring("_IDeviceEvents Interface")
]
dispinterface _IDeviceEvents
{
properties:
methods:
[id(1), helpstring("method OnCommChanged")] HRESULT OnCommChanged();
[id(2), helpstring("method OnStatesChanged")] HRESULT OnStatesChanged();
[id(3), helpstring("method OnContact")] HRESULT OnContact();
[id(4), helpstring("method OnMeasUpdate")] HRESULT OnMeasUpdate();
};

where this four simple events only alert the user about a change
situation; then the user takes the suitable actions.
Do you think it could work for me?

Now I'm trying to write by hand a minimalist tlb, looking for the
definitions in the activex source code

Thanks a lot!!

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


[fpc-pascal] Re: fpc-pascal Digest, Vol 83, Issue 52

2011-05-25 Thread Luis Fernando Del Aguila Mejía

El 25/05/2011 01:35 a.m., fpc-pascal-requ...@lists.freepascal.org escribió:

Question out of curiosity:
Is there a reason why you allocate an array "by hand"?


Yes, getmem return NIL, when no more memory is available.
SetLength, no return NIL, It is work with Exceptions.

My intention was whether it could be done without using dynamic arrays 
and Exceptions.

But two more questions:

1) At this program:

Var A:Ansistring;
Begin
 A:='Hi';
End.

The literal String is at Data area.
Is the A variable points to Data Segment. ?

2) My computer is little endian. (intel)
When I do this:

a: = $ ABFE5689 / / Little endian $ 8956FEAB, it is ok
Writeln (Hi (a)) / / Show $ ABFE, it is ok
Writeln (Lo (a)) / / Show $ 5689, it is ok

In a Big Endian computer. What shows Hi and Lo?

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

RE : RE : RE : RE : RE : [fpc-pascal] support for using an activex

2011-05-25 Thread Ludo Brands
The code in article
http://www.informit.com/articles/article.aspx?p=130494&seqNum=5 goes a long
way in doing what you want to do. Unit Eventsink does pretty much of the
legwork. You should remove the procedure register since that is the Delphi
way to get a component on the toolbar. Remove also the {$IFDEF VER100} and
{$ENDIF}. The unit actually includes the code for InterfaceConnect!! 
In the MainForm unit you'll have to do in a TForm1.Create 

EventSink1:=TEventSink.Create(Self); 
EventSink1.OnInvoke:=@EventSink1Invoke;

because the example assumes you have dropped the component on the form and
entered EventSink1Invoke in the properties box.

As for the tlb conversion, in your case 

IEventIntfEvents = dispinterface
  ['{168F5642-5751-49F5-9AA4-B8A7A5F6A5B8}']
 end;

should do (that is for the events part). AFAIK the procedure and dispid
definitions are only needed for the server. You are only concerned with
dispid's. No need to create prototypes for OnCommChanged() etc.
EventSink1Invoke would be a simple 
case DispID of
  1: // do CommChanged
  2: // do StatesChanged
...
end;


Ludo

-Message d'origine-
De : fpc-pascal-boun...@lists.freepascal.org
[mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Roberto
Padovani Envoyé : mercredi 25 mai 2011 16:01 À : FPC-Pascal users
discussions Objet : Re: RE : RE : RE : RE : [fpc-pascal] support for using
an activex


2011/5/25 Ludo Brands :
> Regarding the tlb to pascal "conversion", AFAIK there is no support in
> fpc. Delphi is clearly better equiped to work with COM objects.
>
> I have also been playing around with a generic eventsink class but the
> problem is that events can have parameters (and a lot do). Your 
> suggestion of using TNotifyEvents could work for events without 
> parameters. You could leave the parameter stuff to the user of the 
> eventsink, eventually helping him by exposing the number and type of 
> parameters, but that means that the user has to have a reasonable good 
> understanding of COM, including the data types compatible with COM 
> marshalling.
>

Thanks for the explanation. In fact, that is the reason why I called it
TSimpleEventSink, meaning that it was good for simple situation. In my case,
for example, the activex controls a hardware stuff which only request the
user to take an action sometimes. In the C++ source code for the class
Device I have:

[
uuid(168F5642-5751-49F5-9AA4-B8A7A5F6A5B8),
helpstring("_IDeviceEvents Interface")
]
dispinterface _IDeviceEvents
{
properties:
methods:
[id(1), helpstring("method OnCommChanged")] HRESULT OnCommChanged();
[id(2), helpstring("method OnStatesChanged")] HRESULT
OnStatesChanged();
[id(3), helpstring("method OnContact")] HRESULT OnContact();
[id(4), helpstring("method OnMeasUpdate")] HRESULT OnMeasUpdate();
};

where this four simple events only alert the user about a change situation;
then the user takes the suitable actions. Do you think it could work for me?

Now I'm trying to write by hand a minimalist tlb, looking for the
definitions in the activex source code

Thanks a lot!!

  Roberto
___
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


[fpc-pascal] Re: Suffix Trie implementation, please review

2011-05-25 Thread leledumbo
> I guess you forgot the attachment?

My bad... well it was midnight here ;)
There you go: 
http://free-pascal-general.1045716.n5.nabble.com/file/n4425751/suffixtrie.zip
suffixtrie.zip 

> BTW, do you know the hashtrie component?

Only ever heard of, never know the details. Thanks, this could be a lesson
to learn.
The improvement over hashtable seems to be in the lookup, so it still uses
hashing to generate initial index which in simple case, like in the page you
point, operates on the whole string (i.e. O(n)). The lookup would take
additional processing. Anyway, it's not really comparable to suffix tries.
Instead, it's comparable to (prefix) tries. For lookup and update, tries
should perform better. But the disadvantage is that no item may get out once
it gets in (at least not so easy).

--
View this message in context: 
http://free-pascal-general.1045716.n5.nabble.com/Suffix-Trie-implementation-please-review-tp4422708p4425751.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: RE : RE : RE : RE : RE : [fpc-pascal] support for using an activex

2011-05-25 Thread Roberto Padovani
2011/5/25 Ludo Brands :
> The code in article
> http://www.informit.com/articles/article.aspx?p=130494&seqNum=5 goes a long
> way in doing what you want to do. Unit Eventsink does pretty much of the
> legwork. You should remove the procedure register since that is the Delphi
> way to get a component on the toolbar. Remove also the {$IFDEF VER100} and
> {$ENDIF}. The unit actually includes the code for InterfaceConnect!!

found that! great!


> As for the tlb conversion, in your case
>
> IEventIntfEvents = dispinterface
>  ['{168F5642-5751-49F5-9AA4-B8A7A5F6A5B8}']
>  end;
>
> should do (that is for the events part). AFAIK the procedure and dispid
> definitions are only needed for the server. You are only concerned with
> dispid's. No need to create prototypes for OnCommChanged() etc.
> EventSink1Invoke would be a simple
> case DispID of
>  1: // do CommChanged
>  2: // do StatesChanged
> ...
> end;
>
>

Now I am "wasting" time making the tlb pascal definitions.
For the event part I'm fine with the dispid's
Until now I was calling the activex method with variants, in and out,
but now I discovered that this IDevice class has a property like:
property Sensors: ISensors;
which inside is a list of items like   Sensor: ISensor.

Can I read the sensores with a variant? Then, to see the fields inside
each sensor, I think a I need a class to do that...
The activex has all of these classes with the suitable dispinterfaces
and uuids and so on. But if I define
 var device, transducers, transducer : variant;
and create
 device := CreateOleObject('Device');
then, can i simply write the following ?
 transducers := device.Transducers;
 transducer := transducers[index];


It's a long path until I get this stuff working...

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


Re: [fpc-pascal] getmem

2011-05-25 Thread Luis Fernando Del Aguila Mejía

El 25/05/2011 01:35 a.m., fpc-pascal-requ...@lists.freepascal.org escribió:

Question out of curiosity:
Is there a reason why you allocate an array "by hand"?


Yes, getmem return NIL, when no more memory is available.
SetLength, no return NIL, It is work with Exceptions.

My intention was whether it could be done without using dynamic arrays 
and Exceptions.

But two more questions:

1) At this program:

Var A:Ansistring;
Begin
 A:='Hi';
End.

The literal String is at Data area.
Is the A variable points to Data Segment. ?

2) My computer is little endian. (intel)
When I do this:

a: = $ ABFE5689 / / Little endian $ 8956FEAB, it is ok
Writeln (Hi (a)) / / Show $ ABFE, it is ok
Writeln (Lo (a)) / / Show $ 5689, it is ok

In a Big Endian computer. What shows Hi and Lo?

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

RE : RE : RE : RE : RE : RE : [fpc-pascal] support for using an activex

2011-05-25 Thread Ludo Brands
Using variants you can transparently "walk" along the exposed objects. The
variant contains the Idispatch of the object and gets the exposed methods at
runtime. Properties are implemented as get and put methods or just get
methods for read only properties.  

If you have something like
Itransducers = interface
  ..
  property transducer[Index:integer]:Itransducer;
end;

Then you would do 
transducer := transducers.transducer[index];

transducer := transducers[index];  works only if transducer is the default
property for Itransducers. I'm not sure if fpc supports this.

Ludo


-Message d'origine-
De : fpc-pascal-boun...@lists.freepascal.org
[mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Roberto
Padovani
Envoyé : mercredi 25 mai 2011 19:34
À : FPC-Pascal users discussions
Objet : Re: RE : RE : RE : RE : RE : [fpc-pascal] support for using an
activex


2011/5/25 Ludo Brands :
> The code in article 
> http://www.informit.com/articles/article.aspx?p=130494&seqNum=5 goes a 
> long way in doing what you want to do. Unit Eventsink does pretty much 
> of the legwork. You should remove the procedure register since that is 
> the Delphi way to get a component on the toolbar. Remove also the 
> {$IFDEF VER100} and {$ENDIF}. The unit actually includes the code for 
> InterfaceConnect!!

found that! great!


> As for the tlb conversion, in your case
>
> IEventIntfEvents = dispinterface
>  ['{168F5642-5751-49F5-9AA4-B8A7A5F6A5B8}']
>  end;
>
> should do (that is for the events part). AFAIK the procedure and 
> dispid definitions are only needed for the server. You are only 
> concerned with dispid's. No need to create prototypes for 
> OnCommChanged() etc. EventSink1Invoke would be a simple case DispID of
>  1: // do CommChanged
>  2: // do StatesChanged
> ...
> end;
>
>

Now I am "wasting" time making the tlb pascal definitions.
For the event part I'm fine with the dispid's
Until now I was calling the activex method with variants, in and out, but
now I discovered that this IDevice class has a property like: property
Sensors: ISensors;
which inside is a list of items like   Sensor: ISensor.

Can I read the sensores with a variant? Then, to see the fields inside each
sensor, I think a I need a class to do that... The activex has all of these
classes with the suitable dispinterfaces and uuids and so on. But if I
define
 var device, transducers, transducer : variant;
and create
 device := CreateOleObject('Device');
then, can i simply write the following ?
 transducers := device.Transducers;
 transducer := transducers[index];


It's a long path until I get this stuff working...

R#
___
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: RE : RE : RE : RE : RE : RE : [fpc-pascal] support for using an activex

2011-05-25 Thread Roberto Padovani
Always thanks!

Given your evident experience on this matter, I kindly ask your advice
on what is best to do.

opt 1) create a fpc class with some pascal style methods, which in
their implementation use variants and call the IDevice class with
late-binding . meaning that there is no compiler check and if my
collegue changes the dll, then I have to change these implementations

opt 2) in a reference of those you sent me, there is some example code
from which I take the lines below. In the tlb conversion unit, the
interface and dispinterface of the class are some replicated. Then
also the eventinterface is defined.
The main interface class is defined without and with dispids. With the
dispids, only the properties are defined and not the methods.

  IFileZapper = interface(IDispatch)
['{2E2FC5E0-5C0E-4C4F-8CC1-D9F6C5A92BA6}']
function Get_Directory: WideString; safecall;
procedure Set_Directory(const Value: WideString); safecall;
function Get_FileMask: WideString; safecall;
procedure Set_FileMask(const Value: WideString); safecall;
procedure BringToFront; safecall;
property Directory: WideString read Get_Directory write Set_Directory;
property FileMask: WideString read Get_FileMask write Set_FileMask;
  end;

  IFileZapperDisp = dispinterface
['{2E2FC5E0-5C0E-4C4F-8CC1-D9F6C5A92BA6}']
property Directory: WideString dispid 1;
property FileMask: WideString dispid 3;
procedure BringToFront; dispid 10;
  end;

  IFileZapperEvents = dispinterface
['{7B6F8ADD-7980-4A35-838B-E1600C43D29E}']
procedure OnSelectionChanged; dispid 1;
procedure OnDirectoryChanged(const DirName: WideString); dispid 2;
  end;

Is this somewhat the same thing as the wrapper of option 1? If I write
all of this conversion (and, by the way, how to convert C++ data types
to pascal?? widestring ?), then how can I use it?

In the end, maybe the wiki page about COM interfaces should be update
to something more than 'Word.Application.NewFile'.
I can't share the activex I have, otherwise it would be a good example
to see something useful to start with.

Roberto

2011/5/25 Ludo Brands :
> Using variants you can transparently "walk" along the exposed objects. The
> variant contains the Idispatch of the object and gets the exposed methods at
> runtime. Properties are implemented as get and put methods or just get
> methods for read only properties.
>
> If you have something like
> Itransducers = interface
>  ..
>  property transducer[Index:integer]:Itransducer;
> end;
>
> Then you would do
> transducer := transducers.transducer[index];
>
> transducer := transducers[index];  works only if transducer is the default
> property for Itransducers. I'm not sure if fpc supports this.
>
> Ludo
>
>
> -Message d'origine-
> De : fpc-pascal-boun...@lists.freepascal.org
> [mailto:fpc-pascal-boun...@lists.freepascal.org] De la part de Roberto
> Padovani
> Envoyé : mercredi 25 mai 2011 19:34
> À : FPC-Pascal users discussions
> Objet : Re: RE : RE : RE : RE : RE : [fpc-pascal] support for using an
> activex
>
>
> 2011/5/25 Ludo Brands :
>> The code in article
>> http://www.informit.com/articles/article.aspx?p=130494&seqNum=5 goes a
>> long way in doing what you want to do. Unit Eventsink does pretty much
>> of the legwork. You should remove the procedure register since that is
>> the Delphi way to get a component on the toolbar. Remove also the
>> {$IFDEF VER100} and {$ENDIF}. The unit actually includes the code for
>> InterfaceConnect!!
>
> found that! great!
>
>
>> As for the tlb conversion, in your case
>>
>> IEventIntfEvents = dispinterface
>>  ['{168F5642-5751-49F5-9AA4-B8A7A5F6A5B8}']
>>  end;
>>
>> should do (that is for the events part). AFAIK the procedure and
>> dispid definitions are only needed for the server. You are only
>> concerned with dispid's. No need to create prototypes for
>> OnCommChanged() etc. EventSink1Invoke would be a simple case DispID of
>>  1: // do CommChanged
>>  2: // do StatesChanged
>> ...
>> end;
>>
>>
>
> Now I am "wasting" time making the tlb pascal definitions.
> For the event part I'm fine with the dispid's
> Until now I was calling the activex method with variants, in and out, but
> now I discovered that this IDevice class has a property like: property
> Sensors: ISensors;
> which inside is a list of items like   Sensor: ISensor.
>
> Can I read the sensores with a variant? Then, to see the fields inside each
> sensor, I think a I need a class to do that... The activex has all of these
> classes with the suitable dispinterfaces and uuids and so on. But if I
> define
>     var device, transducers, transducer : variant;
> and create
>     device := CreateOleObject('Device');
> then, can i simply write the following ?
>     transducers := device.Transducers;
>     transducer := transducers[index];
>
>
> It's a long path until I get this stuff working...
>
> R#
> ___
> fpc-pascal maillist  -  fpc-pascal@lists.freepasc