Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: tito_livio - Luglio 03, 2023, 01:04:55 pm

Titolo: Impedire riduzione ad icona di una form
Inserito da: tito_livio - Luglio 03, 2023, 01:04:55 pm
Buongiorno a tutti,
forse mi sto perdendo in un bicchiere d'acqua, ma come si fa ad impedire che una form venga ridotta ad icona?
Ho provato mettendo FormStyle=fsStayOnTop e ho provato con abort nell'evento OnDeactivate della form ma non funzionano.

Tito
Titolo: Re:Impedire riduzione ad icona di una form
Inserito da: DragoRosso - Luglio 03, 2023, 02:15:17 pm
Dalla proprietà della Form -> BorderIcons togli la spunta a biMinimize intanto.

Inoltre tutte le applicazioni possono essere messe in condizioni di icona ridotta tramite la barra applicazioni (non è possibile evitare ciò, almeno per mia conoscenza).

Se vuoi bloccare l'applicazione dagli spostamenti (compreso l'eventuale messa a icona in altri modi, eccetto come dicevo la barra) puoi intercettare il messaggio "WM_WindowPosChanging":

Codice: [Seleziona]
var PosLocked: boolean = True;

procedure PosChange(var Msg: TWmWindowPosChanging); message WM_WINDOWPOSCHANGING;

procedure TForm1.PosChange(var Msg: TWmWindowPosChanging) ;
begin
  if PosLocked then
    begin
      Msg.WindowPos.x := Left;
      Msg.WindowPos.y := Top;
      Msg.Result := 0;
    end
  else
    inherited;
end;

Ciao
Titolo: Re:Impedire riduzione ad icona di una form
Inserito da: tito_livio - Luglio 03, 2023, 05:13:57 pm
Grazie @DragoRosso, funziona, ho bloccato la riduzione a icona.
Bloccare lo spostamento non era richiesto ma potrebbe servire in futuro.

Ciao.
Titolo: Re:Impedire riduzione ad icona di una form
Inserito da: DragoRosso - Luglio 10, 2023, 04:09:45 pm
Grazie @DragoRosso, funziona, ho bloccato la riduzione a icona.
Bloccare lo spostamento non era richiesto ma potrebbe servire in futuro.
Ciao.

Se vuoi bloccare solo la riduzione ad icona, potresti controllare nella procedura i valori "Msg.WindowPos.x" e "Msg.WindowPos.y" prima di cambiarli. Prova a vedere con il debugger il valore che hanno quando l'app viene messa ad icona (teoricamente potrebbe essere -1 e -1, ma questi valori sono validi anche quando sposti fuori dallo schermo la tua Form ....).

Ciao
Titolo: Re:Impedire riduzione ad icona di una form
Inserito da: tito_livio - Luglio 11, 2023, 06:30:59 pm
Ho fatto un po' di prove e  scrivendo "Msg.WindowPos.x" e "Msg.WindowPos.y" in Lazarus dà errore e non compila.
Infatti scritto così funziona in Delphi (provato in Delphi 7), in Lazarus invece bisogna scrivere:  "Msg.WindowPos^.x" e "Msg.WindowPos^.y".
Se l'applicazione è ridotta ad icona la coppia di coordinate della posizione del form è (0,0) in entrambi gli ambienti di sviluppo, valore uguale alla posizione di partenza del form.
Comunque il metodo funziona benissimo per tenere fermo la form/applicazione.
Inoltre, se l'applicazione gira su di un computer multi monitor, impostare le coordinate  può servire per decidere in quale monitor l'applicazione deve stare, utile, per esempio, per programmi elimina code o comunque che prevedono anche un monitor dedicato ad un "pubblico".

Ciao.
Titolo: Re:Impedire riduzione ad icona di una form
Inserito da: DragoRosso - Luglio 11, 2023, 07:10:50 pm
Ho fatto un po' di prove e  scrivendo "Msg.WindowPos.x" e "Msg.WindowPos.y" in Lazarus dà errore e non compila.
Infatti scritto così funziona in Delphi (provato in Delphi 7), in Lazarus invece bisogna scrivere:  "Msg.WindowPos^.x" e "Msg.WindowPos^.y".

Si, scusa errore mio. Sono abituato con Delphi che "dereferenzia" il puntatore in automatico.

Se l'applicazione è ridotta ad icona la coppia di coordinate della posizione del form è (0,0) in entrambi gli ambienti di sviluppo, valore uguale alla posizione di partenza del form.

Uhmm ... dovrò approfondire ...

Inoltre, se l'applicazione gira su di un computer multi monitor, impostare le coordinate  può servire per decidere in quale monitor l'applicazione deve stare, utile, per esempio, per programmi elimina code o comunque che prevedono anche un monitor dedicato ad un "pubblico".

Su questo bisogna stare attenti (anche se funziona) perchè le coordinate dei monitor non è detto che siano ciò che noi pensiamo. Dipende dal DPI e da come è settata l'applicazione.

Si possono usare anche Screen e Monitors che sono variabili predefinite.

Ciao