Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: AlexLazarus - Novembre 24, 2022, 11:28:39 am

Titolo: [RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Novembre 24, 2022, 11:28:39 am
N.B. RISOLTO: vedi post N. 18

-------------------------------------

Sto "esplorando" le finestre di dialogo. Ho esaminato tre link...

https://lazarus-ccr.sourceforge.io/docs/lcl/dialogs/messagedlg.html
https://lazarus-ccr.sourceforge.io/docs/lcl/forms/tapplication.messagebox.html
https://www.lazaruspascal.it/index.php?topic=2276.msg14125#msg14125

...ma non ho trovato i valori da assegnare a STILE_FINESTRA (che dovrebbe essere un intero?).

Tra l'altro, le info sulla cartella Dialogs del programma (vedi allegato) non sembrano valide. Sostituendo per esempio mtConfirmation,[mbYes, MbNo] con una delle seguenti...
 
// Combinations of buttons.
  mbYesNoCancel = [mbYes, mbNo, mbCancel];
  mbYesNo = [mbYes, mbNo];
  mbOKCancel = [mbOK, mbCancel];
  mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];


...compare sempre Error: ordinal expression expected. E così anche con le altre tre "abbreviazioni".

Tra l'altro, (vedi "Tripli" nel programma) con [mbYes, mbIgnore, MbCancel], compare la finestra con due soli pulsanti, ma forse mi sono incasinato con tutti quei parametri...
...
Inoltre non ci sono indicazioni su come impostare, per un determinato pulsante, il valore di default per consentire all'utente di premere il tasto invio senza essere costretto a selezionare il pulsante con il mouse.
Ho provato con 64(!) valori diversi (vedi Button1) che vengono accettati, ma non sortiscono alcun effetto. Devo proseguire fino a 256?

A parte tutto, che differenza (sostaziale) c'è tra MessageDlg e MassageBox?

Mi sono invece rassegnato(!) a non poter personalizzare le stringhe sui pulsanti (Yes / Sì - Cancel / Annulla, eccetera).

Allego screenshot e ZIP, che credo possa essere di aiuto ai principianti e a chi intenda dare una mano.
Titolo: Re:Principianti(!) Parametri Finestre di dialogo.
Inserito da: giacomarko - Novembre 24, 2022, 02:00:40 pm
Il valore di uscita di una finestra di dialogo non è mbYes ma mrYes
... modalbuttonYes è quello che vuoi nella dialog,
... modarlresultYes, è quello che ottieni

chiaramente questo vale anche per le altre combinazioni, va da se che è possibile "chiedere" alla Dialog di inserire diversi pulsanti,
ma in uscita si otterrà un solo valore, che è il Modal Result della Dialog Box, sul quale poi si possono effettuare tutti i controlli che si vuole.

