Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GEOS-InfoBase-Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Montag, 20. Juni 2016, 22:35

Grafik-Objekt-Größe

Mit MSG_GO_GET_SIZE sollen Höhe und Breite eines grafischen Objekts bestimmbar sein. Die Message liefert aber für beides nur Null zurück. Ist das ein bereits bekannter Fehler im SDK?

Wilfried

2

Dienstag, 21. Juni 2016, 08:48

Ist das ein bereits bekannter Fehler im SDK?

Keine Ahnung ;-)
Zwei Ideen
1. Ist das Objekt schon auf dem Schirme (zumindest gewesen)? Wenn nein könnte die Größe noch null sein, weil es noch nicht fertig initialisiert ist.
2. Lass die Die VisBounds geben und rechne selber.

Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

3

Dienstag, 21. Juni 2016, 16:44

MSG_GO_GET_SIZE


Hmmm... ich habe im Büro nur die N9110-Win-SDK-Techdocs zur Hand. Und da fehlt diese Message komplett! Welches SDK nutzt Du denn?
(Ich frage u.a. deshalb, weil "GO" auch ein "Generic Object" in der UI sein könnte, also ein GenTrigger, VisText, ....)
d[ 0_O ]b

4

Dienstag, 21. Juni 2016, 20:18

Es geht um die dynamisch erzeugten Grafikobjekte unter z.B. GeoDraw.
Die Message MSG_GO_GET_SIZE stammt aus GrObj.goh. Dort gibt es auch eine Message an den GrBody, die die Grenzen (bounds) des aktuell selektierten Objekts angibt. Sie berücksichtigt allerdings die momentan eingestellte Liniendicke. Ich möchte aber die Maße für die Liniendicke 0 haben. Diese Maße werden auch von den "Anfassern", also unabhängig von der Liniendicke, verwendet. Leider ist ein linearer (oder sonstiger rechnerischer) Zusammenhang zwischen den Bounds bei Liniendicke 0 und Liniendicke x nicht erkennbar. MSG_GO_GET_SIZE wird wohl gerade aus diesem Grund angeboten. Nur funktioniert sie eben nicht:-(.

5

Mittwoch, 22. Juni 2016, 12:16

Okay, wenn sie in GrObj.goh definiert wird, sollte GO wirklich für "graphic object" (oder so) stehen. ;)
Komisch nur, dass ich diese Message in den TechDocs nicht finde... Wurde sie nur vergessen? Oder wurde sie absichtlich weggelassen, da sie nicht richtig funktioniert?!
Ich werde mal meine Beispielquelltexte durchsuchen, ob sie irgendwo benutzt wird. Das kann aber mehrere Tage dauern.
d[ 0_O ]b

6

Mittwoch, 22. Juni 2016, 15:32

Hast du die Message mal für "nicht dynamisch erzeugte" Objekte ausprobiert? Dann sollte man sehen ob sie prinzipiell nicht geht oder ob dein Objekt nur noch nicht vollständig initialisiert ist.

Ich hatte auch mal beim Printing das Problem, dass eine Struktur nur dann korrekt gefüllt wurde, wenn ich sie leer (alles Nullen) übergeben habe.

Andere Idee: Schreib die Struktur mit FF voll und schau, ob sie überhaupt geändert wird.

Gruß
Rainer

Und noch ein Nachtrag:
@message void MSG_GO_GET_SIZE ( /* XXX */
GOGetSizeParams _far *retValue = bpaxdxcx);


Schreib doch mal den Pointer (zusätzlich) in die Register, bevor du die Message aufrufst. Und dann würde ich mir die Register ansehen nachdem die Message gerufen wurde. Vielleicht sagt es dir ja etwas.

P.S. Du hast doch sicher @call verwendet, oder ? 8)
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

7

Mittwoch, 22. Juni 2016, 22:45

Hallo Jörg,

Komisch nur, dass ich diese Message in den TechDocs nicht finde...

in meinen Docs steht die Beschreibung für MSG_GO_GET_SIZE in DOC\ASCII\OBJECTS\OGROBJ.TXT ab Zeile 2683.

Wilfried

8

Mittwoch, 22. Juni 2016, 23:01

Hallo Rainer,
Hast du die Message mal für "nicht dynamisch erzeugte" Objekte ausprobiert? Dann sollte man sehen ob sie prinzipiell nicht geht oder ob dein Objekt nur noch nicht vollständig initialisiert ist.

mir geht es nur um Objekte wie Linie, Rechteck, Kreis usw., die du mit den Grafik-Tools selbst erzeugst. Z.B. Rechteck aufziehen, fertig. Das noch selektierte Rechteck (Anfasser sind noch da) kann ich jetzt direkt ansprechen. Mit MSG_GO_SET_SIZE kann ich die Größe einstellen, mit MSG_GO_SET_POSITION den Anfangspunkt beim Aufziehen. Das Objekt ist also vollständig initialisiert.
Andere Idee: Schreib die Struktur mit FF voll und schau, ob sie überhaupt geändert wird.
Hab ich gemacht: Es kommen nur Nullen zurück.
Schreib doch mal den Pointer (zusätzlich) in die Register, bevor du die Message aufrufst.

