Newsgroup: it.comp.lang.delphi
Titolo: [FAQ] le faq di it.comp.lang.delphi

28/05/01
Le FAQ di IT.COMP.LANG.DELPHI
Raccolte e mantenute da Nicola {MSX} Lugato
EMAIL: 
m...@infomedia.it
 ICQ#: 48855787
Scaricate la versione aggiornata da:
http://gpi.infomedia.it/abc/delphi/FaqDelphi.txt
*la CHAT di IT.COMP.LANG.DELPHI *
Ci troviamo sul canale #delphi sul server 
irc.azzurra.it
!
procuratevi un client irc (
www.mirc.com
) e venite!
Versione 1.2
Ultimo aggiornamento: 17/7/2002
Aggiunta la domanda 4.13
INDICE
0- Regolamento
1- Presentazione
2- Domande generiche
3- Visual component library (VCL)
4- API di Windows
5- Multimedia
6- Internet Programming
7- Database
8- Kylix
9- Credits
10- Links
-------------
0 REGOLAMENTO
-------------
Come tutti i luoghi di ritrovo, reali e virtuali, ci sono delle regole da
rispettare.
Quelle che ho raccolto qui sono le generiche regole dei newsgroup.
-Leggi le FAQ!
Prima di fare qualsiasi domanda, guarda le faq e controlla che non sia
presente.
Solo dopo che hai controllato, se non hai trovato soluzione, posta la tua
richiesta.
-Informati prima di chiedere!
Hai un dubbio o una richiesta? Prima di postare e' buona norma che controlli
la
documentazione che hai a disposizione. Controlla sempre l'help in linea di
Delphi,
e' molto ricco e ci sara' la risposta al 90% dei tuoi dubbi. Poi controlla
l'help di
windows sdk sempre compreso in delphi. Poi c'e' la rete, guarda con google
se trovi
un tutorial o altro sull'argomento che ti interessa. Fai sempre qualche
prova, magari
quello che ti serve e' solo il campo di un controllo disponibile sull'object
inspector
che non avevi notato.
In ogni caso non postare dopo 2 secondi di tentativi. Prova, cerca e
ricontrolla, poi chiedi.
-Non pretendere
Nessuno paga la gente del NG per rispondere alle domande. Se una vostra
domanda non trova risposta,
NON arrabbiatevi o fate i sostenuti! I casi possono essere tanti: la vostra
domanda e' troppo
difficile, e' troppo generica, e' esposta male ecc ecc.
Se non riuscite a risolvere il problema, NON ripostate la domanda in
continuazione. Lasciate passare
un po di tempo (qualche settimana, indicativamente) e poi riprovate
riformulando meglio la domanda.
-Comportati bene
Evita di alimentare i flame, non insultare o scrivere con tono arrogante e
simili.
Se altri insultano te, ignorali. Non dovrebbe essere necessario scrivere
queste
cose ma c'e' sempre chi lo fa.. mah..
Dall'altro lato, c'e' la regola in questi NG di non ringraziare per l'aiuto
ricevuto, o almeno
non spedire messaggi solo per ringraziare. Se proprio dovete, fatelo sul
thread della vostra
richiesta.
Molte altre regole generiche le trovi sui siti dedicati alla netiquette, ad
esempio:
http://www.nic.it/NA/netiquette.txt
http://www.bio.unipd.it/local/internet_docs/netiq.html
-Niente test sul NG
"prova non leggere" "test" "aaa prova" "si legge?"
Per favore, NON sul NG! Esisono ng apposta (it.test) provate li e non
disturbate noi!
Lo sappiamo che un messaggio ogni tanto non rompe ma se tutti si mettessero
a fare
prove nei NG ci sarebbe un casino spaventoso!
---------------
1 PRESENTAZIONE
---------------
Lo scopo della vita di queste Faq e' raccogliere le domande piu' comuni
riguardanti
Delphi, un ambiente integrato di sviluppo basato sul linguaggio
ObjectPascal.
La maggior parte delle domande sono state chieste nel newsgroup
It.comp.lang.delphi,
si ringraziano quindi tutti i simpatici partecipanti di questo forum :D
Oltre alle domande piu' comuni, ho pensato di raccogliere anche altre
domande che
seppur poco richeste, hanno una soluzione complicata e quasi impossibile da
risolvere
senza un aiuto.
Se avete suggerimenti o consigli, scrivetemi pure.
Colgo l'occasione per fare un po' di pubblicita' al mio sito :D
Visita il sito di {MSX} 
http://msx.rules.it
 :)
      Nicola {MSX} Lugato
-------------------
2 DOMANDE GENERICHE
-------------------
2.1
-DOMANDA:
Object Pascal ? Io conoscevo il Turbo/Borland pascal... C'è qualcosa in
comune ? Sono avvantaggiato ?
-RISPOSTA
C'è qualcosa in comune. Si sei avvantaggiato, ma non molto. Object Pascal è
una versione ampliata del
Pascal "standard" che tra l'altro implementa le classi in modo di gran lunga
migliore
(rispetto agli Object del pascal), come in C++. Quindi sai già usare buona
parte del linguaggio, ma le novità di Object Pascal sono molte e importanti.
Per fare una consumata analogia, si potrebbe dire che Pascal sta a Object
Pascal
come C sta a C++.
2.2
-DOMANDA:
Delphi mi genera un sacco di file con estensioni strane quando salvo un
progretto. Servono tutti ?
-RISPOSTA: (Riccardo Kalb)
i file con la tilde ~ sono file di backup dei relativi file se vuoi puoi
anche cancellarli se non ti
servono. i file cfg e dof non devi mai cancellarli perchè sono impostazioni
del progetto.
I dcu anche se li cancelli non succede niente perchè vengono rigenerati
nella compilazione,
ma solo se hai i rispettivi file pas (naturalmente i pas non vanno
cancellati)
2.3
-DOMANDA:
Esiste l'overloading degli operatori ?
-RISPOSTA:
No, almeno fino a Delphi5. (no anche sul 6 a quanto ne so)
2.4
-DOMANDA:
Esiste l'overloading delle funzioni ?
-RISPOSTA:
Esiste a partire da Delphi4. Per implementarli, aggiungi la direttiva
overload
sulla dichiarazione delle procedure.
2.5
-DOMANDA:
Come posso far si che la mia applicazione venga caricata ogni volta
all'avvio di Windows?
-RISPOSTA (Antonio Tarolla):
Bisogna utilizzare una chiave particolare del Registro di Windows...ecco il
codice :
var Registro : TRegistry;
begin
Registro:=TRegistry.Create;
   try
     Registro.RootKey:=HKEY_LOCAL_MACHINE;
     if
