Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Marzo 26, 2020, 01:14:33 pm

Titolo: [Risolto] ShowMessage senza bottone
Inserito da: petrusic - Marzo 26, 2020, 01:14:33 pm
Il titolo dovrebbe dare l'idea di una finestra di messaggio contenente  una nota per l'utente, senza però richiederne l'intervento per andare avanti con l'esecuzione del codice, infatti io mi trovo con questa tipologia di lavoro:
- Avvio del programma
- Emissione Form principale vuota
- missione ShowMessage  di avviso d'attesa (senza pulsante)
- Caricamento dati da DBase SQLite
- Attivazione degli altri oggetti componenti la Form principale
- Cancellazione della ShowMessage (senza pulsante)
- Attesa utente

Ho provato a trovare un qualche strumento grafico che soddisfacesse le mie esigenze, ma senza essere riuscito a trovaerlo.
Ho pensato ad una Label, ma non compare; ho pensato ad casella TEdit che deve attendere la digitazione da parte dell'utente, ma mi obliga a gestire gli eventi KeyDown e Key press, per non tenere conto dell'attività dell'utente fino al termine del caricamento dati dal DB.
Sono, ottimisticamente convinto che debba esserci uno strumento simile allo ShowMessage, ma che possa essere chiuso da codice e non dall'esterno.
E' possibile che non ci sia?
Titolo: Re:ShowMessage senza bottone
Inserito da: xinyiman - Marzo 26, 2020, 01:26:25 pm
Puoi usare una TLabel insieme ad un TTimer.
Lascia la label con la proprietà visible a true. Ed imposti l'interval del timer a 5000 (ovvero cinque secondi)
Poi nell'evento ontimer metti l'interval del timer a 0 (così non riparte una seconda volta) ed imposti la proprietà visible della label a false
Titolo: Re:ShowMessage senza bottone
Inserito da: Stilgar - Marzo 26, 2020, 03:43:48 pm
Forse non ho capito.
Potresti creare una form ad hoc al posto di usare show message.
Esiste una propery (FormStyle) che puoi impostare a fsSplash.
Togli tutto quello che possa farla chiudere senza il controllo del programma e dovresti aver ottenuto quello che ti prefiggevi.

Stilgar
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 26, 2020, 03:56:14 pm
Puoi usare una TLabel insieme ad un TTimer.
...
Grazie. Leggendo il tuo consiglio, ho l'impressione che sia più complicato rispetto a creare una procedura di intercettazione di tasti specifici premuti. Non avevo ancora provato, ma poco fa ho impostato la proprietà  ReadOnly della mia Tedit di prova a True.
Pensavo che, con ReadOnly = True, gli eventi OnKeyDown, OnKeypress e OnKweyUp venissero disabilitati, invece ho provato e continuano a funzionare. In queste condizioni e, visto che dovrò sicuramente sfruttarli per altre occasioni, tanto vale che ci metto mani subito.

Potresti creare una form ad hoc al posto di usare show message.
...
Ho capito, ma non è un pò esagerato scomodare una form ogni volta che si debba avvisare l'utente ad aspettare il ciclo di elaborazione in corso?

Io sto studiando in un colpo solo  Pascal e Lazarus e vorrei costruire, mentre imparo, una metodologia di scrittura di cui appropriarmi correttamente ed a titolo definitivo.
Grazie a tutti e due.
 ;) :D
Titolo: Re:ShowMessage senza bottone
Inserito da: Stilgar - Marzo 26, 2020, 03:59:37 pm
Citazione
- Avvio del programma
- Emissione Form principale vuota
- missione ShowMessage  di avviso d'attesa (senza pulsante)

- Caricamento dati da DBase SQLite
- Attivazione degli altri oggetti componenti la Form principale
- Cancellazione della ShowMessage (senza pulsante)
- Attesa utente
Questa sequenza di operazioni in avvio si prestano bene ad una spash screen. Per questo ti suggerivo una form.
Se devi fare tutte queste opeazioni alla pressione di un tasto, credo, ci sia qualche cosa che mi sfugge..

Stilgar
Titolo: Re:ShowMessage senza bottone
Inserito da: nomorelogic - Marzo 26, 2020, 04:03:45 pm
puoi fare qualcosa del genere

Codice: [Seleziona]
- Avvio del programma
- Emissione Form principale vuota
- attesa:= TAttesa.Create(self);
try
- attesa.Show;
- Caricamento dati da DBase SQLite
- Attivazione degli altri oggetti componenti la Form principale
finally
   attesa.Close;
   FreeAndNil( attesa );
end
- Attesa utente
Titolo: Re:ShowMessage senza bottone
Inserito da: xinyiman - Marzo 26, 2020, 04:35:04 pm
Ecco un breve video: https://youtu.be/QxVcp9cgN_c

Ovviamente l'aspetto è spartano. Serve solo per avere delle indicazioni di massima.
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 26, 2020, 05:13:34 pm
Questa sequenza di operazioni in avvio si prestano bene ad una spash screen. Per questo ti suggerivo una form.
Se devi fare tutte queste opeazioni alla pressione di un tasto, credo, ci sia qualche cosa che mi sfugge..

