[archimedes] Re: [archimedes] RISC OS & C - WIMP-Programmierung - Fragen zum nachträglichen Ändern von Symbolen

  • From: Steffen Huber <steffen@xxxxxxxxxxxx>
  • To: archimedes@xxxxxxxxxxxxx
  • Date: Sun, 17 Jul 2016 17:52:05 +0200 (CEST)

Hallo Alex,

ich versuche mich mal an einer Antwort, bin aber schätzungsweise 15 Jahre aus
der Übung...

Alexander Ausserstorfer <bavariasound@xxxxxxxxxxxxxxx> hat am 17. Juli 2016 um
17:10 geschrieben:
1. Symbole nachträglich aktualisieren?

_Wie_ geschieht jetzt die Aktualisierung von indirekt adressierten
Inhalten von Symbolen / Icons? Wenn ich zum Beispiel _nachträglich_ den
indirekt adressierten Text eines Symbols / Icons ändere, so ändert sich
bei mir hier auch sofort der Text im Fenster auf dem Schirm. Nun ist es
aber so, dass ich in meinen Büchern und Unterlagen zu dieser Frage rein
gar nichts fand.

Gibt es auch Situationen, wo das nicht so ist, d. h. das Symbol oder das
Fenster nach der Änderung vom Programm neu auf den Schirm gezeichnet,
also von Hand aktualisiert werden muss?

Meines Wissens wird keinesfalls automatisch aktualisiert, nur weil man im
"indirected"-Speicherblock irgendeine Änderung vornimmt. Im Gegenteil, man muss
explizit das Icon (oder das ganze Fenster in dem das Icon liegt oder den
Fensterbereich den das Icon mit beinhaltet), dessen "indirected"-Daten man
geändert hat, zum Redrawen bringen.

Mein Ada-Code sagt: Wimp_SetIconState,0,blkptr%
blkptr%!0=windowhandle
blkptr%!4=iconhandle
blkptr%!8=0
blkptr%!12=0

2. Symbolinhalte nachträglich ändern?

Mittels der Funktion wimp_get_icon_state bekomme ich zwar eine Kopie vom
Datenblock eines Symboles / Icons in icon_state. Aber das Ändern der
dort enthaltenen Zeiger(werte) bringt natürlich nichts, weil es sich ja
nur um eine Kopie der originalen Zeiger handelt.

So ist es.

Das führt zu zwei weiteren Fragen:

Kann man irgendwie die originalen Zeiger herausfinden und abändern? Die
originalen Zeiger, welche auf die indirekten Inhalte eines Symbol /
Icons zeigen, müssten im Datenblock enthalten sein, welcher durch das
Laden der Vorlage / Templates und Erzeugen des Fensters entstanden ist.
Also entweder in windows oder block.

Nein, man kann die originalen Adressen nicht abändern. Die sind im "WIMP private
workspace", der bei jedem Wimp_CreateWindow und Wimp_CreateIcon genutzt wird.

Wenn ich nicht die Adressen abändern kann oder möchte, auf welche die
originalen Zeiger des Symbols zeigen, so kann ich noch immer deren
Inhalte abändern oder überschreiben (also das, worauf die originalen
Zeiger zeigen).

So ist es ja auch gedacht, mit den "indirected data"-Geschichten. Alles, was
nicht "indirected" ist, kann inhaltlich nicht geändert werden, sondern man muss
ein neues Objekt generieren.

Wie finde ich jetzt aber die Größe der reservierten oder benutzten
Speicher heraus?

Du liest die Bufferlänge aus Wimp_GetIconState raus - steht genau 4 Bytes nach
der Adresse der Indirektion :-)

https://www.riscosopen.org/wiki/documentation/show/Icon%20Data

Gruß
Steffen

-- 
Steffen Huber LambdaComm System – Welcome to Trollinger Country
steffen@xxxxxxxxxxxx
Private homepage http://www.huber-net.de/
RISC OS Blog http://riscosblog.huber-net.de/

Other related posts: