Meine anderen Funktionen werden doch aber auch ganz normal aufgerufen. Was bedeutet denn "ohne Globals aufrufen"?
Gruss farion
Meine anderen Funktionen werden doch aber auch ganz normal aufgerufen. Was bedeutet denn "ohne Globals aufrufen"?
Gruss farion
Mir scheint, dass die PilotMain nicht in einer Section definiert werden darf, seid ich die Deklaration dieser Funktion weggelassen habe funktioniert es.
Noch ne andere Frage zu Sections, gibt es da irgendwelche vordefinierten Namen, die irgendeine Bedeutung haben - ich habe eine meiner Sections data genannt, was aber nicht funktionierte - ein anderes Wort hat dann problemlos funktioniert.
Gruss farion
Hallo,
meine Palmanwendung ist nun immer grösser geworden und benötigt nun mehrere Sections. Allerdings stürzt mein Programm nach dem "Section"-Umbau ab (vorher gab es keinerlei Probleme) - der Fehler im Emulator ist "Unhandled instr" und "Records left locked in closed unprotected DB".
Ich habe zum testen in meiner PilotMain nur noch "return 0" stehen und alles andere auskommentiert - trotzdem kommt dieser Records-locked Fehler.
Ich beschreibe mal kurz was ich getan habe um Sections zu implementieren
.def erzeugt
Sections.h erzeugt
#ifndef _SECTIONS_H
#define _SECTIONS_H
#define SECTION_MAIN __attribute__ ((section("main")))
#endif
meine hautp .c sieht folgendermaßen aus:
#include <PalmTypes.h>
#include <PalmCompatibility.h>
#include <System/SystemPublic.h>
#include <UI/UIPublic.h>
#include "Sections.h"
#include "pw.h"
#include "resource.h"
UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
{
return 0;
}
Alles anzeigen
mein Makefile entsprechend so:
CC = m68k-palmos-gcc
CFLAGS =
MULTIGEN=m68k-palmos-multigen
all: pw.prc
pw.prc: clean pw bin.stamp pw.def
build-prc -c PWa -o pw.prc -n "PWatcher" pw.def pw *.bin
pw: pw.o pw-sections.o pw-sections.ld
$(CC) $(CFLAGS) -o pw pw.o pw-sections.o pw-sections.ld
pw.o: pw.c pw.h
$(CC) $(CFLAGS) -c pw.c
pw-sections.o: pw-sections.s
$(CC) -c pw-sections.s
pw-sections.s pw-sections.ld: pw.def
$(MULTIGEN) pw.def
bin.stamp: resource.rcp resource.h
pilrc resource.rcp
clean:
-rm -f *.[oa] pw *.bin *.stamp
Alles anzeigen
in der pw.h habe ich die PilotMain deklariert
Naja und in der resource.rcp und der resource.h stehen die bisher verwendeten FormElemente.
Gruss farion
Dazu hätte ich ne idee, die mit vertretbarem Aufwand auch recht schnell implementiert wäre.
Wie wäre es wenn du mit dem Palm nur einen Server steuerst. Du nimmst eine kleine Linuxkiste, die du an den beamer anschliesst. Auf der Linuxkiste sind die ganzen Daten (Datenbank, Textdateien ...) . Nun muss noch ein Konsolenprogramm her, das nur folgendes tun muss:
Nummer eintippen - Infos ausgeben, Bild auf Monitor ausgeben (export DISPLAY=:0, display $BILD).
Man kann dann auch noch ein idle Programm starten lassen, das zufällig Bilder in gewissen Abständen anzeigt - ohne das der Palm an ist.
Mit dem Palm lockt man sich jetzt per pssh auf dem server ein (am besten mit screen, da so das Programm immer auf dem Server läuft und man sich nur zum steuern verbindet) startet das Programm und kann nun nach herzenslust infos abrufen und Dinge auf dem Beamer anzeigen.
Auf dem Palm muss nur WLAN funktionieren und pssh installiert sein.
Alternative zu ssh und konsole wäre das ganze mit Apache/php/mysql zu realisieren und nun mit einem Browser auf dem Palm (zb Opera) den Server per Webinterface steuern. Im Hintergrund sollten aber dann trotzdem immer noch ein paar Skripte werkeln um die Bilder auf dem Beamer anzuzeigen.
Der Nachteil ist natürlich, dass du einen kleinen Server brauchst (brauchst du aber doch sowieso - oder wie sollen die Bilder auf den Beamer kommen) der Vorteil - du musst dich nicht mit Palmprogrammierung rumschlagen und bist sehr flexibel, was Datenbestände und Bildmaterial angeht)
Gruss far
Ich habe den Fehler gefunden, nachdem ich überall mal debugging-meldungen reingemacht habe. Du hattest recht, es war sowas wie das return.
Ich habe zu jedem Lock auch ein Unlock, das habe ich auch 20x überprüft. Allerdings gab es noch ne kleine Funktion, die ein Pulldown füllt und dort wird die Schleife mit break verlassen und der Unlock übergangen. Das hatte ich übersehen - naja nun ist es gefixt.
Ich habe allerdings noch eine Frage. Kann ich ein bestimmtes Handle nur 15x locken oder insgesamt nur 15 Handles? Weil der Fehler trat ja bei einem ganz anderen Handle auf, anstatt bei dem welches wirklich nicht geunlockt wurde.
Gruss far
Das return sollte eigentlich nie kommen - dann sollte auch ein Fehler ausgegeben werden. Ausserdem ist doch der Lock in Zeile 8 und in Zeile 10 doch schon der Unlock.
Was meinst Du mit äusserer Lock?
far
okay, das erklärt die seltsame Zahl. Ich locke noch beim Schreiben des Datensatzes ein Handle:
if (!(recH2 = DmNewRecord(dbCnt, &cntSize, sizeof(DBRecordCntType))))
{
FrmCustomAlert(ErrorAlert, "Kann Eintrag nicht erstellen", "", " ");
return;
}
//Hier wird dbRecordCnt gefüllt
recP2 = MemHandleLock(recH2);
DmWrite(recP2, 0, &dbRecordCnt, sizeof(DBRecordCntType));
MemPtrUnlock(recP2);
DmReleaseRecord(dbCnt, cntSize, true);
Alles anzeigen
Aber das ist doch auch in Ordnung - oder unlock MemPtrUnlock recH2 nicht?
Die MemHandleUnlocks habe ich überprüft, dort wird immer das vorher gelockte Handle angegeben.
Hallo
ich bekomme den Fehler "Chunk over-locked" im Emulator (der echte Palm stürzt an der Stelle ab)
Die Stelle ist folgende und der Error kommt beim Lock:
MemHandle recH;
DBRecordTypeCntPtr recP;
...
if (recH = (MemHandle)DmQueryRecord(dbCnt, i))
{
recP = (DBRecordTypeCntPtr)MemHandleLock(recH);
//Hier hole ich per recP->xxx Daten
MemHandleUnlock(recH);
}
An mehreren anderen Stellen (auch mit anderen dbs) funktioniert das problemlos, aber bei einer Stelle bekomme ich den Fehler, genau nachdem ich den 14. Datensatz eingefügt habe. Den Fehler gibt es reproduzierbar nur an dieser Stelle - nach einem Reset kann ich 15 ff problemlos einfügen.
Was bedeutet denn der Fehler genau und nach was muss ich da suchen? Ich habe schon überall geschaut, ob ich irgendwo einen Handle auf die Datenbank nicht wieder freigegeben habe, bisher leider erfolglos.
Danke farion
Das Feld ist nicht editierbar.
Wenn ich MemHandleFree() verwende, kommt beim FrmReturnToForm(0); ein Fehler: "Free Handle". Der Fehler liegt ja auch am Verändern von buf, wenn ich das doubleToStr weglasse gibt es keinen Fehler.
edit:
So funktioniert es jetzt:
FormPtr frm = FrmGetFormPtr(myFormID);
UInt16 obj = FrmGetObjectIndex(frm, myFieldID);
FieldPtr fld = (FieldPtr)FrmGetObjectPtr(frm, obj);
CharPtr p;
VoidHand h;
double cnt;
cnt = strToDouble(GetField(myFormID,myFieldID));
cnt += val;
if(cnt >= 0 && cnt < 100){
h = (VoidHand)FldGetTextHandle(fld);
p = (CharPtr) MemHandleLock (h);
doubleToStr9(p,cnt,1);
MemHandleUnlock (h);
FldSetTextHandle (fld, (Handle)h);
FldDrawField(fld);
}
Alles anzeigen
Ich glaube da ist ein grundlegendes Problem, in der Art wie ich meinen String da verbaue, denn ich habe jetzt noch selbst einige Funktionen geschrieben (die Idee von Metaview zB) - aber immer dasselbe am Ende.
Deswegen schreibe ich hier mal wie ich das ganze aufrufe:
char buf[40];
MemHandle h;
double cnt;
FormPtr frm = FrmGetFormPtr(myFormID);
UInt16 obj = FrmGetObjectIndex(frm, myFieldID);
FieldPtr fld = (FieldPtr)FrmGetObjectPtr(frm, obj);
Char *p = FldGetTextPtr(fld);
cnt = strToDouble(p);
cnt += val;
if(cnt >= 0 && cnt < 100){
doubleToStr(buf,cnt);
h = MemHandleNew(StrLen(buf) + 1);
StrCopy((Char *) MemHandleLock(h), buf);
FldSetTextHandle(fld,h);
FldDrawField(fld);
MemHandleUnlock(h);
}
Alles anzeigen
Egal wie ich buf verändere oder mit welcher Funktion - immer meckert er beim Beenden.
bye far
Ich möchte eine Typkonvertierung von double in string machen und verwende dazu folgende Funktion.
Diese Funktio
void doubleToStr9(const char* str, double flpNumber, Int numFractDigits)
{ int longNumber;
double flpIP, zeros, round;
Int i, remainder, strLen;
Char sign = ' ';
if (numFractDigits < 0 || numFractDigits > 9)
FrmCustomAlert(ErrorAlert, "Error in doubleToStr9.", "", " ");
if (flpNumber < 0.0)
{ flpNumber = -flpNumber;
sign = '-';
}
zeros = 1.0;
for (i=0; i<numFractDigits; i++)
zeros *= 10;
round = 0.5/zeros;
flpNumber += round;
flpIP = (Long) flpNumber;
flpNumber = flpNumber - flpIP;
str[0] = sign;
StrIToA(&str[1], (Long) flpIP);
strLen = StrLen(str);
str[strLen] = '.';
str[numFractDigits+strLen+1] = '\0';
longNumber = flpNumber * zeros;
for (i=numFractDigits+strLen; i>strLen; i--)
{ remainder = longNumber % 10;
str[i] = remainder + 0x30; //diese Zeile scheint das Problem zu sein
longNumber /= 10;
}
}
Alles anzeigen
Diese funktioniert auch, allerdings sagt mein Emulator beim Beenden "un-freed chunk at 0x00F02808, size 5". Auf dem echte Palm (Treo 650) kommt nichts.
Aber ich will mir da ja nicht meinen Speicher mit Müll vollmachen.
Wenn ich die Zeile (oben markiert) auskommentiere tritt das Problem nicht auf (allerdings funktionierts dann natürlich auch nicht mehr)
Irgenwie muss ich wohl den char (char buf[20]) übergebe wieder freigeben - free(buf) funktioniert aber nicht.
Gruss far
Also jetzt sieht es zumindest gut aus. Auch wenn es vielleicht bisschen dirty ist.
PS: Ich habs ja daraufhin auch gefunden - Danke
Ich habe FntLineWidth() gefunden, FntGetLineWidth() gabs nicht - ich musste auch nochmal 18 für den Pfeil abziehen.
Wieso ist das keine gute Idee. Wie macht es dann der Standard Launcher, da passiert mit den Kategorien doch genau das. Das Pulldown ändert ständig seine Grösse in Abhänigkeit des Textes - oder?
farion
LstSetListHeight gab es nicht, dafür aber LstSetHeight - damit hat es dann auch funktioniert die Länge des Pulldowns dynamisch anzupassen.
Ich habe mich dann mal mit FrmSetObjectBounds beschäftigt:
FrmGetObjectBounds(frm, triggerobj, &triggerBounds);
triggerBounds.topLeft.x=160-triggerBounds.extent.x;
FrmSetObjectBounds(frm,triggerobj,&triggerBounds);
Das ist soweit schonmal ein Fortschritt. Leider kann man nur topLeft.x und nicht topRight.x setzen. Somit müsste ich noch die Breite von 160 abziehen, aber extent.x gibt mir nur die ursprüngliche Breite zurück und nicht die Breite die durch das ändern des Textes entstanden ist. Vielleicht hat sich die Breite auch nicht verändert und man sieht nur den Text herausragen.
Meine Frage wäre also noch: wird die richtige Breite automatisch nach Ändern des Textes gesetzt und wenn ja, wie kann ich sie auslesen und wenn nein, wie komme ich an die korrekte Breite?
Gruss und Danke farion
Hallo
ich habe mittels POPUPTRIGGER, LIST und POPUPLIST ein Pulldown erstellt - eine Art Kategorie Pulldown rechts oben.
Funktionieren tut es gut, also wenn ich etwas auswähle kann ich das Event handeln und etwas dementsprechendes tun.
Danach wird dann immer der ausgewählte Eintrag im POPUPTRIGGER angezeigt. Die Position des POPTRIGGERs ist RIGHT@160 und die Breite AUTO. Das Problem ist jetzt aber, dass diese Werte nicht angepasst werden, wenn sich der Inhalt ändert und somit etwas längerer Text rechts abgeschnitten wird.
Mein zweites Problem ist, das die Anzahl der Einträge in der LIST varieren können. Wie kann ich je nachdem wieviele Einträge ich verwende die LIST automatisch verlängern, also den VISIBLE-Wert in Abhängigkeit der Einträge setzen. Die Liste soll immer genau so lang sein, wie es Einträge hat und erst ab einer maximal Anzahl dann scrollen.
Ich programmiere in C, verwende ein aktuelles PalmSDK und die prc-tools.
Gruss farion