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

amiga-news.de Forum > Programmierung > MaxonBasic, Datatypes, Durchblick? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 [ - Beitrag schreiben - ]

07.03.2004, 12:47 Uhr

Ralf27
Posts: 2779
Nutzer
Jup, C... schon klar. ;)

Ich hab hier ein Beispiel in MaxonBasic das Bilder mit Datatypes läd. Leider ist das sowas von "C-Artig" das ich es leider kaum verstehn.
Vorallem an der Stelle an der mit IDCMP gearbeitet wird.

Also folgendes:

Der Programm soll ein Fenster nach Basic-Manier öffnen(z.b. Window 3,"titel" ), ein Bild laden und nach dem laden normal weiterlaufen, bzw. dto& schliesen (Beispielskript).

Ein Großteil des Programms ist mir klar, nur halt die interne Schleife nicht. :-(

Könnte mir da einer helfen?

Beispielskript:
http://home.t-online.de/home/320047197592/dto.bas





--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 07.03.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 13:18 Uhr

Mazze
Posts: 263
Nutzer
Meinst du die IDCMP_UPDATE-Geschichte?
Das Erzeugen des Datatypes wird als eigener Task im Hintergrund durchgeführt. Wenn dies fertig ist, wird ein IDCMP_UPDATE-Signal gesendet, und das Programm setzt den Busy-Mauszeiger wieder zurück.

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 13:19 Uhr

Holger
Posts: 8116
Nutzer
Kannst Du Dich etwas präziser ausdrücken?
Was verstehst Du jetzt genau nicht?

Hast Du generell Probleme mit IDCMP oder nur speziell mit Datatype-Messages?

Kurz zusammengefaßt:
Datatypes Bilder werden asynchron geladen, weshalb es nicht reicht, das Fenster mit dem Objekt drin zu öffnen. Man muß darauf warten, daß das Objekt Vollzug meldet, und es neu zeichnen. Deshalb kommt man nicht drumherum, IDCMP-Messages auszuwerten. Die Messages, die das DT-Objekt betreffen, werden in Zeile 94-119 ausgewertet. Da IDCMP_IDCMPUPDATE eine TagList liefert, wird diese in einer Schleife durchlaufen. Das erwähnte Neuzeichnen passiert in Zeile 115/116.

Generell kann man sagen, daß Datatypes nicht gut für eine Programmierung der Art "xyz machen und dann im Programm weiterlaufen" geeignet sind. Es handelt sich eben um ein objektorientiertes Programmiersystem, daß sich in die event-gesteuerte Arbeitsweise des AmigaOS einpassen soll.

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

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 14:09 Uhr

Mad_Dog
Posts: 1944
Nutzer
@Ralf27:

Hast Du die "Rom Kernel Reference Manuals" oder irgend eine andere Dokumentation der Amiga-API? Wenn ja, dann schau Dir mal die Abschnitte über die "Message-Loops" an.

Ich kann zwar noch nicht genau nachvollziehen, was Du machen willst, aber Du kannst, wenn Du auf einen Event (= ein Ereignis) wartest, wie folgt vorgehen: Mach in Deinem Programm eine Endlosschleife, die verlassen wird, sobald das entsprechende Objekt das Signal liefert. Damit kannst Du dann dafür sorgen, daß das Programm erst weitergeht, wenn der entsprechende Event (z.B. ein anderer Task sendet ein Signal) eingetreten ist.

So macht man das ja auch bei einem Programm, das beendet werden soll, sobald man ein bestimmtest Fenster schließt. Da machst Du auch eine Endlosschleife (die Hauptschleife des Programms), die dann verlassen wird, wenn Intuition meldet, daß das Close-Gadget des Fensters angeklickt wurde.

Damit Du einmal eine Vorstellung davon hast: Stell Dir mal vor, Du machst ein einfaches Programm, bei dem in einer Schleife irgendwelche Berechnungen vorgenommen werden. Damit der User abbrechen kann, baust Du eine Variable ein, die auf "1" gesetzt wird, sobald der Benutzer z.B. die Escape-Taste gedrückt hat. Nun baust Du eine Bedingung ein, daß die Schleife vorzeitig abgebrochen wird, sobald diese Variable den Wert "1" angenommen hat.

So ähnlich kannst Du Dir das mit den Messages auch vorstellen, nur daß die Signale auch von anderen Tasks kommen können.

Das hat eigentlich nichts mit der verwendeten Programmiersprache zu tun, sondern mit den Mechanismen des Betriebssystems (z.B. Tasking, Messages).

Das Thema kommt auch irgend wann mal in meinem C-Kurs dran...
Verfolgst Du den Kurs? :)
--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 14:21 Uhr

