Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 241067 (2503)
  Suchen
 Zurück zur Übersicht
 AutorThema: Bin zu dumm ?
David
Datum:21.06.02 18:36 Antwortenals Email verschicken (David@Brennan.de) 


Habe ein mächtiges Problem am folgenden Listing:

DEF GetTxtLen(4) ! "GDI32","GetTextExtentPoint32A"
window 10,10-500,500

declare Bereich1#,Text$

Text$="DUMMYTEXT"

Struct Dummy = x&,y&
Dim Bereich1#,Dummy

GetTxtLen(%Hdc,Addr(Text$),4,Addr(Bereich1#))

print "Textlen X :"+Bereich1#.x&
print "Textlen Y :"+Bereich1#.y&

waitkey

Dispose Bereich1#

Returnwert der Funktion ist 1.
Nach Abfrage der Parameter und nach Dispose bekomme ich ständig die Fehlermeldung:

Exception EAccessViolation ...

könnte mir jemand bitte helfen bei meinem Denkfehler ??

Vielen Dank schon einmal im vorraus...

David...


Frank Abbing
Datum:21.06.02 20:09 Antwortenals Email verschicken  


Hallo,

hier steckt der Fehler:

declare Bereich1#,Text$
Text$="DUMMYTEXT"

Wenn du den Bereich deklarierst, ist der String text$ ja noch leer, ist also 0 Bytes groß. Außerdem verlangt DECLARE eine Größenangabe, keinen String.
Mach' es so, dann geht's:

Text$="DUMMYTEXT"
Declare Bereich#,(Len(Text$)+1)

---

Addr(Bereich1#) ist auch verkehrt. So muß die Zeile dann richtig lauten:

GetTxtLen(%Hdc,Addr(Text$),4,Bereich1#)

Bereich# ist schon ein Zeiger auf einen Speicherbereich, sodaß Addr(...) falsche Werte an die API übergibt...

Gruß, Frank


Thorsten
Datum:21.06.02 20:49 Antwortenals Email verschicken (mrk@mrk-soft.de) 


Hmmmm, Sorry Frank,

aber das ist Hunbug. DECLARE Resaviert nur Speicher für
die Variable, oder anders, macht Sie für Profan kenntlich.

Ein Bereich wird mit DIM Minensioniert, da wird dann auch
die grösse vergeben.

DECLARE bereich#, text$
text$ = "teststring"

DIM bereich#,10 oder
DIM bereich#,len(text$)

>GetTxtLen(%Hdc,Addr(Text$),4,Addr(Bereich1#))

bereich1# ist hier schon ein Zeiger,
der Parameter 3 gibt die länge von 4 an,
so ist es richtig:

GetTxtLen(%Hdc,Addr(Text$),len(text$),Bereich1#)

die API verbigt ausserdem noch den Zeiger, so das dieser
für Profan am Ende wieder berichtigt werden muss.

DECLARE bereich#, text$, adr&
text$ = "teststring"

DIM bereich#,len(text$)
adr& = bereich#

'api call ...... print usw.

waitkey

bereich# = adr&
Dispose Bereich#

-----------------
Thorsten
www.mrk-soft.de



Frank Abbing
Datum:21.06.02 23:59 Antwortenals Email verschicken  


Hallo,

sorry, hab' jetzt Declare mit Dim verwechselt, sollte mir doch mehr Zeit lassen...

"die API verbigt ausserdem noch den Zeiger, so das dieser
für Profan am Ende wieder berichtigt werden muss."

Glaub' ich nicht. Der Parameter übergibt einen Pointer auf eine zu füllende Size-Struktur. Bereich1# sollten also groß genug dimensioniert sein, sonst kann eine derartige Programmierung ins Auge gehen. Der Zeiger wird aber nicht verbogen, der Bereich wird nur mit Werten gefüllt...

Gruß, Frank


Bernhard Künzel
Datum:22.06.02 13:23 Antwortenals Email verschicken (b.kuenzel@chello.at) 


Hallo David,
versuche es mal so
'//
Declare Size#
Dim Size#,8

Proc GetTextSize
Parameters Text$
External("GDI32","GetTextExtentPoint32A",%HDC,ADDR(Text$),Len(Text$),Size#)
EndProc

Cls
GetTextSize "Irgend ein ausgewählter Text"
Print Format$("'Länge : '#####",Long(Size#,0))
Print Format$("'Höhe : '#####",Long(Size#,4))
WaitInput
Dispose Size#

Gruß
Bernhard



David
Datum: 22.06.02 14:54 Antwortenals Email verschicken (David@Brennan.de) 


Super,

vielen Dank für eure Antworten :-))

Ich hoffe das ich euch nicht zu sehr auf den Keks gehe...

Nochmals Danke...

David


 Zurück zur Übersicht