nyuuzyou/wikis huggingface dataset:
Поиск значения при вводе

=== Поиск значения при вводе ===
Каким способом можно производить поиск подходящих величин в момент ввода? Табличный курсор (визуально) должен перемещаться к наиболее подходящему значению при добавлении пользователем новых символов водимой величины.
Первоначально код писался под Delphi 1. Это может и не лучшее решение, но это работает.
Для поиска величины таблица держится открытой. Индекс должен, естественно, принадлежать полю, используемому элементом управления EditBox. В случае изменения содержимого EditBox, новое значение используется для вызова стандартной функции FindNearest таблицы TTable. Возвращаемая величина снова присваивается свойству Text элемента EditBox.
Я привел лишь общее решение задачи. Фактически во время изменения значения я включал таймер на период 1/3 секунды и в обработчике события OnTimer проводил операцию поиска (с выключением таймера). Это позволяло пользователю набирать без задержки нужный текст без необходимости производить поиск в расчете на вновь введенный символ (поиск проводился только при возникновении задержки в 1/3 секунды).
Вам также может понадобиться специальный обработчик нажатия клавиши backspace или добавления символа в любое место строки.
Вместо возвращения результатов элементу EditBox (который перезаписывает введенное пользователем значение), вы можете передавать результаты другому элементу управления, например компоненту ListBox. Вы также можете отобразить несколько наиболее подходящих значений, к примеру так:
procedure Edit1OnChange(...);
var
 i: integer;
begin
 if not updating then
 exit;
 { сделайте обновление где-нибудь еще - например при срабатывании таймера }
 Updating := False;
 Table1.FindNearest([Edit1.Text]);
 ListBox1.Clear;
 i := 0;
 while (i < 5) and (not (Table1.Eof)) do
 begin
 ListBox1.Items.Add(Table1.Fields[0].AsString);
 Inc(i);
 Table1.Next;
 end;
 ListBox1.ItemIndex := 0;
end;
Author: Bob
Source: Взято с http://delphiworld.narod.ru
ID: 02564
----
Каким способом можно производить поиск подходящих величин в момент ввода? Табличный курсор (визуально) должен перемещаться к наиболее подходящему значению при добавлении пользователем новых символов водимой величины.
Это просто. Вот что я написал в обработчике события OnChange редактора.
with MainForm.PatientTable do
begin
 { начинаем поиск имени }
 IndexName := 'Name';
 FindNearest([SearchFor.Text]);
end;
Код подразумевает, что имя индекса, по которому производится поиск - Name. Свяжите этот код с табличной сеткой и курсор будет перескакивать на ближайшую запись, удовлетворяющую введенной пользователем информации.
Source: Взято с http://delphiworld.narod.ru
ID: 02565
Поиск значения типа DWORD в указанном процессе

=== Поиск значения типа DWORD в указанном процессе ===
//
// Поиск значения типа DWORD в указанном процессе
// paul_shmakov@mail.ru
//
program search;
{$APPTYPE CONSOLE}
uses Windows, SysUtils;
var
 ProcessID: DWord;
 ProcessHandle: THandle;
 Mbi: TMemoryBasicInformation;
 Addr: DWord;
 Value: DWord;
 I: Cardinal;
 Buf: PChar;
 BytesRead: DWord;
