Newsgroup: it.comp.lang.delphi
Titolo: [FAQ] Proposta di FAQ - Parte Seconda

Seconda parte delle FAQ, quella vera.
Ho semplicemente preso le precedenti FAQ, aggiornandole,
potandole, riscrivendole parzialmente in alcuni punti, aggiungendo
qualcosina in altri punti e "spersonalizzandole" del tutto
(togliendo ogni riferimento per quanto possibile a persone o cose);
spero che nessuno si offenda se trova risposte sue senza essere
stato citato, ma queste sono le FAQ di ICLD, non le mie, le sue,
o quelle di Tizio, collega-programmatore di Caio e Sempronio.
Sono tre le domande che IMO dovremmo aggiungere ma non trovo
delle risposte adeguate. Eccole:
- Quali libri su Delphi mi consigliate?
- Come posso creare una splash form all'avvio della mia applicazione?
- Come posso chiudere una applicazione esterna alla mia?
Infine, non sono certissimo della risposta 2.3: qualcuno puo' confermare?
Come sempre ogni vostro apporto, critica e suggerimento e' ben accetto.
Mi raccomando: fate attenzione al quoting se rispondete a questo messaggio!
Buona discussione.
ACSH
// Inizio FAQ
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.
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 (...) 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++.
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:
Solo da Delphi 8.
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:
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 toolbar. Facendo un doppioclick su
un componente, vedrai comparire il medesimo nella form.
Ogni componente ha diverse proprietà, 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 esecuzione) e altri non
visuali, che racchiudono invece 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 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.
3.6
-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.
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:
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.
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:
Esiste una unit apposita (DateUtils.pas) che fornisce molte funzioni
adatte allo scopo.
----------------
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.
------------
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.dedonline.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 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;
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 cercare 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 dal 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.dedonline.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/
Per conoscere tutti i segreti di Windows
http://www.msdn.com/
// Fine FAQ
// Powered By Notepad - 26/09/2004

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
ACSH wrote:
| Seconda parte delle FAQ, quella vera.
[CUT]
Postala anche su it.faq e magari mettila su un sito web da qualche parte
in modo che sia semplice fornire il suo link. Se non hai un sito posso
fornirti lo spazio necessario io gratuitamente (a patto che non ti
secchi dovermi spedire la FAQ ogni volta che la cambi perché io la posti
sul mio sito... sempre che non trovi un metodo migliore).
Bye,
~  Luca
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
Comment: Using GnuPG with MultiZilla - 
http://enigmail.mozdev.org
iD8DBQFBVs/rliez+Z59f3URAsNDAJ9RpjhJZJYJ8cLKk6wiDOvHoqZKHACgwZmt
4gWtJDXkwLVWlJccWzf4jRk=
=K5zb
-----END PGP SIGNATURE-----

 
http://www.dedonline.com
Quel sito non è più raggiungibile, l'indirizzo nuovo è 
http://www.delphiedintorni.it
Ciao,
Andrea Magni

 // Powered By Notepad - 26/09/2004
Bella questa "chicca"... :-)
Il mio contributo l'ho dato...attendiamo altri responsi, con molta 
pazienza dato che le FAQ sono voluminose. :-)
Complimenti per il lavoro, comunque. ;-)
-- 
Marco «Alka» Breveglieri
  ABLS Team S.n.c. - Software & Web
  Via De Gasperi, 14
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

 Il mio contributo l'ho dato...
Grazie.
Ciao.
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 sul mio sito... sempre che non trovi un metodo migliore).
Per i link della versione testuale penso di affidarmi alle note
capacita' di memorizzazzione di GOOGLE e a qualche shortlink. 
Stavo pero' pensando di farne anche una versione HTML e 
approfittero'di sicuro della tua offerta: porta solo un po' di pazienza.
CMQ, gli aggiornamenti saranno davvero rari.
Grazie.


 Ciao.
Ciao! :-)


 nella propria richiesta.
Vedi la FAQ, risposta 7.4.
:-)
E poi io ho gia' iniziato a scoraggiare le persone ...
Grazie ancora.
