nyuuzyou/wikis huggingface dataset:
Как прочитать свойство напрямую из его ресурса?

=== Как прочитать свойство напрямую из его ресурса? ===
if ReadPropertyValue('Form1.Button1', 'width') > 1000 then
 ShowMessage('You are about to create a big button!');
function TForm1.ReadProp(r: TReader): string;
begin
 result := ;
 { Determine the value type of the property, read it with the appropriate method of TReader
 and convert it to string. Not all value types are implemented here but you get the idea. }
 case r.NextValue of
 vaInt8, vaInt16, vaInt32:
 result := IntToStr(r.ReadInteger);
 vaExtended:
 result := FloatToStr(r.ReadFloat);
 vaString:
 result := r.ReadString;
 else
 r.SkipValue; {Not implemented}
 end;
end;
procedure TForm1.ReadRes(PropPath: string; r: TReader);
var
 p: string;
begin
 { Skip the class name }
 r.ReadStr;
 { Construct the property path }
 if PropPath = then
 p := r.ReadStr
 else
 p := PropPath + '.' + r.ReadStr;
 { Read all properties and its values and fill them into the memo }
 while not r.EndOfList do
 Memo1.Lines.Add(p + '.' + r.ReadStr + ' = ' + ReadProp(r));
 { Skip over the end of the list of the properties of this component }
 r.CheckValue(vaNull);
 { Recursively read the properties of all sub-components }
 while not r.EndOfList do
 begin
 ReadRes(p, r);
 r.CheckValue(vaNull);
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 strm: TResourceStream;
 Reader: TReader;
begin
 strm := TResourceStream.Create(HInstance, 'TForm1', RT_RCDATA);
 Reader := TReader.Create(strm, 1024);
 try
 Memo1.Clear;
 Reader.ReadSignature;
 ReadRes(, Reader);
 finally
 Reader.Free;
 strm.Free;
 end;
end;
Only one small problem.
r.SkipValue was protected (in D5) but I hacked that out with the following code:
type THackReader = class(TReader);
{ ... }
 THackReader(r).SkipValue;
Author: Michael Duerig and Tjipke A. van der Plaats
Source: Взято из http://www.lmc-mediaagentur.de/dpool
ID: 00279
Как работать из Delphi напрямую с ADO?

=== Как работать из Delphi напрямую с ADO? ===
Итак, хочу поделиться некоторыми достижениями... так на всякий случай. Если у вас вдруг потребуется сделать в своей программке доступ к базе данных, а BDE использовать будет неохота (или невозможно) - то есть довольно приятный вариант: использовать ActiveX Data Objects. Однако с их использованием есть некоторые проблемы, и одна из них это как передавать Optional параметры, которые вроде как можно не указывать. Однако, если вы работаете с ADO по-человечески, а не через тормозной IDispatch.Invoke то это превращается в головную боль. Вот как от нее избавляться:
var
 OptionalParam: OleVariant;
 VarData: PVarData;
begin
 OptionalParam := DISP_E_PARAMNOTFOUND;
 VarData := @OptionalParam;
 VarData^.VType := varError;
после этого переменную OptionalParam можно передавать вместо неиспользуемого аргумента.
Далее, самый приятный способ получения Result sets:
Там есть масса вариантов, но как выяснилось оптимальным является следующий вариант, который позволяет получить любой желаемый вид курсора (как клиентский, так и серверный)
var
 MyConn: _Connection;
 MyComm: _Command;
 MyRecSet: _Recordset;
 prm1: _Parameter;
begin
 MyConn := CoConnection.Create;
 MyConn.ConnectionString := 'DSN=pubs;uid=sa;pwd=;'; MyConn.Open( , , , -1 );
 MyCommand := CoCommand.Create;
 MyCommand.ActiveConnection := MyConn;
 MyCommand.CommandText := 'SELECT * FROM blahblah WHERE BlahID=?'
 Prm1 := MyCommand.CreateParameter( 'Id', adInteger.adParamInput, -1, <value> );
 MyCommand.AppendParameter(Prm1);
 MyRecSet := CoRecordSet.Create;
 MyRecSet.Open(MyCommand, OptionalParam, adOpenDynamic, adLockReadOnly, adCmdText);
