amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Gadgets mal wieder [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2006-01-09, 16:31 h

Reth
Posts: 1858
User
Hallo allerseits!

Also es ist zum Haare raufen (wenn sie nicht schon von selbst ausgehen würden)!

Ich könnt nen Veitstanz hinlegen.
Habe mal wieder Probleme mit Gadgets. Ich erzeuge Gadgetstrukturen und füge sie mit AddGadget einem Fenster hinzu. Dabei wird immer ans letzte Gadget ein neues angehangen, wenn es hinzugefügt wird.
Standardmäßig hat jedes Gadget als NextGadget zunöchst NULL drin stehen.
Die Gadgets sind vom Typ GTYP_BOOLGADGET, bekommen einen GadgetRender-Image-Zeiger und einen SelectRender-Image-Zeiger, dazu die Flags GACT_RELVERIFY | GACT_IMMEDIATE für Activation und GFLG_GADGIMAGE | GFLG_GADGHIMAGE | GFLG_LABELIMAGE für die Flags.

Doch immer, wenn ich RefreshGadgets mit dem Zeiger auf das erste Gadget aufrufe friert mir das System ein.
Das Problem hatte ich schon mal, konnte es damals aber lösen, indem ich die Reihenfolge fürs Hinzufügen der Gadgets, dem Aktivieren des Fensters und dem Refresh der Gadgets und des Fensters anpasste.
Diesmal klappt das aber nicht mehr, obwohl die Reihenfolge die gleiche ist.

Am Sa. hab ich das Ganze mal zum Leufen bekommen, da hab ich dem Window noch IDCMPFlags verpasst. Danach hab ich nur noch zusätlichen Code für das Fenster erzeugt (z.B. zum Blitten usw.) doch nun friert mir das System ständig ein, wenn ich RefreshGadgets rufe, egal wann ich das mache!

Bin mir sicher, dass die Verzeigerung der Gadgets stimmt und rufe den Refresh wie folgt:

RefreshGadgets(first, window, NULL);

first ist der Zeiger auf das 1. Gadget, window der auf die Windowstruktur.
Die Reihenfolge ist die:

1. Fenster anlegen und öffnen
2. Gadgets hinzufügen
3. Images ins Fenster zeichnen
4. Fenster aktivieren
5. Gadgets Refresh (hier einfrieren)
6. Fenster Refresh

Mit dieser Reihenfolge hatte ich beim letzten Mal keine Probleme, nun aber schon.
Hab auch schon probiert die Gadgets nach Aktivierung zu setzen und gleich den Refresh darauf zu machen, bringt aber das selbe Ergebnis.

Entweder hab ich irgendwo was übersehen, oder gibts da ein genaues Vorgehen, was ich hier nicht einhalte?

Hat jmd. Rat?

Danke schon mal!

Ciao

[ - Answer - Quote - Direct link - ]

2006-01-09, 16:58 h

whose
Posts: 2156
User
@Reth:

hm, ich habe schon ewig nicht mehr mit den "normalen" Gadgets gearbeitet, daher weiß ich jetzt nicht auf Anhieb, ob das stimmt, was ich sage... aber war es nicht bei den Standard-Gadgets ähnlich wie beim ReAction/ClassAct-Listview, daß man vor der Änderung der Gadget-List diese aus dem Fenster "aushängen" soll, um dann die Änderungen durchzuführen? Nach den Änderungen dann wieder "einhängen" und RefreshGadgets() ausführen?

Wie gesagt, ich müßte jetzt erst einmal nachschauen, ob das stimmt, was ich hier erzähle (bin gerade unterwegs und komme wohl erst Abends wieder heim), aber den Versuch ists zumindest wert, oder? ;)

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Answer - Quote - Direct link - ]

2006-01-09, 17:12 h

Holger
Posts: 8116
User
Zitat:
Original von Reth:
Hallo allerseits!

Hallo

Also erstmal:
Zitat:
GACT_RELVERIFY | GACT_IMMEDIATE
Diese Kombination erscheint mir unsinnig. Welches Verhalten ist denn nun genau gewünscht?
Zitat:
GFLG_GADGIMAGE | GFLG_GADGHIMAGE | GFLG_LABELIMAGE für die Flags.
Erscheint mir auch nicht ganz plausibel, auch wenn ich die Bedeutung nicht im Kopf habe. Image + LabelImage sind doch irgendwie zwei verschiedene Dinge und Du benutzt nur eines davon, wie ich Deiner Beschreibung entnehme.

Zitat:
Die Reihenfolge ist die:

1. Fenster anlegen und öffnen
2. Gadgets hinzufügen
3. Images ins Fenster zeichnen
4. Fenster aktivieren
5. Gadgets Refresh (hier einfrieren)
6. Fenster Refresh


