Newsgroup: it.comp.lang.delphi
Titolo: [FAQ] LE FREQUENTLY ASKED QUESTIONS DI ICLD - APRILE

LE FREQUENTLY ASKED QUESTIONS DI it.comp.lang.delphi (ICLD)
INDICE
 1 - Presentazione
 2 - Domande generiche
 3 - Object Pascal e VCL
 4 - API di Windows
 5 - Multimedia
 6 - Internet Programming
 7 - Database
 8 - Report
 9 - Kylix
10 - Links (detti anche "I soliti siti")
---------------
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 (da qualche tempo rinominato Delphi).
La maggior parte delle domande sono state chieste nel newsgroup
It.comp.lang.delphi, si ringraziano quindi tutti i partecipanti di questo
NEWSGROUP. Oltre alle domande piu' comuni, abbiamo pensato di raccogliere
anche altre domande che seppur poco richeste, hanno una soluzione
complicata
e quasi impossibile da risolvere senza un aiuto.
Un ultima cosa: prima di postare, leggi anche il documento
[FAQ] REGOLE PRATICHE PER I NUOVI ARRIVATI
http://makeashorterlink.com/?V2D15283A
che spiega come "comportarsi" sul NG.
-------------------
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).
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++.
Da qualche tempo Borland - considerate anche le significate deviazioni
prese -
ha deciso di definire con "Delphi" anche il linguaggio di programmazione
utilizzato per lo sviluppo.
2.2
-DOMANDA:
Delphi mi genera un sacco di file con estensioni strane quando salvo un
progetto. Servono tutti ?
-RISPOSTA:
I file con la tilde (~) sono file di backup dei relativi file: non sono
indispensabili, se vuoi puoi anche cancellarli.
I file .cfg e .dof non devi mai cancellarli perchè sono impostazioni del
progetto.
I file .dcu anche se li cancelli non succede niente perchè vengono
rigenerati nella compilazione, ma solo se hai i rispettivi file .pas
(naturalmente i file .pas non vanno mai cancellati)
2.3
-DOMANDA:
Esiste l'overloading degli operatori ?
-RISPOSTA:
No.
2.4
-DOMANDA:
Esiste l'overloading delle funzioni ?
-RISPOSTA:
Esiste a partire da Delphi4. Per implementarlo, aggiungi la direttiva
overload nella dichiarazione delle procedure.
2.5
-DOMANDA:
Perche' Delphi genera file exe cosi' grandi ? Non si possono ridurre?
-RISPOSTA:
Di solito, Delphi genera eseguibili molto piu' grandi dei suoi concorrenti
perche' essi sono applicativi stand-alone, in grado cioe' di essere eseguiti
senza il bisogno di librerie esterne: il prezzo da pagare (molto basso, IMO)
per tutti i vantaggi che questo comporta e' la dimensione dell'exe.
Esistono comunque due vie differenti per ridurre le dimensioni
dell'applicazione:
- togliere la vcl e programmare solo con le API di Windows;
- utilizzare programmi di compressione dell'eseguibile (come p.e. UPX).
Questa e' la forza di Delphi: puoi scegliere la strada comoda (lo sviluppo
RAD) o quella ottimizzata (API).
2.6
-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.7
-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. Per questo tipo di operazioni, 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.8
-DOMANDA:
Che cosa usate per creare manuali ed help in linea delle vostre
applicazioni?
-RISPOSTA:
Qualche volta e' stato consigliato il tool *Shalom Help Maker*
(
http://www.danish-shareware.dk/soft/shelpm/
): si tratta di un tool
freeware che crea file in formato HLP classico.
In alternativa, puoi sempre ricorrere al *Microsoft Help Compiler* e
scrivere la tua documentazione in linea usando Microsoft Word.
Ancora, puoi scaricare il *Microsoft HTML Workshop* per scrivere file in
formato CHM, una specie di archivio che riunisce al proprio interno i
file della guida in formato HTML.
Delphi non supporta nativamente questo tipo di file, ma è possibile
renderlo capace di farlo usando componenti esterni, come *Delphi HTML
Kit* (
http://www.helpware.net/delphi/
).
-------------------------------------------
3 OBJECT PASCAL E VISUAL COMPONENT LIBRARY
-------------------------------------------
3.1
-DOMANDA:
Cos'è la VCL ?
-RISPOSTA:
VCL e' l'acronimo di Visual Component Library, il framework messo a
disposizione da Delphi fin dalla sua nascita per velocizzare lo sviluppo
delle applicazioni.
Malgrado il nome possa far pensare il contrario, la VCL non mette a
disposizione del programmatore solo componenti visuali (raggruppati nella
toolbar) ma anche intere gerarchie di classi utilizzabili nella gestione
piu'
generale del programma (non solo della sua parte visuale, quindi).
Nel corso delle versione, hanno affiancato la VCL altri framework
specializzati
in ambiti differenti, come la CLX (per lo sviluppo multipiattaforma
WIN32-Linux) e il .NET Framework (per la nuova piattaforma MS).
3.2
-DOMANDA:
Come posso far si che la mia applicazione venga lanciata ad ogni avvio di
Windows?
-RISPOSTA
Bisogna utilizzare una chiave particolare del Registro di Windows...
ecco il codice:
var Registro : TRegistry;
begin
Registro := TRegistry.Create;
try
with Registro DO
Begin
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',False)
then
if not ValueExists('NomeMiaApplicazione') then
WriteString('NomeMiaApplicazione',(Application.ExeName));
end // WITH
finally
Registro;
end;
end;
3.3
-DOMANDA:
Come posso conoscere la directory dove viene eseguito il mio programma?
-RISPOSTA:
Per sapere il full-path usa la property ExeName dell'oggetto Application;
per ottenere solo la cartella in cui è installato il tuo eseguibile
utilizza ExtractFilePath(Application.exename).
La funzione ParamStr(0) restituisce il medesimo valore, mentre per
recuperare gli altri argomenti della riga di comando usare le funzioni
ParamCount e ParamStr.
3.4
-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);
3.5
-DOMANDA:
Come faccio a comprimere/decomprimere dei file zip dal mio programma?
-RISPOSTA:
Esistono diversi componenti o unit che possono aiutarti: cerca con
Google o nei soliti siti. Fornita "di serie" con Delphi esiste
la unit ZLib (maggiori info le trovi su 
http://www.gzip.org/zlib/
)
che contiene le classi TCompressionStream e TDecompressionStream;
non ha a che vedere direttamente con la creazione di file Zip,
ma offre una soluzione se si devono semplicemente comprimere dati.
3.6
-DOMANDA:
Come prevenire nuove istanze di un'applicazione in Delphi, ovvero fare in
modo che si possa aprire una volta sola?
-RISPOSTA:
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.
Vedi anche qui 
http://tinyurl.com/3oa5o
 per maggiori informazioni.