... теперь можно фетчить записи. Работает шустро и классно. Меня радует. Особенно радуют серверные курсоры.
Проверялось на Delphi 3.02 + ADO 1.5 + MS SQL 6.5 sp4. Пашет как зверь.
Из вкусностей ADO - их легко можно использовать во всяких многопоточных приложениях, где BDE порой сбоит, если, конечно, ODBC драйвер грамотно сделан...
Ну и еще можно использовать для доступа к данным всяких там "нестандартных" баз типа MS Index Server или MS Active Directory Services.
В Delphi (как минимум в 4 версии) существует "константа" EmptyParam, которую можно подставлять в качестве пустого параметра.
; Примечание Vit: с появлением в последющих версиях Дельфи ADO компонентов делает работу с ADO гораздо проще и понятнее, хотя в отдельных проектах всё ещё могут понадобится прямые обращения к недокументированным или не имплементированным в Дельфи возможностям ADO.
Author: Nomadic 
Source: Взято с http://delphiworld.narod.ru
ID: 02664
Как работать с ADO компонентами в DLL?

=== Как работать с ADO компонентами в DLL? ===
В оконных приложениях инициализацию COM берет на себя строка в файле проекта:
 Application.Initialize;
А вот в DLL и консольных программах объекта Application нет, и при попытке работать с любыми ActiveX, включая широко используемые ADO компоненты генерится ошибка, которую исправить очень просто: достаточно в секцию Uses в DPR файле добавить модуль oleauto
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 02650
Как работать с FileOpenDialog и FileSaveDialоg?

=== Как работать с FileOpenDialog и FileSaveDialоg? ===
как именно с ними работать чтобы на с: открыть файл?
Похоже я понял что тебя смущает: OpenFileDialog и SaveFileDialog - ничего сами по себе не открывают и не сохраняют. Они нужны только для выбора имени файла. Ставишь их на форму. Там куча свойств и опций - типа исходный каталог, показыать скрытые файлы или нет и т.п. Впрочем по началу можно их вообще не указывать. Тебе надо знать только 1 метод - execute - открыть диалог:
OpenFileDialog1.Execute();
ты можешь проверить действительно ли пользователь выбрал файл или нажал Cancel:
if OpenFileDialog1.Execute() then 
если файл выбран то свойство FileName возвращает тебе строку - имя файла 
if OpenFileDialog1.Execute then
 ShowMessage(OpenFileDialog1.FileName);
Сам файл не открывается и ничего с ним не делается, все это надо делать вручную:
if OpenFileDialog1.Execute then
begin
 AssignFile(f, OpenFileDialog1.FileName);
 Reset(f);
 Seek(f, $10000);
 Write(f, b);
 CloseFile(f);
end;
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 01192
Как работать с GIF файлами

Этот код, делает следующее, загружаем в листбох список Gif файлов, затем это все дело объединяется в один BMP файл, картинка к картинке, кто знает DirectX поймет для чего это надо (спрайты)
procedure TForm1.Button2Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
 begin
 ListBox1.Items := OpenDialog1.Files;
 Edit2.Text := IntToStr(ListBox1.Items.Count);
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 i, a: Integer;
 bm: TBItmap;
begin
 a := 0;
 bm := TBItmap.Create;
 Image1.Picture.LoadFromFile(listbox1.Items[0]);
 bm.Height := Image1.Height;
 bm.Width := ListBox1.Items.Count * Image1.Picture.Width;
 for i := 0 to ListBox1.Items.Count - 1 do
 begin
 Image1.Picture.LoadFromFile(ListBox1.Items[i]);
 bm.Canvas.Draw(a, 0, Image1.Picture.Graphic);
 a := a + Image1.Picture.Height;
 end;
 //Form1.Canvas.Draw(0, 0, bm);
 bm.SaveToFile(Edit1.Text + '.bmp');
 bm.Free;
end;
Source: http://delphiworld.narod.ru/
ID: 03800
ID: 04295
----
из файлов GIF (анимированных) вытаскивает каждую картинку в отдельности, или записывает в отдельный BMP по очереди
Для этих программок нужен всеми любимый RX Lib !!!
procedure TForm1.Button4Click(Sender: TObject);
var
 i, a: Integer;
 bm: TBItmap;
begin
 a := 0;
 bm := TBItmap.Create;
 bm.Height := RxGIFAnimator1.Height;
 bm.Width := RxGIFAnimator1.Image.Count * RxGIFAnimator1.Width;
 for i := 0 to RxGIFAnimator1.Image.Count - 1 do
 begin
 RxGIFAnimator1.FrameIndex := i;
 bm.Canvas.Draw(a, 0, RxGIFAnimator1.Image.Frames[i].Bitmap);
 a := a + RxGIFAnimator1.Height;
 end;
 //Form1.Canvas.Draw(0, 0, bm);
 bm.SaveToFile(Edit1.Text + '.bmp');
 bm.Free;