begin
 if ParamCount < 2 then
 begin
 WriteLn('Usage: search.exe processid value');
 Exit;
 end;
 ProcessID := StrToInt(ParamStr(1));
 WriteLn('Process id: ' + IntToStr(ProcessID));
 Value := StrToInt(ParamStr(2));
 WriteLn('Value to search: ' + IntToStr(Value));
 // Открываем процесс
 ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or
 PROCESS_VM_OPERATION, False, ProcessID);
 if ProcessHandle = 0 then
 begin
 WriteLn('Failed to open process');
 Exit;
 end;
 try
 Addr := 0;
 // Перечисляем все регионы виртуальной памяти процесса
 while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
 begin
 // Uncomment чтобы увидеть список регионов, найденых в адресном пространстве
 // WriteLn('region: ' + IntToHex(Integer(Mbi.BaseAddress), 8) +
 // ' size: ' + IntToStr(Mbi.RegionSize));
 // Если региону выделена память, и регион не является "сторожевым" (как вершина стека),
 // то читаем этот регион
 if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
 begin
 // Это демонстрационная программа, поэтому здесь выделяется буфер под весь регион.
 // Регион может быть достаточно большим, поэтому лучше читать его блоками для экономии
 // памяти. Но здесь для простоты алгоритма вся оптимизация похерена.
 GetMem(Buf, Mbi.RegionSize);
 try
 // Читаем весь регион в выделенный буфер
 if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf,
 Mbi.RegionSize, BytesRead) then
 begin
 // Ищем значение типа DWORD в буфере
 for I := 0 to BytesRead - SizeOf(Value) do
 begin
 if PDWord(@Buf[I])^ = Value then
 // Найдено, выводим
 WriteLn('Value ' + IntToStr(Value) + ' found at ' +
 IntToHex(Integer(Cardinal(Mbi.BaseAddress) + I), 8));
 end;
 end
 else
 WriteLn('Failed to read process memory ' + IntToStr(GetLastError));
 finally
 FreeMem(Buf);
 end;
 end;
 // Вычисляем адрес следующего региона
 Addr := Addr + Mbi.RegionSize;
 end;
 finally
 CloseHandle(ProcessHandle);
 end;
end.
а вот программа, в которой ведем поиск для примера:
program someprog;
{$APPTYPE CONSOLE}
uses SysUtils;
var
 SomeValue: Integer;
begin
 SomeValue := 12345;
 WriteLn('One variable of this program has a value ' + IntToStr(SomeValue));
 WriteLn('Press any key to exit');
 ReadLn;
end.
Source: Взято из http://forum.sources.ru
ID: 02118
Поиск пересечений графика с осью OX

Для поиска пересечений графика заданной функции с осью абсцисс очень удобен метод хорд. Он основан на линейной интерполяции. По двум точкам, лежащим по разные стороны от оси OX, строится прямая. Поскольку точка пересечения этой прямой с осью OX уже ближе к искомому x, то при повторении этой операции точность резко увеличивается.
Если функция задана массивом точек, то можно произвести только одну операцию приближения.
procedure TForm1.Button1Click(Sender: TObject);
const
 left = -10;
 right = 10;
var
 x1, x2: Double;
 y1, y2: Double;
 k, b: Double;
 x, y: Double;
 d1, d2: Double;
begin
 x1 := left;
 y1 := Sin(x1);
 repeat
 x2 := x1 + 0.1;
 y2 := Sin(x2);
 if y1 * y2 < 0 then
 begin
 repeat
 y1 := Sin(x1);
 y2 := Sin(x2);
 k := (y1 - y2) / (x1 - x2);
 b := y1 - k * x1;
 x := -b / k;
 y := k * x + b;
 d1 := sqr(x1 - x) + sqr(y1 - y);
 d2 := sqr(x2 - x) + sqr(y2 - y);
 if d1 > d2 then
 begin
 d1 := d2;
 x1 := x;
 end
 else
 x2 := x;
 until d1 < 1E-20;
 ListBox1.Items.Add(FloatToStr(x1));
 end;
 x1 := x2;
 y1 := y2;
 until x2 > right;
end;
Source: http://blackman.wp-club.net/
ID: 04104
Category:Алгоритмы
Category:Графика
Category:Геометрия
Поиск по мемо полям

=== Поиск по мемо полям ===
В MS SQL Server 2000 включена специальная версия MS Index Server, которая позволяет построить по текстовым (включая BLOB) полям полнотекстовый индекс и расширения SQL, позволяющие строить запросы по этому индексу, например:
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
Author: Тенцер А. Л.
ID: 02785
Category:Базы данных
Category:MS SQL Server
Поиск по нескольким полям

=== Поиск по нескольким полям ===
KeyFields := 'name;name_1;n_dom;n_kw';
KeyValues := VarArrayOf([ComboBox1.Text, ComboBox2.Text, Edit2.Text, Edit3.Text]);
if dmod.qrfiz.Locate(KeyFields, KeyValues, []) = False then
 dmod.qrfiz.Locate('id', id1, []);