3.7
-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:
Aggiungi la unit Clipbrd e verrà automaticamente istanziato un oggetto di
nome Clipboard ...
Per inserire la stringa in memoria:
Clipboard.SetTextBuf(Stringa);
Per ottenere la stringa:
if Clipboard.HasFormat(CF_TEXT) then Stringa:=Clipboard.AsText;
3.8
-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.
3.9
-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
3.10
-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; // case
3.11
-DOMANDA:
Come ottengo la lista dei font installati sul sistema?
-RISPOSTA:
ListBox1.Items.Assign(Screen.Fonts);
3.12
-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.13
-DOMANDA:
Esiste un componente che mi permetta di lanciare un programma dos e
catturarne l'output?
-RISPOSTA:
Questa procedura permette di ridirezionare l'output di un comando DOS in un
componente TMemo:
procedure TForm1.Button1Click(Sender: TObject);
procedure LanciaComandoDosInMemo (ComandoDos: String; AMemo:TMemo);
const
BufferDiLettura = 2400;
var
AttrSicurezza : TSecurityAttributes;
CodaDiLettura, CodaDiScrittura : THandle;
Inizio : TStartUpInfo;
InfoDelProcesso : TProcessInformation;
Buffer : Pchar;
ByteLetti : DWord;
AppAttiva : DWord;
begin
With AttrSicurezza do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (CodaDiLettura, CodaDiScrittura,
@AttrSicurezza, 0) then
begin
Buffer := AllocMem(65536); // alloco memoria per 64k
FillChar(Inizio, Sizeof(Inizio),#0);
Inizio.cb := SizeOf(Inizio);
Inizio.hStdOutput := CodaDiScrittura;
Inizio.hStdInput := CodaDiLettura;
Inizio.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
Inizio.wShowWindow := SW_HIDE;
if CreateProcess(nil,
PChar(ComandoDos),
@AttrSicurezza,
@AttrSicurezza,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
Inizio,
InfoDelProcesso)
then
begin
repeat
AppAttiva := WaitForSingleObject(InfoDelProcesso.hProcess,100);
Application.ProcessMessages;
until (AppAttiva <> WAIT_TIMEOUT);
Repeat
ByteLetti := 0;
ReadFile(CodaDiLettura,Buffer[0], BufferDiLettura,ByteLetti,nil);
Buffer[ByteLetti]:= #0;
OemToAnsi(Buffer,Buffer);
AMemo.Text := AMemo.text + String(Buffer);
until (ByteLetti < BufferDiLettura);
end;
// libero la memoria
FreeMem(Buffer);
CloseHandle(InfoDelProcesso.hProcess);
CloseHandle(InfoDelProcesso.hThread);
CloseHandle(CodaDiLettura);
CloseHandle(CodaDiScrittura);
end;
end;
begin
// esempio d'uso
LanciaComandoDosInMemo('net.exe c:\',Memo1);
end;
3.14
-DOMANDA:
Come levo il fastidiosissimo beep che fa il TEdit quando premo invio ?
-RISPOSTA:
Nell'evento OnKeyPress metti:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then key := #0;
end;
3.15
-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.16
-DOMANDA:
Come posso sincronizzare i thread di una applicazione multithread ?
-RISPOSTA:
Ecco un ottimo tutorial in italiano dove potrai trovare tutte le
spiegazioni
riguardo l'uso dei thread:
http://makeashorterlink.com/?R206130F8
3.17
-DOMANDA:
Come cambio colore al una ProgressBar?
-RISPOSTA:
Dal 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?!?)
:_(("
3.18
-DOMANDA:
Come posso formattare il testo in un TMemo?
-RISPOSTA:
Non e' possibile: usa un Richedit.
3.19
-DOMANDA:
Devo lavorare con le date ed eseguire operazioni matematiche su di esse:
come fare?
-RISPOSTA:
Fin da Delphi 6 esiste una unit apposita (DateUtils.pas) che fornisce
molte
funzioni adatte allo scopo.
In giro per Internet puoi comunque trovare altre unit freeware.
----------------
4 API di Windows
----------------
4.1
-DOMANDA:
Come posso aprire (o chiudere) il cassettino dI UNA unità CD-ROM via codice?
-RISPOSTA:
Anche qui è necessaria la unit MMSystem.
{Apertura/Chiusura cassetto CD/DVD}
  procedure Cassetto(const chDrive: char; strAzione:string);
  begin
    mciSendString(PChar('open ' + chDrive + ':\ type cdaudio alias
TheDrive'),nil,0,0);
    mciSendString(PChar('set TheDrive door '+ strAzione),nil,0,0);
    mciSendString(PChar('close all'),nil,0,0);
  end;
Utilizzo:
      Cassetto('E','open');
      Cassetto('E','closed');
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);
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 1 al posto di X 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:
La soluzione_teorica_più corretta 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.
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 impostare i privilegi mediante
la funzione AdjustTokenPrivileges e funzioni correlate.
4.8
-DOMANDA:
Come faccio a mettere un'icona nella 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 toglierla:
Shell_NotifyIcon(NIM_Delete, @MyNotifyStruct);
In alternativa, puoi scarcarti dai soliti siti diversi componenti che
offrono molte opzioni per personalizzare la propria applicazione.
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 InfoDelFile : TSHFileInfo;
Icona : TIcon;
begin
SHGetFileInfo(pchar(filename), 0, InfoDelFile,
sizeof(InfoDelFile),SHGFI_ICON or SHGFI_SMALLICON);
Icona := TIcon.create;
Icona.releasehandle;
Icona.handle := InfoDelFile.hIcon;
// usare l'oggetto Icona 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, InfoDelFile,
sizeof(InfoDelFile), 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:
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 ;
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:
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:
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
// riabilita errori critici
SetErrorMode(ErrorMode);
end;
end;
4.14
-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" nei meandri del SO.
Di solito, con un buon lavoro di API, e' possibile recuperarle
agevolmente. Vedi il SDK di Windows per maggiori informazioni.
Per i piu' pigri e i meno intraprendenti, esistono comunque diversi
componenti (vedi i soliti siti) che raggruppano tutte le queste
informazioni.
4.14
-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 corrente per il vostro processo.
esempio:
var WinDirPath: PChar;
begin
GetMem(WinDirPath,MAX_PATH);
GetWindowsDirectory(WinDirPath,MAX_PATH);
ShowMessage(WinDirPath);
FreeMem(WinDirPath);
end;
4.15
-DOMANDA:
Come posso gestire la porta parallela/seriale con Delphi sotto Windows?
-RISPOSTA:
Lo puoi fare tramite API, ma e' molto piu' semplice utilizzando un
componente.
La piu' citata ed apprezzata nel NG sembra essere la suite AsyncPro di
TurboPower disponibile free su SourceForge.
Attento: per gestire le porte hardware sotto NT, e' di solito necessario
scrivere un Device Driver, il che e' argomento molto complesso.
4.16
-DOMANDA:
Come posso aprire un file di Excel (o Word) via codice?
-RISPOSTA
Excel e Word (come tutte le applicazioni Office) sono
"automation server". Le ultime versioni di Delphi
hanno dei componenti per semplificare il lavoro di accesso
e gestione di questi applicativi, ma spesso bastano poche
righe di codice per ottenere cio' che si vuole.
Di seguito si trovano alcuni link dove approfondire l'argomento:
Base:
http://www.blong.com/Articles/Automation%20In%20Delphi/Automation.htm
Avanzato:
http://www.blong.com/Conferences/IConUK2000/DelphiMoreAutomation/More%20Aut
omation%20In%20Delphi.htm
Generalista:
http://www.djpate.freeserve.co.uk/AutoIntro.htm
------------
5 MULTIMEDIA
------------
5.1
-DOMANDA:
Come posso gestire da codice il volume wave della scheda audio?
-RISPOSTA:
Includere la unit MMSystem e poi richiamare la WaveOutSetVolume :
WaveOutSetVolume(0, 00000000); //azzera il volume
WaveOutSetVolume(0, $FFFFFFFF); //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:
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:
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.
5.4
-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 sui Soliti Siti (c).
----------------------
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.delphiedintorni.com
)
uses WinInet;
var
dwFlags: Cardinal;
begin
if InternetGetConnectedState(@dwFlags, 0)
then ShowMessage ('Online')
else ShowMessage ('Offline');
6.3
-DOMANDA:
Come faccio a inviare un'email?
-RISPOSTA:
Esistono diversi metodi che puoi utilizzare:
* usi i componenti forniti con Delphi (nelle ultime versioni trovi
gli Indy).
* usi il protocollo "mailto", per esempio:
http://www.delphifaq.com/fq/q2184.shtml
* puoi usare MAPI, per esempio cosi':
http://www.delphifaq.com/fq/q5012.shtml
Cerca con Google, troverai molte altre informazioni a riguardo!
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;
6.5
-DOMANDA
Come posso scaricare un file da Internet?
-RISPOSTA
Usa il componente TIdHTTP in questa maniera:
FileDaScaricare := TFileStream.Create(NomeFile, fmCreate);
try
IdHTTP1.Get(Url, FileDaScaricare);
finally
FileDaScaricare.Free;
end;
----------
7 DATABASE
----------
7.1
-DOMANDA:
Come si fa a togliere la finestra di login per la connessione
al database?
-RISPOSTA:
Imposta la proprietà LoginPrompt del TDatabase a False.
7.2
-DOMANDA:
Ho diversi problemi (performance, deploy, corruzione dei dati, o altro)
con il BDE: mi date una mano?
-RISPOSTA:
La prima cosa che bisogna fare quando si lavora con il BDE e si ha qualche
problema e' visitare 
www.bdesupport.com
.
Molti dei problemi storici dell'engine Borland sono ben documentati
su questo sito.
7.3
-DOMANDA:
Quale DB mi consigliate di utilizzare per la mia prossima applicazione?
-RISPOSTA:
Questa e' una domanda da evitare assolutamente: non esiste un db
migliore degli altri, ma tutto e' relativo al genere di applicazione
che uno intende sviluppare e dal budget disponibile.
7.4
-DOMANDA:
Ho problemi con uno script SQL, con Firebird, con Access, con MySQL,
con MSSQL: posso postare la mia domanda sul NG?
-RISPOSTA:
In linea di massima, la risposta e' negativa, ma molti post riguardo questi
argomenti sono gia' comparsi sul NG. Diciamo dunque che sono argomenti
"tollerati" se non procurano troppo "rumore". E' comunque bene
mettere il tag [OT] nell'object (e prima di postare qui, cercare una
risposta
in NG piu' adatti).
7.5
-DOMANDA:
Come posso aggiungere a runtime dei campi ad un mia tabella senza
perdere i dati presenti?
-RISPOSTA:
La via piu' semplice e' quella di usare il comando SQL "ALTER TABLE".
-------
8 REPORT
-------
8.1
-DOMANDA:
Ma in Delphi 7 non c'e' piu' QuickReport?
-RISPOSTA:
QuickReport è stato sostituito da Rave Reports della Nevrona.
La scelta ricade probabilmente sul fatto che alla Borland serviva un
motore per il reporting che fosse "portabile" (per garantire la
portabilità delle applicazioni CLX su Kylix, nel sistema operativo
Linux)...e forse per qualche altro motivo (si mormora che QR pulluli di
buchi, anche se io l'ho usato tranquillamente anche in progetti
recenti).
Tuttavia, per questioni di compatibilità, il package QuickReport viene
ancora distribuito assieme a Delphi; per attivarlo, devi installare il
package "dclqrt70.bpl" che si trova nella cartella
$(DELPHI)\Bin
selezionando la voce di menu [Component|Install packages...] e premendo
il pulsante "Add".
Come per magia, appariranno i componenti QReport nella Palette e
l'elemento Report sarà nuovamente disponibile nella finestra di
creazione di un nuovo elemento ([File|New|Other...]).
8.2
-DOMANDA:
Qual'e' la migliore suite di componenti per generare report che
posso utilizzare nel mio programma?
-RISPOSTA:
Questa e' una domanda da evitare assolutamente: non esiste un tool
migliore degli altri, ma tutto e' relativo al genere di applicazione
che uno intende sviluppare e al budget disponibile.
-------
9 KYLIX
-------
9.1
-DOMANDA:
Cos'e' Kylix ?
-RISPOSTA:
Arrivato alla versione 3, è il pacchetto RAD creato da Borland per lo
sviluppo di applicazione sotto Linux.
La FAQ ufficiale di Kylix si trova qui:
http://www.borland.com/kylix/pdf/kyl3_faq.pdf
9.2
-DOMANDA:
E' compatibile con Delphi ?
-RISPOSTA:
Borland assicura sia compatibile con Delphi Studio e C++Builder Studio,
rendendo semplice lo sviluppo cross-platform.
9.3
-DOMANDA:
E' free?
-RISPOSTA:
Esistono tre versione diverse, tra cui una denominata Open: tutte le
applicazione sviluppate con questa versione devono essere
rilasciate sotto licenza GPL.
9.4
-DOMANDA:
Cos'e' la CLX ?
-RISPOSTA:
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.
--------
10 LINKS
--------
Detti anche "I soliti siti" - Copyright (c) 2004 AS -, sono un punto di
riferimento per tutti i frequentatori del NG.
Dove trovare TUTTO su Delphi:
http://www.google.com
Per iniziare:
http://programmazione.html.it/delphi/index.html
http://www.marcocantu.it/EPascal/
http://www.marcocantu.com/edelphi/default.htm
http://www.delphibasics.co.uk/
Dove trovare i componenti che ti servono:
* Torry's Delphi Pages
http://www.torry.net
http://torry.rimini.com/
* Delphi Super Page (inglese)
http://delphi.icm.edu.pl/
I siti Borland
* Borland Italia
http://www.borland.it/
* Borland Community
http://community.borland.com/delphi
* I NG Borland
news://
newsgroups.borland.com
Notizie, articoli, tips, ...
http://www.delphiedintorni.com
http://www.programmazione.it
http://www.delphi3000.com
http://www.marcocantu.com
http://www.drbob42.com
http://delphi.about.com/compute/delphi/
http://www.delphifaq.com/
http://www.cyber-matrix.com/delphi.html
Per conoscere tutti i segreti di Windows
http://www.msdn.com/

 TrollTech, simile ma non uguale alla VCL.
Aggiungerei: occhio che se vuoi usare le librerie QT in senso
commerciale, devi sborsare attorno ai 1500 dollari *per sviluppatore*.
Quindi questo va messo in conto.
Ecco, ho rotto abbastanza le scatole ;-)
Ciau,
Andrea

 Quindi questo va messo in conto.
Ma la Borland non aveva già pagato i diritti alla Trolltech? Mi pare che 
si fosse detto che acquistando una licenza di Kylix si acquistava anche 
il diritto a redistribuire applicazioni basate su CLX e quindi QT.
Bye,
   Luca

 Ecco, ho rotto abbastanza le scatole ;-)
Questo sempre!
;-)
Ciao
ACSH

 ACSH
