xsharp.eu • OleAutoObject - Page 2
Page 2 of 3

Re: OleAutoObject

Posted: Fri Apr 05, 2024 8:42 am
by g.bunzel@domonet.de
Franz,

wenn für den Laufbalken oDlg:SetMarquee(TRUE, 1) eingeschalten wird, macht die Aktualisierung des Balkens durch

DIBSetProgressControl( oDlg:oDCProgressBar:Handle() )

doch eigentlich gar keinen Sinn.
Aus der Funktionsbeschreibung von DIBSetProgressControl():
//d With this function you can set a Progress Control, wich Range is 1..100, then start to read a file with
//d any of DIBCreatexxx() function. For each step, the control will receive a notification to show the current reading.

Wozu diese Funktion aufrufen?

Gerhard

Re: OleAutoObject

Posted: Fri Apr 05, 2024 8:53 am
by Chris
Hi Franz,

1. OK, but where is the function defined and how? If you right click on "DIBSetProgressControl" in the VO editor, where does it get you to?

2. In this case you need an intermediate GC handle to pass and retrieve that object to the windows callback. Here's how to do it:

Code: Select all

USING System.Runtime.InteropServices // top of prg
....
DELEGATE OGS_EnumAddItemToArray_delegate(ptrWnd AS PTR , lParam AS INT) AS WORD 
STATIC FUNCTION OGS_EnumAddItemToArray(ptrWnd AS PTR , lParam AS INT) AS WORD CALLBACK
	LOCAL aWindows AS ARRAY
	LOCAL oArrayHandle AS GCHandle
	oArrayHandle := GCHandle.FromIntPtr(lParam)
	aWindows := (ARRAY) oArrayHandle:Target

	IF aWindows[1] <= aWindows[2]				// number of elements <= max elements?
		aWindows[++aWindows[3]] := ptrWnd		// save handle
		aWindows[1] := ++aWindows[1]			// raise number of elements
	ELSE									// array zu small?
		aWindows[1] := -1					// return error
		RETURN 0
	ENDIF
		
	RETURN 1

FUNCTION OGS_EnumWindows() AS ARRAY PASCAL
	LOCAL aWindows AS ARRAY
	LOCAL loFaktor	AS DWORD
	
	aWindows := ArrayCreate(1024)
	aWindows[1] := 0				// Number of elements
	loFaktor := 1
	
	DO WHILE aWindows[1] = 0
		
		// max number of elements
		aWindows[2] := 1024*loFaktor
		// starting element-1
		aWindows[3] := 3

//		#warning Callback function modified to use a DELEGATE by xPorter. Please review.
//		EnumWindows(@OGS_EnumAddItemToArray(),LONGINT(_CAST,aWindows))
		STATIC LOCAL oOGS_EnumAddItemToArrayDelegate := OGS_EnumAddItemToArray AS OGS_EnumAddItemToArray_Delegate
		LOCAL oArrayHandle AS GCHandle
		oArrayHandle := GCHandle.Alloc(aWindows)
		EnumWindows(Marshal.GetFunctionPointerForDelegate(oOGS_EnumAddItemToArrayDelegate) , GCHandle.ToIntPtr(oArrayHandle))
		oArrayHandle:Free()

		IF aWindows[1] = -1
			
			aWindows := ArrayCreate(1024*(++loFaktor))	// too less elements
			aWindows[1] := 0
			aWindows[2] := 1024*loFaktor
			aWindows[3] := 3

		ELSE
			
			EXIT
		
		ENDIF
		
	ENDDO

	loFaktor := aWindows[1]
	aWindows := ADel(aWindows,1)                 		// delete element 1,2,3
	aWindows := ADel(aWindows,1)
	aWindows := ADel(aWindows,1)
	aWindows := ASize(aWindows,loFaktor)			// running windows

	RETURN aWindows
3. Then it should work. Are you sure that the error message points to that line of code? Can you zip and send me the project to have a look?

Re: OleAutoObject

Posted: Wed Apr 10, 2024 6:24 am
by lagraf
Hi Chris,
1) I commented DIBSetProgressControl like Gerhard said -> Ok
2) I corrected code as you wrote -> maybe Ok not tested