Source: Взято с http://delphiworld.narod.ru
ID: 02563
Поиск слов по маске

=== Поиск слов по маске ===
Может у кого-нибудь есть готовая функция поиска(выборки) слов по маске (с использованием символов '*' и '?'). 
Такая функция в Дельфи есть: MatchesMask из модуля masks. 
Source: Взято из http://forum.sources.ru
Поиск фраз и записей переменной длины

=== Поиск фраз и записей переменной длины ===
Для текста переменной длины вы можете использовать DBmemo. Большинство людей это делают сканированием "на лету" (когда оператор постит запрос), но для реального ускорения процесса можно попробовать способ пре-сканирования, который делают "большие мальчики" (операторы больших баз данных):
при внесении в базу данных новой записи она сканируется на предмет определения ключевых слов (это может быть как предопределенный список ключевых слов, так и всех слов, не встречающиеся в стоп-листе [пример: "the", "of", "and"])
ключевые слова вносятся в список ключевых слов со ссылкой на номер записи, например, "hang",46 или "PC",22.
когда пользователь делает запрос, мы извлекаем все записи, где встречается каждое из ключевых слов, например, "hang" может возвратить номера записей 11, 46 и 22, тогда как "PC" - записи с номерами 91, 22 и 15.
затем мы объединяем числа из всех списков c помощью какого-либо логического оператора, например, результатом приведенного выше примера может быть запись под номером 22 (в случае логического оператора AND), или записи 11, 15, 22, 46 и 91 (в случае оператора OR). Затем извлекайте и выводите эти записи.
для синонимов определите таблицу синонимов (например, "hang","kaput"), и также производите поиск синонимов, добавляя их к тому же списку как и оригинальное слово.
слова, имеющие общие окончания (например, "hang" и "hanged"), можно также сделать синонимами, или, как это делает большинство систем, производить анализ окончаний слов, вычисляя корень по их перекрытию (например, слову "hang" соответствует любое слово, чьи первые 4 буквы равны "hang").
Конечно, есть множество технических деталей, которые необходимо учесть, например, организация списков, их эффективное управление и объединение. Оптимизация этой характеристики может вам дать очень быстрое время поиска (примером удачный реализаций могут служить двигатели поиска Nexus, Lycos или WebCrawler, обрабатывающие сотни тысяч записей в течение секунды).
Source: Взято с http://delphiworld.narod.ru
ID: 02626
Показ всплывающих подсказок в строке состояния

=== Показ всплывающих подсказок в строке состояния ===
Я покажу как сделать так, чтобы строка состояния (Status Bar) показывала все всплывающие подсказки (Hint) элементов управления формы при нахождении курсора мыши в области компонента. Имеется пара решений данной задачи, но в любом случае вы должны создать код для каждой формы (пока я не знаю другого решения). 
; Шаг 1: Расположите TStatusBar на всех формах, где вы хотите увидеть подсказки в строке состояния. Установите свойство SimplePanel в True и присвойте компоненту другое имя (я использую SBStatus). Смотри мой комментарий относительно имени, который я поместил в шаге 4. 
; Шаг 2: Создайте необходимые подсказки в свойствах Hint. Не забудьте вставить '|', если вам необходим длинный текст. 
; Шаг 3: Поместите следующую строку в обработчике события FormCreate вашей формы:
 Application.OnHint := DisplayHint; 
; Шаг 4: Создайте эту процедуру. Пожалуйста обратите внимание на комментарии.
procedure TFrmMain.DisplayHint(Sender: TObject);
var
 Counter, NumComps: integer;
begin
 with Screen.ActiveForm do
 begin
 NumComps := ControlCount - 1;
 for Counter := 0 to NumComps do
 { SBStatus - имя всех моих компонентов TStatusBar.
 При необходимости его можно изменить. }
 if (TControl(Controls[Counter]).Name = 'SBStatus') then
 begin
 if (Application.Hint = ) then
 { ConWorkingName - используемая константа.
 При необходимости ее можно изменить. }
 TStatusBar(Controls[Counter]).SimpleText := ConWorkingName
 else
 TStatusBar(Controls[Counter]).SimpleText := Application.Hint;
 break;
 end;
 end;