Sicuramente sono io a non essere stringato e chiaro.
All'avvio del programma, devo soltanto prendere in carico un paio di colonne di dati da una tabella del DB per caricarle dentro altrettante ComboBox. Sicuramente è un'operazione brevissima, ma per esercizio, vorrei prendere confidenza con gli strumenti di Lazarus.
Durante il caricamento non serve visualizzare il contenuto della Form principale del programma, quindi ho in mente di rimandare tale visualizzazione dopo che sia avvenuto il caricamento delle 2  ComboBox, quindi non occorre che venga premuto alcun tasto. Solo il programma conosce, infatti, l'inizio e la fine delle operazioni di caricamento.
Spero ora di avere chiarito il mio ragionamento.

Avevo, inizialmente, anch'io pensato ad una seconda Form, ma poi ho tralasciato l'idea, perchè, qualora dovessi ripetere tale operazione in altri momenti del programma o in altri programmi, dovrei costruire una gerarchia di Form con passaggio di dati, a volte anche corposi, fra le stesse.

Non ho capito il suggerimento di nomorelogic.  TAttesa che cosa è una classe di tipo Form?
Titolo: Re:ShowMessage senza bottone
Inserito da: nomorelogic - Marzo 26, 2020, 05:17:35 pm
Non ho capito il suggerimento di nomorelogic.  TAttesa che cosa è una classe di tipo Form?

si, fai una nuova form e la chiami TAttesa

la istanzi e mostri prima delle operazioni che devi fare e poi la chiudi e la cancelli
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 26, 2020, 05:35:02 pm
Ecco un breve video: https://youtu.be/QxVcp9cgN_c