ecco un esempio,

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Dialogs.MessageDlg('Welcome to my xyz application.  Exit now?',
    mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
  begin
    Dialogs.MessageDlg('Exiting the xyz application.', mtInformation,
      [mbOk], 0, mbOk);
    Close;
  end;
end;
Titolo: Re:Principianti(!) Parametri Finestre di dialogo.
Inserito da: quack - Novembre 24, 2022, 07:29:37 pm
@AlexLazarus:

In merito agli stili della finestra di dialogo, li trovi qui

https://lazarus-ccr.sourceforge.io/docs/lazutils/uitypes/tmsgdlgtype.html

In merito all'errore di compilazione utilizando una Combination of buttons, quando la passi alla funzione devi togliere le parentesi quadre perchè la Combinations è già un set di costanti.

Per esempio:

Codice: [Seleziona]
MessageDlg(Tit_finestra,  Messaggio, mtInformation, mbYesNoCancel, 0, mbYes);

L'ultimo parametro passato alla funzione, in questo caso mbYes, è il punsante di default,
se l'utente preme invio la funzione restituisce mrYes.

Non credo che tutte le combinazioni di pulsanti siano ammesse, es. [mbYes, mbIgnore, mbCancel].
Titolo: Re:Principianti(!) Parametri Finestre di dialogo.
Inserito da: giacomarko - Novembre 24, 2022, 09:02:53 pm
Le diverse combinazioni di pulsanti sono possibili, chiaramente devono essere utilizzate con la logica

questi i valori che determinano il tipo di pulsante che una Dialog può mostrare,

The Buttons value may be one or more of the following enumerated values :
mbYes            Displays a 'Yes' button
mbNo               Displays a 'No' button
mbOK               Displays an 'OK' button
mbCancel     Displays a 'Cancel' button
mbAbort            Displays an 'Abort' button
mbRetry            Displays a 'Retry' button
mbIgnore            Displays an 'Ignore' button
mbAll            Displays an 'All' button
mbNoToAll    Displays a 'No to all' button
mbYesToAll     Displys a 'Yes to all' button
mbHelp            Displays a 'Help' button

inoltre esistono delle combinazioni di pulsanti, già predefinite, per facilitare la gestione
mbYesNoCancel    = [mbYes,mbNO,mbCancel]
mbYesAllNoAllCancel    =[mbYes,mbYesToAll, mbNo,mbNoToAll,mbCancel]
mbOKCancel            =[mbOK,mbCancel]
mbAbortRetryCancel    =[mbAbort,mbRetry,mbCancel]
mbAbortIgnore            =[mbAbort,mbIgnore]

e questi i valori numerici restituiti dalla Dialog alla sua chiusura, relativi al pulsante premuo:

mrYes    = 6
mrNo    = 7
mrOK    = 1
mrCancel    = 2
mrAbort    = 3
mrRetry    = 4
mrIgnore    = 5
mrAll    = 8
mrNoToAll = 9
mrYesToAll   = 10

M
Titolo: Re:Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Novembre 25, 2022, 10:27:10 am
Codice: [Seleziona]
[quote author=quack link=topic=2688.msg17737#msg17737 date=1669314577]
In merito agli stili della finestra di dialogo, li trovi qui

https://lazarus-ccr.sourceforge.io/docs/lazutils/uitypes/tmsgdlgtype.html

Scusa, ma per gli stili sono ancora in confusione.
Ho letto... https://lazarus-ccr.sourceforge.io/docs/lazutils/uitypes/tmsgdlgtype.html

...ma a parte che Lazarus suggerisce System.UIType al posto dell'obsoleto UITypes (poco male, ho provveduto a sostituire in Classes), ma proprio non ho capito come piffero devo inserire il parametro desiderato relativo allo stile della finestra.
Per esempio, volendo far comparire il simbolo dell'errore, che devo fare?

Codice: [Seleziona]
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLType, System.UITypes;       

procedure TForm1.Button1Click(Sender: TObject);
// Stile finestra
//type TMsgDlgType = (mtWarning,  mtError,  mtInformation,  mtConfirmation,  mtCustom); ??????????????
Var XA, Risposta: Integer;
begin
     Risposta:=  MessageDlg ('Titolo finestra',  'Parametro XA',  mtConfirmation,[mbYes, mbNo, mbIgnore, MbRetry, MbAbort],mtError); // Yes - No - Ignore - Retry - Abort
end;       
Titolo: Re:Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Novembre 25, 2022, 10:31:47 am
Le diverse combinazioni di pulsanti sono possibili [...] eccetera.

Ma infatti, sono proprio molte delle variabili che ho inserito nel programma dimostrativo (ZIP file) allegato al post iniziale.
Titolo: Re:Principianti(!) Parametri Finestre di dialogo.
Inserito da: quack - Novembre 25, 2022, 11:15:06 am
Invece di mtConfirmation devi usare mtError,

Codice: [Seleziona]
MessageDlg('Tit_finestra',  'Messaggio', mtError, [mbYes, mbNo],  0, mbYes);

Se ti serve una finestra di Warning usa mtWarning

Codice: [Seleziona]
MessageDlg('Tit_finestra',  'Messaggio', mtWarning, [mbYes, mbNo],  0, mbYes);

e cosi via per le altre tipologie di finestre. I valori ammessi sono:

mtWarning
mtError
mtInformation
mtConfirmation
mtCustom
Titolo: Re:Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Novembre 27, 2022, 09:22:43 am
Invece di mtConfirmation devi usare mtError,

Codice: [Seleziona]
MessageDlg('Tit_finestra',  'Messaggio', mtError, [mbYes, mbNo],  0, mbYes);

(...eccetera...)

Oh! Finalmente.  :) Grazie!
Tra breve pubblicherò il programma (ZIP) completo e aggiornato con i suggerimenti ricevuti.
Rimane la seconda parte delle mie perplessità segnalata nel post originario:

A parte tutto, che differenza (sostaziale) c'è tra MessageDlg e MassageBox?

Per il momento modifico il post originale con Quasi RISOLTO; poi vedremo...  ;)
Titolo: Re:[quasi RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: DragoRosso - Novembre 27, 2022, 09:56:03 am
La differenza sostanziale è che la MessageBox è una Api di Windows, mentre MessageDlg è una variante potenziatata e migliorata della LCL.

Nella MessageDlg puoi impostare le coordinate di visualizzazione, il contesto di Help a cui accedere, oltre ad altre migliorie rispetto alla MessageBox standard di Windows.

Tieni presente che non si dovrebbe usare MessageBox, MessageDlg e ShowMessage nei Thread, come in genere alcuna finestra di dialogo.

In Lazarus c'è una variante alle dialog box, la TaskDialog che incapsula sempre una Api di Windows e che può essere usata nei Thread (con cautela):

Citazione
https://wiki.freepascal.org/TTaskDialog

Ciao
Titolo: Re:[quasi RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Novembre 27, 2022, 05:00:38 pm
Ho applicato le informazioni ricevute (grazie ancora!) al programma-demo pubblicato nel primo post, che allego qui 2022_11_27_Finestre_dialogo.ZIPoltre a tre screenshot.

Rimangono da stabilire alcune cosette(!)

1) In che modo si può gestire Custom?

2)
Che tipo di variabili sono MtWarning ... MtConfirmation (e simili) e anche mbYes ... MbNo (e simili) in modo da fare una cosa del genere:

Codice: [Seleziona]
// N.B. da valutare solo in modo schematico: la sintassi è completamente errata! 
Var Stile_Finestra: Integer; // ????
Var Stile_Risposta: Real; // ????
Var Stile_Scelta: // ????

Stile_Finestra:= mtError;
Stile_Risposta:= [mbYes,mbNO,mbCancel];
Stile_Scelta:= mbYes;

MessageDlg('Tit_finestra',  'Messaggio', Stile_Finestra, [Stile_Risposta],  0, StileScelta];

Comunque, per il momento le informazioni sono più che sufficienti per capire come gestire le finestre di dialogo nella stragrande maggioranza dei casi.
Titolo: Re:[quasi RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: bonmario - Novembre 27, 2022, 07:31:32 pm
2) [/b]Che tipo di variabili sono MtWarning ... MtConfirmation (e simili) e anche mbYes ... MbNo (e simili) in modo da fare una cosa del genere:

In generale, se nell'IDE di Lazarus fai CTRL + Click su una variabile o una costante, ti manda alla sua dichiarazione.
In questo caso, le trovi anche tutte belle raggruppate, così puoi farti un'idea


Ciao, Mario
Titolo: Re:[quasi RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Novembre 28, 2022, 10:18:16 am
In generale, se nell'IDE di Lazarus fai CTRL + Click su una variabile o una costante, ti manda alla sua dichiarazione.
In questo caso, le trovi anche tutte belle raggruppate, così puoi farti un'idea

...uhmm... forse non sono stato chiaro. Le costanti le ho trovate, ma a parte il fatto che sono "singole", non vedo come sia possibile utilizzarle in un programma. Esempio (ovviamente errato) negli screenshot.
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: bonmario - Novembre 28, 2022, 10:38:56 am
Non so se ho capito bene, ma ...

Dichiari la variabile:
Codice: [Seleziona]
    MyButtons: TMsgDlgButtons;

La inizializzi:
Codice: [Seleziona]
    MyButtons:=[];

Se ad esempio è vera una certa condizione, aggiungi i bottoni:
Codice: [Seleziona]
    MyButtons:=MyButtons + [mbNoToAll] + [mbYes];

A questo punto puoi emettere la richiesta:
Codice: [Seleziona]
    MsgResult:=MessageDlg('Verifica presenza file Iso', Messaggio, mtError, MyButtons, 0);

Ciao, Mario
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: giacomarko - Novembre 28, 2022, 11:00:37 am
AlexLazarus,

secondo me fai confusione tra:

le costanti mb... che sono le costanti per i pulsanti, da usare come parametro all'interno della chiamata, ... [mbAll] ad esempio

e

le costanti mr ... che sono le costanti restitute dalla Dialog quando esci.

nel tuo esempio "Forum_Lazarus_Finestra_Dialogo_B.png" inserisci nella chiamata della Dialog mrAll ... invece di mbAll

Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: DragoRosso - Novembre 28, 2022, 03:46:36 pm
@AlexLazarus,

a differenza di VB, il Pascal è un linguaggio che si basa molto sulla definizione di "TIPO".

Oltre ai "TIPI" noti come integer, double, string, INT64, etc ... esistono una miriade di "TIPI" definiti per descrivere al meglio (e possibilmente senza mischiare e fare confusione) l'uso in un certo contesto.

La maggior parte dei "TIPI" esistenti deriva dalle API di Windows, ad esempio le definizioni di cui in questo topic si è discusso, altri sono e possono essere creati a proprio uso e consumo .... anzi direi che DEVONO essere creati ...

Esempio:

Citazione
//Definisco un  nuovo tipo che descrive il tempo (e che posso espandere in futuro senza pregiudicare il codice già scritto)
type
  TTempo = (NonPervenuto=0, Soleggiato, Nuvoloso, Piovoso, Nevoso, Temporalesco);

//Definisco una variabile di quel tipo

var Tempo: TTempo;

//Assegno uno dei possibili valori alla variabile

Tempo := Nuvoloso;

//Uso della variabile

if Tempo  = Nuvoloso then
  ShowMessage('Nuvoloso');

if Tempo  = Soleggiato then
  ShowMessage('Ohhh, il sole');


Ovviamente anche la definizione di "TIPI" è varia: possono essere interfacce, classi, record, enumerazioni, etc ....

Prova a dare una occhiata all'indice del forum e dai una letta agli articoli riguardanti Lazarus.

Ciao
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: bonmario - Novembre 28, 2022, 03:51:17 pm

Citazione
  TTempo = (NonPervenuto=0, Soleggiato, Nuvoloso, Piovoso, Nevoso, Temporalesco);


Scusa, per curiosità: hai sbagliato a scrivere, o si può veramente mettere qualcosa come "NonPervenuto=0" dichiarando un Tipo?
Se non hai sbagliato a scrivere, non sapevo che si potesse fare ... quale sarebbe il significato di quella dichiarazione?

Grazie, Mario
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: DragoRosso - Novembre 28, 2022, 03:59:45 pm

Citazione
  TTempo = (NonPervenuto=0, Soleggiato, Nuvoloso, Piovoso, Nevoso, Temporalesco);


Scusa, per curiosità: hai sbagliato a scrivere, o si può veramente mettere qualcosa come "NonPervenuto=0" dichiarando un Tipo?
Se non hai sbagliato a scrivere, non sapevo che si potesse fare ... quale sarebbe il significato di quella dichiarazione?

Grazie, Mario

Definisce solo il valore di "enumerazione" degli elementi: il primo parte da zero, il secondo sarà 1, .... e così via.

Codice: [Seleziona]
ord(Nuvoloso) => riporta 2 come valore;
 TTempo(2) => riporta Nuvoloso come valore;

Puoi assegnare ad ogni "voce" un valore diverso, anche non progressivo.

PS.: io lo uso quando devo scrivere i valori in una file INI ad esempio, o in qualsiasi altro contenitore esterno al programma. Domani posso espanderlo senza modificare quello già scritto, e sono sicuro che la lettura "all'inverso" cioè ricaricandola dal file non darà problemi.

Codice: [Seleziona]
writesufile(ord(Tempo));
Tempo := TTempo(readdafile(....));

Ciao
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: bonmario - Novembre 28, 2022, 04:04:32 pm
Questa non la sapevo proprio !!!
Preferisco comunque usare il tipo e non il numero, per evitare problemi quando fai poi manutenzione ai programmi, ma comunque non si finisce mai di imparare, anche su mini argomenti di cui si pensa di sapere tutto !!!

Ciao, Mario
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Novembre 28, 2022, 05:22:34 pm
Aaah! Finalmente... Era molto, molto molto più semplice di quello che ritenessi.
Ho riscritto il programma (che allego a questo post con alcuni screenshot di esempio: 2022_11_28_Forum_Lazarus_Zip_A.ZIP) che risulta molto, molto molto più snello e a prova di errori.
Ringrazio ancora tutti per l'aiuto.  ;)
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: bonmario - Novembre 28, 2022, 05:59:56 pm
Se mi posso permettere, cancella questa riga:
Codice: [Seleziona]
Invio:= Chr(13);

C'è una costante, "LineEnding" che in base al sistema operativo per cui viene compilato il sorgente contiene la corretta sequenza di caratteri. Usa LineEnding al posto della tua variabile "Invio"

Ciao, Mario
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Novembre 28, 2022, 06:23:14 pm
Se mi posso permettere, cancella questa riga:
Codice: [Seleziona]
Invio:= Chr(13);
C'è una costante, "LineEnding" che in base al sistema operativo per cui viene compilato il sorgente contiene la corretta sequenza di caratteri. Usa LineEnding al posto della tua variabile "Invio"

Buono a sapersi. Grazie!
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: giacomarko - Novembre 28, 2022, 07:42:32 pm
Un paio di suggerimenti,

non è necessario ripetete Var ad ogni dichiarazione di variabile, differentemente da VB, in Pascal lo fai solo una volta e poi continui sotto con le altre dichiarazioni, giusto una cosa estetica  :)