Also Refresh-Gadget sollte immer direkt nach dem Hinzufügen passieren. Wenn irgendeine Aktion dazwischen liegen muß, machst Du schon was falsch. Denn Du mußt immer damit rechnen, daß der Refresh auch ungewollt passiert, insbesondere, wenn Du Aktionen wie "Fenster aktivieren" dazwischen legst.
Wenn ich davon ausgehe, daß es sich bei den Images nicht um die der Gadgets handelt, lautet die Reihenfolge
2. Gadgets hinzufügen
3. Gadgets Refresh (hier möglichst nicht einfrieren)
4. Images ins Fenster zeichnen

Wenn Du das Fenster immer beim Öffnen aktivierst, dann setz das entsprechende Flag beim Fensteröffnen. Inaktiv öffnen und dann aktivieren kostet Zeit und (geringfügig) Resourcen.

Den Punkt "Fenster Refresh" verstehe ich in dieser Aufzählung überhaupt nicht. Ein Fenster wird refreshed, wenn das System dazu auffordert und die Layer auch eine entsprechende damage-Liste besitzen.
Aus Eigeninitiative des Programms sollte so etwas niemals erfolgen.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2006-01-09, 17:13 h

thomas
Posts: 7717
User

RefreshGadgets hängt sich immer dann auf, wenn du die Verpointerung falsch hast. Z.B. wenn du irgendwo eben *nicht* NULL drin hast, oder wenn du eine Schleife in NextGadget gebaut hast.

Zitat:
GFLG_GADGIMAGE | GFLG_GADGHIMAGE | GFLG_LABELIMAGE

LABELIMAGE darfst du nicht setzen. Das ist nur für BOOPSI-Gadgets.

Und ansonsten hast du da überall gültige Image-Pointer drin ? Also in GadgetRender und SelectRender ? Wenn du ihm sagst, er soll ein Image zeichnen und du schickst ihn ins Nirvana, dann muß er sich ja aufhängen.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2006-01-09, 17:28 h

thomas
Posts: 7717
User
Zitat:
Original von Holger:
Zitat:
GACT_RELVERIFY | GACT_IMMEDIATE
Diese Kombination erscheint mir unsinnig. Welches Verhalten ist denn nun genau gewünscht?

Wieso unsinnig ? IMMEDIATE heißt nichts anderes, als daß du IDCMP_GADGETDOWN bekommst und mit RELVERIFY bekommst du GADGETUP-Messages. So weißt du, wann das Gadget angeklickt wurde und wann es losgelassen wurde. Ich sehe da nichts unsinniges dran.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2006-01-09, 17:40 h

Holger
Posts: 8116
User
Zitat:
Original von thomas:
Wieso unsinnig ? IMMEDIATE heißt nichts anderes, als daß du IDCMP_GADGETDOWN bekommst und mit RELVERIFY bekommst du GADGETUP-Messages. So weißt du, wann das Gadget angeklickt wurde und wann es losgelassen wurde. Ich sehe da nichts unsinniges dran.

Nun, daß sind die Effekte, aber dahinter stehen auch (dokumentierte) Konzepte. Es gibt Buttons, die erst dann auslösen, wenn der Mauszeiger auch beim Loslassen über dem Button steht (RELVERIFY) und es gibt Schalter, die direkt beim Drücken den Status wechseln (IMMEDIATE), für die das Loslassen bedeutungslos ist.
Du kannst m.W. alle Gadgets in eine der beiden Kategorien unterteilen. Deshalb ist eine Kombination der beiden nicht sehr sinnvoll.
Ich lasse mir gerne praxisnahe Beispiele für das Gegenteil zeigen. Deshalb schrieb ich ja auch "scheint mir". Ich wollte nur die Aufmerksamkeit darauf lenken, damit der Autor darüber nachdenken kann. Wenn es sagt, daß es seine Richtigkeit damit hat, dann ist ja alles in Ordnung.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2006-01-09, 20:53 h

Reth
Posts: 1858
User
Hallo zusammen,

wie es scheint, waren GadgetText und SpecialInfo nicht initialisiert, obwohl ich dachte, mein bisheriger Code hat dafür gesorgt.

Nun scheints zu klappen.

Danke vielmals.

Eigentlich ist es schon beabsichtigt GadgetDown- und GadgetUp-Messages zu bekommen, damit beide ausgewertet werden können.

[ - Answer - Quote - Direct link - ]

2006-01-10, 10:15 h

Mad_Dog
Posts: 1944
User
Zitat:
Original von Reth:

Die Reihenfolge ist die:

1. Fenster anlegen und öffnen
2. Gadgets hinzufügen
3. Images ins Fenster zeichnen
4. Fenster aktivieren
5. Gadgets Refresh (hier einfrieren)
6. Fenster Refresh


Alternativ kannst Du es auch so machen:

1. Gadgets in Gadgetliste eintragen
2. Fenster öffnen - Gadgetliste als TagItem angeben


--

http://www.norman-interactive.com

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Gadgets mal wieder [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.