Newsgroup: it.comp.lang.delphi
Titolo: Problema con font :(

Innanzitutto un saluto a tutti del ng;
Ho un problema per quanto riguarda installazione / rimozione di font con 
delphi. La mia applicazione si appoggia ad una cartella BIN nella quale 
sono contenute tutte le font utilizzate nel progetto.
Ho utilizzato le seguenti righe di codice per effettuare install e 
remove, ma con esito negativo. Qualcuno sarebbe cosě gentile da 
spiegarmi dove sbaglio ?
Grazie.
#[Fabry]
F:Tsearchrec;
Tool:string;
//========================================================================
// Installazione delle fonts
//========================================================================
   if DirectoryExists('BIN')
   then if FindFirst('BIN'+ '*.ttf', faAnyFile, F) = 0
        then repeat
                tool:='BIN\'+F.name;
                AddFontResource(pchar(tool));
                SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
             until findnext(F)<>0;
//========================================================================
//========================================================================
// Rimozione delle fonts
//========================================================================
   if DirectoryExists('BIN')
   then if FindFirst('BIN'+ '*.ttf', faAnyFile, F) = 0
        then repeat
                tool:='BIN\'+F.name;
                RemoveFontResource(pchar(tool));
                SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
             until findnext(F)<>0;

 spiegarmi dove sbaglio ?
Che intendi x "esito negativo"?
Inoltre, vedi bene la guida in linea su findfirst etc, in particolare 
l'uso di findclose.
-- 
Alberto Salvati
A NEAPOLITAN Delphi Developer who is studying c# and .net
"Dicette 'o pappece 'nfaccia 'a noce dammi 'o tiempo che pure te spertoso"

              until findnext(F)<>0;
Manca uno "\"
then if FindFirst('BIN'+ '*.ttf', faAnyFile, F) = 0
diventa:
then if FindFirst('BIN\'+ '*.ttf', faAnyFile, F) = 0
per verificare che i font vengano installati sostituisci per test:
AddFontResource(pchar(tool));
con:
ShowMessage(IntToStr(AddFontResource(pchar(tool))));
che dovrebbe ritornare 1 se il font viene installato
Il messaggio di broadcast che la lista dei font di sistema è cambiata
credo che basti chiamarla solo una volta, pertanto puoi metterla fuori dal
repeat until. E non dimenticare il findclose alla fine del ciclo
Saluti,
Antonio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
sul mio pc ovviamente il progetto funziona senza problemi, perchč le 
fonts che utilizzo sono installate sul sistema, ma ho provato su un 
altro e non va.
La font vengono sostituite da 1 altro tipo di carattere *standard*, 
penso Arial.
La cosa che mi lascia perplesso č che mi č sempre parso che quella 
porzione di codice avesse sempre funzionato, almeno fino a qualche 
giorno fa ...

 
grazie Antonio, sei stato molto gentile. Provo subito, sperando che 
funzioni bene:)

Dopo aver sostituito la porzione di codice incriminata con questa:
   if DirectoryExists('BIN')
   then if FindFirst('BIN\'+ '*.ttf', faAnyFile, F) = 0
        then begin
               repeat
                  tool:='BIN\'+F.name;
                  AddFontResource(pchar(tool));
               until findnext(F)<>0;
               FindClose(F);
               SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
             end;
putroppo non ho ottenuto i risultati sperati. Le font nuove non vengono 
installate, e al loro posto c'è ancora l'arial.
Che rabbia, proprio non capisco dove sta l'errore. :(

 Che rabbia, proprio non capisco dove sta l'errore. :(
Uhm... a me funziona egregiamente...
Su che versione di Windows l'hai provato?
Cmq prova a lavorare con dei percorsi assoluti, come riportato di seguito.
Tra l'altro il secondo if andava messo tra un begin end o le istruzioni
dopo il repeat until vengono eseguite comunque.
Ti consiglio di indentare sempre il codice, evitarai errori stupidi, non
visibili ad occhio con una cattiva indentazione.
Cosa vuol dire che i font non vengono installati?
Hai verificato che AddFontResource ritorna 0 ?
Sul tuo PC è normale che ritorni 0 perchè i font come hai detto sono già
installati.
var F: tSearchRec;
    tool, ExePath: string;
begin
  ExePath:= ExtractFilePath(ParamStr(0));
  if DirectoryExists(ExePath + 'BIN') then
   if FindFirst(ExePath + 'BIN\*.ttf', faAnyFile, F) = 0 then
    begin
      repeat
        tool:= ExePath + 'BIN\'+F.name;
        AddFontResource(pchar(tool));
      until findnext(F)<>0;
      FindClose(F);
      SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
    end;
end;
Fammi sapere,


visibili ad occhio con una cattiva indentazione.
Anche qui non tenerne troppo conto... Con newsland si perde l'indentazione
se non visualizzi il messaggio in raw... e il tuo "strano" modo di
indentare il then alla riga successiva m'ha confuso, forse è la prima
volta che vedo qualcuno che mette il then a capo


 installate, e al loro posto c'è ancora l'arial.
Ma i font per cosa li usi?
Ho verificato che i font vengono installati, aprendo dopo M$ Word.
Non è che li usi su una form? In tal caso il codice credo che andrebbe
messo nella sezione Initialization.
Mi viene il dubbio che il tuo problema sia qualcosa di questo tipo, che
installi il font quando ormai è troppo tardi e la tua applicazione lo
voleva prima.


 
sai.. non sei il primo che me lo dice..
A me viene semplicemente + comodo.. del resto non capisco perchč
si debba chiudere con quel tipo di indentazione il costrutto "Begin End"
e non quello "If Then" :)

 
Hai ragione, forse non mi sono spiegato bene... effettivamente le font 
mi servono per la Form, e le porzioni di codice le ho messe 
rispettivamente in FormCreate per l'installazione e FormClose per la 
rimozione.
Facendo la prova da te suggerita ho anche riscontrato che 
AddFontResource rende 1.. ,anche sul mio pc sul quale le font sono 
installate °_°
Mah...

 rimozione.
Mettile in Initialization e Finalization e vedi che hai risolto!
Formcreate viene chiamato quando oramai la form e i suoi componenti sono
già stati creati


 
Ti ringrazio ancora Antonio, ma, perdona l'ignoranza, non ho capito bene
dove trovo Initialization e Finalization :(

 bene dove trovo Initialization e Finalization :(
li trovi nella guida di Delphi :-) Comunque di seguito una unit vuota
di una form.
guastatore
-----------
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
  Dialogs;
type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
{$R *.dfm}
initialization
//codice 
finalization
//codice
end.

 dove trovo Initialization e Finalization :(
Per default le sezioni non sono presenti, vai alla fine della unit dove è
dichiarata la form interessata e prima dell'end. metti:
initialization
// METTI IL CODICE DI INSTALLAZIONE FONT
finalization
// METTI IL CODICE DI RIMOZIONE FONT
end.
le variabili F e tool dovrai dichiararle come globali
http://www.marcocantu.it/epascal/ch11unit.htm
Ciao,