Andrea

 le FAQ?
Bé, non č detto che allora avesse visto il tuo post, oppure magari 
allora non aveva tempo per leggersi ben bene le FAQ e suggerire 
cambiamenti, oppure ancora non sentiva l'esigenza di cambiare qualcosa 
nelle FAQ, ecc.
Inoltre le FAQ possono cambiare con il tempo, magari cambia il 
linguaggio, magari cambia l'IDE, magari semplicemente cambia una certa 
idea su una certa parte di Delphi... insomma, la morale č che le FAQ non 
sono scritte nella roccia e possono tranquillamente cambiare con il 
tempo. Sarebbe forse meglio fornire una versione nella FAQ (es: Versione 
0.1 del XX/XX/XXXX) in questo modo č possibile capire quale sia l'ultima 
e piů aggiornata versione della FAQ.
Ciao,
   Luca

 disponibilità di librerie di accesso ai dati.
Forse ci si riferisce al fatto che l'ottimizzazione di tabelle, l'uso di 
statement SQL, il backup e restore di FireBird e altri argomenti del 
genere, nonostante si utilizzino in Delphi, non siano strettamente 
legati a Delphi stesso, anche se con un [OT] si potrebbero 
tranquillamente tollerare.
Ciao ad entrambi voi volenterosi. :-)
-- 
MARCO «Alka» BREVEGLIERI
   (
http://www.marco.breveglieri.name
)
Leggi le FAQ di ICLD: 
http://icld.altervista.org

 e piů aggiornata versione della FAQ.
