Newsgroup: it.comp.lang.delphi
Titolo: [FAQ] Le faq di it.comp.lang.delphi [Maggio 2003]

Le FAQ di IT.COMP.LANG.DELPHI
Raccolte e mantenute da Nicola {MSX} Lugato
EMAIL: 
m...@infomedia.it
 ICQ#: 48855787
Versione 1.2
Ultimo aggiornamento: 3/6/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;
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 }
-- 
Morde. 
morde[at]programmer[.]net

 ha scritto nel messaggio
news:jbkhbv46bne6buhfd...@4ax.com...


 Grazie Morde ---
[...]
...Quoting... ;)
Ciao
Matteo

 ha scritto nel messaggio
news:b9akmr$h9rgq$1...@ID-123015.news.dfncis.de...


 ... ;(
Si, ma oltre a ringraziare hai anche quotato tutto ... e non un 
messaggio a caso ... tutte le FAQ :))))))
Ciao.Alberto.
-- 
Alberto Rubinelli - A2 SISTEMI               posted with Gravity 2.60b
Via Costantino Perazzi 22 - 28100 NOVARA (NO) - ITALY     ICQ 49872318
E-Mail : 
alb...@retrocomputing.net
  Tel. 0321 640149 
Web    : 
www.retrocomputing.net
      Fax  0321 391669 BBS  0321 392320