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

Le FAQ di IT.COMP.LANG.DELPHI
Raccolte e pseudo-mantenute da Nicola {MSX} Lugato
EMAIL: 
m...@infomedia.it
 ICQ#: 48855787
Versione 1.1
-------------
PRESENTAZIONE
-------------
Ho apportato le modifiche suggerite e inserito qualche nuova domanda.
Ora dovrebbero esserci 35 domande.
Intanto un po' di pubblicita':
Visita il sito di {MSX} 
http://msx.rules.it
 :)
-----------------
DOMANDE GENERICHE
-----------------
-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 (*), come in C++.
Quindi sai già usare buona
parte del linguaggio, ma le novità di Object Pascal sono molte e importanti.
Per fare una analogia, si potrebbe dire che Pascal sta a Object Pascal
come C sta a C++.
*: si anche pascal normale implementava le classi (la parola chiave era
Object) ma facevano molta piu'
pena.. niente a che vedere con l'Object pascal :)
-DOMANDA:
Delphi mi genera un sacco di file con estensioni strane quando salvo un
progretto. Servono tutti ?
-RISPOSTA: (Riccardo Kalb)
i file con la tilde ~ sono file di backup dei relativi file se vuoi puoi
anche cancellarli se non ti servono.
i file cfg e dof non devi mai cancellarli perchè sono impostazioni del
progetto. I dcu anche se li
cancelli non succede niente perchè vengono rigenerati nella compilazione, ma
solo se hai i rispettivi
file pas (naturalmente i pas non vanno cancellati)
-DOMANDA:
Esiste l'overloading degli operatori ?
-RISPOSTA:
No, almeno fino a Delphi5. (no anche sul 6 a quanto ne so)
-DOMANDA:
Esiste l'overloading delle funzioni ?
-RISPOSTA:
Eseste a partire da Delphi4. Per implementarli, aggiungi la direttiva
overload
sulla dichiarazione delle procedure.
-DOMANDA:
Come posso far si che la mia applicazione venga caricata ogni volta
all'avvio di Windows?
-RISPOSTA (Antonio Tarolla):
Bisogna utilizzare una chiave particolare del Registro di Windows...ecco il
codice :
var Registro : TRegistry;
begin
Registro:=TRegistry.Create;
   try
     Registro.RootKey:=HKEY_LOCAL_MACHINE;
     if
Registro.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',False) then
     if not Registro.ValueExists('NomeMiaApplicazione') then
        Registro.WriteString('NomeMiaApplicazione',(Application.ExeName));
   finally
    Registro.Free;
   end;
end;
-DOMANDA:
Come posso ottenere informazioni sul computer su cui gireranno i miei
programmi ?
Dove trovo informazioni sulle librerie installate, sull'hardware, sulla
memoria disponibile ecc ecc?
-RISPOSTA:
Le informazioni che cerchi sono tutte "sparse". Esistono pero' componenti
che ti cercano e raggruppano
tutte le informazioni. Ad esempio l'eccellente TSystemInfo della Jazarsoft,
che trovate su Torry
o su 
http://www.jazarsoft.cjb.net/
 da info su tantissimi aspetti della
macchina.
-DOMANDA:
Come faccio a sapere la directory dove viene eseguito il mio programma ?
-RISPOSTA:
Per sapere il full-path usa Application.exename, per ottenere la cartella in
cui è il tuo eseguibile utilizza ExtractFilePath(Application.exename).
-DOMANDA:
Come ottengo il nome delle directory di sistema, tipo "c:\windows", la
cartella "temp" ecc ?
-RISPOSTA:
La cartella in cui è installato Windows la ottieni mediante la funzione API
GetWindowsDirectory(), quella temporanea con GetTempPath.
Poi c'e' GetSystemDirectory, che trova la directory di sistema (generalmente
"c:\windows\system")
e GetCurrentDirectory, che ritorna la directory di corrente per il vostro
processo.
esempio:
var WinDirPath: PChar;
begin
  GetMem(WinDirPath,MAX_PATH);
  GetWindowsDirectory(WinDirPath,MAX_PATH);
  ShowMessage(WinDirPath);
  FreeMem(WinDirPath);
