nyuuzyou/wikis huggingface dataset:
Быстрый доступ к нужной записи в таблице Paradox

=== Быстрый доступ к нужной записи в таблице Paradox ===
var
 NeedNumber: Integer;
begin
 NeedNumber := Table.RecNo;
 { сохранение номера нужной записи }
 { код меняющий номер записи }
 { восстановление номера нужной записи }
 Table.RecNo := NeedNumber;
end;
Примечания Vit:
* Следует категорически избегать подобных решений в приложениях "Клиент-Сервер"
* Если есть многопользовательский доступ, то эта конструкция может работать неправильно
Author: Valler ( http://www.valler.narod.ru )
Source: Взято из http://forum.sources.ru
ID: 02554
Быстрый способ обмена значений в 2х переменных.

=== Быстрый способ обмена значений в 2х переменных. ===
==== Обмен значений любых переменных одинакового размера ====
procedure SwapVars1(var u, v; Size: Integer); 
var 
 x: Pointer; 
begin 
 GetMem(x, Size); 
 try 
 System.move(u, x^, Size); 
 System.move(v, u, Size); 
 System.move(x^, v, Size); 
 finally 
 FreeMem(x); 
 end; 
end; 
procedure SwapVars2(var Source, Dest; Size: Integer); 
 // By Mike Heydon, mheydon@eoh.co.za 
begin 
 asm 
 push edi 
 push esi 
 mov esi,Source 
 mov edi,Dest 
 mov ecx,Size 
 cld 
 @1: 
 mov al,[edi] 
 xchg [esi],al 
 inc si 
 stosb 
 loop @1 
 pop esi 
 pop edi 
 end; 
end; 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
 SwapVars1(X1, X2, SizeOf(Integer)); 
end; 
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
==== Быстрый обмен значений 2-х байтов ====
var 
 X1, X2: Byte; 
begin 
 X1 := X2 xor X2; 
 X2 := X1 xor X2; // X2 = X1 
 X1 := X1 xor X2; // X1 = X2 
Author: ___ALex___ 
Source: http://forum.pascal.dax.ru
ID: 00075
В InterBase при создании базы ввести параметр для поддержки русского языка

=== В InterBase при создании базы ввести параметр для поддержки русского языка ===
UPDATE RDB$FIELDS
SET RDB$CHARACTER_SET_ID = 52
WHERE RDB$FIELD_NAME = 'RDB$SOURCE''
Source: Взято с http://delphiworld.narod.ru
ID: 02879
Category:Базы данных
Category:Interbase
В StringGrid ширина колонки подгоняется под длину самой длинной строки

=== В StringGrid ширина колонки подгоняется под длину самой длинной строки ===
Поскольку в компоненте StringGrid по умолчанию все столбцы имеют одинаковую ширину - в некоторых ячейках текст обрезается. Чтобы этого избежать, после заполнения StringGrid нужно для каждого столбца находить текст максимальной длины и в соответствии с его длиной устанавливать ширину всего столбца 
var
 x, y, w: integer;
 s: string;
 MaxWidth: integer;
begin
 with StringGrid1 do
 ClientHeight := DefaultRowHeight * RowCount + 5;
 with StringGrid1 do
 begin
 for x := 0 to ColCount - 1 do
 begin
 MaxWidth := 0;
 for y := 0 to RowCount - 1 do
 begin
 w := Canvas.TextWidth(Cells[x, y]);
 if w > MaxWidth then
 MaxWidth := w;
 end;
 ColWidths[x] := MaxWidth + 5;
 end;
 end;
end;
Source: http://delphiworld.narod.ru/
ID: 01071
В TreeView текущий Node выделяется другим шрифтом

=== В TreeView текущий Node выделяется другим шрифтом ===
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
 Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if cdsSelected in State then
 Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsUnderline];
end;
Source: http://delphiworld.narod.ru/
ID: 01111
В каких версиях IB поддерживаются уведомления о событиях (Event Alerts)?