end; { DisplayHint }
Не забудьте поместить procedure DisplayHint(Sender: TObject) в секции Public. 
Это все, что вы должны сделать. Если вы хотите придать такую функциональность другим формам, просто поместите на них TStatusBar и установите свойство Hint у необходимых компонентов. Я надеюсь это просто. 
Source: http://delphiworld.narod.ru/
ID: 00954
----
Пришло мне письмо: 
...cовет за номером 000306 содержит интересную идею -- выводить Hint'ы не на основную форму, а на активную, я сам до этого не дошел... Но не совсем понятно, чем автору не понравился стандартный метод TForm.FindComponent, существующий со времен Delphi I ? С его использованием метод ShowHint выглядит попроще, да и работает не хуже:
procedure TAnyForm.ShowHint;
var
 C: TStatusBar;
begin
 // ищем наш StatusBar1 на активной форме
 C := TStatusBar(Screen.ActiveForm.FindComponent('StatusBar1'));
 // если не найден -- ищем на основной форме
 if not Assigned(C) then
 C := TStatusBar(Application.MainForm.FindComponent('StatusBar1'));
 // если что-то обнаружено -- рисуем на н?м наш текст
 if Assigned(C) then
 C.SimpleText := ' ' + Application.Hint;
end;
Source: http://delphiworld.narod.ru/
ID: 00955
Показ меток удаленных записей в dBASE-файлах

=== Показ меток удаленных записей в dBASE-файлах ===
Для начала вы должны включить SoftDeletes, после чего вы сможете просматривать записи, помеченные к удалению. В противном случае, вы их не увидите. По умолчанию, для файлов DBF, SoftDeletes установлен в False. Вот логика работы:
procedure TForm1.Button1Click(Sender: TObject);
var
 B: BOOL;
 W: Word;
begin
 Check(DbiSetProp(hDBIObj(Table1.Handle), curSOFTDELETEON, LongInt(True)));
 { Проверяем, что это работает }
 Check(DbiGetProp(hDBIObj(Table1.Handle), curSOFTDELETEON, @B, SizeOf(B), W));
 if B = False then
 Label2.Caption := 'Не помечена'
 else
 Label2.Caption := 'Помечена';
end;
Когда указатель на запись указывает на запись, которую вы хотите удалить, используйте следующую логику:
Table1.UpdateCursorPos;
Check(DbiUndeleteRecord(Table1.Handle));
Метод UpdateCursorPos устанавливает основной курсор BDE на позицию курсора текущей записи, который существуют только для того, чтобы все работало правильно. Вам нужно только вызвать этот метод прямым вызовом одной из BDE API функций (такой как, например, DbiUndeleteRecord).
Ну и, наконец, чтобы все работало, поместите модули DBIPROCS и DBITYPES с список USES.
Source: Взято с http://delphiworld.narod.ru
ID: 02710
Показ свойств во время выполнения программы

=== Показ свойств во время выполнения программы ===
Я написал компонент-отладчик, выводящий в дереве все компоненты. Попробуйте этот код. Вызывайте функцию DisplayProperties как показано ниже:
DisplayProperties(Form1, {Вы можете использовать любой компонент}
 Outline1.Lines, {Допускается любой TStrings-объект}
 0); {0 - "стартовый", корневой уровень}
DisplayProperties(AObj: TObject; AList: TStrings; iIndentLevel: Integer);
var
 Indent: string;
 ATypeInfo: PTypeInfo;
 ATypeData: PTypeData;
 APropTypeData: PTypeData;
 APropInfo: PPropInfo;
 APropList: PPropList;
 iProp: Integer;
 iCnt: Integer;
 iCntProperties: SmallInt;
 ASecondObj: TObject;
procedure AddLine(sLine: string);
begin
 AList.Add(Indent + #160 + IntToStr(iProp) + ': ' + APropInfo^.Name
 + ' (' + APropInfo^.PropType^.Name + ')' + sLine);