Ovviamente l'aspetto è spartano. Serve solo per avere delle indicazioni di massima.
Purtroppo non posso vederlo. Mi dice che il video è privato e che occorre l'autorizzazione per poterlo vedere. Inoltre non sono registrato in YouTube.

Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 26, 2020, 05:45:47 pm
Un'alternativa che per ora vorrei affrontare è quella di testare la pressione dei tasti, come |Invio|, |Backspace|, ....
 Ho trovato qui (https://forum.lazarus.freepascal.org/index.php/topic,23179.msg138071.html#msg138071)
l'uso di una funzione , chiamata VKStringToWord e non ho capito come fare per aggiungerla nel mio programma.
Pensavo ad un pacchetto da fare richiamare a Lazarus stesso per averlo disponibile e richiamabile in qualsiasi programma futuro.
Titolo: Re:ShowMessage senza bottone
Inserito da: Stilgar - Marzo 26, 2020, 06:11:17 pm
Una cosa per volta.
Ti allego un progetto di esempio per la questione di prima.

Titolo: Re:ShowMessage senza bottone
Inserito da: Stilgar - Marzo 26, 2020, 06:53:20 pm
Per i tasti e i nomi. (Non lasciarti trarre in inganno dalla pigrizia di xinyiman  ;D )Usando le unit : LCLType, fgl
Creando un contenitore comodo:
Codice: [Seleziona]
    type
    TKeyNameMap = specialize TFPGMap<word, string>;
  var
    FKeyNameMap: TKeyNameMap;       
Popoli il contenitore
Codice: [Seleziona]
 FKeyNameMap := TKeyNameMap.Create;
  FKeyNameMap.add(VK_0, 'KEY 0');
  FKeyNameMap.add(VK_1, 'KEY 1');
  FKeyNameMap.add(VK_2, 'KEY 2');
  FKeyNameMap.add(VK_3, 'KEY 3');
  FKeyNameMap.add(VK_4, 'KEY 4');
  FKeyNameMap.add(VK_5, 'KEY 5');
  FKeyNameMap.add(VK_6, 'KEY 6');
  FKeyNameMap.add(VK_7, 'KEY 7');
  FKeyNameMap.add(VK_8, 'KEY 8');
  FKeyNameMap.add(VK_9, 'KEY 9');
  FKeyNameMap.add(VK_A, 'KEY A');
  FKeyNameMap.add(VK_ACCEPT, 'KEY ACCEPT');
  FKeyNameMap.add(VK_ADD, 'KEY ADD');
  FKeyNameMap.add(VK_APPS, 'KEY APPS');
  FKeyNameMap.add(VK_ATTN, 'KEY ATTN');
  FKeyNameMap.add(VK_B, 'KEY B');
  FKeyNameMap.add(VK_BACK, 'KEY BACK');
  FKeyNameMap.add(VK_BROWSER_BACK, 'KEY BROWSER_BACK');
  FKeyNameMap.add(VK_BROWSER_FAVORITES, 'KEY BROWSER_FAVORITES');
  FKeyNameMap.add(VK_BROWSER_FORWARD, 'KEY BROWSER_FORWARD');
  FKeyNameMap.add(VK_BROWSER_HOME, 'KEY BROWSER_HOME');
  FKeyNameMap.add(VK_BROWSER_REFRESH, 'KEY BROWSER_REFRESH');
  FKeyNameMap.add(VK_BROWSER_SEARCH, 'KEY BROWSER_SEARCH');
  FKeyNameMap.add(VK_BROWSER_STOP, 'KEY BROWSER_STOP');
  FKeyNameMap.add(VK_C, 'KEY C');
  FKeyNameMap.add(VK_CANCEL, 'KEY CANCEL');
  FKeyNameMap.add(VK_CAPITAL, 'KEY CAPITAL');
  FKeyNameMap.add(VK_CLEAR, 'KEY CLEAR');
  FKeyNameMap.add(VK_CONTROL, 'KEY CONTROL');
  FKeyNameMap.add(VK_CONVERT, 'KEY CONVERT');
  FKeyNameMap.add(VK_CRSEL, 'KEY CRSEL');
  FKeyNameMap.add(VK_D, 'KEY D');
  FKeyNameMap.add(VK_DECIMAL, 'KEY DECIMAL');
  FKeyNameMap.add(VK_DELETE, 'KEY DELETE');
  FKeyNameMap.add(VK_DIVIDE, 'KEY DIVIDE');
  FKeyNameMap.add(VK_DOWN, 'KEY DOWN');
  FKeyNameMap.add(VK_E, 'KEY E');
  FKeyNameMap.add(VK_END, 'KEY END');
  FKeyNameMap.add(VK_EREOF, 'KEY EREOF');
  FKeyNameMap.add(VK_ESCAPE, 'KEY ESCAPE');
  FKeyNameMap.add(VK_EXECUTE, 'KEY EXECUTE');
  FKeyNameMap.add(VK_EXSEL, 'KEY EXSEL');
  FKeyNameMap.add(VK_F, 'KEY F');
  FKeyNameMap.add(VK_F1, 'KEY F1');
  FKeyNameMap.add(VK_F10, 'KEY F10');
  FKeyNameMap.add(VK_F11, 'KEY F11');
  FKeyNameMap.add(VK_F12, 'KEY F12');
  FKeyNameMap.add(VK_F13, 'KEY F13');
  FKeyNameMap.add(VK_F14, 'KEY F14');
  FKeyNameMap.add(VK_F15, 'KEY F15');
  FKeyNameMap.add(VK_F16, 'KEY F16');
  FKeyNameMap.add(VK_F17, 'KEY F17');
  FKeyNameMap.add(VK_F18, 'KEY F18');
  FKeyNameMap.add(VK_F19, 'KEY F19');
  FKeyNameMap.add(VK_F2, 'KEY F2');
  FKeyNameMap.add(VK_F20, 'KEY F20');
  FKeyNameMap.add(VK_F21, 'KEY F21');
  FKeyNameMap.add(VK_F22, 'KEY F22');
  FKeyNameMap.add(VK_F23, 'KEY F23');
  FKeyNameMap.add(VK_F24, 'KEY F24');
  FKeyNameMap.add(VK_F3, 'KEY F3');
  FKeyNameMap.add(VK_F4, 'KEY F4');
  FKeyNameMap.add(VK_F5, 'KEY F5');
  FKeyNameMap.add(VK_F6, 'KEY F6');
  FKeyNameMap.add(VK_F7, 'KEY F7');
  FKeyNameMap.add(VK_F8, 'KEY F8');
  FKeyNameMap.add(VK_F9, 'KEY F9');
  FKeyNameMap.add(VK_FINAL, 'KEY FINAL');
  FKeyNameMap.add(VK_G, 'KEY G');
  FKeyNameMap.add(VK_H, 'KEY H');
  FKeyNameMap.add(VK_HANGUL, 'KEY HANGUL');
  FKeyNameMap.add(VK_HANJA, 'KEY HANJA');
  FKeyNameMap.add(VK_HELP, 'KEY HELP');
  FKeyNameMap.add(VK_HIGHESTVALUE, 'KEY HIGHESTVALUE');
  FKeyNameMap.add(VK_HOME, 'KEY HOME');
  FKeyNameMap.add(VK_I, 'KEY I');
  FKeyNameMap.add(VK_INSERT, 'KEY INSERT');
  FKeyNameMap.add(VK_J, 'KEY J');
  FKeyNameMap.add(VK_JUNJA, 'KEY JUNJA');
  FKeyNameMap.add(VK_K, 'KEY K');
  FKeyNameMap.add(VK_KANA, 'KEY KANA');
  FKeyNameMap.add(VK_KANJI, 'KEY KANJI');
  FKeyNameMap.add(VK_L, 'KEY L');
  FKeyNameMap.add(VK_LAUNCH_APP1, 'KEY LAUNCH_APP1');
  FKeyNameMap.add(VK_LAUNCH_APP2, 'KEY LAUNCH_APP2');
  FKeyNameMap.add(VK_LAUNCH_MAIL, 'KEY LAUNCH_MAIL');
  FKeyNameMap.add(VK_LAUNCH_MEDIA_SELECT, 'KEY LAUNCH_MEDIA_SELECT');
  FKeyNameMap.add(VK_LBUTTON, 'KEY LBUTTON');
  FKeyNameMap.add(VK_LCL_ALT, 'KEY LCL_ALT');
  FKeyNameMap.add(VK_LCL_AT, 'KEY LCL_AT');
  FKeyNameMap.add(VK_LCL_BACKSLASH, 'KEY LCL_BACKSLASH');
  FKeyNameMap.add(VK_LCL_CALL, 'KEY LCL_CALL');
  FKeyNameMap.add(VK_LCL_CAPSLOCK, 'KEY LCL_CAPSLOCK');
  FKeyNameMap.add(VK_LCL_CLOSE_BRAKET, 'KEY LCL_CLOSE_BRAKET');
  FKeyNameMap.add(VK_LCL_COMMA, 'KEY LCL_COMMA');
  FKeyNameMap.add(VK_LCL_ENDCALL, 'KEY LCL_ENDCALL');
  FKeyNameMap.add(VK_LCL_EQUAL, 'KEY LCL_EQUAL');
  FKeyNameMap.add(VK_LCL_LALT, 'KEY LCL_LALT');
  FKeyNameMap.add(VK_LCL_MINUS, 'KEY LCL_MINUS');
  FKeyNameMap.add(VK_LCL_OPEN_BRAKET, 'KEY LCL_OPEN_BRAKET');
  FKeyNameMap.add(VK_LCL_POINT, 'KEY LCL_POINT');
  FKeyNameMap.add(VK_LCL_POWER, 'KEY LCL_POWER');
  FKeyNameMap.add(VK_LCL_QUOTE, 'KEY LCL_QUOTE');
  FKeyNameMap.add(VK_LCL_RALT, 'KEY LCL_RALT');
  FKeyNameMap.add(VK_LCL_SEMI_COMMA, 'KEY LCL_SEMI_COMMA');
  FKeyNameMap.add(VK_LCL_SLASH, 'KEY LCL_SLASH');
  FKeyNameMap.add(VK_LCL_TILDE, 'KEY LCL_TILDE');
  FKeyNameMap.add(VK_LCONTROL, 'KEY LCONTROL');
  FKeyNameMap.add(VK_LEFT, 'KEY LEFT');
  FKeyNameMap.add(VK_LMENU, 'KEY LMENU');
  FKeyNameMap.add(VK_LSHIFT, 'KEY LSHIFT');
  FKeyNameMap.add(VK_LWIN, 'KEY LWIN');
  FKeyNameMap.add(VK_M, 'KEY M');
  FKeyNameMap.add(VK_MBUTTON, 'KEY MBUTTON');
  FKeyNameMap.add(VK_MEDIA_NEXT_TRACK, 'KEY MEDIA_NEXT_TRACK');
  FKeyNameMap.add(VK_MEDIA_PLAY_PAUSE, 'KEY MEDIA_PLAY_PAUSE');
  FKeyNameMap.add(VK_MEDIA_PREV_TRACK, 'KEY MEDIA_PREV_TRACK');
  FKeyNameMap.add(VK_MEDIA_STOP, 'KEY MEDIA_STOP');
  FKeyNameMap.add(VK_MENU, 'KEY MENU');
  FKeyNameMap.add(VK_MODECHANGE, 'KEY MODECHANGE');
  FKeyNameMap.add(VK_MULTIPLY, 'KEY MULTIPLY');
  FKeyNameMap.add(VK_N, 'KEY N');
  FKeyNameMap.add(VK_NEXT, 'KEY NEXT');
  FKeyNameMap.add(VK_NONAME, 'KEY NONAME');
  FKeyNameMap.add(VK_NONCONVERT, 'KEY NONCONVERT');
  FKeyNameMap.add(VK_NUMLOCK, 'KEY NUMLOCK');
  FKeyNameMap.add(VK_NUMPAD0, 'KEY NUMPAD0');
  FKeyNameMap.add(VK_NUMPAD1, 'KEY NUMPAD1');
  FKeyNameMap.add(VK_NUMPAD2, 'KEY NUMPAD2');
  FKeyNameMap.add(VK_NUMPAD3, 'KEY NUMPAD3');
  FKeyNameMap.add(VK_NUMPAD4, 'KEY NUMPAD4');
  FKeyNameMap.add(VK_NUMPAD5, 'KEY NUMPAD5');
  FKeyNameMap.add(VK_NUMPAD6, 'KEY NUMPAD6');
  FKeyNameMap.add(VK_NUMPAD7, 'KEY NUMPAD7');
  FKeyNameMap.add(VK_NUMPAD8, 'KEY NUMPAD8');
  FKeyNameMap.add(VK_NUMPAD9, 'KEY NUMPAD9');
  FKeyNameMap.add(VK_O, 'KEY O');
  FKeyNameMap.add(VK_OEM_1, 'KEY OEM_1');
  FKeyNameMap.add(VK_OEM_102, 'KEY OEM_102');
  FKeyNameMap.add(VK_OEM_2, 'KEY OEM_2');
  FKeyNameMap.add(VK_OEM_3, 'KEY OEM_3');
  FKeyNameMap.add(VK_OEM_4, 'KEY OEM_4');
  FKeyNameMap.add(VK_OEM_5, 'KEY OEM_5');
  FKeyNameMap.add(VK_OEM_6, 'KEY OEM_6');
  FKeyNameMap.add(VK_OEM_7, 'KEY OEM_7');
  FKeyNameMap.add(VK_OEM_8, 'KEY OEM_8');
  FKeyNameMap.add(VK_OEM_CLEAR, 'KEY OEM_CLEAR');
  FKeyNameMap.add(VK_OEM_COMMA, 'KEY OEM_COMMA');
  FKeyNameMap.add(VK_OEM_MINUS, 'KEY OEM_MINUS');
  FKeyNameMap.add(VK_OEM_PERIOD, 'KEY OEM_PERIOD');
  FKeyNameMap.add(VK_OEM_PLUS, 'KEY OEM_PLUS');
  FKeyNameMap.add(VK_P, 'KEY P');
  FKeyNameMap.add(VK_PA1, 'KEY PA1');
  FKeyNameMap.add(VK_PAUSE, 'KEY PAUSE');
  FKeyNameMap.add(VK_PLAY, 'KEY PLAY');
  FKeyNameMap.add(VK_PRINT, 'KEY PRINT');
  FKeyNameMap.add(VK_PRIOR, 'KEY PRIOR');
  FKeyNameMap.add(VK_PROCESSKEY, 'KEY PROCESSKEY');
  FKeyNameMap.add(VK_Q, 'KEY Q');
  FKeyNameMap.add(VK_R, 'KEY R');
  FKeyNameMap.add(VK_RBUTTON, 'KEY RBUTTON');
  FKeyNameMap.add(VK_RCONTROL, 'KEY RCONTROL');
  FKeyNameMap.add(VK_RETURN, 'KEY RETURN');
  FKeyNameMap.add(VK_RIGHT, 'KEY RIGHT');
  FKeyNameMap.add(VK_RMENU, 'KEY RMENU');
  FKeyNameMap.add(VK_RSHIFT, 'KEY RSHIFT');
  FKeyNameMap.add(VK_RWIN, 'KEY RWIN');
  FKeyNameMap.add(VK_S, 'KEY S');
  FKeyNameMap.add(VK_SCROLL, 'KEY SCROLL');
  FKeyNameMap.add(VK_SELECT, 'KEY SELECT');
  FKeyNameMap.add(VK_SEPARATOR, 'KEY SEPARATOR');
  FKeyNameMap.add(VK_SHIFT, 'KEY SHIFT');
  FKeyNameMap.add(VK_SLEEP, 'KEY SLEEP');
  FKeyNameMap.add(VK_SNAPSHOT, 'KEY SNAPSHOT');
  FKeyNameMap.add(VK_SPACE, 'KEY SPACE');
  FKeyNameMap.add(VK_SUBTRACT, 'KEY SUBTRACT');
  FKeyNameMap.add(VK_T, 'KEY T');
  FKeyNameMap.add(VK_TAB, 'KEY TAB');
  FKeyNameMap.add(VK_U, 'KEY U');
  FKeyNameMap.add(VK_UNDEFINED, 'KEY UNDEFINED');
  FKeyNameMap.add(VK_UNKNOWN, 'KEY UNKNOWN');
  FKeyNameMap.add(VK_UP, 'KEY UP');
  FKeyNameMap.add(VK_V, 'KEY V');
  FKeyNameMap.add(VK_VOLUME_DOWN, 'KEY VOLUME_DOWN');
  FKeyNameMap.add(VK_VOLUME_MUTE, 'KEY VOLUME_MUTE');
  FKeyNameMap.add(VK_VOLUME_UP, 'KEY VOLUME_UP');
  FKeyNameMap.add(VK_W, 'KEY W');
  FKeyNameMap.add(VK_X, 'KEY X');
  FKeyNameMap.add(VK_XBUTTON1, 'KEY XBUTTON1');
  FKeyNameMap.add(VK_XBUTTON2, 'KEY XBUTTON2');
  FKeyNameMap.add(VK_Y, 'KEY Y');
  FKeyNameMap.add(VK_Z, 'KEY Z');
  FKeyNameMap.add(VK_ZOOM, 'KEY ZOOM');   
e infine nel gestore della pressione dei tasti (onKeyQualcheCosa)

Codice: [Seleziona]
   if FKeyNameMap.IndexOf(key) > -1 then
    Caption := FKeyNameMap.KeyData[key];


Spero sia abbastanza chiaro.
Stilgar
Titolo: Re:ShowMessage senza bottone
Inserito da: Stilgar - Marzo 26, 2020, 06:54:46 pm
A te lascio pensare come fare il contrario :)
Da Stringa il valore numerico :)
String
Titolo: Re:ShowMessage senza bottone
Inserito da: xinyiman - Marzo 26, 2020, 11:04:27 pm
Ora il video dovrebbe essere visibile.
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 28, 2020, 12:27:44 pm
Ora il video dovrebbe essere visibile.
Si, perfetto. Grazie
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 28, 2020, 01:03:02 pm
Coi suggerimenti  di xinyiman, comprensivi del video seguito poco fa, ho imparato tantissimo e mi sento pronto per metterli in pratica al momento opportuno.
Per questo programma, ho modificato la mia idea iniziale ed ho pensato di utilizzare all'avvio una MessageDlg che mi permette di chiudere il programma, avviato eventualmente per errore, ancor prima di dare corso al caricamento dati dal DB.
Invece, in caso di avvio corretto del programma, rimando il caricamento dei dati dal DB, dopo il consenso a proseguire, dato nella MessageDlg.
Infatti, sparendo la finestra di dialogo, il Focus si sposta sull'unico pulsante visibile ed attivo della Form e, dentro la procedura .Enter dello stesso, inserisco le istruzioni di:
- visibilità di tutti gli altri oggetti componenti la Form, lasciandoli però inibiti;
- procedo al caricamento dei dati necessari dal DB;
- a fine caricamento, rendo validi tutti gli oggetti della form, per permettere
la ripresa dell'attività dell'utente.
Allego due immagini di chiarimento
Titolo: Re:ShowMessage senza bottone
Inserito da: xinyiman - Marzo 29, 2020, 09:26:20 pm
Ottimo, felice di essere stato d'aiuto
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 15, 2024, 07:27:03 pm
Riprendo questa discussione, perchè mi sono deciso finalmente a metter in pratica i suggerimenti ricevuti a suo tempo.
Ho provato perciò mandare su una piccola Form un messaggio di "attesa", da gestire interamente tramite codice.