Ralf27
Posts: 2779
Nutzer
@Mad_Dog

Ich hab da nur ein Problem: Ich kann quasi kein Englisch und somit kann ich leider recht wenig mit englischer Dokumentation anfangen.

Aber seit langer Zeit versuche ich mich der Datatypes zu "bemächtigen", aber bis jetzt.... aber ich will das endlich hinbekommen! :)

Objektorientiert... nunja, das ist halt was neues für mich als alter AmigaBasic progger der seine Progs mit dem MaxonBasic-Compiler compiliert. :)
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 14:32 Uhr

Mad_Dog
Posts: 1944
Nutzer
Du mußt Dir eigentlich nur klar machen, daß der Datatype die Daten "im Hintergrund" (über einen anderen Task) lädt. Und deshalb muß Dein Programm irgendwie mitbekommen, daß dieser andere Task fertig ist. Und das funktioniert über Signale. Wenn du also auf ein Signal warten willst, kannst Du eine Endlosschleife oder Wait() (AmigaOS API-Funktion) benutzen.

--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 14:43 Uhr

Mad_Dog
Posts: 1944
Nutzer
Ich poste hier mal eine Beispielprogramm (die header-Datei lasse ich jetzt mal weg). Achte mal darauf, was am Ende des Programms passiert.

code:
/*  Fraktalstern
 *  Norman Walter 26.12.2001
 *  Demonstriert rekursive Algorithmen
 *  und die Verwendung der Amiga Grafik-Primitiven
 */

#include <exec/types.h>
#include <intuition/intuition.h>
#include <graphics/gfx.h>

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Screen *Screen;
struct Window *Window;
struct RastPort *rp;

#include "stdwindow.h"  /* Eigenes Include-Flie */

void box(int x, int y, int r)

{
   /* Zeichnet ein Quadrat mit Radius r an den Koordinaten x,y */
   /* Es werden die Grafik-Primitiven aus dem ROM verwendet    */

   RectFill(rp,x-r,y-r,x+r,y+r);  // Rechteck zeichnen

}

void star( int x, int y, int r)

   /* Zeichnet Fraktalstern durch rekursive Funktionsaufrufe */

{
    if (r>0)
        {
            star(x-r,y+r,r/2);
            star(x+r,y+r,r/2);
            star(x-r,y-r,r/2);
            star(x+r,y-r,r/2);
            box(x,y,r);
        }

}


void main(void)
    {

        open_libs(); /* Librarys öffnen */

        Window = (struct Window *) open_window(
                  20,20,400,300," Fraktalstern ",
                  WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | ACTIVATE | GIMMEZEROZERO,
                  CLOSEWINDOW, NULL);

        /* GIMMEZEROZERO verhindert, daß SystemGadgets übermalt werden */

        if (Window == NULL) exit(FALSE);

        rp = Window->RPort;

        /* Fensterinhalt übermalen */
        SetAPen(rp, 1L);
        RectFill(rp,0,0,400,300);

      SetAPen(rp, 2L);  // Farbe setzen

        /* Fraktalstern zeichnen */
      star(200,150,80);

        /* Warte auf Mausklick in Close-Gadget */
        Wait(1L<< Window->UserPort->mp_SigBit);
        close_all(); /* Alles schließen */
    }


Hier wartet die AmigaOS API-Funktion Wait() darauf, daß Intuition das Signal liefert, daß das Close-Gadget des Fensters angeklickt wurde.
Erst dann geht's mit close_all() weiter.

