Beiträge von Wilfried

    Klar!

    Ich hab's noch mal genauer untersucht:
    UHR_BREITE 105
    UHR_HOEHE 105
    Das waren meine Konstanten, die sowohl für die View-Document-Größe als auch für GrCreateBitmap in MSG_GEN_PROCESS_OPEN_APPLICATION benutzt werden. Ich weiß allerdings nicht mehr, warum ich diese Werte genommen habe. Meine Bitmap (vom Iconeditor erzeugt war 99 x 99 groß (damit ich einen eindeutigen Mittelpunkt hatte). Diese Größe hab ich auf 100 x 100 vergrößert, ohne dass die Warnung verschwand. Danach habe ich die Werte für die Konstanten verändert und herausgefunden, dass die Warnung verschwindet, sobald UHR_BREITE durch 4 teilbar ist. Der Wert für UHR_HOEHE ist offenbar nicht relevant.
    Entscheidend ist, dass die Breite in GrCreateBitmap durch 4 teilbar ist.
    Die Bitmap ist übrigens vom Typ BMF_4BIT.

    Gruß
    Wilfried

    P.S.: Damit ist meine Uhr fertig:-)

    Das Problem hat sich geklärt: Ich hatte eine Unstimmigkeit zwischen den Bitmapgrößen bei GrCreateBitmap und der tatsächlichen Größe.

    Danke nochmal an Rainer und Jörg!

    Gruß

    Wilfried

    Die Bitmap wird vom Iconeditor mit BMF_4Bit geliefert und sie wird in der Applikation richtig dargestellt.
    Das Huge-Array hat exakt die richtige Größe.
    Die verwendeten Farben sind aus den 16 Farben im Iconeditor gewählt.

    NON_INTEGRAL_WIDTH = nicht ganzzahlige Breite ? Könnten die gepackten Bitmapdaten die Ursache sein?

    Wilfried

    Hallo Rainer,

    zuerst mal vielen Dank für deine Mühe!

    Dein BMPGAMSR ist mir tatsächlich viel zu komplex, um es gleich zu verstehen, dein modifiziertes Doggy-Bitmap dagegen habe ich verstanden :) .

    Trotzdem wollte ich wissen, warum meine Version nicht wie gewünscht funktioniert. Ich habe mit Swat herausgefunden, dass @call Doggy::MSG_VIS_INVALIDATE erst zur Wirkung kommt, wenn alle Methoden abgeschlossen sind. Dann wird der letzte Stand der Bitmap angezeigt. Keine Ahnung, warum das so ist.

    In deiner Version bin ich auf @call Doggy::MSG_VIS_REDRAW_ENTIRE_OBJECT gestoßen und habe @call Doggy::MSG_VIS_INVALIDATE damit ersetzt. Und siehe da: Jetzt funktioniert meine Version wie gewünscht! :) :)


    Wilfried

    Ergänzung: MSG_VIS_MARK_INVALID(VOF_GEOMETRY_INVALID | VOF_IMAGE_INVALID, VUM_NOW) wirkt auch nicht.

    @object GenTriggerClass Start = {
    GI_visMoniker = 'S', "Start";
    GTI_actionMsg = MSG_STARTE_UHR;
    GTI_destination = process;
    HINT_SEEK_MENU_BAR;
    }
    @object GenTriggerClass Bild1 = {
    GI_visMoniker = '1', "Bild1";
    GTI_actionMsg = MSG_BITMAP1_DRAW_TO_DYNAMIC_BITMAP;
    GTI_destination = process;
    HINT_SEEK_MENU_BAR;
    }
    @object GenTriggerClass Bild2 = {
    GI_visMoniker = '2', "Bild2";
    GTI_actionMsg = MSG_BITMAP2_DRAW_TO_DYNAMIC_BITMAP;
    GTI_destination = process;
    HINT_SEEK_MENU_BAR;
    }

    @method BitmapProcessClass, MSG_STARTE_UHR
    {
    @call self::MSG_BITMAP1_DRAW_TO_DYNAMIC_BITMAP();
    TimerSleep(100);
    @call self::MSG_BITMAP2_DRAW_TO_DYNAMIC_BITMAP();
    }
    @method BitmapProcessClass, MSG_BITMAP1_DRAW_TO_DYNAMIC_BITMAP
    {
    VMFileHandle vmfBitmap;
    VMBlockHandle vmbBitmap;
    GStateHandle gsBitmap;
    Bitmap *ptrDoggyBmp;

    @call Doggy::MSG_DOGGY_GET_HUGE_BITMAP_INFO(&vmfBitmap, &vmbBitmap, &gsBitmap);

    MemLock(OptrToHandle(@doggyBmp));
    ptrDoggyBmp = LMemDeref(@doggyBmp);
    GrClearBitmap(gsBitmap); //Ki
    GrDrawBitmap(gsBitmap, 5, 5, ptrDoggyBmp, 0);
    MemUnlock(OptrToHandle(@doggyBmp));

    GrDrawVLine(gsBitmap, 29, 29, (DOGGY_HEIGHT-10));

    @send Doggy::MSG_VIS_INVALIDATE();
    }
    @method BitmapProcessClass, MSG_BITMAP2_DRAW_TO_DYNAMIC_BITMAP
    {
    ...
    GrDrawHLine(gsBitmap, 29, 29, (DOGGY_WIDTH-10));
    ...
    }

    Klick auf Trigger Bild1->Bild1 erscheint, Klick auf Trigger Bild2-> Bild2 erscheint. Beliebig wiederholbar.
    Klick auf Trigger Start-> Bild 2 erscheint nach einer kleinen Pause.
    Tatsächlich sichtbar wird das Bild durch MSG_VIS_DRAW. Diese Methode sollte ja eigentlich durch @send Doggy::MSG_VIS_INVALIDATE() aufgerufen werden. Wenn ich mit Swat einen Stop in MSG_VIS_DRAW setze und dann im Einzelschrittmodus weitergehe, wird mir das bestätigt. Bei Klick auf Trigger Start erfolgt der Stop aber erst mit der 2. Methode.

    Wilfried

    Ich habe in der Menüzeile 2 Trigger, die mir nach Klick jeweils ein Bild (Bitmap) anzeigen. Ich beliebig zwischen den Bildern hin- und herwechseln. Ein 3. Button soll die beiden Bilder nun einmalig nacheinander anzeigen, mit einer kleinen Pause (TimerSleep) dazwischen. In der von Trigger 3 aufgerufenen Methode werden nacheinander die zu den Triggern 1 und 2 gehörenden Methoden aufgerufen. Ergebnis: Es erscheint immer nur das 2. Bild. Wenn ich die Pause vergrössere, erscheint das 2. Bild entsprechend verzögert. Wo liegt mein Denkfehler?

    Wilfried

    Wenn ich mich recht entsinne, dann ist die Uhr eine Vektorgrafik. Und die wird jedes mal gelöscht und komplett wieder neu gezeichnet. Deshalb muss die Uhr flackern.

    Das sehe ich auch so, allerdings wird immer nur das zu verändernde Objekt gelöscht und neu gezeichnet, nicht die ganze Uhr.

    Ich habe keine Übersicht über die gesamte Palette von Geos-Anwendungen, daher meine Frage, ob es vielleicht noch andere (Analog)Uhren gibt.

    Hallo Jörg!

    Ich habe mich missverständlich ausgedrückt. Mit "kontinuierlich" meinte ich, dass die Zeiger weich in die jeweils neue Stellung übergehen. Diese Uhr aber flackert bei jeder Zeigeränderung.

    Wilfried

    VirtualBox ist anscheinend nicht in der Lage, die Targets im Fenster von XP laufen zu lassen.
    Ich hab jetzt mal die Targets aus pcgeos-sdk-win32-6.0.0.56.zip getestet. Auf meinem Hauptrechner laufen sie in der VirtualBox (fast) problemlos (im Vollbild), unabhängig von der Auflösung und Farbtiefe von XP. So lässt sich vermutlich die komplette Entwicklungsumgebung des SDK in der VM realisieren, allerdings muss man auf die komfortablere 2-Fenster-Lösung verzichten.

    Ich habe VirtualBox auf 5 verschiedenen Rechnern ausprobiert: 2 Desktops mit Win10/32 und 3 Notebooks mit Win10/64. Auf meinem neuesten Notebook (uefi) wollte XP gar nicht booten.
    Auf den anderen Rechnern wurde XP als VM installiert. Ensemble startete darin problemlos, die Targets gar nicht.

    Rainer: Bei dir läuft ja das Target in der XP-VM, aber nicht im Fenster oder?