end;
Author: МММ
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 03801
ID: 04296
----
Как поставить (анимационный) GIF на форму?
Использовать компонент rxGIFAnimator из библиотеки RxLib.
Author: Vit
ID: 04297
Category:Графика
Category:Форматы файлов
Как работать с Powerpoint через OLE?

uses
 comobj;
procedure TForm1.Button2Click(Sender: TObject);
var
 PowerPointApp: OLEVariant;
begin
 try
 PowerPointApp := CreateOleObject('PowerPoint.Application');
 except
 ShowMessage('Error...');
 Exit;
 end;
 // Make Powerpoint visible
 PowerPointApp.Visible := True;
 // Show powerpoint version
 ShowMessage(Format('Powerpoint version: %s',[PowerPointApp.Version]));
 // Open a presentation
 PowerPointApp.Presentations.Open('c:\MyPresentation.ppt', False, False, True);
 // Show number of slides
 ShowMessage(Format('%s slides.',[PowerPointApp.ActivePresentation.Slides.Count]));
 // Run the presentation
 PowerPointApp.ActivePresentation.SlideShowSettings.Run;
 // Go to next slide
 PowerPointApp.ActivePresentation.SlideShowWindow.View.Next;
 // Go to slide 2
 PowerPointApp.ActivePresentation.SlideShowWindow.View.GoToSlide(2);
 // Go to previous slide
 PowerPointApp.ActivePresentation.SlideShowWindow.View.Previous;
 // Go to last slide
 PowerPointApp.ActivePresentation.SlideShowWindow.View.Last;
 // Show current slide name
 ShowMessage(Format('Current slidename: %s',[PowerPointApp.ActivePresentation.SlideShowWindow.View.Slide.Name]));
 // Close Powerpoint
 PowerPointApp.Quit;
 PowerPointApp := UnAssigned;
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 04457
Category:COM
Category:MS Office
Как работать с Shapes

var
 Pic: Word2000.Shape;
 Left, Top: OleVariant;
begin
 { Добавить картинку и поместить позади текста }
 Left := 100;
 Top := 100;
 Pic := Doc.Shapes.AddPicture('C:\Small.bmp', EmptyParam, EmptyParam, Left, Top,
 EmptyParam, EmptyParam, EmptyParam);
 Pic.WrapFormat.Type_ := wdWrapNone;
 Pic.ZOrder(msoSendBehindText);
 { Эффект "водяных знаков" }
 Pic.PictureFormat.Brightness := 0.75;
 Pic.PictureFormat.Contrast := 0.20;
 { Сделать белый цвет на картинке прозрачным }
 Pic.PictureFormat.TransparencyColor := clWhite;
 Pic.PictureFormat.TransparentBackground := msoTrue;
 Pic.Fill.Visible := msoFalse;
end;
Source: Взято с Delphi Knowledge Base: http://www.baltsoft.com/
ID: 04425
Category:COM
Category:MS Office
Как работать с WordBasic?

uses OleAuto;
var
 MSWord: Variant;
begin
 MsWord := CreateOleObject('Word.Basic');
 MsWord.FileNewDefault;
 MsWord.TogglePortrait;
end;
Source: Взято с Delphi Knowledge Base: http://www.baltsoft.com/
ID: 04432
Category:COM
Category:MS Office
Как работать с ssShift и TShiftState?

=== Как работать с ssShift и TShiftState? ===
ssShift - это константа применяемая в типе TShiftState (являющемся типом Set) а не логическая, надо примерно так:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if (key = $97) and (ssShift in Shift) then
 begin
 { do something }
 end;
end;
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 00361
Как работать с адресной книгой Lotus Notes?

unit Unit2;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Domino_TLB, Menus, ComCtrls;
const
 PASSWD = 'ur70';
type
 TForm2 = class(TForm)
 TV_INFO: TTreeView;
 MainMenu1: TMainMenu;
 File1: TMenuItem;
 Create1: TMenuItem;
 Init1: TMenuItem;
 AddressBook1: TMenuItem;
 Scan1: TMenuItem;
 procedure Create1Click(Sender: TObject);
 procedure Init1Click(Sender: TObject);
 procedure Scan1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