Mi offro di inserirla nel VCS e di iniziare un versionamento.
Alla base di questo pero' ci deve essere la manutenzione del file txt delle
stesse, anche quando saranno importate in drupal da papa' gianni.
(da oggi Gianni Giusti e' "papa' Gianni", o "daddy gianni", sempre che non
si offenda ;-))
Ciao!
Cosa ne pensate?
P.S.
Imho ogni trhead e' buono per riaccendere il topic delle faq... sopratuttto
quando passando centinaia di post tra un topic e l'altro sulle faq.
:-)
-- 
Morde. 
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 e piů aggiornata versione della FAQ.
La data di aggiornamento delle FAQ e' scritta nell'oggetto e la versione
piu' aggiornata e' quella postata per ultima (una volta al mese, essendo
le FAQ "femmine"); il file di testo originale e' purtroppo perduto nel mio
vecchio HD (molto peggio che essere scritte nella roccia!) e fra poco, se
i miei tentativi di rianimarlo non daranno i loro frutti, finira' presto
in discarica (o deve essere riciclato?).
Ciao
ACSH  
PS. il tono del post e' volutamente scherzoso: non facciamo di questa
discussione una cosa piu' grande di quello che e' e torniamo a parlare di
Delphi.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Mi offro di inserirla nel VCS e di iniziare un versionamento.
Se per VCS intendi CVS occhio perché i numeri di versione assegnati da
cvs non possono essere presi a riferimento per l'utente finale. Per la
manutenzione non c'č problema ovviamente ma per la sequenza del codice
di versione occorrerebbe usare un altro prodotto, imho.
guastatore ;)

 di versione occorrerebbe usare un altro prodotto, imho.