Ähnliche Signale werden auch von den DataTypes gesendet. Damit teilt der DataType dem Betriebssystem (bzw. dem aufrufenden Programm) mit, daß er fertig ist.

--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 14:48 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Mad_Dog:
Wenn du also auf ein Signal warten willst, kannst Du eine Endlosschleife oder Wait() (AmigaOS API-Funktion) benutzen.

Also, bevor es noch schlimmer wird: ich bin mir sicher, Du meinst das Richtige, hast es nur mit der umgangssprachlichen Ausdrucksweise etwas unglücklich dargestellt.

Auf dem Amiga gibt es nur eine einzige Art, auf ein Signal zu warten, und das ist die AmigaOS-Funktion Wait(). Einige Funktionen, wie z.B. WaitPort() rufen ihrerseit Wait() auf, weshalb man in diesen Fällen das Wait() weglassen kann.

Da Wait() nur für Signale zuständig ist, aber nichts über die Bedingung weiß, auf die das Programm tatsächlich wartet, ist es meistens so, daß dieser Wait()-Aufruf im Programm innerhalb einer Schleife stattfindet, die diese zusätzliche Bedingung überprüft, wie z.B. ob das Bild jetzt fertig geladen wurde, oder der Benutzer den Menüpunkt "Beenden" gewählt hat.

Deshalb ist es auch typisch für Amiga-Programme, den Großteil ihrer Lebenszeit in einer Schleife zu verbringen, bis die Bedingung zum Beenden erfüllt ist, ein bool'sches Flag oder das ctrl-c Signal.

Endlosschleifen sollten dagegen nie in einem fertigen Programm auftauchen.

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

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 14:57 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von Mad_Dog:
Wenn du also auf ein Signal warten willst, kannst Du eine Endlosschleife oder Wait() (AmigaOS API-Funktion) benutzen.

Also, bevor es noch schlimmer wird: ich bin mir sicher, Du meinst das Richtige, hast es nur mit der umgangssprachlichen Ausdrucksweise etwas unglücklich dargestellt.

Richtig. :D Die Funktion Wait() ist auch nur eine Schleife, die solange läuft, bis die Abbruchbedingung erfüllt ist. Das wollte ich damit sagen.

Siehe auch Beispielcode.

@Ralf27:

Versuch niemals, die Funktion Wait() mit Parameter 0 aufzurufen, denn dann wartet das Programm für immer!


--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 14:59 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Ich hab da nur ein Problem: Ich kann quasi kein Englisch und somit kann ich leider recht wenig mit englischer Dokumentation anfangen.

Ich befürchte, dann ist die Sprache, die Du als nächstes lernen solltest, Englisch und nicht C.
Der C-Kurs wird vielleicht auch mal solche Themen erreichen, aber es wird leider immer wieder passieren, daß es für irgendeine Bibliothek oder Programmiertechnik erstmal nur englische Dokumentation gibt.
Mit den zu erwartenden AOS4-Neuerungen wird das auch so sein...
Zitat:
Objektorientiert... nunja, das ist halt was neues für mich als alter AmigaBasic progger der seine Progs mit dem MaxonBasic-Compiler compiliert. :)
Auch wenn viele meinen, objektorientiert zu programmieren heißt von C nach C++ umzusteigen (oder ähnliches): es hat nichts mit der verwendeten Programmiersprache zu tun. Gerade die Datatypes kann man ja problemlos auch mit C oder Basic verwenden.

Es geht dabei um die Denkweise. Und der event-gesteuerte Programmablauf wiegt für Dich scheinbar momentan schwerer, als der objektorientierte Ansatz.
Es geht eben darum, daß ein Programm nicht einfach etwas ist, das von oben nach unten durchrattert und evtl. noch Schleifen und Verzeigungen hat, sondern einen Zustand besitzt, der durch Messages von außen, wie z.B. Benutzereingaben, verändert wird.
Egal, ob das jetzt Maus/Tastatureingaben oder ARexx-Kommandos sind, oder eine Diskette eingelegt wurde, immer schickt das System Nachrichten an die interessierten Programme.

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

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:03 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Mad_Dog:
Richtig. :D Die Funktion Wait() ist auch nur eine Schleife, die solange läuft, bis die Abbruchbedingung erfüllt ist. Das wollte ich damit sagen.