Il blocco di verifica...
Codice: [Seleziona]
if risposta =.... 
if risposta =....
...
al posto di utilizzare if, dove controlla ogni valore anche se lo ha già trovato...

usa

Codice: [Seleziona]
Case risposta of
   mrYes:
   ...
   ...
end
;

Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Novembre 29, 2022, 07:42:52 am
Un paio di suggerimenti,
[...eccetera...]

Hai perfettamente ragione, i suggerimenti sono molto più "eleganti" e soprattutto più efficienti dal punto di vista della programmazione.
Tuttavia (IMHO) questo 3D è destinato ai principianti che (sempre IMHO) potrebbero "distrarsi" leggendo un rigo alla volta: se in ogni rigo c'è VAR possono rendersi meglio conto che si sta parlando di dichiarazioni di variabili.
Analogamente per If ... Then: inseriti in ogni rigo credo siano più chiari da un punto d vista puramente didattico.
Ovvio che, in seguito, il principiante diventa più smaliziato e provvederà da sé ad apportare le opportune variazioni.

Anteprima: sto pensando seriamente di creare un canale Youtube destinato proprio ai pincipianti.
Anzi, l'ho già aperto e nei prossimi giorni... (Stay tuned!  ;) )
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: giacomarko - Novembre 29, 2022, 12:13:37 pm
Come credi, io la penso diversamente,