end;
-DOMANDA:
Come faccio a non far venire fuori l'icona della mia applicazione nella
barra delle applicazioni in basso ?
-RISPOSTA:
Nell'evento OnPaint o OnShow della form metti:
ShowWindow(application.handle,SW_HIDE);
-DOMANDA:
Come faccio a comprimere/decomprimere dei file zip dal mio programma?
-RISPOSTA:
Scarica qui il componente che fa al caso tuo:
http://ourworld.compuserve.com/homepages/African_Chief/
Esso utilizza una DLL fornita dai creatori di WinZip, che permette di fare
quello che hai chiesto.
-------------------------------------------------------
Visual Component Library (VCL) e componenti Non-Visuali
-------------------------------------------------------
-DOMANDA:
Cos'è la VCL ?
-RISPOSTA:
Per creare la tua applicazione, Delphi ti mette a disposizione la VCL
(Visual
Component Library), ovvero una raccolta di componenti e controlli che puoi
vedere
raggruppati nella "barra" in alto. Fai doppioclick su un componente e vedrai
che
comparirà nella form, cioè la finestra che vedi piena di puntini. Ogni
componente
ha diverse poprietà, che puoi leggere e modificare tramite l'Object
Inspector dopo
averne selezionato uno. Esistono componenti visuali (chiamati controlli) che
saranno
visibili a runtime (quando il tuo programma sarà in funzione) e altri non
visuali,
che racchiudono altre funzioni. Lo scopo di questa raccolta, è di offrire
agli
sviluppatori degli oggetti che racchiudano ciascuno delle funzioni proprie
di
un certo argomento. Ad esempio esiste il componente OpenDialog, (che
gestisce le
finestre di dialogo per aprire un file), il componente Edit (per avere una
casella
di testo nella form), Image (per le immagini) ecc. ecc. Inoltre è possibile
creare
componenti nuovi o scaricarne dalla Rete.
-DOMANDA:
Come creo dinamicamente un controllo ?
-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. 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).
-DOMANDA:
Esiste un componente che mi permetta di lanciare un programma dos e
catturarne l'output?
-RISPOSTA:
Guarda su torry, c'e' l'ottimo DOScommand per esempio.
-DOMANDA:
Come levo il fastidiosissimo beep che fa il TEdit quando premo invio ?
-RISPOSTA:
Su OnKeyPress metti:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then key := #0;
end;
-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.
--------------
API di Windows
--------------
-DOMANDA:
Aprire e chiudere l'unità CD-ROM "primaria"
-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);
-DOMANDA:
Come faccio ad eseguire un programma esterno?
-RISPOSTA:
Ancora una volta, usa ShellExecute.
ShellExecute(Form1.handle, 'open', 'c:\windows\telnet.exe', nil , nil,
SW_SHOWNORMAL);
Oppure usa un componente, ad esempio TAppExec che trovi su torry
o qui: 
http://www.worldnet.net/~cycocrew/delphi
-DOMANDA:
Come nascondo un processo dalla task list (quella di CTRL-ALT-CANC) ?
-RISPOSTA:
usa questa procedura residente nella DLL Kernel32.dll
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;
stdcall; external 'KERNEL32.DLL';
poi chiama:
RegisterServiceProcess(GetCurrentProcessID, x);
Metti come x 1 se vuoi nasconderla o 0 per ripristinarla.
Questa tecnica funziona solo su Windows 9x/ME.
-DOMANDA:
Mi servirebbe sapere come poter accendere e spegnere i tre led della
tastiera.
-RISPOSTA: (Andrea Magni)
Ecco qua, il tutto si basa su Get/SetKeyBoardState che riempie una struttura
(un array 0..255 di bytes) con lo stato attuale dei tasti...
var Tastiera:Tkeyboardstate;
begin
GetKeyBoardState(Tastiera);
  Tastiera[VK_CAPITAL] := 1;
  Tastiera[VK_NUMLOCK] := 1;
  Tastiera[VK_SCROLL] := 1;
SetKeyBoardState(Tastiera);
ShowMessage('Adesso li spengo');
GetKeyBoardState(Tastiera);
  Tastiera[VK_CAPITAL] := 0;
  Tastiera[VK_NUMLOCK] := 0;
  Tastiera[VK_SCROLL] := 0;
