Domanda

Ho controllato al 100% Sto chiudendo tutti gli handle su un file che ho creato di recente. Ma quando chiamo " opendialog.execute; " la finestra di dialogo si apre come al solito ma con il mouse sopra il suggerimento di un file creato di recente l'intera cosa si blocca con un errore fuori limite.

So che questo non è uno dei miei limiti, come se aprissi il file senza causare un evento (onhint), non ci sono problemi e codificare un elenco di nomi di file per il test ha mostrato che non c'era niente di sbagliato nell'apertura o nel salvataggio di un file. È puramente sull'evento onhint della finestra di dialogo aperta. Come ho detto se sono veloce o utilizzo i tasti freccia non c'è niente di sbagliato nel mio programma.

La cosa più interessante è che non succede nemmeno il 100% delle volte circa il 70%, il che mi ha portato a pensare di averlo riparato più volte, se non solo per un breve periodo di tempo. Qualcuno sa cosa potrebbe succedere? E se no come posso disabilitare l'evento onhint?

come richiesto per il codice non aiuta affatto

OpenDialog.execute;    // crashes here
if fileexists(form1.OpenDialog.FileName) then    
  form1.Address.Text:=form1.OpenDialog.FileName;

e l'errore testo del link

EDIT: ok ho alcune nuove informazioni che una nuova istanza di opendialog ha ancora gli stessi problemi. e, più interessante, sembra che abbia risolto il problema del 30% relativo al suggerimento di un file con un doppio tag, ad esempio "test.jpg.enc". la cosa va bene con esso la prima volta che viene eseguito, e si blocca solo con il suggerimento di questi file codificati, ma solo se ho codificato quel file bianco l'applicazione si è aperta. ad esempio se lo codifico, quindi provo a decodificarlo e si arresta in modo anomalo .. posso eseguirlo di nuovo e decodificarlo correttamente, ma non c'è alcun problema con la decodifica e quindi la codifica in un'istanza dell'aplication.

È stato utile?

Soluzione 3

La soluzione per questo era usare activeX, sembra che ci fosse un bug intordato dopo SP2

utilizza ActiveX;

di inizializzazione   OleInitialize (zero);

finalizzazione   OleUninitialize fine.

oringinaly pubblicato dalla volpe qui

Altri suggerimenti

Sei sicuro che sia stata creata un'istanza di form1?

se sì:

Perché non usi così:

OpenDialog.Options:=  OpenDialog.Options + [ofFileMustExist];

if OpenDialog.Execute then
  Address.Text:= OpenDialog.FileName

Utilizza FastMM4 e definisci FullDebugMode in FastMM4.inc. Questo può aiutarti a trovare il vero problema

Primo: non è quasi mai necessario fare riferimento a " form1.xxx " nel tuo codice, / specialmente / se stai scrivendo codice in un metodo di Form1. Rimuoverei quei riferimenti.

Quindi, creerei un'applicazione il più semplice possibile - un modulo, un TOpenDialog e un pulsante, e proverei a scrivere il minor codice possibile per aprire il file in questione. Se funziona, prova a capire qual è la differenza tra la tua semplice app e la tua vera app. Se fallisce, modifica la tua domanda sopra con / all / il codice per il semplice programma che fallisce.

Due cose:

Compila la tua applicazione con Debug DCU ( Progetto / Opzioni / Usa debug DCU - quindi fai un full build ) e quindi vedere dove si sta verificando l'eccezione. Questo ti darà qualche informazione in più quando si verifica un'eccezione nel codice vcl / rtl. Inviaci il messaggio di errore completo e dove in quale unità ha fallito.

In secondo luogo, e probabilmente ancora più importante , è il comportamento del file all'esterno dell'applicazione. Suggerisci che fallisce circa il 30% delle volte, quindi ogni volta che salvi il file, sfoglialo in una normale finestra di esplorazione e passaci sopra con il mouse per vedere se il suggerimento viene visualizzato correttamente. Quindi aprilo nel blocco note. Se entrambi funzionano, e quindi fallisce nella tua applicazione sarebbe interessante.

Inoltre, quando pubblichi una domanda di follow-up a un precedente domanda è utile se si collega alla domanda precedente in modo che possiamo vedere cosa hai provato in precedenza.

Buona fortuna!

Il messaggio di errore non è un limite, ma una violazione di accesso. Questo significa che stai accedendo alla memoria a cui non sei tuo. Ciò accade principalmente quando una variabile di classe (che è un puntatore a una classe) non viene inizializzata o è già liberata.

Il codice, che presumo sia un metodo di form1, può utilizzare alcune modifiche (che è già stato menzionato):

OpenDialog.execute;    // crashes here
if fileexists(OpenDialog.FileName) then    
  Address.Text := OpenDialog.FileName;

Ma cos'è OpenDialog, è un componente trascinato in form1? In tal caso probabilmente form1 non è inizializzato. Ma molto probabilmente è che OpenDialog è una variabile locale. In tal caso puoi inizializzarlo:

OpenDialog := TOpenDialog.Create;
try
  OpenDialog.execute;   
  if fileexists(OpenDialog.FileName) then    
    Address.Text := OpenDialog.FileName;
finally
  OpenDialog.Free;
end;

Il tuo commento alla risposta di Nick Hodges indica che stai chiamando OpenDialog di Form1 dall'esterno di Form1. Sembra una cattiva idea. Invece, potrebbe essere chiamato un metodo pubblico di Form1 e quel metodo potrebbe manipolare i componenti di Form1. Non ho testato il tuo scenario, ma sembra che ciò potrebbe causare i tuoi problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top