già "imparare" a programmare prendendo pezzi di codice qua e là, secondo me non è il massimo... forse, meglio prendersi un bel libro e iniziare dall'inizio, sopratutto per assimilare la logica dietro alla programmazione ... più che memorizzare il "comando" in se,

secondo, proprio perchè a questo mezzo ci si avvicinano i neofiti, scrivere un "buon codice" dall'inizio è più di aiuto.

Che poi, personalmente, ritengo che il Pascal di per se, sia il codice più leggibile in assoluto  ;)

m
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: tito_livio - Dicembre 01, 2022, 08:53:44 pm

Mi sono invece rassegnato(!) a non poter personalizzare le stringhe sui pulsanti (Yes / Sì - Cancel / Annulla, eccetera).


Per personalizzare le stringhe dei pulsanti puoi usare il comando QuestionDlg, per esempio:

Codice: [Seleziona]
  if QuestionDlg('Salvataggio','Salvare le modifiche?',mtCustom,[mrYes, 'Si', mrNo, 'No'], '')=mryes then ...

Con i bottoni in italiano, credo che il programma si presenti meglio.
Mi è capitato, qualche volta, che l'utente finale quando vedeva dei bottoni come "Yes","Cancel" oppure "Retry", mi chiedeva come mai ci fossero dei pezzi di programma in inglese.