SetKeyBoardState(Tastiera);
-DOMANDA:
Ho bisogno di intercettare un evento di un tasto fuori dalla form, ad
esempio il bottone start della barra di avvio.
-RISPOSTA: (Carlo Bertuccini)
La soluzione_teorica_più correttta  per questo tipo
di problemi consiste nell'iniezione di un hook WH_GETMESSAGE (con DLL) nel
thread/processo esterno interessato e intercettare le notifiche spedite dal
componente stesso ... ad esempio per il click di un bottone viene inviata la
notifica BN_CLICKED e così via.
Esempio:
Per semplicità ho intercettato il messaggio
WM_LBUTTONDOWN perchè BN_CLICKED viene inviato in seguito a un WM_COMMAND
dopo che l'evento è avvenuto.
Ecco il codice:
[Progetto]
----------------------
Unit Unit1;
[...]
Procedure Load (TID : dWord); stdcall; External 'ExtEvent.DLL';
Procedure Remove; stdcall; External 'ExtEvent.DLL';
var
  Form1: TForm1;
  OnlyOnce : Boolean = False;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var ButtonHandle: THandle;
    ThreadID : dWord;
begin
  if (OnlyOnce = False) then begin
    OnlyOnce := True;
    ButtonHandle :=
FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil);
    ThreadID := GetWindowThreadProcessId(ButtonHandle,nil);
    Load(ThreadID);
  end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  Remove;
  OnlyOnce := False;
end;
end.
----------------------
[DLL]
----------------------
library ExtEvent;
uses
  Dialogs,
  Messages,
  Windows;
{$R *.RES}
var
hHook : THandle;
TheHandle : THandle;
Function HookProc(Code:Integer; WPar : Wparam; LPar :Lparam) : Integer;
Stdcall;
Begin
  if (Code = HC_ACTION) then Begin
     if (PMsg(LPar)^.message = WM_LBUTTONDOWN) and
 (PMsg(LPar)^.hwnd = TheHandle) then begin
         ShowMessage('Sta per comparire la Barra di avvio (elaborazione di
WM_LBUTTONDOWN)');
     end;
  end;
  Result := CallNextHookEx(hHook,Code,WPar,LPar);
end;
Procedure Load (TID : dWord); stdcall;
Begin
   hHook:=SetWindowsHookEx(WH_GETMESSAGE,@HookProc,hInstance,TID);
end;
Procedure Remove; stdcall;
Begin
   UnHookWindowsHookEx(hHook);
end;
Exports
Load,Remove;
Begin
    TheHandle :=
FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil);
end.
-------
BTW: Questo soddisfa la richiesta di intercettare un evento, che è ben
diverso da sapere lo stato di un bottone. Esistono infatti dei messaggi che
ci restituiscono informazioni sullo stato dei componenti, ad esempio il
messaggio BM_GETSTATE.
-DOMANDA:
Come faccio a spegnere il computer da una mia app (shutdown) ?
-RISPOSTA:
Devi usare ExitWindowsEx.
E' fondamentale il parametro EWX_SHUTDOWN. Inoltre su piattaforme NT/2K è
necessario risettare i privilegi mediante AdjustTokenPrivileges e funzioni
correlate.
-DOMANDA:
Perche' Delphi genera file exe cosi' grandi ? non si possono ridurre?
-RISPOSTA:
Delphi genera file grandi perche' e' un RAD. Creare finestre in Delphi
e' molto semplice proprio per questo, il prezzo da pagare (molto basso)
e' la dimensione dell'exe. Nulla ti vieta di togliere la vcl e tutto il
resto e programmare con le API. Questa e' la forza di Delphi: puoi scegliere
la strada comoda o quella ottimizzata :)
Ecco un esempio di programma senza VCL, che crea una finestra (notare che
con la VCL il seguente programma non necessita alcuna linea di codice :)
----------------------------------------------------
program Window1;
{ Copyright (c) 1996 by Charlie Calvert
  Standard Windows API application written in Object Pascal.
  No VCL code included. This is all done on the Windows API
  level.
  Note that you need to include both Windows and Messages!}
uses
  Windows, Messages;
const
  AppName = 'Window1';
function WindowProc(Window: HWnd; AMessage, WParam,
                    LParam: Longint): Longint; stdcall; export;
begin
  WindowProc := 0;
  case AMessage of
    wm_Destroy: begin
      PostQuitMessage(0);
      Exit;
    end;
  end;
  WindowProc := DefWindowProc(Window, AMessage, WParam, LParam);
end;
{ Register the Window Class }
function WinRegister: Boolean;
var
  WindowClass: TWndClass;
begin
  WindowClass.Style := cs_hRedraw or cs_vRedraw;
  WindowClass.lpfnWndProc := @WindowProc;
  WindowClass.cbClsExtra := 0;
  WindowClass.cbWndExtra := 0;
  WindowClass.hInstance := HInstance;
  WindowClass.hIcon := LoadIcon(0, idi_Application);
  WindowClass.hCursor := LoadCursor(0, idc_Arrow);
  WindowClass.hbrBackground := HBrush(Color_Window);
  WindowClass.lpszMenuName := nil;
  WindowClass.lpszClassName := AppName;
  Result := RegisterClass(WindowClass) <> 0;