var
 Form2: TForm2;
 Session: TNotesSession;
implementation
{$R *.dfm}
procedure TForm2.Create1Click(Sender: TObject);
begin
 Session := TNotesSession.Create(nil);
end;
procedure TForm2.Init1Click(Sender: TObject);
begin
 Session.Initialize(PASSWD);
end;
procedure TForm2.Scan1Click(Sender: TObject);
var
 NotesDb: NotesDatabase;
 addrBook: NotesDatabase;
 People, People2: NotesView;
 Person, Person2: NotesDocument;
 View: NotesView;
 Item: NotesItem;
 AddrBooks: OleVariant;
 Views: OleVariant;
 Items: OleVariant;
 x, y, z: Integer;
 view_name: string;
 tn, tc: TTreeNode;
begin
 NotesDb := Session.GetDatabase(, 'names.nsf', False);
 AddrBooks := Session.AddressBooks;
 for x := 0 to VarArrayHighBound(AddrBooks, 1) - VarArrayLowBound(AddrBooks, 1) do
 begin
 addrBook := NotesDatabase(IUnknown(AddrBooks[x]));
 if (addrBook.IsPrivateAddressBook) then
 begin
 addrBook.Open;
 end
 else
 addrBook := nil;
 if (addrBook <> nil) then
 begin
 Views := addrBook.Views;
 for y := 0 to VarArrayHighBound(Views, 1) - VarArrayLowBound(Views, 1) do
 begin
 View := NotesView(IUnknown(Views[y]));
 view_name := View.Name;
 tn := tv_info.Items.AddNode(nil, nil, view_name, nil, naAdd);
 if Copy(view_name, 1, 1) = '$' then
 view_name := Copy(view_name, 2, Length(view_name) - 1);
 people := addrBook.GetView(view_name);
 person := people.GetFirstDocument;
 if Person <> nil then
 begin
 Items := Person.Items;
 for z := 0 to VarArrayHighBound(Items, 1) - VarArrayLowBound(Items, 1) do
 begin
 Item := NotesItem(IUnknown(Items[z]));
 tc := tv_info.Items.AddChild(tn, Item.Name);
 people := addrBook.GetView(view_name);
 person := people.GetFirstDocument;
 while (Person <> nil) do
 begin
 try
 try
 tv_info.Items.AddChild(tc, Person.GetFirstItem(Item.Name).Text {Item.Text});
 except
 end;
 finally
 Person := People.GetNextDocument(Person);
 end;
 end;
 end;
 end;
 end;
 end;
 end;
end;
end.
Source: Delphi Knowledge Base: http://www.baltsoft.com/
ID: 04481
Category:COM
Как работать с битами

=== Как работать с битами ===
Есть два способа. 
Низкоуровневый подход обеспечивается логическими операциями: 
var
 I: integer;
 N: integer; // Номер бита в диапазоне от 0..SizeOf(TYPE)*8 - 1
begin
 I := I or (1 shl N); // установка бита
 I := I and not (1 shl N); // сброс бита
 I := I xor (1 shl N); // инверсия бита
 if (i and (1 shl N)) <> 0 then... // проверка установленного бита
end;
Высокоуровневый подход опирается на представление числа в виде множества: 
type
 TIntegerSet = set of 0..SizeOf(Integer)*8 - 1;
var
 I: Integer;
 N: Integer;
begin
 Include(TIntegerSet(I), N); // установили N-ный бит в 1
 Exclude(TIntegerSet(I), N); // сбросили N-ный бит в 0
 if N in TIntegerSet(I) then... // проверили N-ный бит
end;
Source: http://delphiworld.narod.ru
ID: 00820
Как работать с буфером обмена (clipboard)?

=== Как работать с буфером обмена (clipboard)? ===
Этот пример использует картинку, кнопку и компонент shape на форме. Когда пользователь кликает по кнопке, то изображение формы сохраняется в в переменной FormImage и копируется в буфер обмена (Clipboard). Затем изображение формы копируется обратно в компонент картинки, тем самым создавая интересный эффект, особенно, если кнопку понажимать несколько раз.
procedure TForm1.Button1Click(Sender: TObject); 
var 
 FormImage: TBitmap; 
begin 
 FormImage := GetFormImage; 
 try 
 Clipboard.Assign(FormImage); 
 Image1.Picture.Assign(Clipboard); 
 finally 
 FormImage.Free; 
 end; 
