Chr(0) et iziBasic
Thursday 01 January 1970 - 01:00:01
La lecture de données au dela d'un caractère chr(00) est impossible avec iziBasic, puisque celui ci sert à detecter la fin d'une chaine. Je vais donc vous montrer un exemple qui compte le nombre de mail non envoyés de VersaMail (version du T5) pour lire des characteres ou chaines dans une applet PP.
Mise A Jour : Ceci n'est plus nécéssaire depuis la version 6 d'iziBasic puisque celui ci possède à présent une fonction permettant de ne pas tenir compte d'un caractère chr(0).
Requis

- PPShell
- pp.exe pour ARM
- PalmAPI.pas (disponible avec les exemples PP)
- iziBasic
- Savoir compiler avec PP
- Savoir compiler avec iziBasic

L'applet PP (Pascal)
`
//Les declarations classique d'une applet PP pour iziBasic
program kToday;
type iBasFunType=function(S:string):string;
var iBasCallPP:iBasFunType;
function CallPP(S:string):string;
type
//On declare un tableau de 4096 caracteres
kMegaString=array[0..4096] of char;
//Et un pointeur pour ce meme tableau
kMegaStringPtr=^kMegaString;
var
//Variable contenant le numero de la base pdb.
f:LocalID;
//Variable contenant l'index d'enregistrement courant
index:UInt16;
//Variable contenant le nombre d'enregistrement
max:UInt16;
//Variable contenant le nombre de mail non envoyes
nb:UInt16;
//Variable contenant la reference de la base
ref:DmOpenRef;
//Pointeur de l'enregistrement courant
krecord:MemHandle;
//Pointeur de l'enregistrement courant
kZeMegaStringPtr:kMegaStringPtr;
begin
//On commence par rechercher le numero de la base de message de
//VersaMail
f:=DmFindDatabase(0,'MultiMail Messages');
//On ouvre la base a partir du numero de la base et l on recupere sa reference
ref:=DmOpenDatabase(0,f,dmModeReadOnly);
//On recupere le nombre d enregistrement de la base
max:=DmNumRecords(ref)-1;
index:=0;
nb:=0;
//On boucle sur tout les enregistrements
for index:=0 to max do
begin
//On recupere l'enregistrement en question a partir de l'index
krecord:=DmGetRecord(ref,index);
//On teste que tout c est bien passe
if krecord<>nil then
begin
kZeMegaStringPtr:=MemHandleLock(krecord);
if kZeMegaStringPtr<>nil then
begin
//On lit le caractere 9 a partir de la copie memoire de l enregistrement et on
//teste si celui ci est egal a 5 ... qui est la valeur pour un message en attente d'envoir
if kZeMegaStringPtr^[9]=chr(05) then
begin
//Si cela est bien le cas, on l'ajoute a notre compteur.
nb:=nb+1;
end;
end;
//On libere la memoire, en liberant la copie de l enregistrement
MemHandleUnlock(krecord);
end;
//On libere l'enregistrement DmReleaseRecord(ref,index,false);
end;
//On ferme la base
DmCloseDatabase(ref);
//On convertit notre nombre en chaine
StrIToA(S,nb);
CallPP:=S
end;
begin
iBasCallPP:=CallPP;
end.
`
Donc rien de bien compliqué, seulement un accés direct au caractère qui nous interesse.
Le code iziBasic
Je vais maintenant vous montrer comment utiliser notre applet PP avec izibasic.
`
BEGIN
N$=CALLPP$(101)
N$="Et "+N$+" e-mails non envoye(s)."
PRINT N$
END
`
Je ne pense pas que le code mérite d'être commenté vu son extrème simplicité.
Conclusion
Vous avez donc vu comment outrepasser la limite de iziBasic, en utilisant une applet pp pour lire une base, on peut d ailleurs facilement partir de ce code pour créer une applet générique permettant de lire un caractère a un endroit quelquonque d'un record quelquonque d'une base donnée.
Khertan.net by Benoit HERVIER Alias Khertan.