Difference between revisions of "Oracle/es"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting; removed categories included in template)
 
(10 intermediate revisions by 3 users not shown)
Line 1: Line 1:
== Interface de bajo nivel del Servidor de BBDD Oracle ==  
+
{{Oracle}}
 +
== Interfaz de bajo nivel del Servidor de BBDD Oracle ==  
  
La interface de bajo nivel al servidor de BB.DD de Oracle existe en una unidad, '''oraoci''', la cual es una traducción directa de los ficheros de cabecera del interface Oracle.  
+
   La interfaz de bajo nivel al servidor de BB.DD de Oracle existe en una unidad, '''oraoci''', la cual es una traducción directa de los ficheros de cabecera del interfaz Oracle.  
  
Hay dos programas de ejemplo:
+
   Hay dos programas de ejemplo:
  
* '''oraclew''' contiene algunas rutinas para el interface Oracle, para un manejo más fácil del conjunto resultante. Necesita la unidad  classes del FCL.
+
* '''oraclew''' contiene algunas rutinas para el interfaz Oracle, para un manejo más fácil del conjunto resultante. Necesita la unidad  '''classes''' del FCL.
 
* '''test01''' es un simple programa para demostrar la interface.
 
* '''test01''' es un simple programa para demostrar la interface.
  
