amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Ikonifizieren? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

06.10.2009, 22:41 Uhr

MaikG
Posts: 5172
Nutzer
Wenn man sein Programm, was ein Fenster mit Gadgets hat Ikonifizieren möchte, was muss man tun?
Einfach Fenster zu und gut oder muss man die Gadgets Freigeben und
beim Reikonifizieren alles wieder neu machen?

[ - Antworten - Zitieren - Direktlink - ]

06.10.2009, 23:22 Uhr

NoImag
Posts: 1050
Nutzer
@MaikG:

Gadgets musst Du nicht freigeben, aber Du solltest Sie aus dem Fenster ausklinken, bevor Du das Fenster schließt. Das Fenster musst Du auf jeden Fall sauber schließen.

Tschüß


[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 00:16 Uhr

thomas
Posts: 7716
Nutzer

Man darf aber auch nicht außer Acht lassen, daß der Benutzer alles Mögliche an den Prefs ändern kann, während das Fenster geschlossen ist. Da macht es u.U. schon Sinn, auch die Gadgets freizugeben und beim Öffnen dann mit den neuen Attributen des Screens neu anzulegen. Insbesondere wenn man eine fontsensitive GUI hat, die bei geänderten Fonts auch eine andere Größe hat.

Es ist jedenfalls einfacher, generell beim Schließen alles freizugeben und beim Öffnen wieder neu anzulegen, als irgendwie die Änderungen an den Preferences herauszufinden und nur bei Bedarf etwas zu ändern.

Außerdem entspricht es dem Gedanken des Ikonifizierens viel mehr, so viele Ressourcen wie möglich freizugeben.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 10:10 Uhr

Holger
Posts: 8116
Nutzer
Es können sich nicht nur die Attribute des Screens ändern, der Screen selbst kann auch ein ganz anderer sein, da bestimmte Einstellungen nur dadurch aktiviert werden, dass der Screen geschlossen und wieder geöffnet wird.
Und für einige Toolkits/Gadgets ist es zwingend notwendig, dass sie auf dem Screen verwendet werden, für den sie angelegt wurden.


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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 10:55 Uhr

thomas
Posts: 7716
Nutzer
@MaikG:

Erinnerst du dich noch an dieses kleine Programm: http://www.amiga-news.de/forum/thread.php?id=25886&BoardID=7#261801

Ich habe da mal Ikonifizieren eingebaut: http://thomas-rapp.homepage.t-online.de/examples/iconify.c

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 10:59 Uhr

MaikG
Posts: 5172
Nutzer
>Gadgets musst Du nicht freigeben, aber Du solltest Sie aus dem
>Fenster ausklinken, bevor Du das Fenster schließt. Das Fenster
>musst Du auf jeden Fall sauber schließen.


Ausklinken? Wie geht das?



>Man darf aber auch nicht außer Acht lassen, daß der Benutzer alles
>Mögliche an den Prefs ändern kann, während das Fenster geschlossen
>ist. Da macht es u.U. schon Sinn, auch die Gadgets freizugeben und
>beim Öffnen dann mit den neuen Attributen des Screens neu anzulegen.

Das hiesse dan doch auch wenn der Screen geändert wurde das die
Pens nicht mehr stimmen?
Aber wenn der Pubscreen gelockt ist geht das sowieso nicht ;)


>Außerdem entspricht es dem Gedanken des Ikonifizierens viel mehr,
>so viele Ressourcen wie möglich freizugeben.


Soviel fressen die Gadgets eigentlich nicht und das Programm
muss weiterhin Aktiv bleiben. Speicher freigeben geht d.h.
nicht. Es geht eher darum nicht unnötig viel Fenster offen
zu haben wenn man ebend mal keine Ausgabe braucht -> ikonifizieren.

AOS wird lahm mit vielen offenen Fenstern.




