10/05/2024 - al.delphi ha scritto:
Nel caso dovesse avviarsi l'interfaccia, mi puoi rispondere alla domanda #1, ovvero se posso spostare DragAcceptFiles(Handle, True); in OnShow senza compromettere il funzionamento? Fin'ora lo utilizzavo esclusivamente in OnCreate.
Non credo sia corretto spostarlo in OnShow: quell'evento si verifica ogni volta che la finestra viene mostrata, ma anche quando viene nascosta e poi mostrata di nuovo, mentre la caratteristica di poter accettare file deve essere una operazione “una tantum”.
Può essere però che ci siano state delle modifiche a livello di gestione dell'handle di Windows, in quanto mi pare di ricordare che la creazione dei controlli visuali basati su API di Windows (e il Form è uno di questi), ossia che hanno appunto un handle, avviene in due fasi: una questione è creare l'oggetto in sé, che è una questione che riguarda Delphi, l'altro è la creazione effettiva dell'handle che rappresenta il controllo in Delphi (per ricevere messaggi, avere una rappresentazione, ecc.).
Fossi in te, proverei a fare l'override dei metodi CreateWnd() e DestroyWnd() che sono quelli invocati quando si va a creare e distruggere l'handle del controllo.
Idealmente, dovresti scrivere qualcosa del genere:
procedure TMainForm.CreateWnd;
begin
inherited;
DragAcceptFiles(Handle, True);
end;
procedure TMainForm.DestroyWnd;
begin
DragAcceptFiles(Handle, False);
inherited;
end;
Magari questo risolve il problema alla radice.
Nel costruttore effettivamente potrebbe non essere corretto, perché se qualche condizione ricrea l'handle, il drag&drop rimane “registrato” su quello precedente che non è più valido.