Registro.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',False) then
     if not Registro.ValueExists('NomeMiaApplicazione') then
        Registro.WriteString('NomeMiaApplicazione',(Application.ExeName));
   finally
    Registro.Free;
   end;
end;
2.6
-DOMANDA:
Come posso ottenere informazioni sul computer su cui gireranno i miei
programmi ?
Dove trovo informazioni sulle librerie installate, sull'hardware, sulla
memoria disponibile ecc ecc?
-RISPOSTA:
Le informazioni che cerchi sono tutte "sparse". Esistono pero' componenti
che ti cercano e raggruppano
tutte le informazioni. Ad esempio l'eccellente TSystemInfo della Jazarsoft,
che trovate su Torry
o su 
http://www.jazarsoft.cjb.net/
 da info su tantissimi aspetti della
macchina.
2.7
-DOMANDA:
Come faccio a sapere la directory dove viene eseguito il mio programma ?
-RISPOSTA:
Per sapere il full-path usa Application.exename, per ottenere la cartella in
cui è il tuo eseguibile utilizza ExtractFilePath(Application.exename).
2.8
-DOMANDA:
Come ottengo il nome delle directory di sistema, tipo "c:\windows", la
cartella "temp" ecc ?
-RISPOSTA:
La cartella in cui è installato Windows la ottieni mediante la funzione API
GetWindowsDirectory(), quella temporanea con GetTempPath.
Poi c'e' GetSystemDirectory, che trova la directory di sistema (generalmente
"c:\windows\system")
e GetCurrentDirectory, che ritorna la directory di corrente per il vostro
processo.
esempio:
var WinDirPath: PChar;
begin
  GetMem(WinDirPath,MAX_PATH);
  GetWindowsDirectory(WinDirPath,MAX_PATH);
  ShowMessage(WinDirPath);
  FreeMem(WinDirPath);
end;
2.9
-DOMANDA:
Come impedire che appaia sulla Barra delle applicazioni il pulsante/icona
relativo al mio programma ?
-RISPOSTA:
Nell'evento OnPaint o OnShow della form metti:
ShowWindow(application.handle,SW_HIDE);
2.10
-DOMANDA:
Come faccio a comprimere/decomprimere dei file zip dal mio programma?
-RISPOSTA:
Scarica qui il componente che fa al caso tuo:
http://ourworld.compuserve.com/homepages/African_Chief/
Esso utilizza una DLL fornita dai creatori di WinZip, che permette di fare
quello che hai chiesto.
2.11
-DOMANDA:
Come prevenire nuove istanze di un'applicazione in Delphi, ovvero fare in
modo che si possa aprire una volta sola?
-RISPOSTA:
Non esiste un modo particolare di Delphi, lo puoi fare usando le API
di windows, inserendo questo codice nel file di progetto (.dpr):
var
  PrevInstHandle: THandle;
begin
  PrevInstHandle := CreateMutex(nil, False,
'InserireUnaStringaUnivocaCheIdentificaIlProgramma');
  if (GetLastError <> ERROR_ALREADY_EXISTS) and (PrevInstHandle <> 0)
   then  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
   end;