Ich weiß nicht genau, was du meinst.
Folgendermaßen rufe ich die Message auf:

GOGetSizeParams size;
@call objekt::MSG_GO_GET_SIZE(&size);

objekt enthält den Optr des selektierten Objekts.
P.S. Du hast doch sicher @call verwendet, oder ?

Sehr lustig :)

Wilfried

9

Donnerstag, 23. Juni 2016, 10:41

_far


Hmmm... mußte man wegen "_far" nicht irgendwas anders machen: "...far pointers to movable memory that must be locked..." oder so?! Oder mußte man dann "Pascal" nutzen? ... Mein Gedächtnis ist auch nicht mehr, was es nie war... :(

Zitat von »Wilfried«

OBJECTS


Das ganze Kapitel fehlt bei mir leider im Büro (vermutlich, weil es beim N9110-NT-SDK fehlt)... :(
d[ 0_O ]b

10

Donnerstag, 23. Juni 2016, 14:52

@Jörg: _far sagt aus, dass es ein 32 Bit Pointer ist (im Gegensatz zum Near-Pointer der nur das 16 offset in den Speicherblock enthält). Wilfried übergibt also korrekter Weise einen far pointer.

@Wilfried
bpaxdxcx sagt, das der Pointer in diesen Registern übergeben wird. Der C-Stub lädt dann die C-Parameter in in die Register. Wenn er dabei Mist (oder es unvollständig macht) baut kommt ein falscher Pointer im Messagehandler an. Sollte bei dir aber nicht der Fall sein, weil die Struktur mit Nullen überschrieben wird. Ansonsten etwa so:

Quellcode

1
2
3
4
5
6
7
8
dword p
p = (dword) &size;
asm {
mov BP, p & 0xFF
mov AX, (p>>8) & 0xFF
mov DX, (p>>16) & 0xFF
mov CX, (p>>24) &0xFF
}

Wobei ich mit über die korrekte Zuordnung, welches Byte in welches Register muss nicht sicher bin, das hätte ich dann in swat gecheckt.

P.S. Du hast doch sicher @call verwendet, oder ?



Sehr lustig :)
Ja, aber mich hat so eine Fehler schon mal diverse Stunden Sucharbeit gekostet.

Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

11

Donnerstag, 23. Juni 2016, 23:38

Hmmm... die ESP-Variante bringt einen auch nicht viel weiter... :(

;****************************************************************************
MSG_GO_GET_SIZE message
;
; Return the width and height of the object in points. The dimensions
; are calculated by mapping the objects corners into document
; coordinates and calculating the distances between them. The center of
; of the selection handles of a rectangle represent the corners mapped
; into document coordinates. The line thickness is not included in
; this calculation.
;
; Context: GrObj Utility
; Source: Unrestricted
; Destination: Any grobject
; Interception: Unlikely
;
;PASS:
; nothing
;
;RETURN:
; dx:cx - WWFixed width in points
; bp:ax - WWFixed height in points
;
;DESTROYED:
; nothing
;
d[ 0_O ]b

12

Donnerstag, 23. Juni 2016, 23:39

COMMENT @%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
GrObjGetSize
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

SYNOPSIS: Get the width and height of the object in points.

PASS:
*(ds:si) - instance data of object
ds:[bx] - instance data of object
ds:[di] - master part of object (if any)
es - segment of GrObjClass

RETURN:
dx:cx - WWFixed width in points
bp:ax - WWFixed height in points

DESTROYED:
nothing

PSEUDO CODE/STRATEGY:
nothing

KNOWN BUGS/SIDE EFFECTS/IDEAS:
This method should be optimized for SMALL SIZE over SPEED

Common cases:
none

REVISION HISTORY:
Name Date Description
---- ---- -----------
srs 3/ 4/92 Initial version

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@
GrObjGetSize method dynamic GrObjClass, MSG_GO_GET_SIZE
.enter

call GrObjCanGeometry?
jnc done

call GrObjGetAbsNormalOBJECTDimensions
mov bp, bx

done:
.leave
ret
GrObjGetSize endm
d[ 0_O ]b

13

Freitag, 24. Juni 2016, 00:33

Hmmm... in meinen Beispielquelltexten wird die Funktion nur innerhalb GrObj benutzt... vielleicht ist ja auch wieder mal der C-Stub defekt, so daß man die ESP-Version aufrufen "darf"?!
d[ 0_O ]b

14

Freitag, 24. Juni 2016, 08:10

Einen hab ich noch: Schau mal was nach dem Aufruf in den Registern steht
;RETURN:

; dx:cx - WWFixed width in points

; bp:ax - WWFixed height in points

Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

15

Samstag, 25. Juni 2016, 10:03

Swat lässt mich nicht;-).
Der GrBody führt eine Liste mit den gerade selektierten Objekten. Aus dieser Liste hole ich mir mit ChunkArrayGetElement das 0. Element (da ja nur ein Objekt selektiert ist) und schicke an dieses Element meine GO-Messages. Das hat bisher mit Messages wie z.B. MSG_GO_GET_POSITION ohne Probleme funktioniert. Swat allerdings sagt mir, dass ich vor dem Aufruf von ChunkArrayGetElement den Block "locken" muss. Das versuche ich gerade, wobei der erste Parameter von VMLock mit pself->GDI_fileHandle aber nicht akzeptiert wird.

Wilfried

16

Samstag, 25. Juni 2016, 13:28

Hallo Wilfried,

ChunkArrayGetElement erfordert wie alle ChunkArrayRoutinen, dass der Block gelockt ist. Je nachdem wo das ChunkArray liegt muss du MemLock oder VMLock aufrufen. Wenn du im Messagehandler eines Objekts bist ist der Objektblock bereits gelockt.

Mach mal etwas Code und ne Info wo der Code ausgeführt wird. Ich hab jetzt in den Instance data des GrObjBodyClass die Liste nicht finden können. Ich vermute es ist ein ChunkHandle? Dann steckt die Liste im gleichen Block wie das Objekt selbst. VMLock ist nur angebracht falls es ein VMBlockHandle ist. GDI_fileHandle ist aber eine Instancevariable von GenDocument. ... Fragen über Fragen.

Gruß
Rainer

P.S. Die Register kannst du ja per asm Befehl ansehen:

Quellcode

1
2
3
4
5
6
int b, c, d, a;  // keine Registernamen verwenden ;-)
asm mov b, bx;
asm mov c, cx;
MessageNumberBox(b);   // Falls du sowas hast :-)
MessageNumberBox(c);
usw.
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

17

Sonntag, 26. Juni 2016, 21:28

Hallo Rainer,

hm, wo fange ich an?
Also: ChunkArrayGetElement(pself->GBI_selectionArray, 0, &objektOD) rufe ich in einem MessageHandler des GrBodyObjekts auf. Dann bezieht sich pself ja auf den Body. Diese Message rufe ich allerdings jetzt aus einem GenDocumentHandler auf. Dort bezieht pself sich auf das Documentobjekt. So weit wird es von pmake akzeptiert. Swat allerdings sagt noch immer: "Block must be locked", obwohl wie du sagst der Objektblock je bereits gelockt sein soll.
Wie du beschrieben hast, habe ich die Register ausgelesen. Unabhängig vom Aussehen des Grafik-Objekts bekomme ich die Werte 2158 0 0 2051. Das ist ja schon merkwürdig.
Da die Register vor einer Bearbeitung in der Regel gesichert und nach Abscluss der Routine wieder hergestellt werden, habe ich die Register vor Aufruf von MSG_GO_GET_SIZE auf ff gestellt. Absturz auf ganzer Ebene, incl. Windows! Verursacher war die Voreinstellung von bp. Ohne bp bekam ich nach Aufruf der Message im Register cx verschiedene Ergebnisse: Wenn nur ein Register (außer bp) voreingestellt wird, dann ergibt sich 2158 0 0 2054, bei 2 Registern 2158 0 0 2057 und bei allen dreien 2158 0 0 2060.
Mit dem Begriff C-Stub hatte ich bisher noch nichts zu tun. Ich nehme an, dass es sich um die Übergabe von Parametern von asam nach C handelt? Kann man diesen C-Stub irgendwo einsehen?

Wilfried

18

Sonntag, 26. Juni 2016, 21:49

Klingt eigentlich alles sehr vernünftig. Aber: was erwartet Chukarraygetelement als erstem Parameter? Einen Optr? Dann versuch mal
ConstructOptr (OptrToHandle(oself), pself->GBI_selectionArray)
als ersten Parameter

Habe leider die nächsten Tage keinen Zugriff auf die Doku.

Grüße
Rainer

P.S. Ja, C-stub ist die Schnittstelle zwischen C und ASM. Deswegen ist das mit den Registern auch nur ein Versuch gewesen.
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

19

Montag, 27. Juni 2016, 17:08

<ConstructOptr (OptrToHandle(oself), pself->GBI_selectionArray)>

Wofür soll das gut sein? Den Objektpointer des Grafik-Objekts bekomme ich doch korrekt?

20

Montag, 27. Juni 2016, 19:00

Wie gesagt, ich hab gerade keinen Zugriff auf dir Doku. Deswegen schreibe ich auf was ich so versuchen würde. Wenn pself->GBI_selectionArray ein Chunkhandle ist musst du den Optr basteln. Aber wenn es ein Optr ist must du evt vorher den Block locken: MemLock (OptrToHandle (pself->GBI_selectionArray)). ?(
Rainer
Der gerade sein Handy hasst.
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

Zur Zeit ist neben Ihnen 1 Benutzer in diesem Thema unterwegs:

1 Besucher

Ähnliche Themen

Thema bewerten