Gerade das stimmt ja eben nicht.
Solange sich ein Programm in der Wait()-Funktion befindet, wird kein Code, auch keine Schleife ausgeführt. Der Task wird schlafengelegt und verbraucht keine Prozessorzeit, bis das Signal eintritt.

Man kann es sich in Gedanken wie eine konventionelle Schleife vorstellen, sollte aber immer bewußt sein, daß es einen ganz konkreten Grund gibt, warum man immer Wait() statt einer selbstprogrammierten Warteschleife benutzen soll.

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

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:08 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Holger:

Es geht dabei um die Denkweise. Und der event-gesteuerte Programmablauf wiegt für Dich scheinbar momentan schwerer, als der objektorientierte Ansatz.
Es geht eben darum, daß ein Programm nicht einfach etwas ist, das von oben nach unten durchrattert und evtl. noch Schleifen und Verzeigungen hat, sondern einen Zustand besitzt, der durch Messages von außen, wie z.B. Benutzereingaben, verändert wird.
Egal, ob das jetzt Maus/Tastatureingaben oder ARexx-Kommandos sind, oder eine Diskette eingelegt wurde, immer schickt das System Nachrichten an die interessierten Programme.


Ein Event-gesteuertes Programm rattert auch von oben nach unten durch. Aber sobald man bestimmte AmigaOS API-Funktionen benutzt, werden dadurch Tasks gestartet, die -quasi parallel- "neben" dem aufrufenden Programm herlaufen. Um Konflikte zu vermeiden, muß man eben eventuell warten, bis der andere Task über ein Signal mitteilt, daß er fertig ist. Im Zweifel wertet man dann noch aus, ob der Task auch tatsächlich das gemacht hat, was er tun sollte (z.B. Bild laden).


--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:22 Uhr

Ralf27
Posts: 2779
Nutzer
Ich bin immer wieder erfreut wie schnell man hier im Programmiererforum Hilfe und Infos bekommt. Danke! :) :)

Ich hab eben mein Programm angepasst, damit ich mit den Datatypes das Bild laden kann, allerdings nicht gerade optimal:

Ich hab denn eigentlich Beispielcode fast so gelassen wie er ist (siehe ganz oben). Ich hab nur unten nach dem RefreshDTObjektA dto&,win&,NULL&,NULL& folgendes hinzugeschrieben:

ClipBlit& qrast&,x1,y1,zrast&,0,0,nomwidth&,nomheight&,&HC0
going=FALSE&

Das BasicFenster habe ich VOR dem LIB-Fenster generiert und auch gleich denn Rastport in zrast& gespeichert. qrast& ist der Rastport des LIB-Fenster.
Das Programm arbeitet also normal ab und wenn es fertig ist dann wird das Bild in ein Basic-Fenster kopiert und das alte LIB-Fenster geschlossen, sowie alles anderes was mit dem Unterprogramm geöffnet worden ist.
Wenn vorher das LIB-Fenster geschlossen wird oder ein sonstiger Fehler gemeldet wird, dann wird das natürlich auch bearbeitet.

Ist zwar nicht die feine englische Art, aber es funktioniert.

Vorerst, aber ich werd mich auch noch näher mit der Wait()-Funktion befassen.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:23 Uhr

Ralf27
Posts: 2779
Nutzer
Kurze Frage:

Würde das

ClipBlit& qrast&,x1,y1,zrast&,0,0,nomwidth&,nomheight&,&HC0

auch mit Grafikkarten funktionieren???
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:27 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Mad_Dog:
Ein Event-gesteuertes Programm rattert auch von oben nach unten durch. Aber sobald man bestimmte AmigaOS API-Funktionen benutzt, werden dadurch Tasks gestartet, die -quasi parallel- "neben" dem aufrufenden Programm herlaufen.