end.
In alternativa, esistono alcuni componenti, tra cui TOnlyOnce, semplicissimi
da
usare: basta installarli e metterli sulla form :)
2.12
-DOMANDA:
Come posso accedere ad una variabile/funzione/procedura/costante presente in
un'altra Unit? (oppure: come posso accedere ad un componente presente in
un'altra form?)
-RISPOSTA:
basta che aggiungi la unit che ti interessa nella clausola Uses, dopo
implementation.
Se ci fossero delle varibili o altre cose omonime le puoi richiamare in
questo modo:
NomeDellaUnit.Variabile oppure NomeDiUnAltraUnit.Variabile
2.13
-DOMANDA:
come posso gestire la porta parallela/seriale con Delphi sotto Windows?
-RISPOSTA:
Lo puoi fare tramite API, ma e' molto piu' semplice se prendi un componente
da Torry, ce ne sono
a bizzeffe, tra cui TComPort, TPort ecc ecc.
Attento che generalmente funzionano solo su Win9x/Me, mentre mi pare che ne
esistano solo uno o due
per NT (non so i nomi, ma e' specificato sul sito).
Per gestire le porte sotto NT, e' tipicamente necessario scrivere un Device
Driver,
il che e' argomento molto complesso.
2.14
-DOMANDA:
Come accedo ai dati presenti nella Clipboard, cioe' ai testi o alle immagini
salvate con CTRL-INS (o CTRL-V) da altre applicazioni ?
-RISPOSTA (Carlo Bertuccini):
Aggiungi la unit Clipbrd e verrà automaticamente istanziato un oggetto di
nome Clipboard ...
Per mettere la stringa in memoria:
Clipboard.SetTextBuf(Stringa);
Per ottenere la stringa:
if Clipboard.HasFormat(CF_TEXT) then Stringa:=Clipboard.AsText;
2.15
-DOMANDA:
Devo trattare variabili dove memorizzare valori monetari, e dovrei evitare
le imprecisioni dei
tipi reali. Come posso fare ?
-RISPOSTA:
Devi usare il tipo Currency. Questo e' un tipo di dato fixed point, cioe' a
virgola fissa. In pratica
e' un intero con la virgola spostata. Per questo operazioni con i currency
non soffrono dei difetti
dei numeri reali. Il tipo currency e' stato pensato apposta per i valori
monetari, ma puo'
essere usato in ogni caso si vogliano evitare le imprecisioni.
2.16
-DOMANDA:
E' possibile ottenere il nome di un valore di tipo enumerazione sottoforma
di stringa?
-RISPOSTA:
Si puo' usare la funzione:
s:=GetEnumName(TypeInfo(TEnumerato), Ord(TEnumerato(valore)));
Questa funzione richiede la unit non documentata TypInfo.
Un'alternativa e' creare un array di stringhe indicizzato dal tipo
enumerato:
type TPartiCorpo = (pTesta, pCorpo, pBraccia, pGambe);
const PartiCorpoStr:array[low(TPartiCorpo)..high(TPartiCorpo)] of string =
 ('sulla testa', 'sul corpo', 'sulle braccia', 'sulle gambe');
che ha il pregio di poter definire stringhe anche diverse dall'esatto nome
del valore,
come nell'esempio appunto.
2.17
-DOMANDA:
Esistono delle funzioni per maneggiare stringhe con path e nomi di file? Ad
esempio
estrarre il path, l'estensione, ecc ecc?
-RISPOSTA:
Si, ce ne sono parecchie dichiarate sulla unit SysUtils. Tra le altre:
function ChangeFileExt(const FileName, Extension: string): string;
function ExtractFilePath(const FileName: string): string;
function ExtractFileDir(const FileName: string): string;
function ExtractFileDrive(const FileName: string): string;
function ExtractFileName(const FileName: string): string;
function ExtractFileExt(const FileName: string): string;
function ExpandFileName(const FileName: string): string;
function ExtractRelativePath(const BaseName, DestName: string): string;
function ExtractShortPathName(const FileName: string): string;
Il significato di ciascuna e' abbastanza intuitivo :D
2.18
-DOMANDA:
Esiste qualcosa tipo l'union di C/C++ ?
-RISPOSTA:
Si puo' usare solo sui record:
Type MioRecord=record
 ciao:String;
 i:integer;
 case integer of
 0:(
  x,y:integer;
  );
 1:(
  p:TPoint;
  );
 2:(
  Nome:String;
  );
end;
2.19
-DOMANDA:
Come ottengo la lista dei font installati?
-RISPOSTA:
ListBox1.Items.Assign(Screen.Fonts);
---------------------------------------------------------
3 Visual Component Library (VCL) e componenti Non-Visuali
---------------------------------------------------------
3.1
-DOMANDA:
Cos'è la VCL ?
-RISPOSTA:
Per creare la tua applicazione, Delphi ti mette a disposizione la VCL
(Visual
Component Library), ovvero una raccolta di componenti e controlli che puoi
vedere
raggruppati nella "barra" in alto. Fai doppioclick su un componente e vedrai
che
comparirà nella form, cioè la finestra che vedi piena di puntini. Ogni
componente
ha diverse poprietà, che puoi leggere e modificare tramite l'Object
Inspector dopo
averne selezionato uno. Esistono componenti visuali (chiamati controlli) che
saranno
visibili a runtime (quando il tuo programma sarà in funzione) e altri non
visuali,
che racchiudono altre funzioni. Lo scopo di questa raccolta, è di offrire
agli
sviluppatori degli oggetti che racchiudano ciascuno delle funzioni proprie
di
un certo argomento. Ad esempio esiste il componente OpenDialog, (che
gestisce le
finestre di dialogo per aprire un file), il componente Edit (per avere una
casella
di testo nella form), Image (per le immagini) ecc. ecc. Inoltre è possibile
creare
componenti nuovi o scaricarne dalla Rete.
3.2
-DOMANDA:
Come creo dinamicamente (a run-time) un controllo (o un componente)?
-RISPOSTA:
Devi creare l'oggetto che vuoi (ad esempio un bottone) come qualsiasi altro
oggetto e settarci i valori, successivamente chiamare:
Oggetto.Parent := Form;
per rendere visibile l'oggetto (controllo). Dopodiche' puoi settare gli
eventi, associandoli a
procedure che abbiano la stessa firma (= lista dei parametri) e che siano
procedure "of object" (ad es. dichiarata nella sezione
public della form)
procedure TForm1.NuovoBottone;
 var Button:TButton;
begin
 Button := TButton.Create(Form1);
 with Button do
  begin
   Caption := 'Premimi !';
   Left := 100;
   Top := 100;
   Parent := Form1;
   OnClick := ClickProc;
  end;
end;
Inoltre, nel caso si abbia bisogno di avere un riferimento al controllo
anche dopo averlo creato,
si puo' dichiarare l'oggetto come globale invece che locale (o anche come
field della form).
3.4
-DOMANDA:
Esiste un componente che mi permetta di lanciare un programma dos e
catturarne l'output?
-RISPOSTA:
Guarda su torry, c'e' l'ottimo DOScommand per esempio.
3.5
-DOMANDA:
Come levo il fastidiosissimo beep che fa il TEdit quando premo invio ?
-RISPOSTA:
Su OnKeyPress metti:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then key := #0;
end;
3.6
-DOMANDA:
Come accedo velocemente ai singoli pixel di un TBitmap ?
-RISPOSTA:
Devi usare le ScanLine, che ritornano un puntatore al primo byte della
riga che gli passi. Attento che la grandezza dei pixel dipende dalla
profondità di colore.
3.7
-DOMANDA:
Come posso sincronizzare i thread di una applicazione multithread ?
-RISPOSTA:
Per semplici sincronizzazioni, puoi usare il metodo Synchronize del thread
che funziona cosi':
procedure TMyThread.PushTheButton;
begin
  Button1.Click;
end;
procedure TMyThread.Execute;
begin
  ...
  Synchronize(PushTheButton);
  ...
end;
Come si vede alla Synchronize si passa un metodo senza parametri. Con
Synchronize il metodo passato come parametro verra' eseguito nel thread
principale
dell'applicazione, e sara' quindi evitato ogni genere di conflitto.
Per sincronizzazioni piu' avanzate, e' necessario usare gli oggetti appositi
che
mette a disposizione Windows: mutex, critical section, semaphore, event ecc
ecc.
Anche delphi mette a disposizione alcune classi, a cui puo' essere utile
dare
un'occhiata, molte delle quali sono wrapper alle api di windows:
TCriticalSection, TMultiReadExclusiveWriteSyncronizer, TMutex, ecc ecc.
L'argomento comunque e' piuttosto complesso.
3.8
-DOMANDA:
Cosa sono le DelphiX ?
-RISPOSTA:
Sono un pacchetto sviluppato da un privato che permette di utilizzare al
meglio
le DirectX. Sembra che lo sviluppo di questo pacchetto si sia fermato a
Delphi5.
3.9
-DOMANDA:
Come cambio colore al una ProgressBar?
-RISPOSTA:
Da Belfagor, sul NG
"Grazie al cortese interessamento di NEA e a una
sagace opera di indagine nei sorgenti della VCL,
ho la risposta! La posto qui nel caso interessi a qualcuno...
La soluzione suggeritami da NEA (grazie) era questa:
PostMessage(ProgressBar1.Handle, $0409, 0, clRed);
che rende rossa (clRed) la ProgressBar. E funziona.
...ma come funziona?
Vediamo un pò... Secondo l'Help di Delphi, $0409
deve essere un messaggio di sistema. Ma quale?
Diamo un'occhiata ai file sorgenti della VCL... (sia
benedetto il comando Find in Files :-)
$0409 equivale a WM_USER + 9, che a sua volta
equivale ai msg:
TB_ISBUTTONENABLED,
RB_GETRECT,
TTM_SETTOOLINFOA,
SB_SIMPLE,
TBM_CLEARTICS,
PBM_SETBARCOLOR,  --> Tombola!
CBEM_GETEXSTYLE.
PBM_SETBARCOLOR è definito in
[DelphiPath]\Source\Rtl\Win\commctrl.pas,
insieme a PBM_SETBKCOLOR  che serve a
cambiare colore allo sfondo della barra. (MA
ALLORA XCHE' CACCHIO NON CI
HANNO MESSO DUE METODI APPOSTA?!?)
:_(("
----------------
4 API di Windows
----------------
4.1
-DOMANDA:
Come posso aprire (o chiudere) il cassettino dell'unità CD-ROM "primaria"
via codice?
-RISPOSTA:
Anche qui è necessaria la unit MMSystem. Ci sono sicuramente più modi per
fare la stessa cosa, il metodo più semplice consiste nell'utilizzo della
mciSendString
Per aprire :
  mciSendstring('SET CDAUDIO DOOR OPEN WAIT',nil,0, Self.Handle);
Per chiudere :
  mciSendstring('SET CDAUDIO DOOR CLOSED WAIT',nil,0, Self.Handle);
4.2
-DOMANDA:
Come faccio ad eseguire un programma esterno?
-RISPOSTA:
Ancora una volta, usa ShellExecute.
ShellExecute(Form1.handle, 'open', 'c:\windows\telnet.exe', nil , nil,
SW_SHOWNORMAL);
Oppure usa un componente, ad esempio TAppExec che trovi su torry
o qui: 
http://www.worldnet.net/~cycocrew/delphi
4.3
-DOMANDA:
Come nascondo un processo dalla task list (quella di CTRL-ALT-CANC) ?
-RISPOSTA:
usa questa procedura residente nella DLL Kernel32.dll
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;
stdcall; external 'KERNEL32.DLL';
poi chiama:
RegisterServiceProcess(GetCurrentProcessID, x);
Metti come x 1 se vuoi nasconderla o 0 per ripristinarla.
Questa tecnica funziona solo su Windows 9x/ME.
4.5
-DOMANDA:
Ho bisogno di intercettare un evento di un tasto fuori dalla form, ad
esempio il bottone start della barra di avvio.
-RISPOSTA: (Carlo Bertuccini)
La soluzione_teorica_più correttta  per questo tipo
di problemi consiste nell'iniezione di un hook WH_GETMESSAGE (con DLL) nel
thread/processo esterno interessato e intercettare le notifiche spedite dal
componente stesso ... ad esempio per il click di un bottone viene inviata la
notifica BN_CLICKED e così via.
Esempio:
Per semplicità ho intercettato il messaggio
WM_LBUTTONDOWN perchè BN_CLICKED viene inviato in seguito a un WM_COMMAND
dopo che l'evento è avvenuto.
Ecco il codice:
[Progetto]
----------------------
Unit Unit1;
[...]
Procedure Load (TID : dWord); stdcall; External 'ExtEvent.DLL';
Procedure Remove; stdcall; External 'ExtEvent.DLL';
var
  Form1: TForm1;
  OnlyOnce : Boolean = False;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var ButtonHandle: THandle;
    ThreadID : dWord;
begin
  if (OnlyOnce = False) then begin
    OnlyOnce := True;
    ButtonHandle :=
FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil);
    ThreadID := GetWindowThreadProcessId(ButtonHandle,nil);
    Load(ThreadID);
  end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  Remove;
  OnlyOnce := False;
end;
end.
----------------------
[DLL]
----------------------
library ExtEvent;
uses
  Dialogs,
  Messages,
  Windows;
{$R *.RES}
var
hHook : THandle;
TheHandle : THandle;
Function HookProc(Code:Integer; WPar : Wparam; LPar :Lparam) : Integer;
Stdcall;
Begin
  if (Code = HC_ACTION) then Begin
     if (PMsg(LPar)^.message = WM_LBUTTONDOWN) and
 (PMsg(LPar)^.hwnd = TheHandle) then begin
         ShowMessage('Sta per comparire la Barra di avvio (elaborazione di
WM_LBUTTONDOWN)');
     end;
  end;
  Result := CallNextHookEx(hHook,Code,WPar,LPar);
end;
Procedure Load (TID : dWord); stdcall;
Begin
   hHook:=SetWindowsHookEx(WH_GETMESSAGE,@HookProc,hInstance,TID);
end;
Procedure Remove; stdcall;
Begin
   UnHookWindowsHookEx(hHook);
end;
Exports
Load,Remove;
Begin
    TheHandle :=
FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil);
end.
-------
BTW: Questo soddisfa la richiesta di intercettare un evento, che è ben
diverso da sapere lo stato di un bottone. Esistono infatti dei messaggi che
ci restituiscono informazioni sullo stato dei componenti, ad esempio il
messaggio BM_GETSTATE.
4.6
-DOMANDA:
Come faccio a spegnere il computer da una mia app (shutdown) ?
-RISPOSTA:
Devi usare ExitWindowsEx.
E' fondamentale il parametro EWX_SHUTDOWN. Inoltre su piattaforme NT/2K è
necessario risettare i privilegi mediante AdjustTokenPrivileges e funzioni
correlate.
4.7
-DOMANDA:
Perche' Delphi genera file exe cosi' grandi ? non si possono ridurre?
-RISPOSTA:
Delphi genera file grandi perche' e' un RAD. Creare finestre in Delphi
e' molto semplice proprio per questo, il prezzo da pagare (molto basso)
e' la dimensione dell'exe. Nulla ti vieta di togliere la vcl e tutto il
resto e programmare con le API. Questa e' la forza di Delphi: puoi scegliere
la strada comoda o quella ottimizzata :)
Ecco un esempio di programma senza VCL, che crea una finestra (notare che
con la VCL il seguente programma non necessita alcuna linea di codice :)
----------------------------------------------------
program Window1;
{ Copyright (c) 1996 by Charlie Calvert
  Standard Windows API application written in Object Pascal.
  No VCL code included. This is all done on the Windows API
  level.
  Note that you need to include both Windows and Messages!}
