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

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
(
http://tinyurl.com/47yas
) 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' e' uno strumento RAD: 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 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);
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/
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Re: =?ISO-8859-1?Q?=E8FAQ]?= LE FREQUENTLY ASKED QUESTIONS DI ICLD -
NOVEMBRE
non per fare il pignolo ma ci sta qualche carattere di escape di troppo
nel post. controlla la procedura che le invia dal sito (se lo
gestisci tu). Piu che altro perchè non si capisce nulla nel subject come
ti ho riportato sopra.
ciao f
-- 
Coltiva linux, che tanto windows si pianta da solo!
Linux registered user: 364664 (
http://counter.li.org
)

 ciao f
Invece della parentesi quadra mi e' partita una e accentata.
Dislessia delle dita.
Ho corretto l'oggetto di questa risposta, se puo' in qualche modo
risolvere l'incoveniente.
Alla prossima.
Ciao.
ACSH


 risolvere l'incoveniente.
scusa ma non volevo fare il rompi ;-) nessun inconveniente per me. 
ciao


ti capisco, i miei tasti piu consumati sono il backspace e il canc ;-)
i miei piu' consumati sono
CTRL+C
CTRL+V
Io sono un programmatore copia incolla!
 :-P
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

  :-P
Il mio tasto invece è l'F9... sono un programmatore cazzaro che, ogni volta
che cambia una virgola, deve vedere "che effetto fa" :D
-- 
Jax
====
Disprezzo dal più profondo del cuore chi può con piacere marciare in
rango e formazione dietro una musica; soltanto per errore può aver
ricevuto il cervello; un midollo spinale gli basterebbe ampiamente.
(Einstein)

 che cambia una virgola, deve vedere "che effetto fa" :D
Allora avrai senz'altro provato DUnit... ;-)
-- 
Marco «Alka» Breveglieri
  ABLS Team S.n.c. - Software & Web
  Via De Gasperi, 14
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

 Io sono un programmatore copia incolla!
io invece scrivo un sacco di cavolate anche quando programmo!!! ;-)
quindi il canc e backspace sono giustificati! poi a ruota viene l'F9 che
pedantemente mi fa notare le stupidaggini scritte!
uffa!
;-)


 Allora avrai senz'altro provato DUnit... ;-)
Mi hai incuriosito, ma nei prossimi 20 minuti devo fare una cosa che
normalmente mi occuperebbe 1 ora... ovviamente l'ho saputo 30 secondi fa...
domani non mancherò di googlare ;)
-- 
Jax
====
Non basta fare il bene, bisogna anche farlo bene. (Diderot)

 domani non mancherò di googlare ;)
Insisto... ;-)
http://dunit.sourceforge.net/


 
http://dunit.sourceforge.net/
3 parole per descrivere questa cosa: perle ai porci.
Ci credi che non c'ho capito una beata mazza?
Mi sa che fino ad oggi ho vissuto di rendita con delphi...
-- 
Jax
====
Quando la moglie di un uomo impara a capirlo, lei di solito smette di
ascoltarlo.

 Mi sa che fino ad oggi ho vissuto di rendita con delphi...
Si tratta di un framework (consentitemi di usare questa parola, una 
volta tanto) per la costruzione di "Test Case", cioè classi che sono 
preposte al test di altre classi (che fanno parte di una libreria 
sviluppata o di un'applicazione).
Sfruttando le classi del framework, è possibile ereditare metodi già 
pronti per creare e distruggere la classe da testare (o qualsiasi altra 
struttura dati) e chiamare metodi (o eseguire operazioni) che terminano 
con un esito: successo (tutto è andato bene e il test è corretto), 
insuccesso (il test non è andato a buon fine) oppure errore (si è 
verificata un'eccezione).
Ciascun test, attraverso RTTI, viene rilevato dal framework che lo 
propone all'interno di una finestra di dialogo apposita (che vedi anche 
sul sito) dalla quale è possibile lanciare i test più volte, 
visualizzare e salvare gli esiti e altro ancora.
Mi sono avvicinato a questa tipologia di tool poichè pare che in 
Delphi2005 ve ne sarà uno (o almeno, si parla di "unit testing").
Visto che tu hai dichiarato di "verificare l'effetto" di ogni modifica, 
mi è sembrato interessante segnalarti questo tool che è fatto proprio 
per questo: realizzare una procedura di test e ripeterla a comando per 
verificare l'effetto delle modifiche, anche minimali, apportate al 
codice. ;-)
Se vuoi approfondire, segui i tutorial sul sito che mettono in luce le 
caratteristiche di DUnit.
Ogni linguaggio, tra l'altro, ha la sua implementazione di questo 
strumento: JUnit in Java, NUnit per .NET e così via.
Pare sia molto diffuso tra gli eXtreme Programmers...
Ciao! :-)


 sviluppata o di un'applicazione).
Credo di aver capito, grazie della spiegazione esauriente, come al solito.
Il "credo" è perché non sono solito utilizzare classi mie nelle mie
applicazioni, e in generale programmo più "old-style" (procedure, funzioni
et similia) che OOP (oggetti, interfacce).
Mi limito a usare quello che delphi mi mette a disposizione... in questo
senso non sono affatto un eXtreme programmer, purtroppo...
-- 
Jax
====
Povertà e amore sono difficili da nascondere.