end;
{ Create the Window Class }
function WinCreate: HWnd;
var
  hWindow: HWnd;
begin
  hWindow := CreateWindow(AppName, 'Object Pascal Window',
              ws_OverlappedWindow, cw_UseDefault, cw_UseDefault,
              cw_UseDefault, cw_UseDefault, 0, 0, HInstance, nil);
  if hWindow <> 0 then begin
    ShowWindow(hWindow, CmdShow);
    UpdateWindow(hWindow);
  end;
  Result := hWindow;
end;
type func = function(processID, OpTypeFlag:DWORD): DWORD; stdcall;
const RSP_REGISTER = 1;
const RSP_UNREGISTER = 0;
var
  AMessage: TMsg;
  hWindow: HWnd;
  reg:func;
begin
  if not WinRegister then begin
    MessageBox(0, 'Register failed', nil, mb_Ok);
    Exit;
  end;
  hWindow := WinCreate;
  if hWindow = 0 then begin
    MessageBox(0, 'WinCreate failed', nil, mb_Ok);
    Exit;
  end;
@Reg:=GetProcAddress(GetModuleHandle('KERNEL32.DLL'),'RegisterServiceProcess
');
  reg(0,RSP_REGISTER);
  while GetMessage(AMessage, 0, 0, 0) do begin
    TranslateMessage(AMessage);
    DispatchMessage(AMessage);
  end;
  Halt(AMessage.wParam);
  Reg(0, RSP_UNREGISTER);
end.
----------------------------------------------------
-DOMANDA:
Come faccio a mettere un'icona nel Tray (l'area in basso a destra vicino
all'orologio) ?
-RISPOSTA:
Devi usare l'API Shell:NotifyIcon. Ecco un'esempio di come si usa:
MyNotifyStruct: TNotifyIconData;  // dichiarata come globale
procedure TForm1.MettiIcona;
begin
  with MyNotifyStruct do begin
    cbSize:= sizeof(MyNotifyStruct);
    Wnd:= form1.handle;
    uID:= 1;
    uFlags:=  NIF_ICON or NIF_TIP or NIF_MESSAGE;
    hIcon:= UnOggettoTIcon.handle;
    uCallbackMessage:=WM_MSX;
    szTip:= 'Questa scritta viene fuori si ti fermi col mouse';
  end;
  Shell_NotifyIcon(NIM_ADD, @MyNotifyStruct);
end;
Per torglierla:
  Shell_NotifyIcon(NIM_Delete, @MyNotifyStruct);
In alternativa, puoi scarcarti da torry l'ottimo componente TCoolTrayIcon,
che funziona alla
perfezione e offre molte opzioni.
----------
MULTIMEDIA
----------
-DOMANDA:
Come posso gestire da codice il volume wave della scheda audio?
-RISPOSTA (Carlo Bertuccini):
Includere la unit MMSystem e poi richiamare la WaveOutSetVolume :
WaveOutSetVolume(0, 00000000);  file://azzera il volume
WaveOutSetVolume(0, $FFFFFFFF); file://imposta al massimo il volume
Nella funzione WaveOutSetVolume le prime 4 cifre del valore esadecimale che
segue la virgola si
riferiscono agli altoparlandi di sinistra, il resto a quelli di destra.
-DOMANDA:
Cme posso eseguire un file Wave senza il TMediaPlayer
-RISPOSTA (Carlo Bertuccini):
Innanzitutto bisogna sempre includere la unit MMSystem nella USES-list.
Il codice per eseguire è il seguente :
PlaySound('Percorso\nomefile.wav',0,SND_SYNC);
L'ultimo parametro indica se il suono deve essere sincrono (il file non può
essere interrotto fino al termine
della sua esecuzione) o asincrono [SND_ASYNC] (dopo aver avviato la
riproduzione si restituisce il controllo all'applicazione)
-DOMANDA:
Posso usare librerie grafiche avanzate (DirectX o OpenGL) con Delphi ?
-RISPOSTA:
Si. Per entrambe il metodo piu' classico e' procurarsi l'header tradotto in
pascal delle librerie,
includerle nel progetto e usare le API come si fa con gli altri linguaggi.
Puoi procurarti gli header
su DelphiJEDI o su altri siti Delphi (vedi links).
In alternativa puoi usare componenti gia' pronti che incapsulano queste
librerie.
Esistono ad esempio DelphiX (il migliore) e DelphiGameCreator per le DirectX
e OpenGLPanel e altri per OpenGL.
Ancora una volta, trovi tutto su torry (Dio lo benedica :)
--------------------
INTERNET PROGRAMMING
--------------------
-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',
nil,nil,sw_show);
La funzione ShellExecute si trova nella unit ShellApi che dovresti inserire
nella tua USES list.
-DOMANDA:
Come faccio a sapere se sono connesso a Internet ?
-RISPOSTA: (Carlo Bertuccini)
Devi utilizzare le API RAS (Servizi di accesso remoto). Trovi molti esempi
e anche un traduzione dell'header C sulla DSP. Se vuoi semplificare il
lavoro scarica (sempre dallo stesso sito) il componente kzinternetdetect
che ha tra le sue proprietà/metodi un Connected che restituisce
l'informazione interessata.
Non so se ci sia una/nessuna/+ di una traduzione dell'header dell'API
RAS sulla DSP, sicuramente c'è una traduzione sul sito di Fraçoise Piette
(non ho sottomano l'URL)
-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.
--------
DATABASE
--------
-DOMANDA: Come si fa a togliere la finestra di login per la connesione
al database?
-RISPOSTA (Alan Solo):
Imposta la proprietà LoginPrompt del TDatabse a False.
-----
KYLIX
-----
-DOMANDA:
Cos'e' Kylix ?
-RISPOSTA:
E' il porting di Delphi sotto linux, ovvero Delphi per linux.
-DOMANDA:
E' compatibile con Delphi ?
-RISPOSTA:
Domanda complessa :) Dunque, a quanto ne so, Kylix e' compatibile con
Delphi6. Questo pero' a delle condizioni:
devi usare solo i componenti della VCL (che forse ha un altro nome?)
speciale dei due strumenti, evitando
tutte le chiamate alle api e simili. In questo caso lo stesso progetto
dovrebbe compilare su entrambi.
Comunque fino a dove arriva la compatibilita' e' tutto da vedere.
-DOMANDA:
E' free ?
-RISPOSTA:
Magari! Anzi, le varie versioni di Kylix costano molto. A quanto ne so i
prezzi sono questi:
Kylix Server Developer
"Accelerate your Linux® web application development with
Kylix Server Developer edition, the RAD tool for Linux."
$1,999.00
Kylix Desktop Developer
"Accelerate your Linux® GUI development with
Kylix Desktop Developer edition, the RAD tool for Linux."
$999.00
Per prezzi piu' aggiornati, vai al sito 
www.borland.com
Sembra sia prevista una versione GPL.
-DOMANDA:
Cos'e' la CLX ?
-RISPOSTA:
Anche a me piacerebbe saperlo...
Ma non si puo' volere tutto..
-------
CREDITS
-------
Si ringraziano (in ordine sparso):
Alan Solo, Riccardo Kalb, A. Salvati, Andrea Magni, Antonio Tarolla,
Carlo Bertuccini, Charlie Calvert, Paolo Arosio,
WalkieTalkie, Unforgiven, KJK :: Hyperion, Claudio "Elder" Bertoli
-----
LINKS
-----
Torry's Delphi Pages (inglese)
 
