* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Gennaio 17, 2025, 08:22:08 pm

Inserisci il nome utente, la password e la durata della sessione.

81 Visitatori, 0 Utenti

Autore Topic: PROBLEMA Write read su avd  (Letto 199 volte)

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 122
  • Karma: +0/-0
PROBLEMA Write read su avd
« il: 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?

bonmario

  • Hero Member
  • *****
  • Post: 1381
  • Karma: +11/-1
Re:PROBLEMA Write read su avd
« Risposta #1 il: 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

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1457
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:PROBLEMA Write read su avd
« Risposta #2 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 122
  • Karma: +0/-0
Re:PROBLEMA Write read su avd
« Risposta #3 il: Oggi alle 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.

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 122
  • Karma: +0/-0
Re:PROBLEMA Write read su avd
« Risposta #4 il: Oggi alle 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

quack

  • Jr. Member
  • **
  • Post: 91
  • Karma: +8/-0
Re:PROBLEMA Write read su avd
« Risposta #5 il: Oggi alle 07:31:53 am »
Manca l'indice

Codice: [Seleziona]
F.WriteBuffer(Manutenzioni[i], SizeOf(Tmanutenzione));
SO: Fedora\W10
Lazarus: Trunk
FPC: Trunk\3.2.2

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3294
  • Karma: +12/-0
Re:PROBLEMA Write read su avd
« Risposta #6 il: Oggi alle 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
Ieri è passato, domani è futuro, oggi è un dono...

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1457
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:PROBLEMA Write read su avd
« Risposta #7 il: Oggi alle 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

quack

  • Jr. Member
  • **
  • Post: 91
  • Karma: +8/-0
Re:PROBLEMA Write read su avd
« Risposta #8 il: Oggi alle 01:42:11 pm »
@DragoRosso: macché, me ne sono accorto solo dopo aver letto il "pippotto"  ;)
SO: Fedora\W10
Lazarus: Trunk
FPC: Trunk\3.2.2

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 122
  • Karma: +0/-0
Re:PROBLEMA Write read su avd
« Risposta #9 il: Oggi alle 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!

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 122
  • Karma: +0/-0
Re:PROBLEMA Write read su avd
« Risposta #10 il: Oggi alle 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;     

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1457
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:PROBLEMA Write read su avd
« Risposta #11 il: Oggi alle 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ò.
« Ultima modifica: Oggi alle 03:10:46 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2942
  • Karma: +20/-4
Re:PROBLEMA Write read su avd
« Risposta #12 il: Oggi alle 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à  ;)
Imagination is more important than knowledge (A.Einstein)

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 122
  • Karma: +0/-0
Re:PROBLEMA Write read su avd
« Risposta #13 il: Oggi alle 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?


DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1457
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:PROBLEMA Write read su avd
« Risposta #14 il: Oggi alle 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....


:) Ogni alba è un regalo, ogni tramonto è una conquista :)

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: FGB
Stats
  • Post in totale: 19377
  • Topic in totale: 2314
  • Online Today: 120
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 81
Total: 81

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.