Genau das meine ich mit Denkweise. Dem Prozessor ist es letztendlich egal, ob ich codefluß-, event- oder objektorientiert, single- oder multithreaded programmiert habe.
Der Code ist im wesentlichen der gleiche, Unterschiede gibt's nur in der Frage wie gut ich das Problem lösen konnte und wie gut der Sourcecode im Nachhinein gelesen und ggf weiterentwickelt werden kann.

Es ist eben sehr schwer ein Programm zu entwickeln, in dem ein Benutzer über ein dutzend verschiedene Dialoge beliebige Menüpunkte und beliebige ARexx-Kommandos in beliebiger Reihenfolge absetzen kann, wenn man es gleichzeitig in Gedanken in ein Programmfluß-Schema pressen will.
Die Orientierung an dem Zustand ist natürlich, sie entspricht auch der Denkweise des Benutzers einer grafischen Schnittstelle. Der Nutzer klickt z.B. auf einem Bild herum, verändert es damit, bis er "speichern" und dann "beenden" wählt. In seinen Gedanken existiert keine Schleife und er würde es meistens auch kategorisch ablehnen, wenn man ihm sagen würde, daß er sich im Kreis dreht.:lach:

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

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:29 Uhr

Mad_Dog
Posts: 1944
Nutzer
Du solltest dir auch nochmal die Window-Struktur anschauen...
Man kann ein DataType Objekt auch zu einem Fenster hinzufügen.

Da muß nichts geblittet werden.

Aber ehrlich gesagt, sieht der Basic-Beispielcode ziemlich wild aus, mit den vielen PEEKs und so... wie gesagt: Mit C geht sowas viel leichter. :D
--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:31 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Kurze Frage:

Würde das

ClipBlit& qrast&,x1,y1,zrast&,0,0,nomwidth&,nomheight&,&HC0

auch mit Grafikkarten funktionieren???
--
http://www.alternativercomputerclub.de.vu

Ja.
Aber gibt es in MaxonBasic keine Möglichkeit, die Fensteradresse eines Basic-Fensters zu erhalten, um es direkt mit DT zu benutzen, ohne diesen Umweg?

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

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:32 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Mad_Dog:
Du solltest dir auch nochmal die Window-Struktur anschauen...
Man kann ein DataType Objekt auch zu einem Fenster hinzufügen.

Da muß nichts geblittet werden.

Aber ehrlich gesagt, sieht der Basic-Beispielcode ziemlich wild aus, mit den vielen PEEKs und so... wie gesagt: Mit C geht sowas viel leichter. :D
--

http://www.norman-interactive.com



Wie besorgt man sich unter C denn Inhalt einer Speicherstelle?

Leider geht das nicht mit dem direkt ins Window von Basic.
Ich müßte erst denn IDCMP-UPDAT-Flag setzen, was direkt nicht geht. Ich suche gerade nach einer Möglichkeit das zu machen und dann werde ich alles Stück für Stück zerpflücken. :)



--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:38 Uhr

Holger
Posts: 8116
Nutzer
Nachtrag:
In AmigaBasic ging das mit der Funktion WINDOW(7), das lieferte die Intuition-Window Struktur des aktuellen Basic-Fensters.

Geht das mit MaxonBasic vielleicht auch?

Also im Beispiel statt
win&=OpenWindowTagList&(NULL&,VARPTR(tl&(0)))
einfach
win&=WINDOW(7)
benutzen und in's Basic Fenster gucken... (Achtung: die
CloseWindow win&
Anweisung entfernen, sonst gibt's höchstwahrscheinlich Probleme:nuke: )

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