end; 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
 Shape1.Shape := stEllipse; 
 Shape1.Brush.Color := clLime; 
 Image1.Stretch := True; 
end;
Следующий пример копирует содержимое экрана в буфер обмена:
procedure CopyScreenToClipboard; 
var
 dx, dy: integer; 
 hSourcDC, hDestDC, hBM, hbmOld: THandle; 
begin 
 dx := Screen.Width; 
 dy := Screen.Height; 
 hSourcDC := CreateDC('DISPLAY', nil, nil, nil); 
 hDestDC := CreateCompatibleDC(hSourcDC); 
 hBM := CreateCompatibleBitmap(hSourcDC, dx, dy); 
 hbmOld:= SelectObject(hDestDC, hBM); 
 BitBlt(hDestDC, 0, 0, dx, dy, hSourcDC, 0, 0, SRCCopy); 
 OpenClipBoard(Form1.Handle); 
 EmptyClipBoard; 
 SetClipBoardData(CF_Bitmap, hBM); 
 CloseClipBoard; 
 SelectObject(hDestDC, hbmOld); 
 DeleteObject(hBM); 
 DeleteDC(hDestDC); 
 DeleteDC(hSourcDC); 
end;
Source: Взято из http://forum.sources.ru
ID: 01871
Как работать с выделенными запясями в TDBGrid?

=== Как работать с выделенными запясями в TDBGrid? ===
{
 In the "Object Inspector" set your DBGrid's Option for dgMultiSelect = True.
 The Grid_Edit function calls for each selected DBGrid-Row a data-processing
 function.
 Return value is the number of processed rows.
}
function TForm1.Grid_Edit(dbgIn: TDBGrid; qryIn: TQuery): Longint;
 // declared in the private section
begin
 Result := 0;
 with dbgIn.DataSource.DataSet do
 begin
 First;
 DisableControls;
 try
 while not EOF do
 begin
 if (dbgIn.SelectedRows.CurrentRowSelected = True) then
 begin
 { +++ Call here the data-processing function +++
 }
 Inc(Result);
 end;
 Next;
 end;
 finally
 EnableControls;
 end;
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form1.Caption := 'Processed: ' + IntToStr(Grid_Edit(DBGrid1, Query1));
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03041
Category:Базы данных
Category:DBGrid
Как работать с объектом Excel вставленном в Word документ?

var
 AWordApplication: WordApplication;
 AWordDocument: WordDocument;
 AWorkBook: ExcelWorkBook;
 AWorkSheet: ExcelWorkSheet;
 AInlineShape: InlineShape;
 AFileName: OleVariant;
 TrueParam: OleVariant;
begin
 AWordApplication := CoWordApplication.Create;
 try
 FalseParam := False;
 AFileName := 'c:\wordexcel.doc';
 AWordDocument := AWordApplication.Documents.Open(AFileName, EmptyParam,
 EmptyParam,
 EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
 EmptyParam, EmptyParam, EmptyParam, EmptyParam);
 AInlineShape := AWordDocument.InlineShapes.Item(1);
 AInlineShape.Activate;
 AWorkBook := AWordDocument.InlineShapes.Item(1).OLEFormat.Object_ as ExcelWorkBook;
 AWorkSheet := AWorkBook.ActiveSheet as ExcelWorkSheet;
 ShowMessage(AWorkSheet.Cells.Item[2, 1].Text);
 finally
 AWordApplication.Quit(FalseParam, EmptyParam, EmptyParam);
 AWordApplication := nil;
 AWordDocument := nil;
 end;
end;
Source: Взято с Delphi Knowledge Base: http://www.baltsoft.com/
ID: 04428
Category:COM
Category:MS Office
Как работать с полями типа DateTime?