Mi sono orientato su questo post (https://www.lazaruspascal.it/index.php?topic=2275.msg14115#msg14115), ma, ahimè, la prova è fallita.
Riporto le righe con le modifiche:

- nel file frm9.pas:
Codice: [Seleziona]
unit Frm9;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Grids, LCLType, Math, memds, LR_Class, LR_DBSet, lr_e_pdf, Types,
  FrmAttesa, UModuloDatiDB, utilmie;

type       
. . .
procedure AmmortamentoCespiti();   
. . .
  FormAttesa:= TFormAttesa.Create(self);
  FormAttesa.msg:= 'Ricerca   MOVIMENTI AMMORTIZZABILI  in corso' + lineending + lineending + '-----  A T T E N D I  -----';
  FormAttesa.Show;           
. . .
  Formattesa.Close;
  FreeAndNil(FormAttesa);
- - -
end;                           

- nel file frmAttesa.pas
Codice: [Seleziona]
unit FrmAttesa;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

type
  { TFormAttesa }
  TFormAttesa = class(TForm)     //  Form speciale per emissione MESSAGGI
    BPulsOk: TButton;
    Label1: TLabel;
    Panel1: TPanel;
    procedure BPulsOkClick(Sender: TObject);
    procedure BPulsOkEnter(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private

  public
  end;

var
  FormAttesa: TFormAttesa;

  msg: String;
implementation
uses
  FrmMain;
{$R *.lfm}
procedure TFormAttesa.FormCreate(Sender: TObject);
begin
end;

procedure TFormAttesa.BPulsOkEnter(Sender: TObject);
begin
  Label1.Caption:= msg;
end;

procedure TFormAttesa.BPulsOkClick(Sender: TObject);
begin
  self.Hide;
  Close;
end;
end.

Purtroppo non riesco a compilare, per l'Errore "frm9.pas(10,3) Error: Impossibile trovare FrmAttesa usato da Frm9 dell'Analizzatore Progetti."  segnalato dal compilatore.
Ho inserito il nome del file nella finestra dell'Analizzatore Progetti, ma non è cambiato nulla.
Ho guardato anche in:  Progetto -> Opzioni Progettoi -> Form ed ho notatoi che la FormAttesa manca. Dovrei aggiungerla, ma non ho trovato come fare.

A questo punto però mi viene anche il dubbio che ho sbagliato tutto, perchè, magari, non ho capito il suggerimento ricevuto.

Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 17, 2024, 04:55:34 pm
Io proprio non riesco a capire:

La mia Form1  visibile  in : -> Progetto -> Opzioni Progetto -> Form trova corrispondenza coi file  frmmain.lfm e frmmain.pas

Ora ho provato a fare la stessa cosa con la Form8 rinominando la Unit in frmAttesa e rinominando i file frm8.lfm e frm8.pas nei rispettivi frmAttesa.lfm  e frmAttesa.pas.

Ebbene, mentre per la frmmain non mik viene segnalato nessun errore, per la nuova frmAttesa, mi viene segnalato l'Errore "frmmain.pas(9,76) Error: Impossibile trovare FrmAttesa usato da FrmMain dell'Analizzatore Progetti.".

A chiarimento di quanto fatto allego le immagini delle finestre interessate.

Ma allora come devo agire per modificare il nome di una Form e dei file corrispondenti per non fare arrabbiare l'ambiente Lazarus?
Titolo: Re:ShowMessage senza bottone
Inserito da: DragoRosso - Marzo 17, 2024, 09:21:07 pm
Non puoi rinominare i file (a parte che non hai indicato dome hai fatto ...): per rinominare una UNIT (con o senza form) devi usare "SALVA COME" dal menu "FILE" del IDE.

Ciao
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 18, 2024, 09:46:57 am
Non puoi rinominare i file (a parte che non hai indicato dome hai fatto ...): per rinominare una UNIT (con o senza form) devi usare "SALVA COME" dal menu "FILE" del IDE.

Anche se penso di avere già seguito il percorso che mi hai ora suggerito, ho ripetuto l'operazione, ma il riferimento alla Form8 , contenuta nel file frmattesa, non è stata aggiunta all'elenco delle form disponibili dentro le opzioni di tipo form del progetto (vedi immagine allegata)
Titolo: Re:ShowMessage senza bottone
Inserito da: DragoRosso - Marzo 18, 2024, 10:01:01 am
Non saprei cosa dirti: io uso Lazarus 3.2 in Windows e non solo rinomina i file, ma aggiorna anche i riferimenti nei sorgenti (cioè nelle Uses rinomina il riferimento con il nuovo).

Forse qualcun altro del forum che usa più assiduamente Lazarus può fornirti qualche delucidazione.

Ciao
Titolo: Re:ShowMessage senza bottone
Inserito da: nomorelogic - Marzo 18, 2024, 10:54:15 am
anche su Linux funziona allo stesso modo
uso spesso quella funzionalità da menù, sia per rinominare le form che i progetti ed ha sempre funzionato

potrebbe essere anche il case che non riesce a fare il match tra i nomi dei file e la dichiarazione del nome della unit: controlla i case quindi

ad esempio l'errore che hai segnalato è:
Error: Impossibile trovare FrmAttesa usato da FrmMain dell'Analizzatore Progetti.".

mentre nelle dichiarazioni leggo frmAttesa

comunque penso che puoi sistemare manualmente:
- ricontrolla meticolosamente tutti i nomi dei file rispettando il case
- controlla che il nome della unit corrisponda all'identificatore dopo la keyword "uses" nel sorgente (sempre rispettando il case)
- aggiungi manualmente la form


alla fine credo dovresti riuscire a sistemare
Titolo: Re:ShowMessage senza bottone
Inserito da: DragoRosso - Marzo 18, 2024, 11:41:24 am
potrebbe essere anche il case che non riesce a fare il match tra i nomi dei file e la dichiarazione del nome della unit: controlla i case quindi

Hai ragione @nomorelogic, il case mi era sfuggito (non ci faccio caso lavorando con un sistema operativo e soprattutto un linguaggio case insensitive  ;) )

Ciao
Titolo: Re:ShowMessage senza bottone
Inserito da: xinyiman - Marzo 18, 2024, 04:00:18 pm
Come ti è già stato suggerito non devi rinominare i file a mano. Se lo fai, l'analizzatore dei progetti perde il riferimento. Devi poi dall'analizzatore eliminare la dipendenza e rilinkarla a mano.
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 21, 2024, 12:46:29 pm
Va bene. Sono riuscito a reimpostare la form col nuovo nome unit "Frmattesa".
Ora però il com pilatore mi da un altro errore.
Riporto le righe di codice interessate, copiate da qui (https://www.lazaruspascal.it/index.php?topic=2275.msg14115#msg14115):
Codice: [Seleziona]
begin

  Frmattesa:= TForm8.Create();       <-- Riga 2498
  Frmattesa.msg:= 'Ricerca   MOVIMENTI AMMORTIZZABILI  in corso' + lineending + lineending + '-----  A T T E N D I  -----';
  Frmattesa.Show;

  annoCorr:= StrToInt(LeftStr(Form9.dataFin, 4));
. . .
altre istruzioni
. . .
  Frmattesa.Close;
  FreeAndNil(Frmattesa);   

Ecco il messagio d'Errore:
Citazione
frm9.pas(2498,12) Error: Syntax error, "." expected but ":=" found

Nell'esempio di codice suggerito a suo tempo da  nomorelogic il richiamo della Form di Attesa viene fatto con la Form chiamante vuota, mentre io non mi trovo in quella condizione. Non mi rendo conto se ciò possa in qualche modo influire sulla formulazione dell'Errore riportato sopra.
Titolo: Re:ShowMessage senza bottone
Inserito da: DragoRosso - Marzo 21, 2024, 02:16:51 pm
FRMAttesa è il nome della UNIT o della Form ?

Il compilatore sembra aspettarsi il '.', io quindi mi aspetto che FRMAttesa sia il nome della UNIT ...

Unit e componenti vari non possono e non devono avere lo stesso nome.

Estrapolando il codice non è comunque chiaro l'errore.

Ciao
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 21, 2024, 03:18:36 pm
FRMAttesa è il nome della UNIT o della Form ?

E' il nome della Unit:
Codice: [Seleziona]
unit Frmattesa;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

type

  { TForm8 }

  TForm8 = class(TForm)     //  Form speciale per emissione MESSAGGI
    BPulsOk: TButton;
    Label1: TLabel;
    Panel1: TPanel;
    procedure BPulsOkClick(Sender: TObject);
    procedure BPulsOkEnter(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private


  public

  end;

var
  Form8: TForm8;

  msg: String;
implementation                             
Titolo: Re:ShowMessage senza bottone
Inserito da: DragoRosso - Marzo 21, 2024, 03:33:01 pm
E' il nome della Unit:

Quindi stai creando un TForm ... istanziandola con il nome della UNIT ?

Devi instanziare (creare) un oggetto con la sua VAR:

Codice: [Seleziona]
Form8 := TForm8.Create();
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 21, 2024, 04:12:03 pm
E' il nome della Unit:
Quindi stai creando un TForm ... istanziandola con il nome della UNIT ?
Devi instanziare (creare) un oggetto con la sua VAR:
Codice: [Seleziona]
Form8 := TForm8.Create();

Io ho sempre utilizzato Form modali.
Per l'uso che debbo fare ora della Form (avviso di attesa della fine dell'attività automatica in corso di svolgimento), ritengo che sia necessario utilizzare la chiamata della Form col metodo ".show"  per restituire il controllo all'applicazione e proseguire col codice successivo.

Per le chiamate di Form modali ho sempre fatto così:
Codice: [Seleziona]
  Application.CreateForm(TForm5, Form5);   // apre la Form5 - Verifica presenza Tabelle disordinate
  Form5.ShowModal;
  Form5.Free;                   

e mi sono trovato sempre bene.

Non avendo alcuna esperienza nelle chiamate di Form NON modali, non ho proprio capito come procedere, infatti dopo quasi una settimana sono ancora fermo, a sbattere il mio vecchio muso contro un muro invalicabile di errori sintattici.

E ancora purtroppo non vengo fuori. Anche le mie ricerche su casistiche simili sono state inutili.

Mi dispiace dovere chiedere aiuto, ma, Ahimè, da solo non ci arrivo.
Titolo: Re:ShowMessage senza bottone
Inserito da: DragoRosso - Marzo 21, 2024, 05:15:24 pm
@petrusic
Va bene. Sono riuscito a reimpostare la form col nuovo nome unit "Frmattesa".
Ora però il com pilatore mi da un altro errore.
...............
Ecco il messagio d'Errore:
Citazione
frm9.pas(2498,12) Error: Syntax error, "." expected but ":=" found

Questa è stata la tua richiesta, e a questa ho risposto. SOLO A QUESTA, ne a Form non modali ne ad altro.
Ho cercato di farti capire che stavi sbagliando l'uso del codice.

Ora se la tua necessità è un'altra apri un altro topic per favore, altrimenti non si capisce più nulla.

Per quello che riguarda la creazione di una normale form, il codice:

Codice: [Seleziona]
Application.CreateForm(TForm5, Form5);

è corretto. Per visualizzare la nuova Form (che dovrebbe anche già subito essere visualizzata se la proprietà VISIBLE a DESIGN TIME è settata a TRUE) devi usare ciò:

Codice: [Seleziona]
Form5.Show;

e per chiuderla hai diverse opzioni (che dipendono da cosa vuoi fare: distruggerla ? nasconderla ?)

Se vuoi distruggerla sarebbe meglio usare (questo in genere è da preferire al .FREE sulle Form):

Codice: [Seleziona]
Form5.Release;

Se vuoi invece nasconderla usa:

Codice: [Seleziona]
Form5.Close;


Ciao

N.B.: a differenza di uno '.ShowModal', dove l'esecuzione si ferma (o meglio passa alla nuova FORM) finchè non chiudi la Form stessa, il metodo '.Show' non ferma l'esecuzione che quindi continua con la riga successiva subito dopo avere eseguito il metodo '.SHOW' della nuova Form.
Titolo: Re:ShowMessage senza bottone
Inserito da: petrusic - Marzo 21, 2024, 06:37:36 pm
Per quello che riguarda la creazione di una normale form, il codice:
Codice: [Seleziona]
Application.CreateForm(TForm5, Form5);
è corretto. Per visualizzare la nuova Form (che dovrebbe anche già subito essere visualizzata se la proprietà VISIBLE a DESIGN TIME è settata a TRUE) devi usare ciò:
Codice: [Seleziona]
Form5.Show;

Ecco, non avevo considerato la proprietà VISIBLE a DESIGN TIME.

Infatti era settata a FALSE.

Ho corretto il settaggio ed ora il compilatore non da più Errori.

Posso dire che finalmente ho le idee molto più chiare.

Grazie a tutti.
Titolo: Re:[Risolto] ShowMessage senza bottone
Inserito da: DragoRosso - Marzo 21, 2024, 07:13:35 pm
Lieto di esserti stato di aiuto.

Buon divertimento