Ciao.
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Dicembre 03, 2022, 06:50:29 am
Per personalizzare le stringhe dei pulsanti puoi usare il comando QuestionDlg, per esempio:
Codice: [Seleziona]
  if QuestionDlg('Salvataggio','Salvare le modifiche?',mtCustom,[mrYes, 'Si', mrNo, 'No'], '')=mryes then ...
Con i bottoni in italiano, credo che il programma si presenti meglio.
Mi è capitato, qualche volta, che l'utente finale quando vedeva dei bottoni come "Yes","Cancel" oppure "Retry", mi chiedeva come mai ci fossero dei pezzi di programma in inglese.

Buono a sapersi, grazie anche a te!  :)
Appena possibile lo sperimenterò.
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Dicembre 04, 2022, 11:13:32 am


Per personalizzare le stringhe dei pulsanti puoi usare il comando QuestionDlg, per esempio:

Codice: [Seleziona]
  if QuestionDlg('Salvataggio','Salvare le modifiche?',mtCustom,[mrYes, 'Si', mrNo, 'No'], '')=mryes then ...

Con i bottoni in italiano, credo che il programma si presenti meglio.


Per funzionare, funziona. Però vorrei "concatenare" le stringhe, come ho fatto nel programma (che ho allegato al mio post precedente).
Nel codice che allego come esempio vorrei usare la variabile PULSANTI in cui inserire le personalizzazioni.
Però (togliendo i // dei commenti) mi dà Errore; evidentemente sbaglio ad assegnare il tipo di variabile.
Come risolvere?
Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
Var Risposta: integer;
Var PULSANTI: TMsgDlgButtons; // ? ? ? ? ?
begin
  // PULSANTI:= [mrYes, 'Esatto!', mrNo, 'Assolutamente NO!']; // Quale sintassi usare??
  Risposta:= QuestionDlg('Salvataggio','Salvare le modifiche?',mtCustom,[mrYes, 'Esatto!', mrNo, 'Assolutamente NO!'],''); // FUNZIONA!
  // Risposta := QuestionDlg('Salvataggio','Salvare le modifiche?',mtCustom,  PULSANTI  , '') // NON funziona!
end;
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: DragoRosso - Dicembre 05, 2022, 12:37:21 am
Non c'è nulla da risolvere.

La definizione del parametro della funzione è 'array of const', e quello che vuoi fare non è possibile.

Al limite puoi definire ogni singola "posizione" dell'array con una variabile singola:

Codice: [Seleziona]
var P1, P3: integer;
    P2, P4: string;
begin
  P1 := mrYes;
  P2 := 'Si';
  P3 := mrNo;
  P4 := 'No';
  QuestionDlg('Salvataggio','Salvare le modifiche?',mtCustom,  [P1, P2, P3, P4] , '');
end;                                                                                         

Ciao
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Dicembre 05, 2022, 08:05:04 am
Non c'è nulla da risolvere [...] e quello che vuoi fare non è possibile.

Scherzi? 😁 MI HAI RISOLTO IL PROBLEMA! 😉

Mi metto subito all'opera per aggiornare e ampliare il programma. Grazie!

P.S. Pulsanti è un "residuo" precedente.

Codice: [Seleziona]
unit A_2022_12_04_Prova_Pulsanti_personalizzati_pas;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit_Yes_Alternativo: TEdit;
    Edit_No_Alternativo: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
Var Risposta, PYes_Originale, PNo_Originale: integer;
Var PULSANTI:  TMsgDlgBtn;
Var PYes_Alternativo, PNo_Alternativo: string;

begin
  PYes_Originale:= mrYes;
  PYes_Alternativo:= Edit_Yes_Alternativo.Text;

  PNo_Originale:= mrNo;
  PNo_Alternativo:= Edit_No_Alternativo.Text;

  Risposta:= QuestionDlg('Secondo te...','...tre per otto fa ventiquattro?',mtCustom,[PYes_Originale, PYes_Alternativo, PNo_Originale, PNo_Alternativo ],''); // FUNZIONA!
end;

end.


Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Dicembre 05, 2022, 06:22:10 pm
Ho parlato troppo presto... 😥 Ma alla fine un risultato soddisfacente l'ho comunque trovato. 👍
Ho passato tutta la giornata cercando di risolvere un problema:
La sintassi di MessageDlg è diversa da quella di QuestionDlg per il numero e la tipologia di parametri consentiti.
In particolare, QuestionDlg permette l'inserimento di pulsanti "personalizzati" al contrario di MessageDlg. Oppure sono io che non ho capito come inserirli.
In allegato l'intero progetto (Programma_Finestre_dialogo.ZIP) e alcuni screenshot dimostrativi.
Rimane un'ultima modifica da fare: associare a una stringa il contenuto delle parentesi di QuestionDlg / MessageDlg in modo da copiarla e inserirla in propri programmi. Ma per oggi basta, lo farò nei prossimi giorni.
P.S. Con QuestionDlg non sembra possibile "nascondere" uno (o più) dei pulsanti non selezionati: devono comparire, anche se privi di Caption.
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: DragoRosso - Dicembre 05, 2022, 09:46:51 pm
MessageDlg e QuestionDlg sono funzioni diverse, anche se simili.
Sono definite nel modo in cui sono ... è per quello che ti indicavo che non c'è nulla da risolvere.

Gli argomenti di una funzione, qualsiasi essi siano, non possono essere sostituiti da una unica stringa o altro che non sia previsto dalla funzione stessa.
Il Pascal è un linguaggio rigoroso e il "check" della validità viene fatta a livello di compilazione. E anche se passasse la compilazione, potrebbe essere lo stesso codice della "MessageBox" che a Runtime esegue un suo check e non esegue quanto previsto. "Aggirare" non è una buona azione.

Puoi però costruirti una tua funzione che esegua quello che ritieni più opportuno e nel modo più adatto alle tue esigenze, compreso la visualizzazione di una "MessageBox" personalizzata.

Ciao
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: bonmario - Dicembre 06, 2022, 07:28:59 am
Se può interessare, visto che uno dei motivi di questa discussione era il fatto di avere i bottoni con le scritte in italiano, vorrei aggiungere che in lazarus ci sono questi 3 sorgenti:

lclstrconsts.pas
sysinth.inc
sysconst.pp

che al loro interno contengono le stringhe in inglese. BAsta modificarle col valore italiano, ricompilare lazarus, ed il gioco è fatto.
Io lo faccio ormai da qualche anno, e fino ad ora non mi ha ancora creato problemi questa cosa.

P.S. Naturalmente, per le prime e volte, se lo volete fare, prima fatevi un backup di questi 3 files !!!

Ciao, Mario
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Dicembre 06, 2022, 08:17:38 am
Se può interessare, visto che uno dei motivi di questa discussione era il fatto di avere i bottoni con le scritte in italiano, vorrei aggiungere che in lazarus ci sono questi 3 sorgenti:

lclstrconsts.pas
sysinth.inc
sysconst.pp

che al loro interno contengono le stringhe in inglese. BAsta modificarle col valore italiano, ricompilare lazarus, ed il gioco è fatto.
Io lo faccio ormai da qualche anno, e fino ad ora non mi ha ancora creato problemi questa cosa.

P.S. Naturalmente, per le prime e volte, se lo volete fare, prima fatevi un backup di questi 3 files !!!

Interessante e soprattutto intrigante: mi piace "manomettere" i file che non dovrebbero essere manipolati.  ;)
Tuttavia con il programma ZIP volevo dare la possibilità di modificare i messaggi con un programma EXE da usare in modo indipendente.
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: Stilgar - Dicembre 07, 2022, 09:48:28 am
Ciao.
A parte che non ci voglio credere che Bonmario abbia dato quel suggerimento ;D