http://www.torry.net
 
http://torry.rimini.com/
  (mirror italiano)
 Il migliore per cercare componenti aggiuntivi. Sono catalogati per
argomento, commentati e valutati
 e dispone di un motore di ricerca. Molto semplice da usare. Comprende anche
esempi, tool, docs,
 una mailing list e tratta anche Kylix. Generalmente ritenuto il meglio.
Delphi Super Page (inglese)
 
http://delphi.icm.edu.pl/
 Un sito che raccoglie componenti per Delphi e C++Builder. Ne contiene
moltissimi ma lo trovo un po'
 piu' scomodo di Torry.
Borland Community
 
http://community.borland.com/delphi
 La comunita' di sviluppatori della Borland. Credo ci si debba iscrivere
(boh?).
Borland
 
http://www.borland.it/
 Ovviamente il sito della Borland.
Top 100 Delphi sites (inglese)
 
http://www.sandbrooksoftware.com/TS/index.shtml
 i links dei 100 migliori siti sul Delphi.
The Delphi Compendium (inglese)
 
http://www.cyber-matrix.com/delphi.htm
 Tutorial, componenti, articoli ecc. ecc.
#Gameprog-Ita Abc/Delphi page (italiano)
 
http://gpi.infomedia.it/abc/delphi
 I miei tutorial. Alcuni sono orientati allo sviluppo di videogiochi e
