Home MagiCMagiC Eingabefelder in MagiCEingabefelder in MagiC Spezielle Fehlermeldungen von MagiCSpezielle Fehlermeldungen von MagiC

11.7 scrollende Eingabefelder

/*******************************************************************
*
* Dieses Beispielprogramm demonstriert den Gebrauch scrollender
* Eingabefelder in MagiC 3.
*
*******************************************************************/

#include <aes.h>
#include <tos.h>
#include <string.h>
#include <magx.h>
#include "magxlib.h"
#include "edscroll.h"

#define TLEN  30

int  do_dialog    (OBJECT *dialog);

void main()
{
  OBJECT *adr_dialog;
  ULONG crdate;
  int is_scroll;

  XTED xted;
  char tmplt[TLEN+1],txt[TLEN+1];


  /* Feststellen, ob das System Scrolledit kann */
  /* ------------------------------------------ */

  is_scroll = ((0 < get_MagiC_ver(&crdate)) &&
    (crdate >= 0x19950829L));

     /* Applikation beim AES anmelden */
     /* ----------------------------- */

     if   (appl_init() < 0)
          Pterm(1);

     /* Resourcedatei laden */
     /* ------------------- */
     if   (!rsrc_load("edscroll.rsc"))
     {
          form_alert(1, "[3][Kann \"EDSCROLL.RSC\"|nicht finden][Abbruch]");
          goto err;
     }

     rsrc_gaddr(0, EDIT, &adr_dialog);

  /* Scroll-TEDINFO initialisieren */
  /* ----------------------------- */

  init_scrlted(adr_dialog+EDITTXT, is_scroll, &xted,
        txt, tmplt, TLEN);

  strcpy(txt, "Beispiel");

  /* Dialog */
  /* ------ */

     wind_update(BEG_MCTRL);
     graf_mouse(ARROW, 0L);
     do_dialog(adr_dialog);
     wind_update(END_MCTRL);
     rsrc_free();

  err:
     appl_exit();
     Pterm0();
}


/****************************************************************
*
* do_dialog
*
****************************************************************/

int do_dialog(OBJECT *dialog)
{
     int cx, cy, cw, ch;
     int exitbutton;

     form_center(dialog, &cx, &cy, &cw, &ch);
     form_dial(FMD_START, 0,0,0,0, cx, cy, cw, ch);
     objc_draw(dialog, ROOT, MAX_DEPTH, cx, cy, cw, ch);
     exitbutton = 0x7f & form_do(dialog, 0);
     form_dial(FMD_FINISH, 0,0,0,0,cx, cy, cw, ch);
     return(exitbutton);
}


/*******************************************************************
*
* MagiC-Version ermitteln.
* ========================
*
* Falls <crdate> != NULL ist, wird das Erstelldatum in der
* Form jjjjmmdd geliefert. Durch "<" und ">" kann dann
* direkt ermittelt werden, ob eine bestimmte Funktion
* bei der vorliegenden MagiC- Version verfügbar ist.
*
* Rückgabe:  0     kein MagiC installiert
*           -1    bin noch im AUTO-Ordner
*       0x0a0b    Version a.b
*
*******************************************************************/

WORD get_MagiC_ver(ULONG *crdate)
{
  ULONG *cookie;
  AESVARS *av;

  cookie = get_cookie('MagX');
  if  (!cookie)
    return(0);
  else
  {
    av = ((MAGX_COOKIE *) (*cookie))->aesvars;
    if  (!av)
      return(-1);
    else if (crdate)
    {
      *crdate = av->date << 16L;        /* jjjj0000 */
      *crdate |= av->date >> 24L;       /* jjjj00tt */
      *crdate |= (av->date >> 8L) & 0xff00L;    /* jjjjmmtt */
      return(av->version);
    }
  }
}


/****************************************************************
*
* Macht ein F(BOX)TEXT-Objekt scrollbar, wenn MagiC läuft.
*
* Wenn <is_scroll> FALSE ist, wird nur das Textfeld auf eine
* Benutzerzeichenkette umgesetzt.
*
* Im RCS sollte das Textfeld leer gelassen werden, die Schablone
* und die Valid-Zeichenkette müssen jedoch eingegeben werden,
* weil sonst das RCS streikt.
* Für scrollende Felder muß eine neue Schablone angelegt werden,
* die in der .RSC-Datei angemeldete kann nicht verwendet werden,
* weil sie zu kurz ist. Die hier angelegte Schablone besteht
* nur aus '_'-Zeichen, weil dies 99.9% aller Anwendungsfälle
* für scrollende !{"Objekte" ignore} abdeckt. Die Länge der
* Valid-Zeichenkette ist egal, d.h. muß mindestens 1 sein, weil
* das AES das letzte Zeichen der Valid-Zeichenkette
* automatisch vervielfacht, bis die Länge des Textfeld erreicht
* ist.
*
* Die maximale Länge für die Eingabezeichenkette ist in jedem
* Fall (TEDINFO.te_txtlen - 1).
*
****************************************************************/

void init_scrlted(OBJECT *o, WORD is_scroll, XTED *xted,
        char *txt, char *tmplt, WORD len)
{
  TEDINFO *t;

  t = o->ob_spec.tedinfo;
  t->te_just = TE_LEFT;   /* wichtig! */
  t->te_ptext = txt;
  if  (is_scroll)
  {
    memset(tmplt, '_', len);  /* neue Schablone */
    tmplt[len] = '\0';
    xted->xte_ptmplt = tmplt;
    xted->xte_pvalid = t->te_pvalid;
    xted->xte_vislen = t->te_tmplen - 1;
    xted->xte_scroll = 0;

    t->te_tmplen = len+1;
    t->te_ptmplt = NULL;
    t->te_pvalid = (void *) xted;
  }
  t->te_txtlen = t->te_tmplen;
}

Querverweis: AES   Eingabefelder in MagiC   GEM   TEDINFO


Home MagiCMagiC Eingabefelder in MagiCEingabefelder in MagiC Spezielle Fehlermeldungen von MagiCSpezielle Fehlermeldungen von MagiC