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

amiga-news.de Forum > Programmierung > Wie ein WINDOW deaktivieren? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

18.04.2002, 12:40 Uhr

Micha1701
Posts: 938
Nutzer
Hi!

Mal wieder eine programmiertechnische Frage:

Wie kann ich ein Fenster deaktivieren? Einzelne Gadgets, ok, das geht ja wohl, aber wie das ganze Fenster?

Gefallen würde es mir, wenn es genauso wäre, wie wenn man per Reaction ein GETFILE Button erstellt hat und dort gerade den Dateinamen per ASL Requester abfragt. Das Fenster ist einfach gesperrt. Klickt man drauf, verwandelt sich der Mauszeiger in die Stopuhr und nichts ist anwählbar....

Jemand eine Idee?

--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Antworten - Zitieren - Direktlink - ]

18.04.2002, 12:54 Uhr

thomas
Posts: 7716
Nutzer

Der allgemein anerkannte Trick ist, einen Requester der Größe 1x1 in der linken oberen Ecke des Screens zu öffnen. Dadurch werden alle Eingabeelemente des Fensters gesperrt. Zusätzlich noch mit SetPointerTags (oder so ähnlich) den Busy-Pointer setzen und die Illusion ist perfekt. Das müßte so oder so ähnlich auch in den RKRMs stehen.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

18.04.2002, 18:30 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Der allgemein anerkannte Trick ist, einen Requester der Größe 1x1 in der linken oberen Ecke des Screens zu öffnen.

Die Groesse des Requesters ist dabei nicht entscheidend, stattdessen achtet man darauf, dass er transparent ist.
Es steht so in der Tat in den RKRMs und zwar nicht nur als anwendbare Methode, sondern auch als Art und Weise, wie z.B. ASL-Requester das Blockieren durchfuehren.

mfg


--

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

[ - Antworten - Zitieren - Direktlink - ]

18.04.2002, 18:51 Uhr

David
Posts: 65
Nutzer
Hallo,

ich benutzte bei Reaction / ClassAct

dafür immer folgendes

SetAttrs(objwin,WA_BusyPointer,1,0); // Fenster sperren
/*
....
*/
SetAttrs(objwin,WA_BusyPointer,0,0); // Fenster wieder freigeben


wobei 'objwin' der Pointer für das jeweilige Fenster ist.

mfg
David

[ - Antworten - Zitieren - Direktlink - ]

18.04.2002, 20:23 Uhr

Beeblebrox
Posts: 723
Nutzer
Jetzt will ich auch nochmal was programmiertechnisches fragen:
Wie kann ich denn ein Device öffnen ? Das habe ich noch nie
verstanden. Benutze das StormC3 von der Developer CD, bzw.
gelegentlich auch ne Vollversion von Maxon C++. Aktuell möchte
ich gerne die Funktion GetSysTime benutzen und kann aber das
timer.device nicht öffnen.
B.t.w.: Emperor ist echt eine ganz nette Sache für so Gelegen-
heitsprogrammierer wie mich :)

[ - Antworten - Zitieren - Direktlink - ]

18.04.2002, 22:19 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Beeblebrox:
Jetzt will ich auch nochmal was programmiertechnisches fragen:
Wie kann ich denn ein Device öffnen ? [...]Aktuell möchte
ich gerne die Funktion GetSysTime benutzen[...]

code:
#include <exec/exec.h>
#include <devices/timer.h>

#include <clib/timer_protos.h>
#include <clib/exec_protos.h>

// nur für printf
#include <stdio.h>

int main(int argc,char**arg)
{
  struct timeval* result;
  struct timerequest ioRequest;
  int error;

  ioRequest.tr_node.io_Message.mn_Length=sizeof(ioRequest);
  error=OpenDevice("timer.device", 0, &ioRequest.tr_node, 0);
  if(!error)
  {
    result=&ioRequest.tr_time;
    GetSysTime(result);
    printf("Systime: %ld.%ld\n", result->tv_secs, result->tv_micro);
    CloseDevice(&ioRequest.tr_node);
  }
  else printf("couldn't open timer.device (code %d)\n", error);
}