[ Dieser Beitrag wurde von Holger am 07.03.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:43 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von Ralf27:
Kurze Frage:

Würde das

ClipBlit& qrast&,x1,y1,zrast&,0,0,nomwidth&,nomheight&,&HC0

auch mit Grafikkarten funktionieren???
--
http://www.alternativercomputerclub.de.vu

Ja.
Aber gibt es in MaxonBasic keine Möglichkeit, die Fensteradresse eines Basic-Fensters zu erhalten, um es direkt mit DT zu benutzen, ohne diesen Umweg?

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


Gibt es schon:
win&=window(7)


Ich muß allerdings "nur" nachträglich den IDCMP-Update-Flag setzen. Ich schau gerade nach wie ich das machen könnte.



--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 07.03.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:47 Uhr

Mad_Dog
Posts: 1944
Nutzer
@Holger:

Stimmt schon, was Du sagst. Objektorientiertes Programmieren kommt der natürlichen Denkweise des Menschen schon näher als andere Ansätze...

Aber: "Objektorientiert" heißt nicht automatisch gleich, daß mehrere Tasks -quasi parallel- nebenher laufen. "Objektorientiert" heißt ja nur, daß man Objekte hat, die Attribute (Eigenschaften) und Methoden (Funktionen) hat. Also z.B. eine Klasse "Auto", die bestimmte Attribute wie z.B. "Gewicht" und Methoden wie z.B. "nach links lenken" hat. Dann hat man Instanzen dieser Klasse...

Und wenn man dann programmiert, schreibt man z.B.

code:
MeinAuto.lenke_nach_links();


Dann wird auf Instanz MeinAuto die Methode "lenke_nach_links()"
angewandt usw. .

Das heißt aber noch lange nicht, daß hier irgend ein anderer Task beteiligt sein muß. Das kann zwar sein, muß aber nicht.

Aber ich glaub, jetzt verwirren wir Ralf27 ein Bisschen zu sehr... ;)



--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:50 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Ich muß allerdings "nur" nachträglich den IDCMP-Update-Flag setzen. Ich schau gerade nach wie ich das machen könnte.

Success = ModifyIDCMP( Window, IDCMPFlags )

Das Problem ist, daß Du die Flags hinterher wahrscheinlich auf den alten Wert setzen willst, das heißt in Basic wieder zu peek() greifen.

Und MaxonBasic könnte Probleme machen, wenn unerwartete Messages ankommen...

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

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:50 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
Nachtrag:
In AmigaBasic ging das mit der Funktion WINDOW(7), das lieferte die Intuition-Window Struktur des aktuellen Basic-Fensters.

Geht das mit MaxonBasic vielleicht auch?

Also im Beispiel statt
win&=OpenWindowTagList&(NULL&,VARPTR(tl&(0)))
einfach
win&=WINDOW(7)
benutzen und in's Basic Fenster gucken... (Achtung: die
CloseWindow win&
Anweisung entfernen, sonst gibt's höchstwahrscheinlich Probleme:nuke: )

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

[ Dieser Beitrag wurde von Holger am 07.03.2004 editiert. ]



Das stimmt. Allerdings muß ich erst das IDCMP-Update-Flag setzen und das geht nicht direkt mit MaxonBasic. Ich muß das irgendwie nachträglich setzen.

PS:
AmigaBasic Programme laufen eigentlich zu 100% auch auf MaxonBasic. Jedenfalls hab ich damit noch keine Probleme gehabt. :)

Und das ganze geht auch fast 100% in Richtung QBASIC (DOS). Allerdings werden dort Screens anderst gehandhabt und auch Dateien werden dort anderst geöffnet, bearbeitet (z.b. wegen dem Pfad).
(Das ganze bei QBASIC natürlich nur wenn man keine Library benutzt. :) )
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 07.03.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:55 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Ralf27:

Wie besorgt man sich unter C denn Inhalt einer Speicherstelle?

Leider geht das nicht mit dem direkt ins Window von Basic.
Ich müßte erst denn IDCMP-UPDAT-Flag setzen, was direkt nicht geht. Ich suche gerade nach einer Möglichkeit das zu machen und dann werde ich alles Stück für Stück zerpflücken. :)



Welche Speicherstelle willst Du denn?

Du mußt Dir überhaupt erst mal klar machen, daß ein Window eine Struktur mit verschiedenen Komponenten ist. Die Definition dieser Struktur steht in intuition/intuition.h.

In C macht man das dann so, daß man einen Zeiger auf diese Struktur hat. Damit kann man dann auf die Komponenten zugreifen (siehe auch C-Kurs).

Falls Du den RastPort eines Fensters meinst: Auch der ist eine Komponente der Window Struktur.
--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 15:55 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Mad_Dog:
Stimmt schon, was Du sagst. Objektorientiertes Programmieren kommt der natürlichen Denkweise des Menschen schon näher als andere Ansätze...