But I have problems testing the app:
When starting the app I read a binary license file (you know it from INTERN.PRG) with memoread. What I get is different between VO and X#:
VO: œœ¦R«œ ª˜¯i‘’“z…”q íÜÞçÂÝÕÊ‘Ä×êØÖàÎçÜìØ„³¢¯³´¿§¼Á²’Ø“ñÕãèÙéêêùÝëðáñòò²¾Ô×ÄÒÚ
X#: ££ªR½£á¬ÿ»iüæÆôzàöqáf_¦t-¦+-æ-+O++a+t_8+ä¦ó»¦¦+º+-¦Æ+ô±+pF+TOO·¦d=ß±==¦+++--+

Why this is different?

3) Here are the classes Mailing and Etikette in short and the error XS7036, oOwner in Constructor is a DialogWindow

Code: Select all

CLASS Mailing
METHOD Close() 
ASSIGN FilterExpression(cString AS STRING) AS STRING PASCAL 
CONSTRUCTOR(oOwner AS window, cName AS STRING) 
ACCESS IsValid AS LOGIC PASCAL 
METHOD PrintPreview() 
ASSIGN SeekExpression(cString AS STRING) AS STRING PASCAL 
METHOD SetIndex(cString1 AS STRING, cString2 AS STRING) 
METHOD SetSortOrder(cOrder AS STRING) 
METHOD SetVariableValue(cVar AS STRING, cStr AS STRING) 
ASSIGN WhileExpression(cString) 
END CLASS

CLASS Etikette INHERIT Mailing	// Line 570
METHOD PrintPreview() 
END CLASS

error XS7036: There is no argument given that corresponds to the required formal parameter 'oOwner' of 'Mailing.Mailing(VO.Window, string)'	570,1	dlgReports.prg	Etikette:Etikette
Regards, Franz

Re: OleAutoObject

Posted: Wed Apr 10, 2024 7:03 am
by lagraf
When I read the file with FRead or FReadLine instead of MemoRead it is ok!

Re: OleAutoObject

Posted: Wed Apr 10, 2024 7:16 am
by wriedmann
Hi Franz,
using Memoread for binary files in .NET is a bad idea.
In .NET strings are Unicode and not more ANSI/ASCII.
Wolfgang

Re: OleAutoObject

Posted: Wed Apr 10, 2024 9:06 am
by Chris
Hi Franz,

2. As Wolfgang said, that's because strings in .Net (and X#) are unicode, in contrast to the 8-bit strings of VO and due to the ansi<->OEM conversions. I am a bit surprised that with FReadLine() it does work as expected, but in any case that's good!

3. OK, so the error is reported for the Etikette class itself, not for the object instantiation. You just need to define a constructor that calls the parent one like this:

Code: Select all

CLASS Etikette INHERIT Mailing
CONSTRUCTOR(oOwner AS window, cName AS STRING) 
SUPER(oOwner, cName)
There's an option in VOXporter to automatically add such missing constructors, but it's better if you add them manually (if they are not too many), so you can also use better parameter names (VOXporter uses generic ones) as in above.

Re: OleAutoObject

Posted: Wed Apr 10, 2024 9:51 am
by lagraf
Hi Chris,
3) ok, Class Etikette runs now!
VO automatically uses Init of super class when Init is missing, why X# doesn't do this with Constructor?
I already tried something like SUPER: ..., but now I know that this is VO style and does not run <g>!

Thank you very much for all your help!
Franz

Re: OleAutoObject

Posted: Wed Apr 10, 2024 10:09 am
by Chris
Hi Franz,

The difference is that VO uses CLIPPER calling convention constructors only, while in your X# code the constructor is strongly typed. If it was not typed, then you could had used the vo17 (generate missing clipper constructors) compiler option (in the app properties, compiler page) so that the compiler would had created one automatically.

Re: OleAutoObject

Posted: Thu Apr 11, 2024 8:37 am
by lagraf
Hi Chris,
as I only need a small part of the XML Parser, I wrote a small function to extract the needed part of the XML string.
So I do not need the XML Parser and OleAutoObject in this app.
Franz

Re: OleAutoObject

Posted: Thu Apr 11, 2024 9:15 am
by Chris
Hi Franz,

OK, sounds good! Btw, in case you are not aware, .Net has a very sophisticated and powerful set of classes for handling Xml. You can use them by adding a reference to System.Xml and using the classes System.Xml.XmlDocument, System.Xml.XmlNode etc.