>Und für einige Toolkits/Gadgets ist es zwingend notwendig,
>dass sie auf dem Screen verwendet werden, für den sie angelegt
>wurden.


Geht um Gadtools.


[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 11:24 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Ja, iconifizieren ist ein relativ aufwendiger prozess.
Du musst alles Resourcen die mit dem Screen zu tun haben freigeben (Friendly Bitmaps, Gadgets, Pens etc.) und beim popup wieder allocieren.
Der Screen kann ja ein komplett anderer sein, auch die Eintellungen für das GUI Toolkit etc. kann alles anders sein.

Am besten man nutzt ein GUI Toolkit, das solche Dinge direkt unterstützt, wie MUI oder NTUI (<= Werbung).
--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 11:30 Uhr

MaikG
Posts: 5172
Nutzer
Zitat:
Original von thomas:
@MaikG:

Erinnerst du dich noch an dieses kleine Programm: http://www.amiga-news.de/forum/thread.php?id=25886&BoardID=7#261801

Ich habe da mal Ikonifizieren eingebaut: http://thomas-rapp.homepage.t-online.de/examples/iconify.c

Gruß Thomas

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



Dunkel :)
Danke.
Ganz so einfach wird das aber nicht Existierendes muss wiederhergestellt
werden. Im Augenblick des Ikonifizierens ist ein anderer Zustand
als beim Generellen Initialaufbau. Listviews etc.






>Der Screen kann ja ein komplett anderer sein, auch die Eintellungen
>für das GUI Toolkit etc. kann alles anders sein.

>Am besten man nutzt ein GUI Toolkit, das solche Dinge direkt unterstützt, wie MUI oder NTUI (<= Werbung).

Das ist schon übel, mir würde es reichen wenn Gadtools nicht
versucht in das nicht existierende Fenster zu schreiben.
Für MUI habe ich keine Includes und keine Ahnung davon.

[ Dieser Beitrag wurde von MaikG am 07.10.2009 um 11:35 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 11:34 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
Ausklinken? Wie geht das?

Gadget-Liste auf NULL setzen.
Zitat:
Das hiesse dan doch auch wenn der Screen geändert wurde das die
Pens nicht mehr stimmen?

Kommt drauf an, welche Du meinst. Gelockte Pens dürfen ihre RGB-Werte nicht einfach so ändern, allerdings ist das System, historisch bedingt, nicht ganz so streng mit den Pens 0-3 der Workbench.
Die gewählten DrawInfo-Pens für 3D-Look, Text-Highlight, etc. können zumindest unter AOS3.x nicht so einfach geändert werden, deshalb muss der Screen dazu geschlossen und wieder geöffnet werden.
Zitat:
Aber wenn der Pubscreen gelockt ist geht das sowieso nicht ;)
Ja, deshalb ist es auch extrem schlechter Stil, den PubScreen ohne Grund gelockt zu halten.
Zitat:
Soviel fressen die Gadgets eigentlich nicht und das Programm
muss weiterhin Aktiv bleiben. Speicher freigeben geht d.h.
nicht. Es geht eher darum nicht unnötig viel Fenster offen
zu haben wenn man ebend mal keine Ausgabe braucht -> ikonifizieren.

Schreib dem Anwender nicht vor, warum er Dein Programm ikonifiziert.
Zitat:
Geht um Gadtools.
Da würd ich mal sagen: neu anlegen, ohne wenn und aber.


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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 11:39 Uhr

MaikG
Posts: 5172
Nutzer
>Gadget-Liste auf NULL setzen.

Ach richtig da gab es so ein Window Modify befehl.


>Kommt drauf an, welche Du meinst. Gelockte Pens dürfen ihre RGB-Werte nicht einfach so ändern, allerdings ist das System, historisch bedingt, nicht ganz so streng mit den Pens 0-3 der Workbench.
>Die gewählten DrawInfo-Pens für 3D-Look, Text-Highlight, etc. können zumindest unter AOS3.x nicht so einfach geändert werden, deshalb muss der Screen dazu geschlossen und wieder geöffnet werden.

