Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [Delphi] Cancellazione record in file ad accesso random

    Ciao a tutti,

    ho un serio problema che riguarda la cancellazione di un record all'interno di un file ad accesso random.

    Se i record in archivio sono pochi, la cancellazione avviene senza problemi. Al contrario, quando diventano più di 200, la cancellazione non avviene anche se non ricevo nessun messaggio di errore.

    Il codice da me utilizzato è il seguente:

    codice:
    type
      recordtype=record
        varCognome   :string[50];
        varNome      :string[50];
        varEmail     :string[250];
    end;
    
      qfile:file of recordtype;
      qfileTemp:file of recordtype;
      qrecord:recordtype;
      numrec:integer;
      numtemp:integer;
    
    procedure TfrmArchivio.imgEliminaMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
    
      try
    
        ASSIGNFILE(qfile, Trim(lblFile.Caption));
        Reset(qfile);
    
        ASSIGNFILE(qfiletemp, ExtractFilePath(application.exename) + '\Archivio.tmp');
        REWRITE(qfiletemp);
    
          For numtemp:=0 To filesize(qfile)-1 Do
            begin
    
              seek(qfile,numtemp);
              read(qfile,qrecord);
    
              If IntToStr(numtemp + 1) <> Trim(lblPosizione.Caption)  Then
                begin
                  write (qfiletemp, qrecord);
                end;
    
            end;
    
        closefile(qfile);
        closefile(qfiletemp);
    
        deletefile(Trim(lblFile.Caption));
        renamefile(ExtractFilePath(application.exename) + '\Archivio.tmp', Trim(lblFile.Caption));
    
      except
       ShowMessage('Attenzione: il sistema non permette di accedere all''archivio.' + #10 + #13 + #10 + #13 + 'Accertarsi di possedere i privilegi di scrittura nella cartella di installazione del programma.');
       exit;
      end;
    
    end;
    Nel codice di sopra, lblFile è una Label che conserva il percorso del file di archivio, mentre lblPosizione conserva il numero del record corrente.

    Ho notato che, quando avviene il malfunzionamento, l'archivio temporaneo viene regolarmente creato ma poi non sovrascrive il file originale.

    Qualcuno sa dirmi come è possibile risolvere il problema?

    Grazie in anticipo.
    http://www.espositosoftware.it

  2. #2
    non ti conviene usare la classe TStringList ?

    carichi il file con il metodo LoadFromFile
    cancelli il record con Delete
    scrivi il file con SaveToFile

    ciao
    sergio

  3. #3
    Originariamente inviato da mondobimbi
    non ti conviene usare la classe TStringList ?

    carichi il file con il metodo LoadFromFile
    cancelli il record con Delete
    scrivi il file con SaveToFile

    ciao
    sergio
    Ciao, grazie per la risposta.

    Il codice di cui sopra è inserito in una immagine che fa da pulsante, per cui non mi è possibile caricare l'archivio in una TStringList.
    http://www.espositosoftware.it

  4. #4
    TstringList non è un componente visuale (che si chiama TList) e lo puoi usare tranquillamente. Crei una istanza di TStringList, ci applichi i metodi che ti ho detto (probabilmentge Delete va applicato alla proprietà Strings di TStringList, ma te lo dico a memoria). Prova a dare una occhiata alla guida in linea e scopriria molti metodi e proprietà utili.
    ciao
    sergio

  5. #5
    Originariamente inviato da mondobimbi
    TstringList non è un componente visuale (che si chiama TList) e lo puoi usare tranquillamente. Crei una istanza di TStringList, ci applichi i metodi che ti ho detto (probabilmentge Delete va applicato alla proprietà Strings di TStringList, ma te lo dico a memoria). Prova a dare una occhiata alla guida in linea e scopriria molti metodi e proprietà utili.
    ciao
    sergio
    Ciao e di nuovo grazie.

    TStringList è effettivamente un componente interessante ma, anche leggendo la guida, non sono riuscito a capire come si fa a caricare in esso i record di un file ad accesso random. No so se in quel caso bisogna usare qualche altro comando al posto di LoadFromFile, dato che i record non sono separati fra di essi da una andata a capo ma si distinguono per il fatto che ognuno ha la stessa lunghezza in caratteri.

    Qualcuno saprebbe dirmi come caricare i record di un database ad accesso random in una TstringList e a cancellare uno di essi e, dopo le modifiche, salvare il file?
    http://www.espositosoftware.it

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    Faccio una domanda che è tutto fuorché la risoluzione al problema ma...

    ...la struttura del file ad accesso random è un'imposizione dovuta a qualche specifico motivo, oppure può essere sostituita da un formato equivalente ma più facilmente manutenibile?

    Lo chiedo perché non sono rari i casi in cui si deve accedere a file aventi un formato specifico e già esistenti (magari perché generati da altri software); se così non fosse, ci sono probabilmente dei metodi meno complessi di scrivere su file, cioè che non richiedono di gestire il file così a basso livello... Bisognerebbe conoscere anche lo scopo di utilizzo del file in questione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Originariamente inviato da alka
    Faccio una domanda che è tutto fuorché la risoluzione al problema ma...

    ...la struttura del file ad accesso random è un'imposizione dovuta a qualche specifico motivo, oppure può essere sostituita da un formato equivalente ma più facilmente manutenibile?

    Lo chiedo perché non sono rari i casi in cui si deve accedere a file aventi un formato specifico e già esistenti (magari perché generati da altri software); se così non fosse, ci sono probabilmente dei metodi meno complessi di scrivere su file, cioè che non richiedono di gestire il file così a basso livello... Bisognerebbe conoscere anche lo scopo di utilizzo del file in questione.

    Ciao!
    Ciao,

    la struttura del random access file mi è imposta dal fatto che il programma deve pesare pochissimo, deve essere condiviso in una LAN e deve essere utilizzato senza bisogno di installazione (l'eseguibile deve essere autosufficiente). Il programma soddisfa tutte le esigenze. L'unica pecca è, appunto, la funzione di cancellazione che, per qualche motivo, restituisce un errore quando i record cominciano ad aumentare.
    http://www.espositosoftware.it

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    Originariamente inviato da esposito
    la struttura del random access file mi è imposta dal fatto che il programma deve pesare pochissimo, deve essere condiviso in una LAN e deve essere utilizzato senza bisogno di installazione (l'eseguibile deve essere autosufficiente). Il programma soddisfa tutte le esigenze. L'unica pecca è, appunto, la funzione di cancellazione che, per qualche motivo, restituisce un errore quando i record cominciano ad aumentare.
    Anche il file di dati è condiviso tra più utenti?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Originariamente inviato da alka
    Anche il file di dati è condiviso tra più utenti?
    Sì, anche il file di archivio è condiviso. Tuttavia, gli utenti non sono molti e, per questo motivo, il rischio che effettuino un salvataggio o una modifica nello stesso preciso istante è molto remoto.
    http://www.espositosoftware.it

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    Originariamente inviato da esposito
    Sì, anche il file di archivio è condiviso. Tuttavia, gli utenti non sono molti e, per questo motivo, il rischio che effettuino un salvataggio o una modifica nello stesso preciso istante è molto remoto.
    Mmm... invece non lo escluderei del tutto, anzi do quasi per scontato che sia la causa principale, salvo altri indizi (anche perché quando il file è voluminoso, i tempi di salvataggio aumentano, visto che la cancellazione materialmente avviene riscrivendo l'intero file senza il record eliminato, oltretutto passando tutti i dati in rete).

    Per verificare la correttezza della procedura, sarebbe sufficiente costruire qualche Unit Test automatizzato che effettui varie operazioni di inserimento, modifica, eliminazione sul file per accertare che il problema non si verifichi anche in condizione di "monoutenza".

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.