Italian community of Lazarus and Free Pascal

Programmazione => Mobile => Topic aperto da: Narciso - Gennaio 16, 2025, 06:15:43 pm

Titolo: PROBLEMA Write read su avd
Inserito da: Narciso - Gennaio 16, 2025, 06:15:43 pm
Sto provando a programmare un app per memorizzare le manutenzioni che faccio ai miei veicoli, uso una struttura di record che vorrei salvare in uno stream.
Durante il debug sul'AVD l'app crasha quando provo il salvataggio.

ALLEGO la procedura di salvataggio che mi pare corretta, credo che dipenda dalle impostazioni dell'avd.
procedure TAndroidModule1.SalvaDati( FileName: string; const Manutenzioni: tmanutenzioni);
var
  F: TFileStream;
  i: Integer;
begin
FileName := tPath.Combine(tPath.GetDocumentsPath, filename);

 showmessage('salvo');
  F := TFileStream.Create(FileName, fmCreate);
  try
    for i := 0 to High(Manutenzioni) do
      F.WriteBuffer(Manutenzioni, SizeOf(Tmanutenzione));
  finally
    F.Free;
  end;
end;     

Qualcuno ha qualche idea per risolvere il problema?
Titolo: Re:PROBLEMA Write read su avd
Inserito da: bonmario - Gennaio 16, 2025, 06:30:29 pm
Scusa, magari per te è banale, ma ... AVD sarebbe ?
Dici che crasha durante il debug. Intendi dire che quando invece gira senza debug funziona tutto correttamente ?

Ciao, Mario
Titolo: Re:PROBLEMA Write read su avd
Inserito da: DragoRosso - Gennaio 16, 2025, 07:33:03 pm
procedure TAndroidModule1.SalvaDati( FileName: string; const Manutenzioni: tmanutenzioni);
.....
    for i := 0 to High(Manutenzioni) do
      F.WriteBuffer(Manutenzioni, SizeOf(Tmanutenzione));
.....