=== В каких версиях IB поддерживаются уведомления о событиях (Event Alerts)? ===
Во всех, кроме локального IB для Windows 3.1. Это очень сильно урезанная версия IB, даже по сравнению с Local IB 4.1 for Windows95.
Устойчивая работа Event Alerters зависит как от используемого компонента (см. www.ibase.ru/download.htm), так и от сервиспаков, установленных на NT Server или Workstation. Например, уведомление о событиях работает, если установлен SP3 и postsp3 hotfix TEARDROP2, либо установлен SP4 (большой, т.е. ~70мегабайт).
EventAlerters могут работать неустойчиво, если для SP3 не установлен teardrop2, либо вообще не работать, если установлен SP4 размером ~32 мегабайта (из-за версии tcpip.sys). Если клиентами являются NT Workstation, настоятельно рекомендуется на клиентах установить тот же SP и постфиксы, что и для сервера.
Author: Дмитрий Кузьменко (http://www.ibase.ru)
ID: 02904
Category:Базы данных
Category:Interbase
В каком порядке происходят события при создании и показе окна?

=== В каком порядке происходят события при создании и показе окна? ===
При создании окна обработчики событий выполняются в следующем порядке:
* OnCreate
* OnShow
* OnPaint
* OnActivate
* OnResize
* OnPaint (снова)
Copyright © 1996 Epsylon Technologies
Source: Взято из FAQ Epsylon Technologies (095)-913-5608; (095)-913-2934; (095)-535-5349
ID: 00439
== См. также ==
Рождение, жизнь и гибель формы
В основном Help'е в Delphi не работает индекс по Win32?

===== В основном Help'е в Delphi не работает индекс по Win32? =====
- в /help/delphi3.cfg добавить строку типа
 :index Win32=Win32.hlp
она должна быть добавлена перед строкой
 :Link win32.hlp
* стереть delphi3.gid
* запустить Help и получать удовольствие
В delphi3.cnt тоже нужно строчку добавить:
 :include win32.cnt
Source: http://blackman.wp-club.net/
ID: 00003
В режиме отладки приложения не разрешается открытие базы данных

=== В режиме отладки приложения не разрешается открытие базы данных ===
Необходимо отключить (деинсталлировать через Oracle Installer) Trace Service на клиенте - совет от ORACLE. Глюк имеет место быть только под Windows NT 4.xx.
Source: Взято с http://delphiworld.narod.ru
ID: 02718
В строке состояния TStatusBar выводится только 127 символов

=== В строке состояния TStatusBar выводится только 127 символов ===
В строке состояния TStatusBar выводится только 127 символов.
Можно ли как-нибудь увеличить это число? 
procedure TForm1.Button1Click(Sender: TObject);
var 
 i: Integer;
 s: string;
begin
 s := ;
 for i := 1 to 150 do
 s := s + IntToStr(i mod 10);
 Label1.Caption := s;
 Form1.Paint;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
 Label1.Repaint;
 Application.ProcessMessages; { yield; }
 StatusBar1.Canvas.CopyRect(
 Rect(2, Round((StatusBar1.Height - Label1.Height)/2), Label1.Width, Label1.Height),
 Label1.Canvas,
 Rect(0, 0, Label1.Width, Label1.Height));
end;
Author: Mikel 
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 00523
В чем отличие между Create(Self) и Create(Application)?

=== В чем отличие между Create(Self) и Create(Application)? ===
Self может быть использовано только в методе класса, и ссылается на текущий экземпляр класса. Таким образом "Self" в методе класса TForm1 ссылается на текущий экземпляр TForm1. При создании компонента Вы передаете его владельца (owner) в конструктор. При уничтожении формы или компонента автоматически уничтожаются и все компоненты владельцем которого она является. Таким образом если при создании формы передать в качестве владельца Application эта форма будет автоматически уничтожена при уничтожении Application. Если же при создании формы передать в качестве владельца другую форму, вновь созданная форма будет автоматически уничтожена при уничтожении формы-владельца. 
ID: 00110
В чем разница между CHAR и VARCHAR ? Что лучше использовать?

=== В чем разница между CHAR и VARCHAR ? Что лучше использовать? ===
Разработчики утверждают, что разницы практически нет - особенности VARCHAR в том, что используется дополнительно два байта для хранения длины, а CHAR игнорирует пробелы в конце хранимой строки.
Если вы собираетесь хранить строки длиной не более 40-50 символов, то лучше использовать CHAR. Более подробно см. статью.
При передаче по сети в текущих версиях IB VARCHAR передается так-же как и CHAR (т.е. неэффективно). Исправлено в IB 5.0.
Author: Дмитрий Кузьменко
Source: http://www.ibase.ru/
ID: 02919
Category:Базы данных
Category:Interbase
Ввести пароль Paradox

=== Ввести пароль Paradox ===
Как мне при соединении с таблицей Paradox устранить/"удовлетворить" окошко с требованием ввести пароль, защищающей таблицу?
Свойство компонента Table ACTIVE должно быть установлено в FALSE. (Если она активна прежде, чем вы ввели пароль, вы получите это окошко.) Затем поместите следующий код в обработчике события формы OnCreate:
session.AddPassword('Мой секретный пароль');
table1.Active := True;
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 02946
Category:Базы данных
Category:Paradox
Вертикальный текст с горизонтальной ориентацией букв

procedure TForm1.FormPaint(Sender: TObject);
var
 hFont: Thandle;
 LogFont: TLogFont;
 Count: Integer;
begin
 LogFont.lfHeight := 30;
 LogFont.lfWidth := 10;
 LogFont.lfWeight := 900;
 LogFont.lfEscapement := -200;
 LogFont.lfCharSet := 1;
 LogFont.lfOutPrecision := OUT_TT_PRECIS;
 LogFont.lfQuality := DRAFT_QUALITY;
 LogFont.lfPitchAndFamily := FF_Modern;
 hFont := CreateFontIndirect(LogFont);
 Selectobject(Form1.Canvas.Handle, hFont);
 SetTextColor(Form1.Canvas.Handle, rgb(0, 0, 200));
 SetBKmode(Form1.Canvas.Handle, TRANSPARENT);
 //TextOut(Form1.Canvas.Handle, 10, 10, 'Повернутый', 7);
 for Count := 1 to 100 do
 begin
 Canvas.TextOut(Random(Form1.Width), Random(Form1.Height), 'Повернутый');
 SetTextColor(Form1.Canvas.Handle, RGB(Random(255), Random(255), Random(255)));
 end;
 DeleteObject(hFont);
end;
Source: http://delphiworld.narod.ru/
ID: 03657
Category:Графика
Category:Работа с текстом
Взятие интеграла методом Симпсона

{**** UBPFD *********** by kladovka.net.ru ****
>> Взятие интеграла методом Симпсона
Интеграл методом Симпсона
A, B - интервал интегрирования
N - число точек на интервале
Func - функция, от которой берется интеграл.
Возвращаемое значение - значение интеграла
Зависимости: System
Автор: Mystic, mystic2000@newmail.ru, ICQ:125905046, Харьков
Copyright: Mystic
Дата: 25 апреля 2002 г.
********************************************** }
type
 TFunction = function(X: Extended; Arg: Pointer): Extended;
function Simpson(A, B: Extended; N: Cardinal; Func: TFunction; Arg: Pointer): Extended;
var
 h: Extended;
 X: Extended;
 K: Extended;
 I: Integer;
begin
 Assert(N > 0);
 h := 0.5 * (B-A) / N;
 Result := Func(A, Arg);
 X := A + h;
 for I := 1 to 2*N-1 do
 begin
 if I mod 2 = 0 then
 K := 2
 else
 K := 4;
 Result := Result + K * Func(X, Arg);
 X := X + h;
 end;
 Result := Result + Func(B, Arg);
 Result := h * Result / 3;
end;
Author: Mystic
ID: 04200
----
{ **** UBPFD *********** by kladovka.net.ru ****
>> Вычисление определённого интеграла методом Симпсона
A, B - границы интегрирования
Eps - заданная относительная точность вычисления
F - подинтегральная функция
Зависимости: нет
Автор: Dimka Maslov, mainbox@endimus.ru
Copyright: Dimka Maslov
Дата: 26 ноября 2003 г.
********************************************** }
type
 TDoubleFunc = function (X: Double): Double;
function Integral(A, B, Eps: Double; F: TDoubleFunc): Double;
 function InternalCalc(A, B: Double; F: TDoubleFunc; N: Integer): Double;
 var
 x, dx: Double;
 i: Integer;
 begin
 dx := (B - A) / N;
 Result := 0;
 x := A;
 for i := 1 to N do
 begin
 Result := Result + dx * (F(x) + 4*F(x+dx/2) + F(x+dx)) / 6;
 x := x + dx;
 end;
 end;
var
 N: Integer;
 Prev: Double;
begin
 Result := InternalCalc(A, B, F, 4);
 N := 4;
 repeat
 Prev := Result;
 N := N shl 1;
 Result := InternalCalc(A, B, F, N);
 until (Result = 0) or (Abs((Result-Prev) / Result) < Eps);
end;
Пример использования:
function F(X: Double): Double;
begin
 Result := X * X * X;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Label1.Caption := FloatToStr(Integral(-10, 10, 0.00001, F));
end;
Author: Dimka Maslov
ID: 04201
Category:Алгоритмы
Взять все расширения из реестра и их описание

=== Взять все расширения из реестра и их описание ===
{
 This Code will return the programs associated with each extension.
 You can obviously modify it to search for a specific extension.
}
uses Registry;
procedure TForm1.Button1Click(Sender: TObject);
var
 reg: TRegistry;
 keys: TStringList;
 i: Integer;
 typename, displayname, server: string;
begin
 memo1.Clear;
 reg := TRegistry.Create;
 try
 reg.rootkey := HKEY_CLASSES_ROOT;
 if reg.OpenKey(, False) then
 begin
 keys := TStringList.Create;
 try
 reg.GetKeyNames(keys);
 reg.CloseKey;
 { memo1.lines.addstrings(keys); }
 for i := 0 to keys.Count - 1 do
 begin
 if keys[i][1] = '.' then
 begin
 { this is an extension, get its typename }
 if reg.OpenKey(keys[i], False) then
 begin
 typename := reg.ReadString();
 reg.CloseKey;
 if typename <> then
 begin
 if reg.OpenKey(typename, False) then
 begin
 displayname := reg.ReadString();
 reg.CloseKey;
 end;
 if reg.OpenKey(typename + '\shell\open\command', False) then
 begin
 server := reg.ReadString();
 memo1.Lines.Add(Format('Extension: "%s", Typename: "%s", Displayname:"%s"' +
 #13#10' Server: %s',
 [keys[i], typename, displayname, server]));
 reg.CloseKey;
 end;
 end;
 end;
 end;
 end;
 finally
 keys.Free;
 end;
 end;
 finally
 reg.Free
 end;
end;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01744
Взять один символ из потока памяти

=== Взять один символ из потока памяти ===
unit MsFormR;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;
type
 TForm1 = class(TForm)
 OpenDialog1: TOpenDialog;
 SaveDialog1: TSaveDialog;
 Memo1: TMemo;
 ListBox1: TListBox;
 Panel1: TPanel;
 Button1: TButton;
 Button2: TButton;
 Splitter1: TSplitter;
 procedure FormCreate(Sender: TObject);
 procedure Button1Click(Sender: TObject);
 procedure Button2Click(Sender: TObject);
 private
 MemStr1: TMemoryStream;
 public
 procedure ShowMemStr;
 end;
var
 Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
 MemStr1 := TMemoryStream.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 Str1: TFileStream;
begin
 OpenDialog1.Filter :=
 'Any file (*.*)|*.*';
 OpenDialog1.DefaultExt := '*';
 if OpenDialog1.Execute then
 begin
 Str1 := TFileStream.Create (
 OpenDialog1.Filename, fmOpenRead);
 try
 MemStr1.LoadFromStream (Str1);
 ShowMemStr;
 Button2.Enabled := true;
 finally
 Str1.Free;
 end;
 end;
end;
procedure TForm1.ShowMemStr;
begin
 Memo1.Lines.LoadFromStream (MemStr1);
end;
procedure TForm1.Button2Click(Sender: TObject);
const
 ndx: LongInt = 1;
var
 pch: PChar;
 tmpC: Char;
begin
 pch := MemStr1.Memory;
 tmpC := pch[ndx];
 pch[ndx] := #0;
 ListBox1.Items.SetText(MemStr1.Memory);
 pch[ndx] := tmpC;
 if ndx < MemStr1.Size then
 Inc(ndx)
 else
 Button2.Enabled := False;
end;
end.
Source: http://delphiworld.narod.ru
ID: 00083
Визуализация нажатия кнопки

=== Визуализация нажатия кнопки ===
Я знаю как нажать кнопку через keypress, но хотя пользователь определил действие в обработчике события OnClick, сама кнопка не отражает видимых изменений, происходящих при ее нажатии мышью. Кто-нибудь может мне помочь? 
Вы можете сделать кнопку "нажатой" или "ненажатой", посылая ей сообщение BM_SETSTATE. Определить ее текущее состояние можно, послав ей сообщение BM_GETSTATE. 
Для нажатия кнопки:
 Button1.Perform(BM_SETSTATE, 1, 0);
Для отжатия кнопки:
 Button1.Perform(BM_SETSTATE, 0, 0);
Чтобы обнаружить нажатие кнопки:
 ButtonPressed := Button1.Perform(BM_GETSTATE, 0, 0) = 1;
Source: http://delphiworld.narod.ru/
ID: 01243
Включение WAL на NetWare ухудшает производительность на 80% при вставках записей, и только на 15% - при обновлениях.

=== Включение WAL на NetWare ухудшает производительность на 80% при вставках записей, и только на 15% - при обновлениях. ===
Файл WAL должен быть расположен на другом винчестере чем основная БД. (это-же относится и к теневой БД). В этом случае ухудшения производительности не будет. Кроме этого вы должны учитывать, что запись в WAL происходит синхронно с БД, поэтому сравнивать "производительность" WAL с асинхронными изменениями в БД некорректно.
Author: Дмитрий Кузьменко (http://www.ibase.ru)
ID: 02901
Category:Базы данных
Category:Interbase
Включение и выключение закладки Notebook

=== Включение и выключение закладки Notebook ===
Вот хороший трюк от Xavier Pacheco:
unit TabDis;
interface
uses
 SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
 Controls, Forms, Dialogs, StdCtrls, TabNotBk;
type
 TFrmTabDis = class(TForm)
 TabbedNotebook1: TTabbedNotebook;
 Button1: TButton;
 procedure FormCreate(Sender: TObject);
 procedure Button1Click(Sender: TObject);
 private
 { Private-Deklarationen }
 public
 { Public-Deklarationen }
 end;
var
 FrmTabDis: TFrmTabDis;
implementation
{$R *.DFM}
procedure TFrmTabDis.FormCreate(Sender: TObject);
var
 i: integer;
 j: integer;
begin
 { Создаем имена для всех Notebook TTabButton }
 j := 0;
 with TabbedNotebook1 do
 for i := 0 to ControlCount - 1 do
 if Controls[i].ClassName = 'TTabButton' then
 begin
 Controls[i].Name := Controls[i].ClassName + IntToStr(j);
 Inc(j);
 end;
end;
procedure TFrmTabDis.Button1Click(Sender: TObject);
begin
 { Делаем недоступной определенную страницу notebook }
 with TControl(TabbedNotebook1.FindComponent('TTabButton2')) do
 Enabled := not Enabled;
end;
end.
Source: http://delphiworld.narod.ru/
ID: 01169
Включение и выключение клавиатуры

=== Включение и выключение клавиатуры ===
// используемые переменные
var
 Dummy: integer = 0;
 OldKbHook: HHook = 0;
implementation
function KbHook(code: Integer; wparam: Word; lparam: LongInt): LongInt; stdcall;
begin
 if code < 0 then
 Result := CallNextHookEx(oldKbHook, code, wparam, lparam)
 else
 Result := 1;
end;
// включение клавы
procedure TForm1.KeyBoardOn(Sender: TObject);
begin
 if OldKbHook <> 0 then
 begin
 UnHookWindowshookEx(OldKbHook);
 OldKbHook := 0;
 end;
 SystemParametersInfo(SPI_SETFASTTASKSWITCH, 0, 0, 0);
 SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);
end;
// выключение клавы
procedure TForm1.KeyBoardOff(Sender: TObject);
begin
 SystemParametersInfo(SPI_SETFASTTASKSWITCH, 1, @Dummy, 0);
 SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, @Dummy, 0);
 OldKbHook := SetWindowsHookEx(WH_KEYBOARD, @KbHook, HInstance, 0);
