Autor | Thema: Bin zu dumm ? | | Datum:21.06.02 18:36 
(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...
|
| | Datum:21.06.02 20:09 
| |
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
|
| | Datum:21.06.02 20:49 
(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
|
| | Datum:21.06.02 23:59 
| |
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
|
| | Datum:22.06.02 13:23 
(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
|
| | Datum: 22.06.02 14:54 
(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
|
|
|