uses
  Windows, Messages;
const
  AppName = 'Window1';
function WindowProc(Window: HWnd; AMessage, WParam,
                    LParam: Longint): Longint; stdcall; export;
begin
  WindowProc := 0;
  case AMessage of
    wm_Destroy: begin
      PostQuitMessage(0);
      Exit;
    end;
  end;
  WindowProc := DefWindowProc(Window, AMessage, WParam, LParam);
end;
{ Register the Window Class }
function WinRegister: Boolean;
var
  WindowClass: TWndClass;
begin
  WindowClass.Style := cs_hRedraw or cs_vRedraw;
  WindowClass.lpfnWndProc := @WindowProc;
  WindowClass.cbClsExtra := 0;
  WindowClass.cbWndExtra := 0;
  WindowClass.hInstance := HInstance;
  WindowClass.hIcon := LoadIcon(0, idi_Application);
  WindowClass.hCursor := LoadCursor(0, idc_Arrow);
  WindowClass.hbrBackground := HBrush(Color_Window);
  WindowClass.lpszMenuName := nil;
  WindowClass.lpszClassName := AppName;
  Result := RegisterClass(WindowClass) <> 0;
end;
{ Create the Window Class }
function WinCreate: HWnd;
var
  hWindow: HWnd;
begin
  hWindow := CreateWindow(AppName, 'Object Pascal Window',
              ws_OverlappedWindow, cw_UseDefault, cw_UseDefault,
              cw_UseDefault, cw_UseDefault, 0, 0, HInstance, nil);
  if hWindow <> 0 then begin
    ShowWindow(hWindow, CmdShow);
    UpdateWindow(hWindow);
  end;
  Result := hWindow;