end;
Некоторые замечания по поводу этих процедур: 
 Если программу упаковать UPX-ом - клава не будет отключаться (причин не знаю). 
 В ДОС-окне клава будет работать (FAR, VC и т.п.) :( 
 Состояния клавиш NumLock, CapsLock, ScrollLock не отслеживаются и могут быть изменены. 
 Возможно EnableHardwareKeyboard более эффективен и прост, но я тоже, к сожалению, не знаю, как им пользоваться. 
 Если вместо WH_KEYBOARD поставить WH_MOUSE, то можно выключать таким образом мышь :-)
Source: http://delphiworld.narod.ru/
ID: 01532
----
program antiklava;
{ подключение необходимых модулей }
uses
 Windows;
{ объявление логической переменной}
var
 klava: boolean;
begin
 { устанавливаем значение переменной }
 klava := true;
 { начинаем бесконечный цикл }
 while true do
 begin
 { делаем так, чтобы всё не подвисло :)}
 Yield;
 { ничего не делаем 2 минуты }
 Sleep(2*60*1000);
 { присваиваем переменной противоположное значение }
 klava := not klava;
 { и в зависимости от переменной,
 отключаем или включаем клаву с мышкой}
 EnableHardwareInput(klava);
 end;
end.
Source: http://delphiworld.narod.ru/
ID: 01533
----
Вот недокументированная функция из User32.dll, которая блокирует ввод (мышь, клавиатуру кроме Ctrl+Alt+Del). При нажатии Ctrl+Alt+Del все разблокируется :-(
procedure BlockInput; external 'user32.dll'; 
Передаем параметры в стек вручную через push, иначе что-то глючит: 
 1 - заблокировать
 0 - разблокировать
procedure Block;
asm
 push 1
 call BlockInput
end;
procedure UnBlock;
asm
 push 0
 call BlockInput
end;
ID: 01534
Включение и выключение устройств ввода/вывода

=== Включение и выключение устройств ввода/вывода ===
Иногда может возникнуть необходимость в выключении на время устройств ввода - клавиатуры и мыши. Например, это неплохо сделать на время выполнения кода системы защиты от копирования, в играх, или в качестве "наказания" при запуске программы по истечению срока ее бесплатного использования ... . Однако наилучшее ее применение - отключение клавиатуры и мыши на время работы демонстрационки, основанной на воспроизведении записанных заранее перемещений мышки и клавиатурного ввода (см. об этом отдельный раздел этой книги). Это элементарно сделать при помощи API:
 EnableHadwareInput(Enable: Boolean): Boolean;
Enable - требуемое состояние устройств ввода (True - включены, false - выключены). Если ввод заблокирован, то его можно разблокировать вручную - нажать Ctrl + Alt + Del, при появлении меню "Завершение работы программы" ввод разблокируется.
А вот еще интересный прикол.
Включение/выключение монитора программным способом.
Предупреждаю сразу! После того, как вы отключите монитор, просто так вы его уже не включите (хотя это может быть зависит от монитора, я, во всяком случае, не смог). Только после перезагрузки компьютера.
Отключить:
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);
Включить:
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
Source: http://dmitry9.nm.ru/info/
ID: 01687
Внести изменения в набор данных и не потерять текушей позиции

=== Внести изменения в набор данных и не потерять текушей позиции ===
procedure TMyForm.MakeChanges;
var
 aBookmark: TBookmark;
begin
 Table1.DisableControls;
 aBookmark := Table.GetBookmark;
 try
 { ваш код }
 finally
 Table1.GotoBookmark(aBookmark);
 Table1.FreeBookmark(aBookmark);
 Table1.EnableControls;
 end;
end;
ID: 02435
ID: 02640
Возведение в степень

Стандартные функции T-SQL не поддерживают возведение в степень если результат не вмещается в тип int, несмотря на то что сам T-SQL вполне поддерживает большие числа (bigint)
@Base bigint, @Exp int
--...
 Declare
 @Result bigint,
 @j int
 Set @j=0
 Set @Result=1
 while @j<@Exp
 begin
 Set @Result=@Result*@Base
 Set @j=@j+1
 end
 Return @Result
Author: Vit
ID: 02841
Category:Алгоритмы
Category:Математика
Category:T-SQL