Sie sind nicht angemeldet.

1

Freitag, 22. März 2019, 11:35

Objekt in ESP adressieren

Ich befinde mich in einer Prozedur in der Ruler-Bibliothek. Von hier aus möchte eine Msg an ein UI-Objekt senden. Es handelt sich um ein GenBooleanGroupClass-Objekt (GeoDraw: Optionen->Lineale->horizontales/vertikales Lineal zeigen). Dieses Opjekt, innerhalb eines Controllers, wird in der Ruler-Bibliothek deklariert und hat den Namen RulerAttrList. Ich möchte nun die Selektionen dieser GenBooleanGroup abfragen mit MSG_GEN_BOOLEAN_GROUP_GET_SELECTED_BOOLEANS. Das Setzen der Register läuft so ab: Global Handle des Empfängerobjekts nach bx, ChunkHandle nach si, MSG nach ax, Senden der MSG mit call ObjMessage. Mein Problem besteht darin, dass call ObjMessage immer mit Illegal Handle abgebrochen wird. Bisher war ich davon ausgegangen, dass der Objektname für den optr des Objekts steht. Wenn ich die Register bx und si so setze:
movdw bxsi, RulerAttrList
dann sagt pmake, dass Sourcegröße word nicht zur Zielgröße dword passt.
Wenn ich die Register einzeln setze mit
mov bx, handle RulerAttrList
mov si, offset RulerAttrList
dann beschwert pmake sich nicht mehr, aber swat meldet death due to Illegal Handle.
Damit bin ich mit meinem Latein am Ende. Hat vielleicht jemand eine Idee?

Wilfried

2

Freitag, 22. März 2019, 12:34

Hallo Wilfried,
könnte es sein, dass es wieder gleiche Problem ist wie schon letztens? Meines Wissens nach werden Controller vor der Verwendung dupliziert, so dass das Memhandle sich ändert.
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

3

Freitag, 22. März 2019, 18:50

Hallo Rainer,

das könnte natürlich sein, aber mich macht stutzig, dass laut pmake nur ein word im Objektnamen stecken soll. Außerdem wüsste ich nicht, wie man sowas wie ConstructOptr in ESP realisieren sollte.

Wilfried

4

Montag, 15. April 2019, 11:15

Ich habe die Ruler-Library an einigen Stellen so verändert, dass die Lineal-Anzeige den Anforderungen von z.B. GeoCad gerecht wird: Positive Richtung der Koordinaten nach oben/rechts. Da es sicher nicht jedem User gefällt, wenn z.B. in GeoWrite das senkrechte Lineal nur negative Zahlen anzeigt (weil sich der Koordinatenursprung hier oben links befindet), möchte ich die Veränderungen schaltbar machen. Leider ist mir bisher keine Lösung dazu eingefallen und Falk hat bisher keine Zeit gefunden, mir auf meine Anfrage zu antworten. Es geht darum, innerhalb der Library eine Message an ein innerhalb der Library befindliches UI-Objekt zu schicken. Wenn also doch noch jemand einen Tipp parat hat: Ich sitze in Wartestellung...

Wilfried

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Wilfried« (16. April 2019, 10:18)


5

Dienstag, 16. April 2019, 19:31

Hallo Wilfried,
hilft dir sowas wie eine gloable Varibale für die Library? Mit
extern GeodePrivAlloc (GeodeHandle gh, word numWords);

kannst du wohl soetwas ähnliches anlegen. Die Objekte könnten dann darauf zugreifen.

Gruß

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

6

Mittwoch, 17. April 2019, 18:06