end;
begin
 try
 Indent := GetIndentSpace(iIndentLevel);
 ATypeInfo := AObj.ClassInfo;
 ATypeData := GetTypeData(ATypeInfo);
 iCntProperties := ATypeData^.PropCount;
 GetMem(APropList, SizeOf(TPropInfo) * iCntProperties);
 GetPropInfos(ATypeInfo, APropList);
 for iProp := 0 to ATypeData^.PropCount - 1 do
 begin
 APropInfo := APropList^[iProp];
 case APropInfo^.PropType^.Kind of
 tkInteger:
 AddLine(' := ' + IntToStr(GetOrdProp(AObj, APropInfo)));
 tkChar:
 AddLine(' := ' + chr(GetOrdProp(AObj, APropInfo)));
 tkEnumeration:
 begin
 APropTypeData := GetTypeData(APropInfo^.PropType);
 if APropTypeData^.BaseType^.Name <> APropInfo^.PropType^.Name then
 AddLine(' := ' + IntToStr(GetOrdProp(AObj, APropInfo)))
 else
 AddLine(' := ' + APropTypeData^.NameList);
 end;
 tkFloat:
 AddLine(' := ' + FloatToStr(GetFloatProp(AObj, APropInfo)));
 tkString:
 AddLine(' := "' + GetStrProp(AObj, APropInfo) + '"');
 tkSet:
 begin
 AddLine(' := ' + IntToStr(GetOrdProp(AObj, APropInfo)));
 end;
 tkClass:
 begin
 ASecondObj := TObject(GetOrdProp(AObj, APropInfo));
 if ASecondObj = nil then
 AddLine(' := NIL')
 else
 begin
 AddLine();
 DisplayProperties(ASecondObj, AList, iIndentLevel + 1);
 end;
 end;
 tkMethod:
 begin
 AddLine();
 end;
 else
 AddLine(' := >>НЕИЗВЕСТНО<<');
 end;
 end;
 except {Выводим исключение и продолжаем дальше}
 on e: Exception do ShowMessage(e.Message);
 end;
 FreeMem(APropList, SizeOf(TPropInfo) * iCntProperties);
end;
function GetIndentSpace(iIndentLevel: Integer): string;
var iCnt: Integer;
begin
 Result := ;
 for iCnt := 0 to iIndentLevel - 1 do
 Result := Result + #9;
end;
Author: Thomas von Stetten
Source: Валентина Озерова, Сборник Kuliba
ID: 00038
Показать Choose Domain диалог?

=== Показать Choose Domain диалог? ===
{
 If you are developing network software for Windows NT,
 you usually need to ask the user to select a computer or domain
 he wants to connect/login.
}
const
 FOCUSDLG_DOMAINS_ONLY = 1;
 FOCUSDLG_SERVERS_ONLY = 2;
 FOCUSDLG_SERVERS_DOMAINS = 3;
 FOCUSDLG_BROWSE_LOGON_DOMAIN = $00010000;
 FOCUSDLG_BROWSE_WKSTA_DOMAIN = $00020000;
 FOCUSDLG_BROWSE_OTHER_DOMAINS = $00040000;
 FOCUSDLG_BROWSE_TRUSTING_DOMAINS = $00080000;
 FOCUSDLG_BROWSE_WORKGROUP_DOMAINS = $00100000;
 FOCUSDLG_BROWSE_ALL_DOMAINS = FOCUSDLG_BROWSE_LOGON_DOMAIN or
 FOCUSDLG_BROWSE_WKSTA_DOMAIN or FOCUSDLG_BROWSE_OTHER_DOMAINS or
 FOCUSDLG_BROWSE_TRUSTING_DOMAINS or FOCUSDLG_BROWSE_WORKGROUP_DOMAINS;
function SystemFocusDialog(hwndOwner: HWND; dwSelectionFlag: UINT;
 wszName: PWideChar; dwBufSize: DWORD; var bOKPressed: Boolean;
 wszHelpFile: PWideChar; dwContextHelpId: DWORD): DWORD; stdcall;
 external 'ntlanman.dll' Name 'I_SystemFocusDialog';
function ComputerBrowser(hWndParent: HWND; wCompName: PWideChar;
 dwBufLen: DWORD): Boolean;
var
 dwError: DWORD;
