|
EuroLire
(scritto con Delphi 5) Utility
per la conversione da Lire ad Euro e viceversa. unit
UEuroLire;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, ComCtrls, ToolWin, Buttons;
type
TEuroLire = class(TForm)
ToolBar1: TToolBar;
StatusBar1: TStatusBar;
Panel1: TPanel;
Lire: TEdit;
Euro: TEdit;
Label1: TLabel;
Label2: TLabel;
SBEsci: TSpeedButton;
SBAiuto: TSpeedButton;
SBInformazioni: TSpeedButton;
SBCancella: TSpeedButton;
SBStrisciata: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure Lire_o_EuroEnter(Sender: TObject);
procedure TastoKeyPress(Sender: TObject;
var Key: Char);
procedure EuroLireKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
procedure EuroChange(Sender: TObject);
procedure SBStrisciataClick(Sender: TObject);
procedure StampaStrisciata(ColonnaLire, ColonnaEuro, Segno:
string);
procedure SBCancellaClick(Sender: TObject);
procedure SBAiutoClick(Sender: TObject);
procedure SBInformazioniClick(Sender: TObject);
procedure SBEsciClick(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
protected
procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo);
message WM_GetMinMaxInfo;
private
{ Private declarations }
public
{ Public declarations }
end;
var
EuroLire: TEuroLire;
RisoluzioneL: integer;
RisoluzioneH: integer;
Risoluzione: string;
CaratteriDpi: integer;
Larghezza: integer;
Altezza: integer;
implementation
uses UInformazioni, UMessaggio, UStrisciata;
{$R *.DFM}
type
PosizioneRecordType = Record
X: integer;
Y: integer;
end;
var
NumeroVecchioLire: string;
NumeroVecchioEuro: string;
PosizioneFile: file of PosizioneRecordType;
PosizioneData: PosizioneRecordType;
FName: string;
ImportoLire: Extended;
ImportoEuro: Extended;
TotaleLire: Currency;
TotaleEuro: Currency;
ValTransStrL: string;
ValTransStrE: string;
SegnoDecimaleGiaUsato: Boolean;
DueDecimaliGiaInseriti: Boolean;
InvioAppenaPremuto: Boolean;
procedure TEuroLire.FormCreate(Sender: TObject);
begin
{ legge la risoluzione dello schermo (larghezza x altezza in pixel)
e la dimensione dei caratteri
N.B. l'applicazione è stata sviluppata a 1024x768 - 120 dpi }
Risoluzione := IntToStr(Screen.Width) + 'x' +
IntToStr(Screen.Height);
CaratteriDpi := Screen.PixelsPerInch;
{ adatta la dimensione dei controlli in base alla dimensione dei
caratteri utilizzati da Windows }
{ se i caratteri non sono 120 dpi come in fase di progettazione... }
if CaratteriDpi <> 120
{ ...rimpicciolisce i controlli della form... }
then EuroLire.ScaleControls(100, (CaratteriDpi * 100 div 120) + 2);
{ ...altrimenti rimane la dimensione ottimizzata per 120 dpi }
{ ottimizza la visualizzazione in PC con risoluzione impostata a
800x600 oppure 640x480 (1024x768 è quella standard)
N.B.: Larghezza e Altezza sono usate anche da WMGetMinMaxInfo }
if Risoluzione = '1024x768'
then
begin
Larghezza := 355; // come in fase di progetto
Altezza := 151;
// come in fase di progetto
end
else if Risoluzione = '800x600'
then
begin
Larghezza := 278; // div 1,28 (355 / 1,28 = 277,344)
Altezza := 130;
// div 1,28 (151 / 1,28 = 117,969)
{ Eurolire.ScaleBy(100, 128); ---> non ha l'effetto desiderato
a causa della dimensione dei font }
{ riposiziona i controlli sulla scheda }
Label1.Top := 4;
Label2.Top := 4;
Lire.Top := 20;
Euro.Top := 20;
Label1.Left := 8;
Lire.Left := 8;
Label2.Left := 140;
Euro.Left := 140;
StatusBar1.Panels[0].Width := 133;
StatusBar1.Panels[1].Width := 133;
end
else if Risoluzione = '640x480'
then // per ora come
800x600
begin
Larghezza := 278;
Altezza := 130;
Label1.Top := 4;
Label2.Top := 4;
Lire.Top := 20;
Euro.Top := 20;
Label1.Left := 8;
Lire.Left := 8;
Label2.Left := 140;
Euro.Left := 140;
StatusBar1.Panels[0].Width := 133;
StatusBar1.Panels[1].Width := 133;
end
else
// se altra risoluzione come in fase di progetto
begin
Larghezza := 355;
Altezza := 151;
end;
{ imposta larghezza e altezza della finestra }
EuroLire.Width := Larghezza;
EuroLire.Height := Altezza;
{ assegna a FName il nome del file di configurazione Config.cel }
FName := 'Config.cel';
AssignFile(PosizioneFile, FName);
{ se il file esiste lo apre ed assegna le posizioni alla finestra }
if FileExists(FName)
then begin
Reset(PosizioneFile);
Read(PosizioneFile, PosizioneData);
EuroLire.Left := PosizioneData.X;
EuroLire.Top := PosizioneData.Y;
end
{ altrimenti crea il file }
else Rewrite(PosizioneFile);
CloseFile(PosizioneFile);
{ imposta il carattere separatore di migliaia }
ThousandSeparator := '.';
{ imposta il carattere separatore di migliaia }
DecimalSeparator := ',';
{ imposta a non usato il carattere ',' o '.' nella casella di testo }
SegnoDecimaleGiaUsato := False;
{ imposta a non inseriti due decimali nella casella di testo Euro }
DueDecimaliGiaInseriti := False;
{ imposta a non usato il carattere 'invio' }
InvioAppenaPremuto := False;
end;
procedure TEuroLire.Lire_o_EuroEnter(Sender: TObject);
begin
{ cambia il titolo della finestra quando si cambia la focalizzazione
delle caselle }
if Lire.Focused
then EuroLire.Caption :=
'Convertitore Lire / Euro';
if Euro.Focused
then EuroLire.Caption :=
'Convertitore Euro / Lire';
{ quando si cambia la focalizzazione delle caselle, se una delle due
è vuota vengono ripulite entrambe }
if (Lire.Text <> '') or (Euro.Text <>
'') then
begin
Lire.Text := '';
Euro.Text := '';
end;
end;
procedure TEuroLire.TastoKeyPress(Sender: TObject; var Key: Char);
begin
// GESTIONE DEI TASTI -----------------------------------------------
{ vengono consentiti sempre backspace e invio }
if (Key <> Char(VK_BACK))and (Key <> Char(VK_RETURN))
then
{ vengono consentiti solo i seguenti tasti: i numeri da 0 a 9,
il punto, la virgola, il più, il meno;
se viene premuto un altro tasto il carattere viene posto a nullo
(Key := #0), cioè come se non fosse stato digitato nulla }
if (Key <> '0') and
(Key <> '1') and
(Key <> '2') and
(Key <> '3') and
(Key <> '4') and
(Key <> '5') and
(Key <> '6') and
(Key <> '7') and
(Key <> '8') and
(Key <> '9') and
(Key <> ',') and
(Key <> '.') and
(Key <> '+') and
(Key <> '-') or
(DueDecimaliGiaInseriti = True) then Key :=
#0;
// GESTIONE DEL TASTO 'INVIO' ---------------------------------------
{ controlla se è stato premuto 'invio' }
if Key = Char(VK_RETURN) then
begin
{ elimina il beep che windows emette quando si preme invio in una
casella di testo }
Key := #0;
{ se è un nuovo numero lo converte }
if (Lire.Text <> NumeroVecchioLire)
or
(Euro.Text <> NumeroVecchioEuro)
then
begin
try // gestisce l'errore di conversione
{ se sono Lire le converte in Euro }
if Lire.Focused
then
begin
{ memorizza l'importo in Lire }
ImportoLire := StrToFloat(Lire.Text);
{ converte l'importo in Euro }
ImportoEuro := StrToFloat(Lire.Text) / 1936.27;
{ visualizza l'importo convertito in Euro }
Euro.Text := FormatFloat('###,###,##0.##', ImportoEuro);
{ visualizza l'importo in Lire formattato }
Lire.Text := FormatFloat('###,###,###,###', ImportoLire);
end;
{ se sono Euro gli converte in Lire }
if Euro.Focused
then
begin
{ memorizza l'importo in Euro }
ImportoEuro := StrToFloat(Euro.Text);
{ converte l'importo in Lire }
ImportoLire := StrToFloat(Euro.Text) * 1936.27;
{ visualizza l'importo convertito in Lire }
Lire.Text := FormatFloat('###,###,###', ImportoLire);
{ visualizza l'importo in Euro formattato }
Euro.Text := FormatFloat('###,###,##0.##', ImportoEuro);
end;
except
{ se c'è un errore di conversione pulisce le caselle }
on EConvertError
do begin
Lire.Text := '';
Euro.Text := '';
end;
end;
{ memorizza i numeri appena convertiti }
NumeroVecchioLire := Lire.Text;
NumeroVecchioEuro := Euro.Text;
{ seleziona il numero convertito nella casella di testo
in modo che si possa scrivere subito un nuovo numero senza
dover prima cancellare il contenuto della casella stessa;
se dovesse essere deselezionata la casella, modificato il
numero lasciando i caratteri di formattazione (come il punto
separatore di migliaia) ed infine premuto invio, l'errore
di conversione verrebbe intercettato dal blocco except
precedente }
if Lire.Focused
then begin
Lire.SelStart := 0;
Lire.SelLength := Length(Lire.Text);
end;
if Euro.Focused
then begin
Euro.SelStart := 0;
Euro.SelLength := Length(Euro.Text);
end;
end
else
{ se non è un nuovo numero pulisce le caselle }
begin
Lire.Text := '';
Euro.Text := '';
end;
{ viene tolta l'annotazione del segno decimale già usato }
SegnoDecimaleGiaUsato := False;
{ imposta a non inseriti due decimali nella casella di testo Euro }
DueDecimaliGiaInseriti := False;
{ viene annotata la pressione del tasto 'invio' }
InvioAppenaPremuto := True;
end;
// GESTIONE DEL TASTO '+' -------------------------------------------
{ controlla se è stato premuto '+' }
if Key = '+'
then // oppure: if Key = #043
begin
{ elimina la scrittura del '+' nella casella di testo }
Key := #0;
{ controlla se non è stato appena premuto 'invio' }
if InvioAppenaPremuto = False
{ se non è stato appena premuto 'invio' visualizza la finestra
Messaggio che segnala un errore (si può sommare solo quanto
è stato appena convertito) }
then Messaggio.ShowModal
{ se è stato appena premuto 'invio' procede }
else
begin
{ viene utilizzata una stringa per gestire meglio i decimali }
ValTransStrE := FormatFloat('########0.##', ImportoEuro);
{ somma al TotaleEuro }
TotaleEuro := TotaleEuro + StrToCurr(ValTransStrE);
{ viene utilizzata una stringa per gestire meglio i decimali }
ValTransStrL := FormatFloat('###########0', ImportoLire);
{ somma al TotaleLire }
TotaleLire := TotaleLire + StrToCurr(ValTransStrL);
{ visualizza il TotaleLire nel primo pannello della StatusBar}
StatusBar1.Panels[0].Text :=
' Tot.: '
+ FormatCurr('###,###,###,##0', TotaleLire);
{ visualizza il TotaleEuro nel secondo pannello della StatusBar}
StatusBar1.Panels[1].Text :=
' Tot.: ' + FormatCurr('###,###,##0.##', TotaleEuro);
{ viene tolta l'annotazione della pressione del tasto 'invio' }
InvioAppenaPremuto := False;
{ stampa la strisciata (vedi la procedura StampaStrisciata) }
StampaStrisciata(ValTransStrL, ValTransStrE, '
+');
end;
// end else
end;
// GESTIONE DEL TASTO '-' -------------------------------------------
{ controlla se è stato premuto '-' }
if Key = '-'
then // oppure: if Key = #045 then
begin
{ elimina la scrittura del '-' nella casella di testo }
Key := #0;
{ controlla se non è stato appena premuto 'invio' }
if InvioAppenaPremuto = False
{ se non è stato appena premuto 'invio' visualizza la finestra
Messaggio che segnala un errore (si può sottrarre solo quanto
è stato appena convertito) }
then Messaggio.ShowModal
{ se è stato appena premuto 'invio' procede }
else
begin
{ viene utilizzata una stringa per gestire meglio i decimali }
ValTransStrE := FormatFloat('########0.##', ImportoEuro);
{ sottrae al TotaleEuro }
TotaleEuro := TotaleEuro - StrToCurr(ValTransStrE);
{ viene utilizzata una stringa per gestire meglio i decimali }
ValTransStrL := FormatFloat('###########0', ImportoLire);
{ sottrae al TotaleLire }
TotaleLire := TotaleLire - StrToCurr(ValTransStrL);
{ visualizza il TotaleLire nel primo pannello della StatusBar}
StatusBar1.Panels[0].Text :=
' Tot.: '
+ FormatCurr('###,###,###,##0', TotaleLire);
{ visualizza il TotaleEuro nel secondo pannello della StatusBar}
StatusBar1.Panels[1].Text :=
' Tot.: ' + FormatCurr('###,###,##0.##', TotaleEuro);
{ viene tolta l'annotazione della pressione del tasto 'invio' }
InvioAppenaPremuto := False;
{ stampa la strisciata (vedi la procedura StampaStrisciata) }
StampaStrisciata(ValTransStrL, ValTransStrE, ' -');
end;
// end else
end;
// GESTIONE DEI TASTI ',' E '.' -------------------------------------
{ controlla se è stato premuto ',' o '.' (decimali) }
if (Key = ',')
or (Key = '.') then
{ se si digita un importo in Lire... }
if Lire.Focused
{ ...elimina la scrittura di virgola o punto nella casella }
then Key := #0
{ se si digita un importo in Euro ( se Euro.Focused)... }
else
{ se non è già stato usato il segno decimale }
if SegnoDecimaleGiaUsato = False
then
begin
{ viene scritta la virgola al posto del punto (decimale) }
Key := ',';
{ viene annotato l'utilizzo del segno decimale }
SegnoDecimaleGiaUsato := True;
end
{ se è già stato usato il segno decimale viene annullato
il carattere}
else key :=
#0;
end;
procedure TEuroLire.EuroLireKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
{ assegna a F1 la procedura di aiuto }
if Key = VK_F1 then
SBAiutoClick(Self);
{ assegna a F4 la procedura di cancellazione }
if Key = VK_F4 then SBCancellaClick(Self);
{ assegna a F5 l'apertura della finestra Strisciata }
if Key = VK_F5 then SBStrisciataClick(Self);
{ assegna a F7 la procedura di uscita }
if Key = VK_F7 then SBEsciClick(Self);
{ assegna a F10 l'apertura della finestra Informazioni }
if Key = VK_F10 then SBInformazioniClick(Self);
end;
procedure TEuroLire.EuroChange(Sender: TObject);
var
I : integer;
PosizioneVirgola: integer;
begin
{ questa procedura evita che nella casella di testo Euro non sia
più possibile scrivere una virgola, dopo averne cancellata una
con il backspace;
evita inoltre la possibilità di scrivere più di due decimali di Euro }
{ viene eseguito solo se si inseriscono dati in Euro }
if Euro.Focused then
begin
{ inizializza }
PosizioneVirgola := 0;
DueDecimaliGiaInseriti := False;
{ ciclo eseguito tante volte quanti sono i caratteri in Euro.Text }
for I := 1 to Length(Euro.Text)
do
{ legge un carattere e se è una virgola... }
if Copy(Euro.Text, I, 1) =
',' then
{ ...ne memorizza la posizione }
If PosizioneVirgola = 0
then PosizioneVirgola := I;
{ se non ci sono virgole imposta SegnoDecimaleGiaUsato a Falso }
if PosizioneVirgola = 0 then SegnoDecimaleGiaUsato := False;
{ se ci sono virgole... }
if PosizioneVirgola > 0 then
{ ...e ci sono due decimali... }
if Length(Euro.Text) > (PosizioneVirgola + 1)
then
{ ...viene impostato DueDecimaliGiaUsati a True }
DueDecimaliGiaInseriti := True;
end;
end;
procedure TEuroLire.SBStrisciataClick(Sender: TObject);
begin
{ stampa in MemoStrisciata i totali (N.B.: #09 è tabulazione) }
if TotaleLire < 0 then
Strisciata.MemoStrisciata.Lines.Add(FormatCurr('000,000,000,000',
TotaleLire) + ' T' + #09
+ FormatCurr('000,000,000.00',
TotaleEuro) + ' T')
else
Strisciata.MemoStrisciata.Lines.Add(' ' + FormatCurr('000,000,000,000',
TotaleLire) + ' T' + #09 +
' ' + FormatCurr('000,000,000.00',
TotaleEuro) + ' T');
{ apre la finestra (modale) Strisciata }
Strisciata.ShowModal;
end;
procedure TEuroLire.StampaStrisciata(ColonnaLire, ColonnaEuro,
Segno: string);
var
A: string;
B: string;
C: string;
begin
{ si assegnano le variabili }
A := FormatCurr('000,000,000,000', StrToCurr(ColonnaLire));
B := FormatCurr('000,000,000.00', StrToCurr(ColonnaEuro));
C := Segno;
{ stampa nel MemoStrisciata la riga (N.B.: #09 è tabulazione) }
Strisciata.MemoStrisciata.Lines.Add(' ' + A + C +
#09 + ' ' + B + C);
end;
procedure TEuroLire.SBCancellaClick(Sender: TObject);
begin
{ azzera i valori ed annulla le stringhe di testo }
ImportoLire := 0;
ImportoEuro := 0;
TotaleLire := 0;
TotaleEuro := 0;
ValTransStrL := '';
ValTransStrE := '';
Lire.Text := '';
Euro.Text := '';
StatusBar1.Panels[0].Text := '';
StatusBar1.Panels[1].Text := '';
Strisciata.MemoStrisciata.Clear;
{ imposta a non usato il carattere ',' o '.' nella casella di testo }
SegnoDecimaleGiaUsato := False;
{ imposta a non inseriti due decimali nella casella di testo Euro }
DueDecimaliGiaInseriti := False;
{ viene tolta l'annotazione della pressione del tasto 'invio' }
InvioAppenaPremuto := False;
end;
procedure TEuroLire.SBAiutoClick(Sender: TObject);
begin
{ minimizza la finestra dell'applicazione, altrimenti rimarrebbe
in primo piano impedendo di leggere l'aiuto in lenea }
EuroLire.WindowState := wsMinimized;
{ apre l'aiuto in linea }
Application.HelpCommand(HELP_CONTENTS, 0);
end;
procedure TEuroLire.SBInformazioniClick(Sender: TObject);
begin
{ apre la finestra (modale) informazioni }
Informazioni.ShowModal;
end;
procedure TEuroLire.SBEsciClick(Sender: TObject);
begin
{ se l'aiuto in linea è aperto lo chiude prima di uscire dal programma }
Application.HelpCommand(HELP_QUIT, 0);
{ chiude }
Close;
end;
procedure TEuroLire.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{ assegna a FName il nome del file di configurazione Config.cel }
FName := 'Config.cel';
AssignFile(PosizioneFile, FName);
{ scrive nel file la posizione attuale della finestra e poi lo chiude }
Reset(PosizioneFile);
PosizioneData.X := EuroLire.Left;
PosizioneData.Y := EuroLire.Top;
Write(PosizioneFile, PosizioneData);
CloseFile(PosizioneFile);
end;
procedure TEuroLire.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo);
begin
{ inpedisce di ridimensionare la finestra }
Message.MinMaxInfo^.ptMinTrackSize.x := Larghezza;
Message.MinMaxInfo^.ptMinTrackSize.y := Altezza;
Message.MinMaxInfo^.ptMaxTrackSize.x := Larghezza;
Message.MinMaxInfo^.ptMaxTrackSize.y := Altezza;
end;
end.
unit
UStrisciata;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, StdCtrls, ComCtrls, ToolWin;
type
TStrisciata = class(TForm)
ToolBar1: TToolBar;
StatusBar1: TStatusBar;
MemoStrisciata: TMemo;
SBEsci: TSpeedButton;
procedure FormShow(Sender: TObject);
procedure SBEsciClick(Sender: TObject);
procedure MemoStrisciataKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Strisciata: TStrisciata;
implementation
uses UEuroLire;
{$R *.DFM}
procedure TStrisciata.FormShow(Sender: TObject);
begin
Strisciata.Top := EuroLire.Top + 25;
Strisciata.Left := EuroLire.Left + 25;
end;
procedure TStrisciata.SBEsciClick(Sender: TObject);
begin
Close;
end;
procedure TStrisciata.MemoStrisciataKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
{ assegna a F7 la procedura di uscita }
if Key = VK_F7 then SBEsciClick(Self);
end;
procedure TStrisciata.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{ stampa una riga vuota in uscita }
MemoStrisciata.Lines.Add('');
end;
end.
unit
UInformazioni;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TInformazioni = class(TForm)
Image1: TImage;
LCopyright: TLabel;
LVersione: TLabel;
DCopyright1: TLabel;
DCopyright2: TLabel;
DCopyright3: TLabel;
OK: TButton;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure OKClick(Sender: TObject);
procedure WMGetMinMaxInfo(var
Message: TWMGetMinMaxInfo);
message WM_GetMinMaxInfo;
procedure OKKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Informazioni: TInformazioni;
implementation
uses UEuroLire;
{$R *.DFM}
procedure TInformazioni.FormCreate(Sender: TObject);
begin
{ se i caratteri sono 96 dpi... }
if CaratteriDpi = 96
{ ...rimpicciolisce i controlli della form... }
then Informazioni.ScaleControls(124, 100)
{ ...altrimenti rimane la dimensione ottimizzata per 120 dpi.
N.B.: CaratteriDpi è una variabile globale definita in
UEuroLire }
end;
procedure TInformazioni.FormShow(Sender: TObject);
begin
{ centra la finestra verticalmente }
Top := EuroLire.Top +
(EuroLire.Height - Informazioni.Height) div 2;
{ centra la finestra orizzontalmente }
Left := EuroLire.Left +
(EuroLire.Width - Informazioni.Width) div 2;
end;
procedure TInformazioni.OKClick(Sender: TObject);
begin
Close;
end;
procedure TInformazioni.WMGetMinMaxInfo(var Message:
TWMGetMinMaxInfo);
begin
{ inpedisce il ridimensionamento della finestra }
Message.MinMaxInfo^.ptMinTrackSize.x := 240;
Message.MinMaxInfo^.ptMinTrackSize.y := 145;
Message.MinMaxInfo^.ptMaxTrackSize.x := 240;
Message.MinMaxInfo^.ptMaxTrackSize.y := 145;
end;
procedure TInformazioni.OKKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
{ risponde alla pressione del tasto funzione:
- se è F7 chiude,
- se è un altro tasto lo converte in una tabulazione per evitare
che la pressione di F7 dopo altri tasti non provochi più la
chiusura della finestra }
if Key = VK_F7 then Close else Key := VK_TAB;
end;
end.
unit
UMessaggio;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TMessaggio = class(TForm)
LCopyright: TLabel;
DCopyright1: TLabel;
DCopyright2: TLabel;
DCopyright3: TLabel;
OK: TButton;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure OKClick(Sender: TObject);
procedure WMGetMinMaxInfo(var
Message: TWMGetMinMaxInfo);
message WM_GetMinMaxInfo;
procedure OKKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Messaggio: TMessaggio;
implementation
uses UEuroLire;
{$R *.DFM}
procedure TMessaggio.FormCreate(Sender: TObject);
begin
{ se i caratteri sono 96 dpi... }
if CaratteriDpi = 96
{ ...rimpicciolisce i controlli della
form... }
then Messaggio.ScaleControls(124, 100)
{ ...altrimenti rimane la dimensione ottimizzata per 120 dpi.
N.B.: CaratteriDpi è una variabile globale definita in
UEuroLire }
end;
procedure TMessaggio.FormShow(Sender: TObject);
begin
{ centra la finestra verticalmente }
Top := EuroLire.Top +
(EuroLire.Height - Messaggio.Height) div 2;
{ centra la finestra orizzontalmente }
Left := EuroLire.Left +
(EuroLire.Width - Messaggio.Width) div 2;
end;
procedure TMessaggio.OKClick(Sender: TObject);
begin
Close;
end;
procedure TMessaggio.WMGetMinMaxInfo(var
Message: TWMGetMinMaxInfo);
begin
{ inpedisce il ridimensionamento della finestra }
Message.MinMaxInfo^.ptMinTrackSize.x := 240;
Message.MinMaxInfo^.ptMinTrackSize.y := 145;
Message.MinMaxInfo^.ptMaxTrackSize.x := 240;
Message.MinMaxInfo^.ptMaxTrackSize.y := 145;
end;
procedure TMessaggio.OKKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
{ risponde alla pressione del tasto funzione:
- se è F7 chiude,
- se è un altro tasto lo converte in una tabulazione per evitare
che la
pressione di F7 dopo altri tasti non provochi più la chiusura della
finestra }
if Key = VK_F7 then Close
else Key := VK_TAB;
end;
end.
 |