Anzumerken ist hier aber, daß es sich bei GetSysTime nicht um eine typische device-Operation handelt, weil sie wie eine library-Funktion aufgerufen wird und die Daten in dem IORequest gar nicht benutzt.

mfg

--

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

[ - Antworten - Zitieren - Direktlink - ]

19.04.2002, 07:38 Uhr

Micha1701
Posts: 938
Nutzer
Hi!

Danke erstmal an die guten Vorschläge.
Hab dann den von David genommen, der gefällt mir am Besten.
Wobei eigentlich alle beide das gleiche tun....

Genauso sollte es sein.... ;-)

Danke!

--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Antworten - Zitieren - Direktlink - ]

19.04.2002, 10:38 Uhr

Beeblebrox
Posts: 723
Nutzer
Danke Holger ! Werde ich heute abend, wenn ich Zeit habe gleich
mal ausprobieren. :)

[ - Antworten - Zitieren - Direktlink - ]

19.04.2002, 10:53 Uhr

thomas
Posts: 7716
Nutzer

@Holger, Beeblebrox: das ist sehr schlechter Stil. Die Request-Struktur sollte immer mit CreateExtIO angelegt werden. Außerdem brauchst du noch einen Reply-Port, sonst kannst du nicht auf das Ergebnis warten.

Nimm mal diese paar Funktionen:
code:
/*-------------------------------------------------------------------- ------*/
/* Timer.device öffnen                                                      */
/*-------------------------------------------------------------------- ------*/

   struct timerequest *open_timer (long unit)

   {
   struct MsgPort *reply;
   struct timerequest *request;

   if (reply = CreatePort (NULL,0))
      {
      if (request = (struct timerequest *)CreateExtIO (reply,sizeof(struct timerequest)))
         {
         if (OpenDevice ("timer.device",unit,(struct IORequest *)request,0) == 0)
            {
            return (request);
            }
         else
            err = ERR_OPEN_TIMER_FAILED;

         DeleteExtIO ((struct IORequest *)request);
         }
      else
         err = ERR_CANNOT_CREATE_IOREQ;
      DeletePort (reply);
      }
   else
      err = ERR_CANNOT_CREATE_REPLY_PORT;

   return (NULL);
   }

/*-------------------------------------------------------------------- ------*/
/* Timer starten                                                            */
/*-------------------------------------------------------------------- ------*/

   void start_timer (struct timerequest *request,ULONG secs,ULONG micro)

   {
   request->tr_node.io_Command = TR_ADDREQUEST;
   request->tr_time.tv_secs  = secs;
   request->tr_time.tv_micro = micro;
   SendIO ((struct IORequest *)request);
   }

/*-------------------------------------------------------------------- ------*/
/* Auf Timer warten                                                         */
/*-------------------------------------------------------------------- ------*/

   #define wait_timer(timereq) WaitIO((struct IORequest *)(timereq))

/*-------------------------------------------------------------------- ------*/
/* Timer.device schließen                                                   */
/*-------------------------------------------------------------------- ------*/

   void close_timer (struct timerequest *request)

   {
   struct MsgPort *reply;

   if (request)
      {
      reply = request->tr_node.io_Message.mn_ReplyPort;

      AbortIO ((struct IORequest *)request);
      CloseDevice ((struct IORequest *)request);
      DeleteExtIO ((struct IORequest *)request);
      DeletePort (reply);
      }
   }


Die sollten sich auch ziemlich leicht an andere Devices anpassen lassen.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

19.04.2002, 21:47 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:

@Holger, Beeblebrox: das ist sehr schlechter Stil. Die Request-Struktur sollte immer mit CreateExtIO angelegt werden.

Vorausgesetzt, die Ziel-OS-Version besitzt diese Funktion.
Zitat:
Außerdem brauchst du noch einen Reply-Port, sonst kannst du nicht auf das Ergebnis warten.
Nur, wenn man auch IO-Funktionen benutzt. Ich habe extra darauf hingewiesen, daß die angesprochene Funktion nicht typisch ist.

mfg

--

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

[ - Antworten - Zitieren - Direktlink - ]

19.04.2002, 22:25 Uhr

thomas
Posts: 7716
Nutzer
Zitat:
Vorausgesetzt, die Ziel-OS-Version besitzt diese Funktion.