Qualcuno conosce che prodotto si puo' usare?


Tra un pianto e l'altro del bebč, "daddy gianni", come mi ha battezzato 
morde ;-) ,ha fatto delle variazioni sul sito ufficiale:
1) per gli amministratori delle faq, adesso č possibile identare il 
codice. Se viene fatto un copia incolla di codice identato, 
automaticamente ritorna identato
2) In fondo ad ogni faq č presente "view as pdf" che permette la 
trasformazione della faq in pdf
Appena ho altro tempo preparo un piccolo testo che spiega come inserire, 
modificare, cancellare faq (questo per ACSH, Breveglieri, Jax o chiunque 
altro lo desideri, dietro consenso di tutti)
Ciao
Gianni

 morde ;-) ,ha fatto delle variazioni sul sito ufficiale:
Mi dimenticavo una cosa importante!!
C'è qualcuno che vuol essere il depositario anche del login e password 
ftp e mysql? E' meglio che queste informazioni le sappia almeno 2 
persone..... non si sa mai (mi tocco), se qualcuno ha qualche problema 
il sito ufficiale non può fermarsi.
Ciao
Gianni

 ftp e mysql? 
Daddy Gianni se per te non e' un problema spediscimele che le custodiro'
senza fatica, visto che sono anche l'amministratore della mailing list di
icld. ^___^
ciao!
A proposito, il sito e' down in questo momento...altervista problems?
-- 
Morde. 
FAQ di icld (beta-version): 
http://icld.altervista.org
 



Abemus Papa'.
:-)
Ciao
ACSH 

 Abemus Papa'.
ROTFL
Ciao
Gianni


Adesso funziona, ma non ho fatto nulla. Probabilmente altervista era giů.
Ciao
Gianni

Inserito il link "cerca" per cercare velocemente nelle faq
http://icld.altervista.org/?q=search
P.S.
la ricerca avviene solo sui titoli delle faq
Ciao
Gianni

 Gianni

 Le invio a te e ACSH così siamo in tre (numero perfetto)
L'hai gia' fatto?
Io non ho ricevuto nulla.
Ciao
ACSH


 Io non ho ricevuto nulla.
hops... scusa
Pensavo di averti messo come destinatario, ma rivedento la posta inviata 
mi son reso conto dell'errore
Ciao
Gianni