Ja, das wär was :) . Ein Speicherplatz, auf den von überall innerhalb der Library zugegriffen werden kann. Die entsprechenden Befehle sind auch in ESP vorhanden, nur leider steht dort nicht, in welchen Registern welche Parameter übergeben werden müssen :( .

7

Donnerstag, 18. April 2019, 09:46

Ich denke jetzt so: In C gibt es die Befehle. also muss auch irgendwo im SDK der C-Befehl definiert sein. Dort sollte stehen, wie der C-Befehl auf des ASM Befehl zugreift, oder?
Andererseits: Man kann in einer Library auch ganz normal globale Variablen definieren, fällt mir gerade siedend heiß ein! Das mache ich in meiner RTL:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/***************************************************************************
 *	$ID RunLibGlobalStruct
 *	Einge Laufzeit-Daten packe ich in eine globale Struktur, damit
 *	alle Objekte drauf zugreifen k”nnen. Daten die hier abgelegt sind,
 *	werden von allen laufenden BASIC-Programmen simultan benutzt
 *	--> bei Bedarf durch eine Semaphore schtzen, vgl. funcCallSem
 ***************************************************************************/
typedef struct {

	int 		decimalSeparator;	// gepuffert, damit er nicht immer geholt werden muss

	/* Die folgenden Semaphoren sollen verhindern, das mehrere
	 * BASIC-Programme (Threads) globale Resourcen wie das
	 * TokenArray (einer Library) oder Variablen gleichzeitig verwenden
	 */
	SemaphoreHandle		tokenAccessSem;	// Locken des HugeArray mit dem
										// Ausführbaren Code
-... usw.
	} RunLibGlobalStruct;
RunLibGlobalStruct runlibGlobals;


und in der GOC-File mache ich dann:
extern RunLibGlobalStruct runlibGlobals;
Das geht in ESP sicher ähnlich

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

8

Donnerstag, 18. April 2019, 19:22

Ausgehend von deiner Anregung habe ich die Doku studiert (zum wievielten Male!): Globale Variablen werden in sogenannten Pseudo-Segmenten iData/uData (in dgroup) abgelegt. Für die Deklaration habe ich ein Beispiele gefunden. Wenn ich nun noch finde, wie ich auf die Variablen zugreife, dann bin ich ein großes Stück weiter :) .

Wilfried

9

Samstag, 20. April 2019, 10:07

Der Zugriff auf die globale Variable funktioniert jetzt. Damit kann der Anwender wählen, ob er auch negative oder nur positive Koordinaten angezeigt bekommen möchte. :)

Rainer: Dein Tipp war gut. Danke!

10

Samstag, 20. April 2019, 10:45

Schön. :). Gibt es keine Querwechselwirkungen. Z. B. wenn jemand GeoWrite und dein Programm offen hat und es in dem einen so und in dem anderen anders haben will?
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Rainer« (20. April 2019, 12:21)


11

Samstag, 20. April 2019, 18:04

So ganz rund läuft es nicht: Solange man in z.B. Geowrite und GeoDraw die nur Einstellung für Vorzeichen/kein Vorzeichen ändert, gibt es keine Seiteneffekte. Ändert man aber in einem Programm den Einheiten-Typ, so passt sich die Vorzeicheneinstellung der des anderen Programms an :( .

12

Samstag, 20. April 2019, 20:50

Dann musst du es wohl doch in den jeweiligen Objekten selber speichern. Da du zu vorhandenen Objektklassen wahrscheinlich keine Instancevariablen hinzufügen kannst (sonst laufen Programme die diese Objekte gesubclasst haben nicht mehr) musst du es wohl über Vardata Einträge machen. Also dein geändertes Objekt fragt das Vardata Feld ab und zeigt dann z. B. negative Koordinaten an. Gesubclasste Objekte oder auch nur Programme, die nichts von den Vardata Feldern wissen verhalten sich dann so wie immer.
Ein ähnliches Problem habe ich in R-BASIC wenn ich vorhanden Objekten eine neue Eigenschaft spendieren will. Man darf die Größe der Instancdaten nicht ändern sonst geht gar nichts mehr.
Gruß Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

13

Sonntag, 21. April 2019, 09:43

Damit wäre ich dann wieder beim Ausgangsproblem: Ich brauch den optr des Objekts (RulerShowControl, enthält GenBooleanGroup), egal ob ich ein Vardata-Feld oder die selektierten GenBooleans abfrage.

Wilfried

14

Sonntag, 21. April 2019, 11:35

Mich macht in deinem ersten Post gerade stutzig, dass si das Chunkhandle und bx das MemHandle bekommen soll. Hast du es mal andersrum versucht?
Ansonsten gehen mir gerade die Ideen aus.
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

15

Sonntag, 21. April 2019, 18:37

Die ESP-Doku sagt, dass bei Benutzung von ObjMessage der optr des Rezipienten in bx:si übergeben wird. Etliche Beispiele in den Samples bestätigen dies und ich hab's ja auch schon erfolgreich so gemacht. Wäre schön gewesen, wenn dein Gefühl recht gehabt hätte ;).

Wilfried

Ähnliche Themen

Thema bewerten