ObtainBestPenA&

Aber um den Screen freizugeben müssten die dann auch Freigegeben
werden.


>Ja, deshalb ist es auch extrem schlechter Stil, den PubScreen ohne
>Grund gelockt zu halten.

Ich weiss :(


>Da würd ich mal sagen: neu anlegen, ohne wenn und aber.

Ich muss das Ganze mal durchgehen um zu Sehen ob ich das hinbekomme.


[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 11:42 Uhr

thomas
Posts: 7716
Nutzer
Zitat:
Original von MaikG:
Ganz so einfach wird das aber nicht Existierendes muss wiederhergestellt
werden. Im Augenblick des Ikonifizierens ist ein anderer Zustand
als beim Generellen Initialaufbau. Listviews etc.



Üblicherweise lädt man beim Programmstart die Einstellungen und speichert sie in der GUI-Struktur. Dann kann man beim Öffnen des Fensters die Gadgets direkt auf den voreingestellten Wert setzen.

Beim Schließen des Fensters speichert man die aktuellen Einstellungen dann wieder in der GUI-Struktur (wenn sie nicht ohnehin schon dort sind), sodaß beim anschließenden Öffnen des Fensters alles wieder so ist, wie vorher.

Das ist vielleicht ein bißchen Tipparbeit, aber schwierig ist das nicht.

Wenn du Einstellungen abspeichern möchtest, mußt du sowieso Variablen dafür anlegen. Dann kannst du auch die GUI-Sruktur dafür nehmen.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 11:42 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
Ganz so einfach wird das aber nicht Existierendes muss wiederhergestellt
werden. Im Augenblick des Ikonifizierens ist ein anderer Zustand
als beim Generellen Initialaufbau. Listviews etc.

Das ist die Herausforderung beim Programmieren: es richtig zu machen ;)
Es gibt zwei Möglichkeiten.
1. Du schreibst Deine Routine zum GUI-Aufbau grundsätzlich so, dass sie nicht von einem bestimmten Initialzustand ausgeht
2. Du stellst das GUI wieder her, in dem Du zuerst den Initialzustand erzeugst und dann die Schritte zum Aktualisieren durchläufst, wie Du sie in dieser oder ähnlicher Form auch vorher durchlaufen hättest, um bis zu dem Zustand zu kommen
Zitat:
Das ist schon übel, mir würde es reichen wenn Gadtools nicht
versucht in das nicht existierende Fenster zu schreiben.

Gadtools schreibt nicht in nicht existierende Fenster.
Sollte es dennoch knallen, liegt der Fehler bei Dir. Es ist allerdings vollkommen unnötig, Gadgets im Speicher zu behalten, die Du möglicherweise sowieso nicht benutzen kannst, wenn Du das Fenster wieder öffnest. Zu prüfen, ob die Gadgets kompatibel zum aktuellen Screen-Zustand sind, wäre aufwendiger, als sie neu zu erzeugen.

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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 11:44 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Üblicherweise lädt man beim Programmstart die Einstellungen und speichert sie in der GUI-Struktur. Dann kann man beim Öffnen des Fensters die Gadgets direkt auf den voreingestellten Wert setzen.

Beim Schließen des Fensters speichert man die aktuellen Einstellungen dann wieder in der GUI-Struktur (wenn sie nicht ohnehin schon dort sind), sodaß beim anschließenden Öffnen des Fensters alles wieder so ist, wie vorher.

Ich halte den Namen "GUI-Struktur" für etwas unglücklich gewählt, wenn diese Struktur gerade unabhängig von tatsächlichen GUI ist.

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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 12:16 Uhr

thomas
Posts: 7716
Nutzer
Zitat:
Original von Holger:
Ich halte den Namen "GUI-Struktur" für etwas unglücklich gewählt, wenn diese Struktur gerade unabhängig von tatsächlichen GUI ist.


Mag sein. Der Name bezieht sich auf mein Beispiel. Da werden die Werte zusammen mit der GUI gespeichert, weil das ganze Programm nunmal nur aus der GUI besteht.


@MaikG:

Ich habe das Beispiel angepasst (gleicher Link).

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 12:48 Uhr

MaikG
Posts: 5172
Nutzer
>Üblicherweise lädt man beim Programmstart die Einstellungen und >speichert sie in der GUI-Struktur. Dann kann man beim Öffnen des >Fensters die Gadgets direkt auf den voreingestellten Wert setzen.
>Beim Schließen des Fensters speichert man die aktuellen >Einstellungen dann wieder in der GUI-Struktur (wenn sie nicht >ohnehin schon dort sind), sodaß beim anschließenden Öffnen des >Fensters alles wieder so ist, wie vorher.

Weil es sich aber um temporäre Werte handelt kann ich z.B.
die Nodes vom Listview nicht wieder freigeben.

>Das ist vielleicht ein bißchen Tipparbeit, aber schwierig ist das >nicht.

Ein bisschen viel, z.B. muss wenn der Screenlock beendet wird auch verhindert werden das ein Sub, ein Fenster öffnet.
Aber da muss ich wohl durch.

Btw. gibt es überhaupt bei Intuition/Gadtools ein Iconifizieren Symbol wie bei Aweb/Genesis?



>Ich habe das Beispiel angepasst (gleicher Link).

Danke.

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 14:33 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
Weil es sich aber um temporäre Werte handelt kann ich z.B.
die Nodes vom Listview nicht wieder freigeben.

Wer legt denn die Nodes an, Du oder das ListView? Wenn es Deine Nodes sind, musst Du sie auch nicht freigeben, nur weil das GUI freigegeben wird.
Zitat:
Ein bisschen viel, z.B. muss wenn der Screenlock beendet wird auch verhindert werden das ein Sub, ein Fenster öffnet.
Ja, erst mal musst Du Dich entscheiden. Ist das Programm nun ikonifiziert, d.h. ohne Fenster, oder nicht? Wenn es keine Fenster geben soll, sollte auch kein Unterprogramm ein Fenster öffnen. Wenn doch, dann sollte das Unterprogramm den Public Screen locken, bevor es das Fenster öffnet, und den Lock wieder freigeben, sobald das Fenster offen ist. Wenn ein Fenster offen ist, braucht man nämlich keinen Lock mehr.
Zitat:
Btw. gibt es überhaupt bei Intuition/Gadtools ein Iconifizieren Symbol wie bei Aweb/Genesis?
Nicht bei AOS3.x/Gadtools.

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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 14:42 Uhr

MaikG
Posts: 5172
Nutzer
>Wer legt denn die Nodes an, Du oder das ListView? Wenn es Deine Nodes >sind, musst Du sie auch nicht freigeben, nur weil das GUI freigegeben >wird.

Ich glaube ich.

>Ja, erst mal musst Du Dich entscheiden. Ist das Programm nun >ikonifiziert, d.h. ohne Fenster, oder nicht?

okay, man kann ja auch einen seperaten lock machen.


>Nicht bei AOS3.x/Gadtools.

Aber selbst Zeichnen geht und klick darauf erkennen oder?

Andererseits auch wieder dumm wenn die Original Fenster Einsteller
irgendwie anders platziert sind. Z.b. OS4 da kann man diese weitgehend ändern.

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 14:50 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
Aber selbst Zeichnen geht und klick darauf erkennen oder?

Wenn es sich wie gewohnt verhalten soll, also als Gadget im Fensterrahmen, muss es auch als Border-Gadget angelegt werden.
Zitat:
Andererseits auch wieder dumm wenn die Original Fenster Einsteller
irgendwie anders platziert sind. Z.b. OS4 da kann man diese weitgehend ändern.

Ab AOS4 gibt es Funktionen in intuition, um solche Gadgets anzulegen. Einfacher ist es allerdings, ReAction zu benutzen. Das hat einen funktionierenden Work-Around unter AOS3.x und eine kompatible Implementierung unter AOS4.x.

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

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 15:15 Uhr

MaikG
Posts: 5172
Nutzer
>Wenn es sich wie gewohnt verhalten soll, also als Gadget im
>Fensterrahmen, muss es auch als Border-Gadget angelegt werden.

Oje, unbekanntes Gebiet.
Habe schon probiert es selbst zu Zeichenen aber es verschwindet
wenn das Fenster Inaktiviert wird und der Refresh wird mir
nicht mitgeteilt. Ist eins mit Smart refresh.

[ - Antworten - Zitieren - Direktlink - ]

07.10.2009, 15:45 Uhr

thomas
Posts: 7716
Nutzer
@MaikG:

Warum muß es denn unbedingt im Fensterrahmen sein ? Mach doch einen Knopf irgendwo im Fenster. Oder mach gar kein Gadget, sondern nur einen Menüpunkt mit Tastenkombination.

Ein Gadget im Fensterrahmen unterzubringen ist nicht gerade einfach, besonders beim oberen Rand, da der ja mit dem Screenfont die Größe ändert. Da braucht's schon ein BOOPSI-Gadget. Und wenn du damit anfängst, dann kannst du gleich auf ClassAct/ReAction umsteigen. Das ist nichts anderes als BOOPSI und hat die Funktion zum Iconify schon eingebaut.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

08.10.2009, 11:45 Uhr

thomas
Posts: 7716
Nutzer

Hier wäre dann auch noch ein Beispiel für ein Iconify-Gadget im oberen Bildschirmrahmen: http://thomas-rapp.homepage.t-online.de/examples/iconifygad.c

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

08.10.2009, 18:38 Uhr

MaikG
Posts: 5172
Nutzer
Zitat:
Original von thomas:

Hier wäre dann auch noch ein Beispiel für ein Iconify-Gadget im oberen Bildschirmrahmen: http://thomas-rapp.homepage.t-online.de/examples/iconifygad.c

Gruß Thomas

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


Ich seh schon das ist ziemlich kompliziert und wenn ich saveds lese, wohl gar nicht machbar unter MBasic.
Menüpunkt oder Button muss reichen.

[ - Antworten - Zitieren - Direktlink - ]

08.10.2009, 20:12 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Ein Gadget im Fensterrahmen unterzubringen ist nicht gerade einfach, besonders beim oberen Rand, da der ja mit dem Screenfont die Größe ändert. Da braucht's schon ein BOOPSI-Gadget.

Das ist jetzt aber schon ein bisschen übertrieben. Gadgets im Fensterrahmen funktionieren zwar nicht mit gadtools und sind deutlich komplizierter, wenn man sie mit BOOPSI implementiert, aber erstaunlicherweise relativ einfach, wenn man zurück zu den Wurzeln geht.

Mit den Mitteln von AOS1.x, nämlich eine einfache Vektorgrafik, wie Du sie in Deinem Beispiel verwendest, als Struktur (war sinnigerweise "Border", wenn ich mich recht entsinne) zu erzeugen und um die Höhe des Screenfonts zu skalieren, und das Ganze in ein Gadget, das relativ zum rechten Rand positioniert wird, zu packen, geht es nämlich auch.

Und das sollte somit ohne Callback, also auch in Basic funktionieren. Das gute ist ja, dass weder die Größen der anderen Fenster-Gadgets, noch des Screenfonts sich ändern, solange das Fenster und somit auch der Screen offen sind.

Allerdings kann es trotzdem nicht schaden, sich mit ReAction auseinanderzusetzen...

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

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Ikonifizieren? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.