Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 241067 (2503)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Bin zu dumm ?
David
| 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...
Frank Abbing
| 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
Thorsten
| 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
Frank Abbing
| 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
Bernhard Künzel
| 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
David
| 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

| Zurück zur Übersicht