=== Как работать с полями типа DateTime? ===
Query1.Sql.Text := 'SELECT * FROM TableName WHERE (Date > :D1) AND (Date < :D2)';
Query1.Params.ParseSql(Query1.Sql.Text, True);
Query1.Params.ParamByName('D1').Value := StringToDatetime('09.10.2002');
Query1.Params.ParamByName('D2').Value := StringToDatetime('09.11.2002');
Query1.Active := True;
Возможно применение запроса:
SELECT Date
FROM TableName
WHERE BETWEEN '01/01/2002' AND '31/01/2002'
В этом коде 2 неточности, которые могут стать потенциальными ошибками, именно по этому я рекомендую использовать код с параметрами. Итак:
1) Не все SQL сервера понимают строки как нечто в одинарных кавычках, некоторые требуют двойных кавычек, некоторые сервера могут быть настроены на одинарные или двойные кавычки. Если дату передавать как параметр, то конечный запрос будет строить сам сервер, и он поставит те кавычки, которые нужны.
2) Где гарантия что формат даты одинаковый на компьютере с программой и компьютере с базой данных? У меня может стоять на клиенте русская винда с русскими настройками и '2/9/2002' будет интерпретироваться как "2 сентября", а на компьютере с базой данных стоит регионарный стандарт для Америки и эта же дата будет означать "9 февраля". (Про разделители полей даты я уже молчу). В этом случае так же параметры работают корректнее - серверу передаётся дата, а он делает запрос в соответствии со своими регионарными стандартами.
Author: Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 02402
Как работать с реестром Windows?

=== Как работать с реестром Windows? ===
Вот небольшой пример работы с системным реестром;
uses
 Registry, Windows;
procedure TForm1.Button1Click(Sender: TObject);
var
 Registry: TRegistry;
begin
 { создаём объект TRegistry }
 Registry := TRegistry.Create;
 { устанавливаем корневой ключ; например HKEY_LOCAL_MACHINE или HKEY_CURRENT_USER }
 Registry.RootKey := HKEY_LOCAL_MACHINE;
 { открываем и создаём ключ }
 Registry.OpenKey('software\MyRegistryExample', True);
 { записываем значение }
 Registry.WriteString('MyRegistryName', 'MyRegistry Value');
 { закрываем и освобождаем ключ }
 Registry.CloseKey;
 Registry.Free;
end;
// для удаления ключа используется функция Registry.DeleteKey
Source: Взято из http://forum.sources.ru
ID: 02268
Как работать со всеми фреймами, отображёнными в данный момент в WebBrowser?

Данный пример показывает как определить в каких фреймах разрешена команда 'copy':
procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
 for i := 0 to (WebBrowser1.OleObject.Document.frames.Length - 1) do
 if WebBrowser1.OleObject.Document.frames.item(i).document.queryCommandEnabled('Copy') then
 ShowMessage('copy command is enabled for frame no.' + IntToStr(i));
end;
Перевод материала с сайта members.home.com/hfournier/webbrowser.htm
Author: Peter Friese
Source: http://blackman.km.ru/myfaq/cont4.phtml
ID: 03488
Category:Связь
Category:WebBrowser
Как работать со всеми ячейками TABLE?

Пример показывает как добавить содержимое каждой ячейки в TMemo:
procedure TForm1.Button1Click(Sender: TObject);
var
 i, j: integer;
 ovTable: OleVariant;
begin
 // Я использовал первую таблицу на странице в качестве примера
 ovTable := WebBrowser1.OleObject.Document.all.tags('TABLE').item(0);
 for i := 0 to (ovTable.Rows.Length - 1) do
 begin
 for j := 0 to (ovTable.Rows.Item(i).Cells.Length - 1) do
 begin
 Memo1.Lines.Add(ovTable.Rows.Item(i).Cells.Item(j).InnerText;
 end;
 end;
end;
Перевод материала с сайта members.home.com/hfournier/webbrowser.htm
Source: http://blackman.km.ru/myfaq/cont4.phtml
ID: 03489
Category:Связь
Category:WebBrowser
Как разделить обработку OnClick и OnDblClick? Ведь OnClick будет вызываться всегда, и перед DblClick.

=== Как разделить обработку OnClick и OnDblClick? Ведь OnClick будет вызываться всегда, и перед DblClick. ===
Именно так и происходит в Windows - посылаются оба сообщения. Для того чтобы обработать только какое-то одно событие необходимо чуть "задержать" выполнение OnClick. Сделать это можно следующим способом: 
procedure TForm1.ListBox1Click(Sender: TObject);
var
 Msg: TMsg;
 TargetTime: Longint;
begin
 { get the maximum time to wait for a double-click message }
 TargetTime := GetTickCount + GetDoubleClickTime;
 { cycle until DblClick received or wait time run out }
 while GetTickCount < TargetTime do
 if PeekMessage(Msg, ListBox1.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, WM_NOREMOVE)
 then Exit; { Double click }
 MessageDlg('Single clicked', mtInformation, [mbOK], 0);
end;
ID: 00343