Palm Programmierung: Field-Inhalt setzen

jokey2

Erfahrenes Mitglied
Hallo Gemeinde!

Ich beschäftige mich jetzt seit ein paar Tagen (endlich) mit der Programmierung meines Palms. Inzwischen kann ich auch schon ein Form erstellen und auf bestimmte Events reagieren.

Mein Problem ist nun folgendes: Ich habe ein Textfeld (Field) in meinem Form, dem ich beim Programmstart einen bestimmten Text zuweisen will.
Das habe ich mit der Funktion FldSetText(...) versucht. Die will aber als ersten Parameter einen Zeiger auf FieldType, als zweiten Parameter einen MemHandle. Den MemHandle habe ich erzeugt und den Speicher auch mit Textdaten gefüllt. Aber woher bekomme ich den Zeiger auf FieldType, der mir auf das entsprechende Ressourcenobjekt verweist?

Ich habe es schon mit FrmGetObjectPtr versucht und den void-Pointer in einen FieldType-Pointer umgewandelt, aber das Textfeld blieb leer.

Ähnliche Verständnisprobleme habe ich z.B. auch mit den Control-Funktionen, die einen Zeiger auf ControlType verlangen. Auch da weiß ich nicht, wie ich diesen Zeiger bekommen kann.

Weiterhin heißt es in der Doku zur Funktion FldSetText, der vierte Parameter (size) wäre nicht die Länge des Text-Strings, aber welche Länge man da eintragen soll, ist nicht erwähnt. Soll das die Länge des ganzen Speicherblocks sein?

Ich wäre sehr dankbar, wenn mir da jemand ein paar Tipps geben könnte. Vielleicht gibt es ja hier im Forum jemanden mit Palm-Erfahrung.

[EDIT] Vielleicht ist ja auch FldSetText der falsche Ansatz?
 
Zuletzt bearbeitet:
Vielleicht kann mir einfach jemand ganz allgemein erklären, wie ich Daten in Fields eintrage und aus ihnen auslese. Irgendwie kriege ich das nicht hin.

Hier ist mal der Quellcode, wie ich ihn bisher habe. Es geht also hauptsächlich um die Funktionen GetFieldTextValues() und SetFieldTextValues(). Die Form enthält 4 Textfelder, einen Button und 2 Checkboxen, das Programm soll mal die Laufzeit bzw. die Höhe der Raten eines Kredites ausrechnen. Zur Berechnung der Laufzeit des Kredites müssen Kreditbetrag, Zins und monatliche Rate eingegeben werden, zur Berechnung der Höhe der Monatsrate braucht man den Kreditbetrag, den Zins und die Laufzeit. Die erforderlichen Daten sollen in die Textfelder eingegeben und vom Programm dort ausgelesen werden.

AppMain.c:
Code:
#include <PalmOS.h>

#include "MainRsc.h"


typedef enum e_CalcMode
{
    CM_RUNTIME = 0,
    CM_RATE
}T_CalcMode;

T_CalcMode enumCalcMode = CM_RUNTIME;
FormPtr formMain; /* pointer to Main form structure */
Coord coFldRuntimeX, coFldRuntimeY, coFldRateX, coFldRateY;
FlpCompDouble dAmount, dRPC, dRate, dRuntime;
MemHandle hMemAmount, hMemRPC, hMemRate, hMemRuntime;

void GetFieldTextValues();

void Wait(UInt32 iSec)
{
    UInt32 Start;
    
    Start = TimGetSeconds();
    while(TimGetSeconds() < Start + 3);
}

void StopCalcError()
{
    WinEraseChars("Berechne!", 9, 50, 50);
    WinDrawChars("Fehler", 9, 50, 50);
    Wait(3);
    WinEraseChars("Fehler", 9, 50, 50);
}

void DoCalculate()
{
    //Berechnung

    WinDrawChars("Berechne!", 9, 50, 50);
    
    GetFieldTextValues();    
    
    if((dAmount.d == 0.0) ||
    (dRPC.d == 0.0)  || 
    ((dRate.d == 0.0) && (enumCalcMode == CM_RUNTIME)) ||
    ((dRuntime.d == 0.0) && (enumCalcMode == CM_RATE)))
        StopCalcError();

    //Hier soll ma was berechnet werden

    WinEraseChars("Berechne!", 9, 50, 50);
    
}