grafica, altri sono generici,
 tra cui un tutorial da zero sulle classi.
Software Planet (italiano)
 
http://www.softwareplanet.net
 Contiene dei corsi di Delphi scritti da Tommaso Trani (almeno credo :).
Real Programmers Use Pascal (Kylix) (inglese)
 
http://www.oreilly.com/news/kylix_0800.html
 qui ci sono alcuni articoli (per la sezione generale direi), un po'
 datati pero' secondo me interessanti. (Alan Solo)
Delphi in a Nutshell - The Delphi Object Model (inglese)
 
http://www.oreilly.com/catalog/delphi/chapter/ch02.html
 (spiega il modello ad oggetti di Delphi confrontandolo con VB, Java e C++)
(Alan Solo)
Borland Forums
 news://
forums.borland.com
 (inglese)
 i newsgroup della borland, qui troverete sicuramente molte risposte
 su Delphi e sugli altri prodotti Borland
Tamaracka
 
http://www.tamaracka.com/search.htm
 (inglese)
 per cercare nei newsgroup di Borland (Alan Solo)
Componenti / Librerie / Tools (FW / OS / SW / $$) (Paolo Arosio)
 JEDI  
http://www.delphi-jedi.org
 RxLib  
http://www.rxlib.com
 ICS:  (datemi il link)
 Indy:  (datemi il link)
 FreeVCS 
http://www.thensle.de
Notizie, articoli, tips, ... (Paolo Arosio)
 
http://www.dedonline.com
           (Italiano)
 
http://www.programmazione.it
       (Italiano)
 
http://www.delphi3000.com
 
http://www.marcocantu.com
 
http://www.drbob42.com
 
http://www.delphioop.com
TurboPower
 
http://www.turbopower.com
i seguenti link sono per interbase (Alan Solo)
 
http://www.ibphoenix.com
 
http://firebird.sourceforge.net/
Ricerche (Paolo Arosio)
 
http://www.google.com
                  (generale)
Altri link (non testati) da Carlo Bertuccini
http://www.advdelphisys.com/
{ Moltissime funzioni per Delphi }
http://www.mindspring.com/~cityzoo/buglist/buglist.html
{ Vari trucchi, FAQ etc }
http://www.mhn.org/~graham/delphi.html
{ Altre FAQ }
http://www.delphiexchange.com
{ Molte altre risorse per delphi }
http://www.drbob42.com/
{ Ecco un maniaco di Delphi }
http://www.itecuk.com/delmag/
{ The Delphi Magazine }
http://www.icss.net/~nhodges/delphi.htm
{ Altri esempi e risorse per Delphi }
http://www.mclink.it/mclink/delphi/
{ Molti Link!! }
http://www.delphiseek.com
{ Un vero e proprio motore di ricerca per Delphi }
http://www.delphisource.com
{ Anche qui c'e parecchio materiale interessante }
http://www.kaposnet.hu/books/tysdelphi4/
{ Un intero libro su Delphi }
http://www.chami.com/tips/index/
{ Parecchi Tips, anche su Delphi }
------------
Cose Inutili
------------
Ed ora qualche Haiku sul delphi :)
Borland innovates.
Delphi lives where Microsoft
fears to port their code.
 Tim Sommers
drag. drop. TButton.
the form is where it happens.
now, assign OnClick.
 Tim Sommers
Windows sucks out loud
Use Kylix to port your code
Linux treats you right
 Tim Sommers
I am the source code.
compiler reduces me
to ones and zeroes.
 Tim Sommers
I sit and I think
Delphi for Linux, Awesome!
I anxiously wait.
 Micheal Bonner
Haiku Error Messages (Richard Morris)
invalid pointer
I am sure you tried to free
that pointer before
Eek, Invalid cast!
You tried to shove a square peg
into a round hole
Hey, Stack overflow
Now you have PUSHed me to far
Can't take this abuse
That is all messed up
Semicolon before Else
not in this language
$WEAKPACKAGEUNIT
or $DENYPACKAGEUNIT
one or the other
no semicolon
have you recently escaped
Visual Basic ?
--
URL per la gerarchia it. e il GCN: 
http://www.news.nic.it/news-it/

 ma non ho trovato nulla di valido ...
si potrebbero usare nomi familiari, che so, i nomi delle ex :) ..pero' temo
che non si potrebbero fare programmi molto complessi, a causa della
scarsita' di variabili ;)
(Zortek)