end;
var
  AMessage: TMsg;
  hWindow: HWnd;
  reg:func;
begin
  if not WinRegister then begin
    MessageBox(0, 'Register failed', nil, mb_Ok);
    Exit;
  end;
  hWindow := WinCreate;
  if hWindow = 0 then begin
    MessageBox(0, 'WinCreate failed', nil, mb_Ok);
    Exit;
  end;
  while GetMessage(AMessage, 0, 0, 0) do begin
    TranslateMessage(AMessage);
    DispatchMessage(AMessage);
  end;
  Halt(AMessage.wParam);
end.
----------------------------------------------------
4.8
-DOMANDA:
Come faccio a mettere un'icona nel Tray (l'area in basso a destra vicino
all'orologio) ?
-RISPOSTA:
Devi usare l'API Shell_NotifyIcon. Ecco un'esempio di come si usa:
MyNotifyStruct: TNotifyIconData;  // dichiarata come globale
procedure TForm1.MettiIcona;
begin
  with MyNotifyStruct do begin
    cbSize:= sizeof(MyNotifyStruct);
    Wnd:= form1.handle;
    uID:= 1;
    uFlags:=  NIF_ICON or NIF_TIP or NIF_MESSAGE;
    hIcon:= UnOggettoTIcon.handle;
    uCallbackMessage:=WM_MSX;
    szTip:= 'Questa scritta viene fuori si ti fermi col mouse';
  end;
  Shell_NotifyIcon(NIM_ADD, @MyNotifyStruct);