begin
 Result := False;
 dwError := SystemFocusDialog(hWndParent, FOCUSDLG_SERVERS_DOMAINS or
 FOCUSDLG_BROWSE_ALL_DOMAINS,
 wCompName, dwBufLen, Result, nil, 0);
 if dwError <> NO_ERROR then Exit;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 wCompName: array [0..MAX_COMPUTERNAME_LENGTH + 1] of WideChar;
begin
 if ComputerBrowser(0, wCompName, MAX_COMPUTERNAME_LENGTH + 1) then
 ShowMessage(wCompName)
 else
 ShowMessage('no computer selected');
end;
{***************************}
// Show the ServerBrowseDialogA0 Dialog
type
 TServerBrowseDialogA0 = function(hwnd: HWND; pchBuffer: Pointer;
 cchBufSize: DWORD): bool; stdcall;
function ShowServerDialog(AHandle: THandle): string;
var
 ServerBrowseDialogA0: TServerBrowseDialogA0;
 LANMAN_DLL: DWORD;
 buffer: array[0..1024] of char;
 bLoadLib: Boolean;
begin
 LANMAN_DLL := GetModuleHandle('NTLANMAN.DLL');
 if LANMAN_DLL = 0 then
 begin
 LANMAN_DLL := LoadLibrary('NTLANMAN.DLL');
 bLoadLib := True;
 end;
 if LANMAN_DLL <> 0 then
 begin
 @ServerBrowseDialogA0 := GetProcAddress(LANMAN_DLL, 'ServerBrowseDialogA0');
 DialogBox(HInstance, MAKEINTRESOURCE(101), AHandle, nil);
 ServerBrowseDialogA0(AHandle, @buffer, 1024);
 if buffer[0] = '\' then
 begin
 Result := buffer;
 end;
 if bLoadLib then
 FreeLibrary(LANMAN_DLL);
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Label1.Caption := ShowServerDialog(Form1.Handle);
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 01210
Показать Run диалог

=== Показать Run диалог ===
uses
 ComObj;
procedure TForm1.FormCreate(Sender: TObject);
var
 ShellApplication: Variant;
begin
 ShellApplication := CreateOleObject('Shell.Application');
 ShellApplication.FileRun;
end;
{*****************************}
{2.}
{ This code uses the undocumented RunFileDlg function to show the "run" dialog }
// For Win NT
procedure RunFileDlgW(OwnerWnd: HWND; Icon: HICON; lpstrDirectory: PWideChar;
 lpstrTitle: PWideChar; lpstrDescription: PWideChar; Flags: Longint); stdcall;
 external 'Shell32.dll' Index 61;
// For Win 9x (Win NT to show standard captions )
procedure RunFileDlg(OwnerWnd: HWND; Icon: HICON; lpstrDirectory: PChar;
 lpstrTitle: PChar; lpstrDescription: PChar; Flags: Longint); stdcall;
 external 'Shell32.dll' Index 61;
const
 RFF_NOBROWSE = 1; //Removes the browse button.
 RFF_NODEFAULT = 2; // No default item selected.
 RFF_CALCDIRECTORY = 4; // Calculates the working directory from the file name.
 RFF_NOLABEL = 8; // Removes the edit box label.
 RFF_NOSEPARATEMEM = 14; // Removes the Separate Memory Space check box (Windows NT only).
function ShowRunFileDialg(OwnerWnd: HWND; InitialDir, Title, Description: PChar;
 flags: Integer; StandardCaptions: Boolean): Boolean;
var
 HideBrowseButton: Boolean;
 TitleWideChar, InitialDirWideChar, DescriptionWideChar: PWideChar;
 Size: Integer;