LCLStrConsts.pas/SysConst.pas


Le stringhe sono dei riferimenti a delle risorse per il programma.
Nello specifico delle resourcestring.


Volendo ci sono metodi più ortodossi per modificare le stringhe senza segarsi i sorgenti.
Qui c'è qualche spunto.
https://wiki.lazarus.freepascal.org/Using_resourcestrings (https://wiki.lazarus.freepascal.org/Using_resourcestrings)




Stilgar
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: Stilgar - Dicembre 07, 2022, 09:53:56 am
Ah, per sysinth le uniche stringhe che vedo sono quelle delle localizzazioni per i formati dei numeri e date.


Quelle si possono "applicare" come si vogliono all'avvio dell'applicazione.


Codice: [Seleziona]

var
  DefaultFormatSettings : TFormatSettings = (
    CurrencyFormat: 1;
    NegCurrFormat: 5;
    ThousandSeparator: ',';
    DecimalSeparator: '.';
    CurrencyDecimals: 2;
    DateSeparator: '-';
    TimeSeparator: ':';
    ListSeparator: ',';
    CurrencyString: '$';
    ShortDateFormat: 'd/m/y';
    LongDateFormat: 'dd" "mmmm" "yyyy';
    TimeAMString: 'AM';
    TimePMString: 'PM';
    ShortTimeFormat: 'hh:nn';
    LongTimeFormat: 'hh:nn:ss';
    ShortMonthNames: ('Jan','Feb','Mar','Apr','May','Jun',
                      'Jul','Aug','Sep','Oct','Nov','Dec');
    LongMonthNames: ('January','February','March','April','May','June',
                     'July','August','September','October','November','December');
    ShortDayNames: ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
    LongDayNames:  ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
    TwoDigitYearCenturyWindow: 50;
  );


  FormatSettings : TFormatSettings absolute DefaultFormatSettings;




