J2ME - Java Mobile

Programovacie jazyky, rady, poradňa...
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

OK dik moc. Ked budem mat cas cez weekend tak sa nato pozrem :wink:
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

A dajaky uz hotovy konvertor TXT do toho kodovaneho .dat formatu nieje?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Musíš si nejaký program vytvoriť. Tento program skonvertuje textový súbor v kódovaní CP1250 do toho súboru v UTF-8 (ale jednoducho sa dá skompilovať iba v Linuxe)

Kód: Vybrať všetko

#include	<stdlib.h>
#include	<stdio.h>
#include	<string.h>
#include	<iconv.h>

#define	BUFFER_SIZE	80000
#define	MAX_SIZE	32767

int translate_string(iconv_t cd, char *buf)
{
	char		tmp[BUFFER_SIZE];
	size_t		nconv;
	char		*inptr = buf, *outptr = tmp;
	size_t		insize = strlen(buf) + 1, avail = sizeof(tmp);

	nconv = iconv(cd, &inptr, &insize, &outptr, &avail);
	strcpy(buf, tmp);
	return 0;
}

void write_utf(char *line, FILE *file)
{
	int		len;
	unsigned char	buf[2];

	len = strlen(line);
	buf[0] = (len >> 8) & 0xFF;
	buf[1] = (len >> 0) & 0xFF;
	fwrite(buf, 2, 1, file);
	fwrite(line, len, 1, file);
}

void trim(char *s)
{
	int		len;

	len = strlen(s);
	if (len > 0 && (s[len] == '\n' || s[len] == '\r')) len--;
	if (len > 0 && (s[len] == '\n' || s[len] == '\r')) len--;
	s[len-1] = '\0';
}

int main(int argc, char *argv[])
{
	FILE		*in_file, *out_file;
	char		line[BUFFER_SIZE];
	iconv_t		cd;

	if (argc != 3) {
		fprintf(stderr, "Usage: cvt-to-utf <in-file> <out-file>\n");
		return EXIT_FAILURE;
	}
	in_file = fopen(argv[1], "r");
	if (in_file == NULL) {
		fprintf(stderr, "Unable to open input file '%s'\n", argv[1]);
		return EXIT_FAILURE;
	}
	out_file = fopen(argv[2], "wb");
	if (out_file == NULL) {
		fclose(in_file);
		fprintf(stderr, "Unable to open output file '%s'\n", argv[2]);
		return EXIT_FAILURE;
	}

	cd = iconv_open("UTF-8", "CP1250");

	while (!feof(in_file)) {
		if (fgets(line, sizeof(line), in_file) == NULL)
			break;
		trim(line);
		if (strlen(line) > MAX_SIZE) {
			fprintf(stderr, "Input string too long\n");
			goto err;
		}
		translate_string(cd, line);
		if (strlen(line) > MAX_SIZE) {
			fprintf(stderr, "Output too long\n");
			goto err;
		}
		write_utf(line, out_file);
	}

err:
	fclose(in_file);
	fclose(out_file);

	if (cd != (iconv_t)-1) iconv_close(cd);

	return EXIT_SUCCESS;
}
Kedže tých dát budeš mať dosť veľa, bolo by vhodné vymyslieť taký formát ukladania tých dát, aby nebolo nutné mať veľa dát v pamäti (kedže v mobiloch je RAM pamäte dosť málo).
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

A nestaci ked len zoberiem textak a ho ulozim cez dajaky textovy editor kde nastavim UTF8 kodovanie?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Funkcia readUTF potrebuje dáta vo formáte 16 bitové číslo určujúce veľkosť reťazca v bajtoch a potom samotný reťazec v utf-8 kódovaní.
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

NJ tak potom asi nic. Lebo LINUX nemam, v jave nerobim, v J2ME sa to neda a DELPHI som v zivote nevidel :cry:

EDIT:
Tak nakoniec to asi predsa necham len v tom TXT ked s inym si neviem dat rady, s tym ze uz dajak poriesim tu diakritiku.
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

No teras mam problem s PRELOADEROM.
Chcem urobit preloader na nacitanie dat z TXT. Lenze som zistil ze operciu musim volat jedine z public void startApp() lebo inak nefunguje no mne sa operacia vola z public void commandAction kde sa nacita nazov TXT suboru.
Neviete mi s tym niekto pomoct prosiiim? Alebo aspon ako poslat tu premennu spet do startApp() aby som mohol operaciu zavolat odtial?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Funkcia startApp() sa volá hneď po spustení midletu. Funkcia commandAction() sa volá až oveľa neskôr (ak sa teda zavolá).
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

Tak nakoniec nepouzijem ten preloader lebo to je vazne urcene len na load aplikacie na zaciatku a z konstruktoru sa volat neda tak je to na prd.
Ale da sa scrolovat text v canvas? Ked vypisem text cez DrawString ale je prilis dlhy ze sa nevojde na display tak ako mam urobit aby sam rotoval z prava dolava a naspet? :?:

Ako zistim sirku (width) stringu vypisaneho cez DrawString ze ci je sirsi ako sirka displaya? :?:
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Trieda Font má funkciu stringWidth(). Aktuálny font získaš pomocou funkcie getFont().
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Musíš dať

Kód: Vybrať všetko

sirka = canvas.getFont().stringWidth(SSS[0]);
(alebo si ten font ulož to nejakej premennej [ak to budeš používať častejšie]).
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

jj uz mi to ide no hadze to teras:

Kód: Vybrať všetko

NullPointerException
a neviem preco. Ved SSS[0] = "AHOJ"; a nieje null.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

NULL mohla vrátiť aj funkcia getFont(). Skús si pozrieť vo WTK adresár apps. V niektorých príkladoch je použitá aj funkcia stringWidth().
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

Nie to nieje tym. Ked zadam sirka = lowFont.stringWidth("AHOJ"); tak ide bez problemov. Ale ked tam dam sirka = lowFont.stringWidth(STR[2]); tak to hlasi.
A uz fakt neviem ci to moze byt.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Aký typ je SSS a ako si ho inicializoval?
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

Mam triedu MIDlet a vnej je vnorena trieda canvas. SSS je inicializovany v triede MIDlet. Ale uz som zistil ze to error hadze len ked stringWidth umiestnim do konstruktora canvasu. Akonahle som to dal do public void paint tak uz to islo ale to je nevihodne pre mna.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Tie reťazce musíš inicializovať ešte pred použitím tej funkcie (teda buď načítanie reťazce dáš do konštruktora, alebo zavoláš funkciu na zisťovanie šírky až potom, ako tie raťazce načítaš).
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

Da sa dajako zistit v J2ME aktualny cas a datum, ale priamo z telefonu? Alebo dajakym inym sposobom ale nie cez datove pripojenie?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Skús niečo ako:

Kód: Vybrať všetko

Calendar now = Calendar.getInstance();
int hours = now.get(Calendar.HOUR_OF_DAY);
int minutes = now.get(Calendar.MINUTE);
SSPPYY
Medium Star
Medium Star
Príspevky: 370
Registrovaný: 28 máj 2006, 9:46

Príspevok od používateľa SSPPYY »

DIK moc je to super. Len mam s tym mensi problemik. Podla coho on vie ake to je pasmo? Lebo na emulatore mi ukazoval -1 hodinu a na mobile mi ukazuje spravne.
Bojim sa toho ze na roznych mobiloch bude hodina hore dole.
Napísať odpoveď