== OOP access to Oracle ==
+
== Acceso OOP a Oracle ==
Built over the low-level interface, the SQLDB framework supplied with FPC supports accessing Oracle (using TOracleConnection); see also [[Lazarus_Database_Overview#Lazarus_and_Oracle]]
 
  
Lazarus also has a component:
+
   Construido sobre la interfaz de bajo nivel, el marco de trabajo SQLDB que viene con FPC soporta el acceso a Oracle (utilizando TOracleConnection); ver también [[Lazarus_Database_Overview#Lazarus_and_Oracle]]
 +
 
 +
   Lazarus dispone de un componente:
  
 
[[Image:sqldbcomponents.png]]
 
[[Image:sqldbcomponents.png]]
  
* Hostname: as with other sqldb connectors, use hostname or IP address. Leave empty if you use a TNSNAMES.ORA net service name in DatabaseName
+
* Hostname: igual que con otros conectores sqldb, utilizaremos el nombre de la máquina o la dirección IP. Dejaremos vacío si se utiliza el servicio de nombres de red TNSNAMES.ORA en DatabaseName.
* Username/password: same as with other sqldb connectors
+
* Username/password: igual que con otros conectores sqldb.
 
* DatabaseName:  
 
* DatabaseName:  
** instance/SID of the Oracle server you want to connect to '''or'''
+
** Instancia/SID del servidor Oracle al que se necesita conectar '''or'''
** net service name in a TNSNAMES.ORA file
+
** servicio de nombres de red en un fichero TNSNAMES.ORA.
  
{{Note|Released FPC/Lazarus x64 versions on Windows do not include an Oracle connector. If you enable it and test successfully, please submit a patch with the changes so it can be included}}
+
{{Nota|En Windows las versiones X64 de FPC/Lazarus x64 no incluyen el conector Oracle. Si logras habilitarlo y la prueba resulta satisfactorio, envía un parche con los cambios de modo que puedan ser incluidos}}. A fecha de realizar esta traducción de su versión en inglés no se si este inconveniente ha sido subsanado ya, si alguien lo sabe que corrija esto.
 +
{{Nota| Aquí hay una solución a este problema en win64: http://nobytes.blogspot.com.es/2014/04/how-to-use-toracleconnection-under.html}}
  
 
== Resolución de problemas ==
 
== Resolución de problemas ==
 
=== Conjuntos de caracteres para Cliente y Servidor ===
 
=== Conjuntos de caracteres para Cliente y Servidor ===
To get info about what character set/NLS settings are active, you can run the following program.
 
Podemos arrancar el siguiente programa para obtener información sobre que conjunto de caracteres/NLS se encuentran activos.
 
Por favor, no olvides rellenar correctametne los datos de nombre de servidor, nombre de base de datos, nombre de usuario y contraseña antes de compilar.
 
  
<syntaxhighlight>
+
&nbsp;&nbsp;&nbsp;Podemos arrancar el siguiente programa para obtener información sobre que conjunto de caracteres/NLS se encuentran activos. Por favor, no olvides rellenar correctamente los datos de nombre de servidor, nombre de base de datos, nombre de usuario y contraseña antes de compilar.
program oracharset;
+
 
 +
<syntaxhighlight lang=pascal>
 +
program oracharset;
  
{ Muestra información del conjunto de caracteres/NLS (Soporte Nacional de Lenguaje) utilizado en Cliente y Servidor}
+
{ Muestra información del conjunto de caracteres/NLS (Soporte Nacional de Lenguaje) utilizado en Cliente y Servidor}
{ Por favor edita los datos de conexión primero: nombre usuario, contraseña, nombre de servidor y base de datos. }
+
{ Por favor edita los datos de conexión primero: nombre usuario, contraseña, nombre de servidor y base de datos. }
  
{$mode objfpc}{$H+}
+
{$mode objfpc}{$H+}
  
uses {$IFDEF UNIX} {$IFDEF UseCThreads}
+
uses {$IFDEF UNIX} {$IFDEF UseCThreads}
  cthreads, {$ENDIF} {$ENDIF}
+
  cthreads, {$ENDIF} {$ENDIF}
  Classes,
+
  Classes,
  SysUtils,
+
  SysUtils,
  sqldb,
+
  sqldb,
  oracleconnection;
+
  oracleconnection;
  
var
+
var
  Col: integer;
+
  Col: integer;
  Conn: TOracleConnection;
+
  Conn: TOracleConnection; { para la conexión }
  Tran: TSQLTransaction;
+
  Tran: TSQLTransaction;   { para la transacción }
  Q: TSQLQuery;
+
  Q: TSQLQuery;           { para la query o consulta }
begin
+
begin
  Conn := TOracleConnection.Create(nil);
+
  Conn := TOracleConnection.Create(nil); { Creamos Conexión reservando recursos }
  Tran := TSQLTransaction.Create(nil);
+
  Tran := TSQLTransaction.Create(nil); {Creamos Transacción reservando recursos}
  Q := TSQLQuery.Create(nil);
+
  Q := TSQLQuery.Create(nil); { Creamos consulta reservando recursos }
  try
+
  try
    // * EDITAR INFORMACIÓN DE IDENTIFICACIÓN SEGÚN SEA NECESARIO *
+
    // * EDITAR INFORMACIÓN DE IDENTIFICACIÓN SEGÚN SEA NECESARIO *
    Conn.HostName := '';            { HostName: nombre del equipo al que conectamos }
+
    Conn.HostName := '';            { HostName: nombre del equipo al que conectamos }
    Conn.UserName := 'system';      { UserName: usuario de BB.DD con el que nos validamos }     
+
    Conn.UserName := 'system';      { UserName: usuario de BB.DD con el que nos validamos }     
    Conn.Password := '';            { Password: contraseña del usuario para conectar a la BB.DD }
+
    Conn.Password := '';            { Password: contraseña del usuario para conectar a la BB.DD }
    Conn.DatabaseName := 'XE';      { DatabaseName: nombre de la base de datos (BB.DD)a la que conectamos dentro del servidor }
+
    Conn.DatabaseName := 'XE';      { DatabaseName: nombre de la base de datos (BB.DD)a la que conectamos dentro del servidor }
    // * FIN INFORMACIÓN DE IDENTIFICACIÓN *
+
    // * FIN INFORMACIÓN DE IDENTIFICACIÓN *
    Conn.Transaction := Tran;
+
    Conn.Transaction := Tran;
    Q.DataBase := Conn;
+
    Q.DataBase := Conn; { Pasamos los datos de conexión a la Query }
    Conn.Open;
+
    Conn.Open; { Abrimos conexión }
    Tran.Active := true;
+
    Tran.Active := true;
  
    writeln('Información del conjunto de caracteres del Servidor:');
+
    writeln('Información del conjunto de caracteres del Servidor:');
    Q.SQL.Text := 'SELECT value$ FROM sys.props$ WHERE name like ''NLS_%'' ';
+
    Q.SQL.Text := 'SELECT value$ FROM sys.props$ WHERE name like ''NLS_%'' ';
    Q.Open;
+
    Q.Open;
    Q.First;
+
    Q.First;
    while not (Q.EOF) do
+
    while not (Q.EOF) do { Mientras la query no nos devuelva final hacer esto... }
    begin
 
      writeln('*****************');
 
      for Col := 0 to Q.Fields.Count - 1 do
 
 
       begin
 
       begin
         try
+
      writeln('*****************');
           writeln(Q.Fields[Col].DisplayLabel + ':');
+
      for Col := 0 to Q.Fields.Count - 1 do { desde columna 0 hasta cuenta de campos-1...}
           writeln(Q.Fields[Col].AsString);
+
         begin
        except
+
        try
 +
           writeln(Q.Fields[Col].DisplayLabel + ':'); { Imprimimos en pantalla la etiqueta del campo con índice Col }
 +
           writeln(Q.Fields[Col].AsString); { Imprimimos en pantalla el campo con índice Col de la query, retornado como cadena }
 +
        except
 
           writeln('Error solicitando campo ', Col);
 
           writeln('Error solicitando campo ', Col);
 +
        end;
 
         end;
 
         end;
 +
      Q.Next;
 
       end;
 
       end;
       Q.Next;
+
       Q.Close;
    end;
 
    Q.Close;
 
  
    writeln('');
+
      writeln('');
    writeln('Información del conjunto de caracteres del cliente:');
+
      writeln('Información del conjunto de caracteres del cliente:');
    Q.SQL.Text := 'SELECT * FROM NLS_SESSION_PARAMETERS ';
+
      Q.SQL.Text := 'SELECT * FROM NLS_SESSION_PARAMETERS ';
    Q.Open;
+
      Q.Open;
    Q.First;
+
      Q.First;
    while not (Q.EOF) do
+
      while not (Q.EOF) do
    begin
+
      begin
      writeln('*****************');
+
        writeln('*****************');
      for Col := 0 to Q.Fields.Count - 1 do
+
        for Col := 0 to Q.Fields.Count - 1 do
      begin
+
        begin
        try
+
          try
          writeln(Q.Fields[Col].DisplayLabel + ':');
+
          writeln(Q.Fields[Col].DisplayLabel + ':');
          writeln(Q.Fields[Col].AsString);
+
          writeln(Q.Fields[Col].AsString);
        except
+
          except
          writeln('Error solicitando campo ', Col);
+
          writeln('Error solicitando campo ', Col);
        end;
+
          end;
      end;
+
        end;
      Q.Next;
+
        Q.Next;
    end;
+
      end;
    Q.Close;
+
      Q.Close;
    // *FIN DE CÓDIGO DE EJEMPLO DE TESTEO DE ERROR*
+
      // *FIN DE CÓDIGO DE EJEMPLO DE TESTEO DE ERROR*
    Conn.Close;
+
      Conn.Close; { Cerramos la conexión }
  finally
+
  finally
     Q.Free;
+
     Q.Free; { Liberamos los recursos de la query }
     Tran.Free;
+
     Tran.Free; { Liberamos los recursos de la transacción }
     Conn.Free;
+
     Conn.Free; { Liberamos los recursos de la conexión }
  end;
+
  end;
  writeln('Programa completado. Presiona cualquier tecla para continuar.');
+
  writeln('Programa completado. Presiona cualquier tecla para continuar.');
  readln;
+
  readln;
end.
+
end.</syntaxhighlight>
</syntaxhighlight>
 
  
 
=== ORA-00911 : invalid character ===
 
=== ORA-00911 : invalid character ===
  
Si visualizas este mensaje de error (o su equivalente en español (carácter no válido), puedes probar lo siguiente:
+
&nbsp;&nbsp;&nbsp;Si visualizas este mensaje de error (o su equivalente en español (carácter no válido), puedes probar lo siguiente:
  
 
* Suprimiendo el punto y coma - ; - si lo has puesto en una sentencia SELECT.
 
* Suprimiendo el punto y coma - ; - si lo has puesto en una sentencia SELECT.
 
* Añadiendo el punto y coma (e.g. en sentencias CALL o EXECUTE)
 
* Añadiendo el punto y coma (e.g. en sentencias CALL o EXECUTE)
  
Ver este hilo que se aplica a .Net pero que se puede aplicar también a SQLDB: [http://social.msdn.microsoft.com/Forums/en/adodotnetdataproviders/thread/58a27505-a3fb-4cb1-9063-3946b3f26acd]
+
&nbsp;&nbsp;&nbsp;Ver este hilo que se aplica a .Net pero que se puede aplicar también a SQLDB: [http://social.msdn.microsoft.com/Forums/en/adodotnetdataproviders/thread/58a27505-a3fb-4cb1-9063-3946b3f26acd]
  
Volver a [[Package_List|Packages List]]
+
&nbsp;&nbsp;&nbsp;Volver a [[Package_List|Packages List]]
  
 
{{LCL Components Footer |TPQTEventMonitor|TODBCConnection}}
 
{{LCL Components Footer |TPQTEventMonitor|TODBCConnection}}
 
{{LCL Components}}
 
{{LCL Components}}
 
[[Category:Databases]]
 
[[Category:Components]]
 
[[Category:FPC]]
 
[[Category:LCL]]
 
[[Category:Tutorials]]
 

Latest revision as of 04:38, 23 February 2020

English (en) español (es) français (fr) 日本語 (ja)

Interfaz de bajo nivel del Servidor de BBDD Oracle

   La interfaz de bajo nivel al servidor de BB.DD de Oracle existe en una unidad, oraoci, la cual es una traducción directa de los ficheros de cabecera del interfaz Oracle.

   Hay dos programas de ejemplo:

  • oraclew contiene algunas rutinas para el interfaz Oracle, para un manejo más fácil del conjunto resultante. Necesita la unidad classes del FCL.
  • test01 es un simple programa para demostrar la interface.

Acceso OOP a Oracle

   Construido sobre la interfaz de bajo nivel, el marco de trabajo SQLDB que viene con FPC soporta el acceso a Oracle (utilizando TOracleConnection); ver también Lazarus_Database_Overview#Lazarus_and_Oracle

   Lazarus dispone de un componente:

sqldbcomponents.png

  • Hostname: igual que con otros conectores sqldb, utilizaremos el nombre de la máquina o la dirección IP. Dejaremos vacío si se utiliza el servicio de nombres de red TNSNAMES.ORA en DatabaseName.
  • Username/password: igual que con otros conectores sqldb.
  • DatabaseName:
    • Instancia/SID del servidor Oracle al que se necesita conectar or
    • servicio de nombres de red en un fichero TNSNAMES.ORA.
Note-icon.png

Nota: En Windows las versiones X64 de FPC/Lazarus x64 no incluyen el conector Oracle. Si logras habilitarlo y la prueba resulta satisfactorio, envía un parche con los cambios de modo que puedan ser incluidos

. A fecha de realizar esta traducción de su versión en inglés no se si este inconveniente ha sido subsanado ya, si alguien lo sabe que corrija esto.

Note-icon.png

Nota: Aquí hay una solución a este problema en win64: http://nobytes.blogspot.com.es/2014/04/how-to-use-toracleconnection-under.html

Resolución de problemas

Conjuntos de caracteres para Cliente y Servidor

   Podemos arrancar el siguiente programa para obtener información sobre que conjunto de caracteres/NLS se encuentran activos. Por favor, no olvides rellenar correctamente los datos de nombre de servidor, nombre de base de datos, nombre de usuario y contraseña antes de compilar.

 program oracharset;

 { Muestra información del conjunto de caracteres/NLS (Soporte Nacional de Lenguaje) utilizado en Cliente y Servidor}
 { Por favor edita los datos de conexión primero: nombre usuario, contraseña, nombre de servidor y base de datos. }

 {$mode objfpc}{$H+}

 uses {$IFDEF UNIX} {$IFDEF UseCThreads}
   cthreads, {$ENDIF} {$ENDIF}
   Classes,
   SysUtils,
   sqldb,
   oracleconnection;

 var
   Col: integer;
   Conn: TOracleConnection; { para la conexión }
   Tran: TSQLTransaction;   { para la transacción }
   Q: TSQLQuery;            { para la query o consulta }
 begin
   Conn := TOracleConnection.Create(nil); { Creamos Conexión reservando recursos }
   Tran := TSQLTransaction.Create(nil); {Creamos Transacción reservando recursos}
   Q := TSQLQuery.Create(nil); { Creamos consulta reservando recursos }
   try
     // * EDITAR INFORMACIÓN DE IDENTIFICACIÓN SEGÚN SEA NECESARIO *
     Conn.HostName := '';             { HostName: nombre del equipo al que conectamos }
     Conn.UserName := 'system';       { UserName: usuario de BB.DD con el que nos validamos }    
     Conn.Password := '';             { Password: contraseña del usuario para conectar a la BB.DD }
     Conn.DatabaseName := 'XE';       { DatabaseName: nombre de la base de datos (BB.DD)a la que conectamos dentro del servidor }
     // * FIN INFORMACIÓN DE IDENTIFICACIÓN *
     Conn.Transaction := Tran;
     Q.DataBase := Conn; { Pasamos los datos de conexión a la Query }
     Conn.Open; { Abrimos conexión }
     Tran.Active := true;

     writeln('Información del conjunto de caracteres del Servidor:');
     Q.SQL.Text := 'SELECT value$ FROM sys.props$ WHERE name like ''NLS_%'' ';
     Q.Open;
     Q.First;
     while not (Q.EOF) do  { Mientras la query no nos devuelva final hacer esto... }
      begin
       writeln('*****************');
       for Col := 0 to Q.Fields.Count - 1 do { desde columna 0 hasta cuenta de campos-1...}
        begin
         try
          writeln(Q.Fields[Col].DisplayLabel + ':'); { Imprimimos en pantalla la etiqueta del campo con índice Col }
          writeln(Q.Fields[Col].AsString); { Imprimimos en pantalla el campo con índice Col de la query, retornado como cadena }
         except
          writeln('Error solicitando campo ', Col);
         end;
        end;
       Q.Next;
      end;
      Q.Close;

      writeln('');
      writeln('Información del conjunto de caracteres del cliente:');
      Q.SQL.Text := 'SELECT * FROM NLS_SESSION_PARAMETERS ';
      Q.Open;
      Q.First;
      while not (Q.EOF) do
       begin
        writeln('*****************');
        for Col := 0 to Q.Fields.Count - 1 do
         begin
          try
           writeln(Q.Fields[Col].DisplayLabel + ':');
           writeln(Q.Fields[Col].AsString);
          except
           writeln('Error solicitando campo ', Col);
          end;
         end;
         Q.Next;
       end;
       Q.Close;
       // *FIN DE CÓDIGO DE EJEMPLO DE TESTEO DE ERROR*
       Conn.Close; { Cerramos la conexión }
   finally
    Q.Free; { Liberamos los recursos de la query }
    Tran.Free; { Liberamos los recursos de la transacción }
    Conn.Free; { Liberamos los recursos de la conexión }
   end;
   writeln('Programa completado. Presiona cualquier tecla para continuar.');
   readln;
 end.

ORA-00911 : invalid character

   Si visualizas este mensaje de error (o su equivalente en español (carácter no válido), puedes probar lo siguiente:

  • Suprimiendo el punto y coma - ; - si lo has puesto en una sentencia SELECT.
  • Añadiendo el punto y coma (e.g. en sentencias CALL o EXECUTE)

   Ver este hilo que se aplica a .Net pero que se puede aplicar también a SQLDB: [1]

   Volver a Packages List


Return To: LCL Components  — Previous: TPQTEventMonitor Next: TODBCConnection


LCL Components
Component Tab Components
Standard TMainMenu • TPopupMenu • TButton • TLabel • TEdit • TMemo • TToggleBox • TCheckBox • TRadioButton • TListBox • TComboBox • TScrollBar • TGroupBox • TRadioGroup • TCheckGroup • TPanel • TFrame • TActionList
Additional TBitBtn • TSpeedButton • TStaticText • TImage • TShape • TBevel • TPaintBox • TNotebook • TLabeledEdit • TSplitter • TTrayIcon • TControlBar • TFlowPanel • TMaskEdit • TCheckListBox • TScrollBox • TApplicationProperties • TStringGrid • TDrawGrid • TPairSplitter • TColorBox • TColorListBox • TValueListEditor
Common Controls TTrackBar • TProgressBar • TTreeView • TListView • TStatusBar • TToolBar • TCoolBar • TUpDown • TPageControl • TTabControl • THeaderControl • TImageList • TPopupNotifier • TDateTimePicker
Dialogs TOpenDialog • TSaveDialog • TSelectDirectoryDialog • TColorDialog • TFontDialog • TFindDialog • TReplaceDialog • TTaskDialog • TOpenPictureDialog • TSavePictureDialog • TCalendarDialog • TCalculatorDialog • TPrinterSetupDialog • TPrintDialog • TPageSetupDialog
Data Controls TDBNavigator • TDBText • TDBEdit • TDBMemo • TDBImage • TDBListBox • TDBLookupListBox • TDBComboBox • TDBLookupComboBox • TDBCheckBox • TDBRadioGroup • TDBCalendar • TDBGroupBox • TDBGrid • TDBDateTimePicker
Data Access TDataSource • TCSVDataSet • TSdfDataSet • TBufDataset • TFixedFormatDataSet • TDbf • TMemDataset
System TTimer • TIdleTimer • TLazComponentQueue • THTMLHelpDatabase • THTMLBrowserHelpViewer • TAsyncProcess • TProcessUTF8 • TProcess • TSimpleIPCClient • TSimpleIPCServer • TXMLConfig • TEventLog • TServiceManager • TCHMHelpDatabase • TLHelpConnector
Misc TColorButton • TSpinEdit • TFloatSpinEdit • TArrow • TCalendar • TEditButton • TFileNameEdit • TDirectoryEdit • TDateEdit • TTimeEdit • TCalcEdit • TFileListBox • TFilterComboBox • TComboBoxEx • TCheckComboBox • TButtonPanel • TShellTreeView • TShellListView • TXMLPropStorage • TINIPropStorage • TJSONPropStorage • TIDEDialogLayoutStorage • TMRUManager • TStrHolder
LazControls TCheckBoxThemed • TDividerBevel • TExtendedNotebook • TListFilterEdit • TListViewFilterEdit • TLvlGraphControl • TShortPathEdit • TSpinEditEx • TFloatSpinEditEx • TTreeFilterEdit • TExtendedTabControl •
RTTI TTIEdit • TTIComboBox • TTIButton • TTICheckBox • TTILabel • TTIGroupBox • TTIRadioGroup • TTICheckGroup • TTICheckListBox • TTIListBox • TTIMemo • TTICalendar • TTIImage • TTIFloatSpinEdit • TTISpinEdit • TTITrackBar • TTIProgressBar • TTIMaskEdit • TTIColorButton • TMultiPropertyLink • TTIPropertyGrid • TTIGrid
SQLdb TSQLQuery • TSQLTransaction • TSQLScript • TSQLConnector • TMSSQLConnection • TSybaseConnection • TPQConnection • TPQTEventMonitor • TOracleConnection • TODBCConnection • TMySQL40Connection • TMySQL41Connection • TMySQL50Connection • TMySQL51Connection • TMySQL55Connection • TMySQL56Connection • TMySQL57Connection • TSQLite3Connection • TIBConnection • TFBAdmin • TFBEventMonitor • TSQLDBLibraryLoader
Pascal Script TPSScript • TPSScriptDebugger • TPSDllPlugin • TPSImport_Classes • TPSImport_DateUtils • TPSImport_ComObj • TPSImport_DB • TPSImport_Forms • TPSImport_Controls • TPSImport_StdCtrls • TPSCustomPlugin
SynEdit TSynEdit • TSynCompletion • TSynAutoComplete • TSynMacroRecorder • TSynExporterHTML • TSynPluginSyncroEdit • TSynPasSyn • TSynFreePascalSyn • TSynCppSyn • TSynJavaSyn • TSynPerlSyn • TSynHTMLSyn • TSynXMLSyn • TSynLFMSyn • TSynDiffSyn • TSynUNIXShellScriptSyn • TSynCssSyn • TSynPHPSyn • TSynTeXSyn • TSynSQLSyn • TSynPythonSyn • TSynVBSyn • TSynAnySyn • TSynMultiSyn • TSynBatSyn • TSynIniSyn • TSynPoSyn
Chart TChart • TListChartSource • TRandomChartSource • TUserDefinedChartSource • TCalculatedChartSource • TDbChartSource • TChartToolset • TChartAxisTransformations • TChartStyles • TChartLegendPanel • TChartNavScrollBar • TChartNavPanel • TIntervalChartSource • TDateTimeIntervalChartSource • TChartListBox • TChartExtentLink • TChartImageList
IPro TIpFileDataProvider • TIpHtmlDataProvider • TIpHttpDataProvider • TIpHtmlPanel
Virtual Controls TVirtualDrawTree • TVirtualStringTree • TVTHeaderPopupMenu