begin
 if (Win32Platform = VER_PLATFORM_WIN32_NT) and not StandardCaptions then
 begin
 Size := SizeOf(WideChar) * MAX_PATH;
 InitialDirWideChar := nil;
 TitleWideChar := nil;
 DescriptionWideChar := nil;
 GetMem(InitialDirWideChar, Size);
 GetMem(TitleWideChar, Size);
 GetMem(DescriptionWideChar, Size);
 StringToWideChar(InitialDir, InitialDirWideChar, MAX_PATH);
 StringToWideChar(Title, TitleWideChar, MAX_PATH);
 StringToWideChar(Description, DescriptionWideChar, MAX_PATH);
 try
 RunFileDlgW(OwnerWnd, 0, InitialDirWideChar, TitleWideChar, DescriptionWideChar, Flags);
 finally
 FreeMem(InitialDirWideChar);
 FreeMem(TitleWideChar);
 FreeMem(DescriptionWideChar);
 end;
 end
 else
 RunFileDlg(OwnerWnd, 0, PChar(InitialDir), PChar(Title), PChar(Description), Flags);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowRunFileDialg(FindWindow('Shell_TrayWnd', nil), nil, nil, nil, RFF_NOBROWSE, True);
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 01209
Показать код HTML страницы в TMemo

// You need a TMemo, a TButton and a NMHTTP
procedure TForm1.Button1Click(Sender: TObject);
begin
 NMHTTP1.Get('www.swissdelphicenter.ch');
 memo1.Text := NMHTTP1.Body
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03537
Category:Связь
Category:Web
Показываем/Скрываем System Tray

=== Показываем/Скрываем System Tray ===
Вы, наверное, видели множество примеров, которые показывают как скрывать панель задач или кнопку Пуск. Но вот как скрыть только System Tray?
procedure hideStartbutton(visi: Boolean);
var
 Tray, Child: hWnd;
 C: array[0..127] of Char;
 S: string;
begin
 Tray := FindWindow('Shell_TrayWnd', nil);
 Child := GetWindow(Tray, GW_CHILD);
 while Child <> 0 do
 begin
 if GetClassName(Child, C, SizeOf(C)) > 0 then
 begin
 S := StrPAS(C);
 if UpperCase(S) = 'TRAYNOTIFYWND' then
 begin
 if Visi then
 ShowWindow(Child, 1)
 else
 ShowWindow(Child, 0);
 end;
 end;
 Child := GetWindow(Child, GW_HWNDNEXT);
 end;
end;
для того, чтобы обатно её показать, используйте 
 hideStartbutton(True); 
или
 hideStartbutton(False); 
чтобы скрыть !! 
Source: Взято из http://forum.sources.ru
ID: 01762
Показываем всплывающие подсказки в различных панелях StatusBar

=== Показываем всплывающие подсказки в различных панелях StatusBar ===
Данный пример демонстрирует показ всплывающих подсказок для любой панели статусбара. Этот метод отличается от того, который использует событие MouseMove, и запускается только тогда, когда приложению необходимо показать всплывающие подсказки. В то время как при использовании MouseMove метод будет вызываться при каждом попадании курсора мышки на statusbar.
{ Добавьте CommCtrl в uses. }
{ в интерфейсе формы для статусбара } 
 private 
 procedure AppShowHint(var HintStr: string; var CanShow: boolean; 
 var HintInfo: THintInfo);
procedure TForm1.FormCreate(Sender: TObject); 
begin 
 Application.OnShowHint := AppShowHint; 
end;
procedure TForm1.AppShowHint(var HintStr: string; var CanShow: boolean; 
var HintInfo: THintInfo); 
const 
 PanelHints: array [0..6] of string = 
 ('Cursor position', 'Ascii char', 'Bookmarks', 'Caps lock', 
 'Insert/Overwrite', 'File size', 'File name');
var 
 x: integer; 
 R: TRect; 
begin 
 if HintInfo.HintControl = StatusBar1 then 
 begin 
 for x := 0 to StatusBar1.Panels.Count-1 do 
 begin 
 SendMessage(StatusBar1.Handle, SB_GETRECT, x, Longint(@R)); 
 if PtInRect(R, HintInfo.CursorPos) then 
 begin 
 HintStr := PanelHints[x]; 
 InflateRect(R, 3, 3);
 { Устанавливаем CursorRect говоря системе проверить новые
 строки с подсказками, когда курсор покинет этот прямоугольник. } 
 HintInfo.CursorRect := R; 
 break; 
 end; 
 end; 
 end; 
end;
Source: Взято из http://forum.sources.ru
ID: 01272