end;
Per torglierla:
  Shell_NotifyIcon(NIM_Delete, @MyNotifyStruct);
In alternativa, puoi scarcarti da torry l'ottimo componente TCoolTrayIcon,
che funziona alla
perfezione e offre molte opzioni.
4.9
-DOMANDA:
Come ottengo l'icona di sistema assegnata a un tipo di file?
Ad esempio l'icona assegnata ai file .bmp, ai .wav ecc.
-RISPOSTA:
Usa l'api SHGetFileInfo.
Se hai a disposizione un file di quel tipo (che magari devi controllare),
puoi usare
questo codice:
var fi:TSHFileInfo;
    i:TIcon;
begin
 SHGetFileInfo(pchar(filename), 0, fi,sizeof(fi),SHGFI_ICON or
SHGFI_SMALLICON);
 i:=TIcon.create;
 i.releasehandle;
 i.handle:=fi.hIcon;
 // usare i qui
end;
Se invece devi ottenere l'icona senza avere uno specifico file di quel tipo,
puoi usare il seguente codice:
SHGetFileInfo(pchar('.zip'), FILE_ATTRIBUTE_NORMAL, fi,sizeof(fi),
   SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SMALLICON);
A quanto la Microsoft dice qui:
http://support.microsoft.com/support/kb/articles/Q179/1/67.ASP
in qusto modo, passando FILE_ATTRIBUTE_NORMAL, l'API assume che il file
esista
senza controllare sull'HD. Praticamente ci si fa beffe dell'api passandole
solo
l'estensione.
4.10
-DOMANDA:
Come posso disegnare un'icona su un device context?
-RISPOSTA:
Usa l'api DrawIcon o DrawIconEx.
Prendono per parametro un hdc dove disegnare (potete usare Canvas.Handle se
avete
un componente), le coordinate e un hicon (oppure il campo Handle di un
oggetto TIcon).
4.11
-DOMANDA:
Come posso associare un'estensione a un determinato programma?
-RISPOSTA (Andrea Laforgia):
procedure CreaNuovaAssociazione( Ext,
                                 ProgID,
                                 ProgDescr,
                                 ProgPath : string ) ;
var RegistroWin : TRegistry ;
begin
  RegistroWin := TRegistry.Create ;
  try
    RegistroWin.RootKey := HKEY_CLASSES_ROOT ;
    RegistroWin.OpenKey( '.' + Ext, true ) ;
    RegistroWin.WriteString( '', ProgID ) ;
    RegistroWin.CloseKey ;
    RegistroWin.OpenKey( ProgID, true ) ;
    RegistroWin.WriteString( '', ProgDescr ) ;
    RegistroWin.OpenKey( 'shell\open\command', true ) ;
    RegistroWin.WriteString( '', '"'+ProgPath+'" "%1"' ) ;
    RegistroWin.CloseKey ;
    RegistroWin.CloseKey ;
  finally
    RegistroWin.CloseKey ;
    RegistroWin.Free ;
  end ;
end ;
procedure TForm1.Button1Click(Sender: TObject);
begin
  CreaNuovaAssociazione( 'alf',
                         '.ALF files program processor',
                         'Applicazione di prova per file .ALF',
                         'C:\WinNT\System32\Notepad.exe' ) ;
end ;
4.12
-DOMANDA:
E come posso vedere se una certa estensione ha gia un'associazione?
-RISPOSTA (ACSH):
function EsisteAssociazione(ext:string): boolean;
var RegistroWin : TRegistry ;
begin
  RegistroWin := TRegistry.Create ;
  try
    RegistroWin.RootKey := HKEY_CLASSES_ROOT ;
    Result := RegistroWin.OpenKey( '.' + Ext, False ) ;
  finally
    RegistroWin.CloseKey ;
    RegistroWin.Free ;
  end ;
end ;
4.13
-DOMANDA:
Come faccio a sapere se c'e' un dischetto floppy nel driver?
-RISPOSTA (David Marcucci):
Usa questa funzione:
function DiskInDrive(Drive: Char): Boolean;
 var ErrorMode: word;
begin
 { rendi il char maiuscolo }
 UpCase(Drive);
 { assicurati che sia una lettera }
 if not (Drive in ['A'..'Z']) then
  raise EConvertError.Create('Not a valid drive ID');
 { disabilita errori critici }
 ErrorMode := SetErrorMode(SEM_FailCriticalErrors);
 try
  { drive 1 = a, 2 = b, 3 = c, etc. }
  Result := NOT (DiskSize(Ord(Drive) - $40) = -1);
 finally
  { riabilia errori critici }
  SetErrorMode(ErrorMode);
 end;