Hai passato il tipo "tmanutenzioni" come parametro (è un array, visto che poi lo usi con l'indice ?), poi usi il sizeof(TManutenzione) ...

Deduco che il "TManutenzioni" è un array di tipo "TManutenzione" ? Tutto giusto ?

Se è così, prova nel "for" ad usare "LOW(Manutenzioni)" invece di "0".

Ciao
Titolo: Re:PROBLEMA Write read su avd
Inserito da: Narciso - Gennaio 17, 2025, 05:11:57 am
Scusa, magari per te è banale, ma ... AVD sarebbe ?
Dici che crasha durante il debug. Intendi dire che quando invece gira senza debug funziona tutto correttamente ?

Ciao, Mario

L'app è per android e il debug si fa su un telefono virtuale che normalmente viene chiamato AVD, quindi il debug avviene simulando il funzionamento dell'app sull'AVD.
Titolo: Re:PROBLEMA Write read su avd
Inserito da: Narciso - Gennaio 17, 2025, 05:32:54 am
procedure TAndroidModule1.SalvaDati( FileName: string; const Manutenzioni: tmanutenzioni);
.....
    for i := 0 to High(Manutenzioni) do
      F.WriteBuffer(Manutenzioni, SizeOf(Tmanutenzione));
.....

Hai passato il tipo "tmanutenzioni" come parametro (è un array, visto che poi lo usi con l'indice ?), poi usi il sizeof(TManutenzione) ...

Deduco che il "TManutenzioni" è un array di tipo "TManutenzione" ? Tutto giusto ?

Se è così, prova nel "for" ad usare "LOW(Manutenzioni)" invece di "0".

Ciao

niente da fare, ero abbastanza sicuto che l'array inizia da 0, per scrupolo ci ho provato ma da lo stesso errore :enable to write. Grazie lo stesso
Titolo: Re:PROBLEMA Write read su avd
Inserito da: quack - Gennaio 17, 2025, 07:31:53 am
Manca l'indice

Codice: [Seleziona]
F.WriteBuffer(Manutenzioni[i], SizeOf(Tmanutenzione));
Titolo: Re:PROBLEMA Write read su avd
Inserito da: xinyiman - Gennaio 17, 2025, 08:18:27 am
Se sviluppi per android immagino che usi LAMW. Quindi mi chied, perchè scrivere nei file (che non sai mai le restrizioni che hai sul filesystem adesso e in futuro) e non usi il database sqlite che android mette a disposizione per i propri software?
Trovi anche diversi esempi con l'installazione di LAMW
Titolo: Re:PROBLEMA Write read su avd
Inserito da: DragoRosso - Gennaio 17, 2025, 11:25:46 am
Manca l'indice

Codice: [Seleziona]
F.WriteBuffer(Manutenzioni[i], SizeOf(Tmanutenzione));

Bravo @QUACK !!!
Ho fatto tutto un pipotto con i tipi e non mi sono neanche accorto dell'indice mancante ... stò invecchiando  :o
Titolo: Re:PROBLEMA Write read su avd
Inserito da: quack - Gennaio 17, 2025, 01:42:11 pm
@DragoRosso: macché, me ne sono accorto solo dopo aver letto il "pippotto"  ;)
Titolo: Re:PROBLEMA Write read su avd
Inserito da: Narciso - Gennaio 17, 2025, 02:41:53 pm
Se sviluppi per android immagino che usi LAMW. Quindi mi chied, perchè scrivere nei file (che non sai mai le restrizioni che hai sul filesystem adesso e in futuro) e non usi il database sqlite che android mette a disposizione per i propri software?
Trovi anche diversi esempi con l'installazione di LAMW

perche' dovrei imparare sqlite! hiihhiih e so vecchio pure io!
Titolo: Re:PROBLEMA Write read su avd
Inserito da: Narciso - Gennaio 17, 2025, 02:43:32 pm
Manca l'indice

Codice: [Seleziona]
F.WriteBuffer(Manutenzioni[i], SizeOf(Tmanutenzione));

anche con l'indice mi da errore readonly

procedure TAndroidModule1.SalvaDati(FileName: string; const Manutenzioni: tmanutenzioni);
var
  F: TFileStream;
  i: Integer;
begin
  FileName := tPath.Combine(tPath.GetDocumentsPath, filename);

  showmessage('salvo '+filename);
  try
    F := TFileStream.Create(FileName, fmCreate);
    try
      for i := low(Manutenzioni) to High(Manutenzioni) do
        F.WriteBuffer(Manutenzioni, SizeOf(Tmanutenzione));
    finally
      F.Free;
    end;
    showmessage('Dati salvati con successo');
  except
    on E: Exception do
      showmessage('Errore durante il salvataggio dei dati: ' + E.Message);
  end;
end;     
Titolo: Re:PROBLEMA Write read su avd
Inserito da: DragoRosso - Gennaio 17, 2025, 02:57:56 pm
Ok, l'errore "read only" è già diverso dal crash (forse si poteva capire da un tuo precedente post).

Che versione usi di Android simulato e che versione di SDK Android si basa il tuo sviluppo (non ho LAMW installato e non sò quali sono le release) ?

In Android, c'è stato un cambio di qualche tempo fà in cui alla memoria interna si accede normalmente (non serve più la "user permission") e sulla esterna si scrive solo se il programma è "firmato" e previo set e richiesta della corrispondente "user permission". Penso che ciò valga anche per l'APK (a meno che l'utente non abbia forzato l'installazione nella memoria esterna).

GetDocumentsPath dovrebbe riferirsi alla memoria interna, e GetSharedDocumentsPath invece a quella esterna.

Se stai provando con una vecchia versione di Android, potrebbe essere che servano ancora le USER PERMISSION di scrittura e che magari LAMW non le esponga più (ad esempio ciò è quello che succede in Delphi ora).

Prova a verificare ciò.
Titolo: Re:PROBLEMA Write read su avd
Inserito da: nomorelogic - Gennaio 17, 2025, 03:12:36 pm
Manca l'indice

Codice: [Seleziona]
F.WriteBuffer(Manutenzioni[i], SizeOf(Tmanutenzione));

anche con l'indice mi da errore readonly

procedure TAndroidModule1.SalvaDati(FileName: string; const Manutenzioni: tmanutenzioni);
var
  F: TFileStream;
  i: Integer;
begin
  FileName := tPath.Combine(tPath.GetDocumentsPath, filename);

  showmessage('salvo '+filename);
  try
    F := TFileStream.Create(FileName, fmCreate);
    try
      for i := low(Manutenzioni) to High(Manutenzioni) do
        F.WriteBuffer(Manutenzioni, SizeOf(Tmanutenzione));
    finally
      F.Free;
    end;
    showmessage('Dati salvati con successo');
  except
    on E: Exception do
      showmessage('Errore durante il salvataggio dei dati: ' + E.Message);
  end;
end;     


Narciso per favore usa il tag del codice nei post (sarebbe il bottoncino col simbolo del cancelletto o come lo chiamano oggi hashtag), aumenta la leggibilità  ;)
Titolo: Re:PROBLEMA Write read su avd
Inserito da: Narciso - Gennaio 17, 2025, 05:30:12 pm
Ok, l'errore "read only" è già diverso dal crash (forse si poteva capire da un tuo precedente post).

Che versione usi di Android simulato e che versione di SDK Android si basa il tuo sviluppo (non ho LAMW installato e non sò quali sono le release) ?

In Android, c'è stato un cambio di qualche tempo fà in cui alla memoria interna si accede normalmente (non serve più la "user permission") e sulla esterna si scrive solo se il programma è "firmato" e previo set e richiesta della corrispondente "user permission". Penso che ciò valga anche per l'APK (a meno che l'utente non abbia forzato l'installazione nella memoria esterna).

GetDocumentsPath dovrebbe riferirsi alla memoria interna, e GetSharedDocumentsPath invece a quella esterna.

Se stai provando con una vecchia versione di Android, potrebbe essere che servano ancora le USER PERMISSION di scrittura e che magari LAMW non le esponga più (ad esempio ciò è quello che succede in Delphi ora).




[JDKPaths]
0=C:\Program Files\Java\jdk-21

[SDKPaths]
0=C:\AndroidForLazarus\sdk

[GradlePaths]
0=C:\AndroidForLazarus\gradle-8.12-bin\gradle-8.12

Ant Apache-ant-1.10.15

non saprei che versione di sdk è.... L'avd l'ho creato con android studio versione IcevanillaCream

Il LAmw è l'ultimo scaricato dal sito lamw.

Come si gestiscono le user permission?

Titolo: Re:PROBLEMA Write read su avd
Inserito da: DragoRosso - Gennaio 17, 2025, 07:29:50 pm
Stai usando Android 15 (come sistema operativo).

I permessi dovresti vederli nelle opzioni progetto, sotto la voce LAMW (almeno così ricordo).

Però, con quella release di Android non hai bisogna di permessi per scrivere nella memoria locale.

Puoi stampare cosa quella path visualizza (ossia il valore di quella path).

Sull'emulatore hai impostato anche la memoria SD ? Prova a impostarla, non vorrei che l'emulatore usasse comunque quella....