Non vedo la necessità di modificare le "impostazioni di fabbrica" direttamente dall'originale.




Stilgar
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: bonmario - Dicembre 07, 2022, 12:47:08 pm
Tieni conto che questa cosa l'avevo vista parecchi anni fa, e non ricordo se allora i sorgenti erano come quelli di adesso.
In ogni caso, ,i ero fatto un programma che lancio ad ogni aggiornamento di Lazarus, che fa dei semplici trova e sostituisci in quei sorgenti.

Ciao, Mario
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: Stilgar - Dicembre 07, 2022, 03:39:48 pm
La stavo buttando in ridere.


Cmq, potresti aggiornare le cose in modo da avere il .mo con le stringhe localizzate utilizzando gtraslate, o altri servizi on line, per avere tutte le stringhe localizzate.


La butto lì come idea.


Stilgar
Titolo: Re:[RISOLTO] Principianti(!) Parametri Finestre di dialogo.
Inserito da: AlexLazarus - Dicembre 07, 2022, 04:30:37 pm
Ah, per sysinth le uniche stringhe che vedo sono quelle delle localizzazioni per i formati dei numeri e date.
Quelle si possono "applicare" come si vogliono all'avvio dell'applicazione.
Codice: [Seleziona]
var
  DefaultFormatSettings : TFormatSettings = (
    CurrencyFormat: 1;
    NegCurrFormat: 5;
    ThousandSeparator: ',';
    DecimalSeparator: '.';
    CurrencyDecimals: 2;
    DateSeparator: '-';

// Eccetera

  FormatSettings : TFormatSettings absolute DefaultFormatSettings;



Non vedo la necessità di modificare le "impostazioni di fabbrica" direttamente dall'originale.

Wow! Interessante, molto interessante. Grazie!