Aber: "Objektorientiert" heißt nicht automatisch gleich, daß mehrere Tasks -quasi parallel- nebenher laufen.

Ich schrieb ja auch an Ralf: Und der event-gesteuerte Programmablauf wiegt für Dich scheinbar momentan schwerer, als der objektorientierte Ansatz.

Die Datatypes sind nunmal beides.

Und ich habe deshalb in diesem Zusammenhang auch nicht von objektorientiert, sondern zustandsorientiert gesprochen.
Objektorientierung wäre die logische Weiterentwicklung daraus, mit Vererbung, Polymorphismus und dem ganzen Krempel, der im Zusammenhang mit "event-gesteuert" erstmal nicht so wichtig ist.

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

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 16:00 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Das stimmt. Allerdings muß ich erst das IDCMP-Update-Flag setzen und das geht nicht direkt mit MaxonBasic. Ich muß das irgendwie nachträglich setzen.

Ja, an diesem Thread kann man sehen, was dabei herauskommt, wenn parallel verarbeitet wird und man keine ausreichenden Synchronisationsmechanismen hat.

Auch wenn's oben schon steht (Nur damit es nicht im Thread untergeht):
Success = ModifyIDCMP( Window, IDCMPFlags )
lautet die Funktion.

In Basic dann wohl Success% = ModifyIDCMP&( Window&, IDCMPFlags& )
oder so ähnlich.

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

[ Dieser Beitrag wurde von Holger am 07.03.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.03.2004, 18:23 Uhr

chkamiga
Posts:
[Ex-Mitglied]
>Ja.
>Aber gibt es in MaxonBasic keine Möglichkeit, die Fensteradresse eines Basic-Fensters zu erhalten, um es direkt mit DT zu benutzen, ohne diesen Umweg?


Sicher gibts alles


Amiga-Basic Programme(gross) musste ich eingentlich immer
für Maxonbasic anpassen bevor sie gelaufen sind...
--
http://people.freenet.de/CHRAmiga.de

CHRKUM@web.de

[ - Ändern - Antworten - Zitieren - Direktlink - ]

07.03.2004, 19:14 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von chkamiga:
>Ja.
>Aber gibt es in MaxonBasic keine Möglichkeit, die Fensteradresse eines Basic-Fensters zu erhalten, um es direkt mit DT zu benutzen, ohne diesen Umweg?


Sicher gibts alles


Amiga-Basic Programme(gross) musste ich eingentlich immer
für Maxonbasic anpassen bevor sie gelaufen sind...
--
http://people.freenet.de/CHRAmiga.de


CHRKUM@web.de


Was mußtest Du denn anpassen?!?

--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

08.03.2004, 16:26 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von Ralf27:
Kurze Frage:

Würde das

ClipBlit& qrast&,x1,y1,zrast&,0,0,nomwidth&,nomheight&,&HC0

auch mit Grafikkarten funktionieren???
--
http://www.alternativercomputerclub.de.vu

Ja.
Aber gibt es in MaxonBasic keine Möglichkeit, die Fensteradresse eines Basic-Fensters zu erhalten, um es direkt mit DT zu benutzen, ohne diesen Umweg?

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


Ich hab es eben mit einer Grafikkarte getestet und es funktioniert definitiv nicht richtig :dance3:

Unter AGA ohne Probleme und mit Grafikkarte stimmt es nicht ganz (16Bit) (Farbfehler).

Was wäre besser geeigenet als ClipBlit?
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

08.03.2004, 16:54 Uhr

Ralf27
Posts: 2779
Nutzer
Hin und wieder ist es doch einfacher als man denkt...

Ich hab es geschaft und zwar richtig! :D

Statt ein Window mit DOS aufzubauen nehme ich einfach ein Standart Window von Basic und setze zusätzlich das IDMCP-Update-Flag, fertig. :)

Hin und wieder sieht man die Lösung vor lauter Problemen nicht. *lol*
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > MaxonBasic, Datatypes, Durchblick? [ - Suche - Neue Beiträge - Registrieren - Login - ]


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