void SetCalcMode(T_CalcMode mode)
{
     UInt16 cbIndexRuntime, cbIndexRate, fieldIndexRuntime, fieldIndexRate;

    cbIndexRate = FrmGetObjectIndex(formMain, CheckRate);
    cbIndexRuntime = FrmGetObjectIndex(formMain, CheckRuntime);
    FrmSetControlValue (formMain, cbIndexRuntime, mode == CM_RUNTIME ? 1 : 0);
    FrmSetControlValue (formMain, cbIndexRate, mode == CM_RATE ? 1 : 0);
    fieldIndexRate = FrmGetObjectIndex(formMain, FieldRate);
    fieldIndexRuntime = FrmGetObjectIndex(formMain, FieldRuntime);
    FrmShowObject(formMain, mode == CM_RUNTIME ? fieldIndexRate : fieldIndexRuntime);
    FrmHideObject(formMain, mode == CM_RUNTIME ? fieldIndexRuntime : fieldIndexRate);
    enumCalcMode = mode;
}


void SetFieldTextValues()
{
    // Werte in den Fields setzen und anzeigen

    MemPtr pMem;
     UInt16 fieldIndexRuntime, fieldIndexRate, filedIndexRPC, fieldIndexAmount;
    FieldType *pftAmount, *pftRPC, *pftRate, *pftRuntime;

    fieldIndexRate = FrmGetObjectIndex(formMain, FieldRate);
    fieldIndexRuntime = FrmGetObjectIndex(formMain, FieldRuntime);
    filedIndexRPC = FrmGetObjectIndex(formMain, FieldRPC);
    fieldIndexAmount = FrmGetObjectIndex(formMain, FieldAmount);

    pftAmount = (FieldType*)FrmGetObjectPtr (formMain, fieldIndexAmount);
    pftRPC = (FieldType*)FrmGetObjectPtr (formMain, filedIndexRPC);
    pftRate = (FieldType*)FrmGetObjectPtr (formMain, fieldIndexRate);
    pftRuntime = (FieldType*)FrmGetObjectPtr (formMain, fieldIndexRuntime);

    pMem = MemHandleLock(hMemAmount);
    FlpFToA(dAmount.fd, (Char *)pMem);
    MemHandleUnlock(hMemAmount);
    FldDrawField(pftAmount);

    pMem = MemHandleLock(hMemRPC);
    FlpFToA(dRPC.fd, (Char *)pMem);
    MemHandleUnlock(hMemRPC);
    FldDrawField(pftRPC);

    pMem = MemHandleLock(hMemRate);
    FlpFToA(dRate.fd, (Char *)pMem);
    MemHandleUnlock(hMemRate);
    FldDrawField(pftRate);

    pMem = MemHandleLock(hMemRuntime);
    FlpFToA(dRuntime.fd, (Char *)pMem);
    MemHandleUnlock(hMemRuntime);
    FldDrawField(pftRuntime);
    
}

void GetFieldTextValues()
{
    // Werte aus den Fields auslesen und in die Variablen speichern

    MemPtr pMem;
     UInt16 fieldIndexRuntime, fieldIndexRate, filedIndexRPC, fieldIndexAmount;
    FieldType *pftAmount, *pftRPC, *pftRate, *pftRuntime;

    fieldIndexRate = FrmGetObjectIndex(formMain, FieldRate);
    fieldIndexRuntime = FrmGetObjectIndex(formMain, FieldRuntime);
    filedIndexRPC = FrmGetObjectIndex(formMain, FieldRPC);
    fieldIndexAmount = FrmGetObjectIndex(formMain, FieldAmount);

    pftAmount = (FieldType*)FrmGetObjectPtr (formMain, fieldIndexAmount);
    pftRPC = (FieldType*)FrmGetObjectPtr (formMain, filedIndexRPC);
    pftRate = (FieldType*)FrmGetObjectPtr (formMain, fieldIndexRate);
    pftRuntime = (FieldType*)FrmGetObjectPtr (formMain, fieldIndexRuntime);

    pMem = MemHandleLock(hMemAmount);
    dAmount.fd = FlpAToF((Char *)pMem);
    MemHandleUnlock(hMemAmount);

    pMem = MemHandleLock(hMemRPC);
    dRPC.fd = FlpAToF((Char *)pMem);
    MemHandleUnlock(hMemRPC);

    pMem = MemHandleLock(hMemRate);
    dRate.fd = FlpAToF((Char *)pMem);
    MemHandleUnlock(hMemRate);

    pMem = MemHandleLock(hMemRuntime);
    dRuntime.fd = FlpAToF((Char *)pMem);
    MemHandleUnlock(hMemRuntime);
    
}

/* main form handler function */
static Boolean MainformHandleEvent( EventType* event)
{
    /* Parse the event */
    if( event->eType == ctlSelectEvent )
    {
        switch(event->data.ctlSelect.controlID)
        {
            case ButtonDoCalculate:
                DoCalculate();
                break;
            case CheckRuntime:
                SetCalcMode(CM_RUNTIME);
                break;
            case CheckRate:
                SetCalcMode(CM_RATE);
                break;
                
        }
    }
    return( false );
}