Das hat mit dem Ziel-OS nichts zu tun. Die Funktion ist in der amiga.lib enthalten und funktioniert unter allen OS-Versionen, einschließlich 1.3 und älter.

Zitat:
Nur, wenn man auch IO-Funktionen benutzt. Ich habe extra darauf hingewiesen, daß die angesprochene Funktion nicht typisch ist.

Stimmt, das mit GetSysTime() habe ich erst hinterher gelesen.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

20.04.2002, 10:05 Uhr

Beeblebrox
Posts: 723
Nutzer
Danke ersteinmal.. das mit dem timer.device hat gut funktioniert.
Nun liefert aber GetSysTime nur die vergangenen Sekunden seit dem
ersten Januar 1978.. das war mir schon klar. Nur hatte ich nicht
beachtet, daß es wohl keine OS-Funktion gibt, die das Datum aufge-
schlüsselt in Jahr, Monat, Tag, Stunden,... in einer Struktur oder
so ablegt. Muß ich jetzt echt nen eigenen Kalender programmieren,
nur um an die Uhrzeit zu kommen ? Ich habe ein Display an meinen
Parallelport gebastelt und das soll neben dem freien Ram, was es
bislang anzeigt auch die Zeit zeigen.

[ - Antworten - Zitieren - Direktlink - ]

20.04.2002, 12:18 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Beeblebrox:
Nur hatte ich nicht beachtet, daß es wohl keine OS-Funktion gibt, die das Datum aufgeschlüsselt in Jahr, Monat, Tag, Stunden,... in einer Struktur oder so ablegt.

Wie kommst Du darauf, daß es so etwas nicht gibt ?
Aber Du schießt hier sowieso mit Kanonen auf Spatzen. Hättest Du gesagt, was Du wirklich willst, hätten wir Dir auch gesagt, daß Du das timer.device nicht brauchst. Benutze einfach die DOS-Funktion DateStamp() und Du erhält die Anzahl der Minuten seit Mitternacht.
Du kannst allerdings auch aus dem Ergebnis mit der Funktion DateToStr() einen formatierten Text erzeugen.

mfg

--

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

[ - Antworten - Zitieren - Direktlink - ]

20.04.2002, 12:29 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Das hat mit dem Ziel-OS nichts zu tun. Die Funktion ist in der amiga.lib enthalten und funktioniert unter allen OS-Versionen, einschließlich 1.3 und älter.

Na ja, als alter Assembler-Programmierer sieht man halt nur die Funktionen, die tatsächlich im OS vorhanden sind.:glow:
Das mit den Strukturen ist sowieso ein Design-Fehler des AmigaOS. Man hätte gleich von Beginn an für alle von OS definierten Strukturen auch OS-Funktionen zum Anlegen anbieten, bzw. auch als einzige Möglichkeit definieren müssen.

mfg

--

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

[ - Antworten - Zitieren - Direktlink - ]

20.04.2002, 21:08 Uhr

Beeblebrox
Posts: 723
Nutzer
Also euer Aufwand war wahrlich nicht umsonst, jetzt weiß ich
wenigstens grundsätzlich wie man mit einem Device klarkommt.
Dass ich nichts von den anderen Funktionen weiß liegt daran,
daß ich blind in Hothelp (OS2.1) und der Developer CD nach
passenden Funktionen suche. Und wenn es keinen Verweis zu einer
anderen gibt ist das schlecht. Von meinen Bekannten, Freunden
benutzt mitlerweile eh niemand mehr nen Amiga.

[ - Antworten - Zitieren - Direktlink - ]

21.04.2002, 15:47 Uhr

Holger
Posts: 8116
Nutzer
@Beeblebrox:
Nun, wenn Du eine Developer-CD hast, sieh doch mal unter Reference/Includes_and_Autodocs/INCLUDES_AND_AUTODOCS, bzw Reference/Includes_and_Autodocs/INCLUDES_AND_AUTODOCS_3.5 (DevCD 2)nach. Dort sind zumindest alle Funktionen dokumentiert. Leider besitzt AmigaGuide, bzw. MultiView keine ansprechende Suchfunktion.

mfg

--

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 > Wie ein WINDOW deaktivieren? [ - Suche - Neue Beiträge - Registrieren - Login - ]


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