end;
------------
5 MULTIMEDIA
------------
5.1
-DOMANDA:
Come posso gestire da codice il volume wave della scheda audio?
-RISPOSTA (Carlo Bertuccini):
Includere la unit MMSystem e poi richiamare la WaveOutSetVolume :
WaveOutSetVolume(0, 00000000);  file://azzera il volume
WaveOutSetVolume(0, $FFFFFFFF); file://imposta al massimo il volume
Nella funzione WaveOutSetVolume le prime 4 cifre del valore esadecimale che
segue la virgola si
riferiscono agli altoparlandi di sinistra, il resto a quelli di destra.
5.2
-DOMANDA:
Cme posso eseguire un file Wave senza il TMediaPlayer
-RISPOSTA (Carlo Bertuccini):
Innanzitutto bisogna sempre includere la unit MMSystem nella USES-list.
Il codice per eseguire è il seguente :
PlaySound('Percorso\nomefile.wav',0,SND_SYNC);
L'ultimo parametro indica se il suono deve essere sincrono (il file non può
essere interrotto fino al termine
della sua esecuzione) o asincrono [SND_ASYNC] (dopo aver avviato la
riproduzione si restituisce il controllo all'applicazione)
5.3
-DOMANDA:
Posso usare librerie grafiche avanzate (DirectX o OpenGL) con Delphi ?
-RISPOSTA:
Si. Per entrambe il metodo piu' classico e' procurarsi l'header tradotto in
pascal delle librerie,
includerle nel progetto e usare le API come si fa con gli altri linguaggi.
Puoi procurarti gli header
su DelphiJEDI o su altri siti Delphi (vedi links).
In alternativa puoi usare componenti gia' pronti che incapsulano queste
librerie.
Esistono ad esempio DelphiX (il migliore) e DelphiGameCreator per le DirectX
e OpenGLPanel e altri per OpenGL.
Ancora una volta, trovi tutto su torry (Dio lo benedica :)
----------------------
6 INTERNET PROGRAMMING
----------------------
6.1
-DOMANDA:
Come posso aprire il browser di default su un URL a scelta?
-RISPOSTA:
Usa ShellExecute:
ShellExecute (handle, nil, '
http://www.indirizzo.com
' ,nil,nil,sw_show);
Per le e-mail:
ShellExecute (handle, nil,'mailto:
cic...@server.com
', nil,nil,sw_show);
o anche:
ShellExecute (handle,
nil,'mailto:
cic...@server.com
?subject=Saluti&body=corpo del messaggio',
nil,nil,sw_show);
La funzione ShellExecute si trova nella unit ShellApi che dovresti inserire
nella tua USES list.
6.2
-DOMANDA:
Come faccio a sapere se sono connesso a Internet ?
-RISPOSTA:
Ecco un esempio di codice che fa per te (scritto da Marco Cantù e preso da
www.dedonline.com
)
uses
  WinInet;
var
  dwFlags: Cardinal;
begin
  if InternetGetConnectedState(@dwFlags, 0) then
    ShowMessage ('Online')
  else
    ShowMessage ('Offline');
Se vuoi semplificare il lavoro scarica il componente kzinternetdetect (o uno
simile)
che ha tra le sue proprietà/metodi un Connected che restituisce
l'informazione interessata.
6.3
-DOMANDA:
Come faccio a inviare un'email gia' pronta ?
-RISPOSTA:
Se hai la versione Client/Server, puoi usare il componente TNMSMTP.
Devi impostare l'indirizzo del tuo server SMTP, il corpo, il destiantario
nei vari campi dell'OI.
Se non hai la Client/Server puoi cercare un componente simile su Torry.
6.4
-DOMANDA:
Come ottengo l'IP della macchina su cui gira il mio programma ?
-RISPOSTA:
Ecco una procedura che fa per te (devi includere Winsock.pas).
Function GetIP:string;
var
  WSAData: TWSAData;
  HostName, IP: String;
  HostEnt: PHostEnt;
begin
  try
    WSAStartup(2,WSAData);
    SetLength(HostName,255);
    GetHostName(PChar(HostName),255);
    SetLength(HostName,StrLen(PChar(HostName)));
    HostEnt:=GetHostByName(PChar(HostName));
    with HostEnt^ do
      IP:=Format('%d.%d.%d.%d',
                     [Byte(h_addr^[0]),
                      Byte(h_addr^[1]),
                      Byte(h_addr^[2]),
                      Byte(h_addr^[3])]);
    WSACleanup;
  except
  Ip:='Error getting IP';
  end;
 Result:=ip;
end;
----------
7 DATABASE
----------
7.1
-DOMANDA: Come si fa a togliere la finestra di login per la connesione
al database?
-RISPOSTA (Alan Solo):
Imposta la proprietà LoginPrompt del TDatabase a False.
-------
8 KYLIX
-------
8.1
-DOMANDA:
Cos'e' Kylix ?
-RISPOSTA:
E' il porting di Delphi sotto linux, ovvero Delphi per linux.
8.2
-DOMANDA:
E' compatibile con Delphi ?
-RISPOSTA:
Domanda complessa :) Dunque, a quanto ne so, Kylix e' compatibile con
Delphi6. Questo pero' a delle condizioni:
devi usare solo i componenti della CLX (la libreria di Kylix) speciale dei
due strumenti, evitando
tutte le chiamate alle api e simili. In questo caso lo stesso progetto
dovrebbe compilare su entrambi.
Comunque fino a dove arriva la compatibilita' e' tutto da vedere.
Nota: se qualche lettore ha provato Kylix e ci sa dire qualcosa, avrebbe la
nostra stima :D
8.3
-DOMANDA:
E' free ?
-RISPOSTA:
Dovrebbe esserci una versione ridotta utilizzabile per scopi personali
gratuita. Le altre versioni sono a
pagamento, come Delphi.
Per i prezzi, guarda 
www.borland.com
8.4
-DOMANDA:
Cos'e' la CLX ?
-RISPOSTA (ACSH):
E' un framework (una libreria di classi) progettato per semplificare lo
sviluppo di applicazioni multipiattaforma, basato sulle librerie QT di
TrollTech, simile ma non uguale alla VCL.
---------
9 CREDITS
---------
Si ringraziano (in ordine sparso):
Alan Solo, Riccardo Kalb, A. Salvati, Andrea Magni, Antonio Tarolla, Gianni
Giusti,
Carlo Bertuccini, Charlie Calvert, Paolo Arosio, ACSH, Piero Bonanno,
Unforgiven, KJK :: Hyperion, Claudio "Elder" Bertoli, WalkieTalkie.
--------
10 LINKS
--------
Per iniziare:
http://programmazione.html.it/delphi/index.html
Un ottimo corso di base di Carlo Marona.
Torry's Delphi Pages (inglese)
 
http://www.torry.net
 
http://torry.rimini.com/
  (mirror italiano)
 Il migliore per cercare componenti aggiuntivi. Sono catalogati per
argomento, commentati e valutati
 e dispone di un motore di ricerca. Molto semplice da usare. Comprende anche
esempi, tool, docs,
 una mailing list e tratta anche Kylix. Generalmente ritenuto il meglio.
Delphi Super Page (inglese)
 
http://delphi.icm.edu.pl/
 Un sito che raccoglie componenti per Delphi e C++Builder. Ne contiene
moltissimi ma lo trovo un po'
 piu' scomodo di Torry.
Borland Community
 
http://community.borland.com/delphi
 La comunita' di sviluppatori della Borland. Credo ci si debba iscrivere
(boh?).
Borland
 
http://www.borland.it/
 Ovviamente il sito della Borland.
#Gameprog-Ita Abc/Delphi page (italiano)
 
http://gpi.infomedia.it/abc/delphi
 I miei tutorial. Alcuni sono orientati allo sviluppo di videogiochi e
grafica, altri sono generici,
 tra cui un tutorial da zero sulle classi.
Componenti / Librerie / Tools (FW / OS / SW / $$) (Paolo Arosio)
 JEDI  
http://www.delphi-jedi.org
 RxLib  
http://sourceforge.net/projects/rxlib/
 ICS:  
http://users.swing.be/francois.piette/indexuk.htm
 Indy:  
http://www.nevrona.com/Indy/
 FreeVCS 
http://www.thensle.de
Top 100 Delphi sites (inglese)
 
http://www.sandbrooksoftware.com/TS/index.shtml
 i links dei 100 migliori siti sul Delphi.
The Delphi Compendium (inglese)
 
http://www.cyber-matrix.com/delphi.htm
 Tutorial, componenti, articoli ecc. ecc.
Software Planet (italiano)
 
http://www.softwareplanet.net
 Contiene dei corsi di Delphi scritti da Andrea "TheBeerBear" Raimondi.
Real Programmers Use Pascal (Kylix) (inglese)
 
http://www.oreilly.com/news/kylix_0800.html
 qui ci sono alcuni articoli (per la sezione generale direi), un po'
 datati pero' secondo me interessanti. (Alan Solo)
Delphi in a Nutshell - The Delphi Object Model (inglese)
 
http://www.oreilly.com/catalog/delphi/chapter/ch02.html
 (spiega il modello ad oggetti di Delphi confrontandolo con VB, Java e C++)
(Alan Solo)
Borland Forums
 news://
forums.borland.com
 (inglese)
 i newsgroup della borland, qui troverete sicuramente molte risposte
 su Delphi e sugli altri prodotti Borland
Tamaracka
 
http://www.tamaracka.com/search.htm
 (inglese)
 per cercare nei newsgroup di Borland (Alan Solo)
The Delphi Box
http://Inner-Smile.com
 .
About - Delphi Programming
http://delphi.about.com/compute/delphi/
BDE Alternatives List
http://www.kylecordes.com/bag/list.html
Notizie, articoli, tips, ... (Paolo Arosio)
 
http://www.dedonline.com
           (Italiano)
 
http://www.programmazione.it
       (Italiano)
 
http://www.delphi3000.com
 
http://www.marcocantu.com
 
http://www.drbob42.com
 
http://www.delphioop.com
TurboPower
 
http://www.turbopower.com
i seguenti link sono per interbase (Alan Solo)
 
http://www.ibphoenix.com
 
http://firebird.sourceforge.net/
Ricerche (Paolo Arosio)
 
http://www.google.com
                  (generale)
Delphi Automation site di Deborah Pate:
 
http://www.djpate.freeserve.co.uk/Automation.htm
 per l'OLE Automation di molti programmi Microsoft
Altri link (non testati) da Carlo Bertuccini
http://www.advdelphisys.com/
{ Moltissime funzioni per Delphi }
http://www.mindspring.com/~cityzoo/buglist/buglist.html
{ Vari trucchi, FAQ etc }
http://www.mhn.org/~graham/delphi.html
{ Altre FAQ }
http://www.delphiexchange.com
{ Molte altre risorse per delphi }
http://www.drbob42.com/
{ Ecco un maniaco di Delphi }
http://www.thedelphimagazine.com/
{ The Delphi Magazine }
http://www.icss.net/~nhodges/delphi.htm
{ Altri esempi e risorse per Delphi }
http://www.mclink.it/mclink/delphi/
{ Molti Link!! }
http://www.delphiseek.com
{ Un vero e proprio motore di ricerca per Delphi }
http://www.delphisource.com
{ Anche qui c'e parecchio materiale interessante }
http://www.kaposnet.hu/books/tysdelphi4/
{ Un intero libro su Delphi }
http://www.chami.com/tips/index/
{ Parecchi Tips, anche su Delphi }

   reg:func;
[...]
Quella variabile reg di tipo func (indefinito, per altro) impedisce la
compilazione del codice ed č inutilizzata.
Ciao!
--
- Carlo -
cbertu81(at)libero(dot)it

 compilazione del codice ed č inutilizzata.
Grazie, corretto :)