/* application init function */
void AppStart()
{
     UInt16 cbIndex;
     UInt16 fieldIndexRuntime, fieldIndexRate, filedIndexRPC, fieldIndexAmount;
    FieldType *pftAmount, *pftRPC, *pftRate, *pftRuntime;

    /* Initialize form */
    formMain = FrmInitForm( ZinsrechnerForm );
    FrmSetEventHandler( formMain, MainformHandleEvent );
    FrmSetActiveForm( formMain );
    FrmDrawForm( formMain );

    fieldIndexRate = FrmGetObjectIndex(formMain, FieldRate);
    fieldIndexRuntime = FrmGetObjectIndex(formMain, FieldRuntime);
    filedIndexRPC = FrmGetObjectIndex(formMain, FieldRPC);
    fieldIndexAmount = FrmGetObjectIndex(formMain, FieldAmount);
    FrmGetObjectPosition (formMain, fieldIndexRuntime, &coFldRuntimeX, &coFldRuntimeY);
    FrmGetObjectPosition (formMain, fieldIndexRate, &coFldRateX, &coFldRateY);
    
    hMemAmount = MemHandleNew(25);
    hMemRPC = MemHandleNew(25);
    hMemRate = MemHandleNew(25);
    hMemRuntime = MemHandleNew(25);
    
    pftAmount = (FieldType*)FrmGetObjectPtr (formMain, fieldIndexAmount);
    pftRPC = (FieldType*)FrmGetObjectPtr (formMain, filedIndexRPC);
    pftRate = (FieldType*)FrmGetObjectPtr (formMain, fieldIndexRate);
    pftRuntime = (FieldType*)FrmGetObjectPtr (formMain, fieldIndexRuntime);

    FldSetTextHandle(pftAmount, hMemAmount);
    FldSetTextHandle(pftRPC, hMemRPC);
    FldSetTextHandle(pftRate, hMemRate);
    FldSetTextHandle(pftRuntime, hMemRuntime);

    SetFieldTextValues();
        
    SetCalcMode(CM_RUNTIME);
}

/* application stop function */
void AppStop( void )
{
    MemHandleFree(hMemAmount);
    MemHandleFree(hMemRPC);
    MemHandleFree(hMemRate);
    MemHandleFree(hMemRuntime);
    
    FrmCloseAllForms ();
}

void EventLoop()
{
    EventType event; /* event structure */
    
    /* event loop */
    do
    {
        /* Get the next event */
        EvtGetEvent( &event, evtWaitForever );
        /* Handle system events */
        if( SysHandleEvent( &event ) )
            continue;
        /* Handle form events */
        FrmDispatchEvent( &event );
        /* If it's a stop event, exit */
    } while( event.eType != appStopEvent );
}
/***********************************************************************
 *
 * FUNCTION:    PilotMain
 *
 * DESCRIPTION: The entry point for all Palm OS applications, this 
 *                function's sole purpose is to receive and respond to 
 *                launch codes. 
 *
 * PARAMETERS:  -> cmd    The launch code to which your application is to 
 *                    respond. See Palm OS® Programmer's API Reference 
 *                    Chapter 1, "Application Launch Codes," 
 *                    for a list of predefined launch codes. You may create 
 *                    additional launch codes; see "Creating Your Own Launch 
 *                    Codes" of the Palm OS Programmer's Companion, vol. I. 
 *
 *                -> cmdPBP A pointer to a structure containing any 
 *                    launch-command-specific parameters, or NULL if the
 *                    launch code has none. See the description of each launch 
 *                    code for a description of the parameter structure that 
 *                    accompanies it, if any. 
 *
 *                -> launchFlags Flags that indicate whether your application's 
 *                    global variables are available, whether your application 
 *                    is now the active application, whether it already was the 
 *                    active application, and so on. See "Launch Flags" for a 
 *                    list of launch flags. 

 *
 * RETURNED:    Return errNone if your application processed the launch 
 *                code successfully, or an appropriate error code if there 
 *                was a problem. When another application invokes your 
 *                application using SysAppLaunch, this value is returned to
 *                the caller. 
 *
 ***********************************************************************/

UInt32 PilotMain (UInt16 cmd, void *cmdPBP, UInt16 launchFlags) 
{ 
    
    /* If this is not a normal launch, don't launch */
    if( cmd != sysAppLaunchCmdNormalLaunch )
        return( 0 );
    
    AppStart();
    EventLoop();
    AppStop();
 
     return errNone; 
}
MainRsc.h
Code:
#define ZinsrechnerForm                1000


#define ButtonDoCalculate            1000
#define    FieldAmount                    1001
#define    FieldRPC                    1004
#define    FieldRate                    1009
#define    FieldRuntime                1012

#define CheckRuntime                1005
#define CheckRate                    1006
 

Neue Beiträge

Zurück