nyuuzyou/wikis huggingface dataset:
Кросс-таблица через pivot-таблицу

=== Кросс-таблица через pivot-таблицу ===
Мне нужна помощь по реализации запроса кросс-таблицы в Delphi. У кого-нибудь имеется соответствующий опыт?
Использовать pivot-таблицу должен все тот-же общий механизм (относительно к любой базе данных SQL).
Предположим, что у нас есть данные продаж в таблице с полями Store, Product, Month, Sales, и вам необходимо отображать данные по продуктам за каждый месяц. (Примем, что поле 'month' для простоты имеет значения 1..12.)
Оригинальные данные примера:
 Store Product Month Sales
 #1 Toys 1 100
 #2 Toys 1 68
 #1 Toys 2 150
 #1 Books 1 75
 ...
Желаемый отчет должен выглядеть похожим на этот:
 Product January February March .....
 Toys 168 150
 Books 75 .....
Установите pivot-таблицу с именем tblPivot и 12 строками:
 pvtMonth pvtJan pvtFeb pvtMar pvtApr ....
 1 1 0 0 0 ....
 2 0 1 0 0
 3 0 0 1 0
 4 0 0 0 1
 .....
Теперь запрос, выполненный в виде:
SELECT Product, January=SUM(Sales*pvtJan),
 February=SUM(Sales*pvtFeb),
 March=SUM(Sales*pvtMar),
 April=SUM(Sales*pvtApr), ...
WHERE Month = pvtMonth
GROUP BY Product
даст вам информацию, опубликованную выше.
Поскольку pivot-таблица имеет только 12 строк, большинство SQL-движков сохранят результат в кэшовой памяти, так что скорость выполнения запроса весьма велика.
Source: Взято с http://delphiworld.narod.ru
ID: 02603
КроссKylix - возможность под Windows Delphi получать Linux исполняемые файлы

Информация здесь:
http://crosskylix.untergrund.net/
Скачать можно здесь:
http://crosskylix.untergrund.net/crosskylix-100.zip
Author: Remax 
Source: Vingrad.ru http://forum.vingrad.ru
ID: 04632
Category:Kylix
Category:Linux
Кто владелец taskbar buttons (NT)?

=== Кто владелец taskbar buttons (NT)? ===
{
 In this article, I wish to describe the useful undocumented function
 GetTaskmanWindow. The GetTaskmanWindow function returns a handle to
 the window that ownes the taskbar buttons.
 Here is the quoting about taskbar from Microsoft MSDN:
 "The Microsoft® Windows® interface includes a special application desktop
 toolbar called the taskbar.
 The taskbar can be used for such tasks as switching between open
 windows and starting new applications..."
 and "The taskbar includes the Start menu, taskbar buttons,
 a shortcut menu, and a status area...".
 Unfortunately, Win32 API doesn't contain documented
 function that can be used for accessing to the
 taskbar so we should again use an undocumented way.
 Here is the prototype for GetTaskmanWindow:
 function GetTaskmanWindow (): HWND;
 As always, Microsoft doesn't provide us with the exports symbols
 in the User32.lib for this function, so we should load them dynamically using the
 GetProcAddress and GetModuleHandle functions:
}
// getaskmanwnd.cpp (Windows NT/2000)
//
// This example will show you how you can obtain a handle to the
// Windows Taskbar window.
// Translated from C to Delphi by Thomas Stutz
// Original Code:
// (c)1999 Ashot Oganesyan K, SmartLine, Inc
// mailto:ashot@aha.ru, http://www.protect-me.com, http://www.codepile.com
function TaskmanWindow: HWND;
type
 TGetTaskmanWindow = function(): HWND; stdcall;
var
 hUser32: THandle;
 GetTaskmanWindow: TGetTaskmanWindow;
begin
 Result := 0;
 hUser32 := GetModuleHandle('user32.dll');
 if (hUser32 > 0) then
 begin
 @GetTaskmanWindow := GetProcAddress(hUser32, 'GetTaskmanWindow');
 if Assigned(GetTaskmanWindow) then
 begin
 Result := GetTaskmanWindow;
 end;
 end;
end;
procedure ShowTaskmanWindow(bValue: Boolean);
var
 hTaskmanWindow: Hwnd;
begin
 hTaskmanWindow := TaskmanWindow;
 if hTaskmanWindow <> 0 then
 begin
 ShowWindow(GetParent(hTaskmanWindow), Ord(bValue));
 end;
end;
// Example to Hide the Taskman Window
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowTaskmanWindow(False);
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 01775
Лимит на время выполнения программы

=== Лимит на время выполнения программы ===
{
 In der Projekt Datei (.dpr):
 In your project's file (.dpr):
}
uses
 Forms, Sysutils, Dialogs,
 MyProgr in my_prog1.pas {Form1};
const
 email = 'my.mail@provider.xyz';
 homepage = 'http://www.myhomepage.com';
 // Limit the execution time to 04/21/2003.
 // Gultigkeit auf 21. April 2003 begrenzen.
 YearExp = 2003;
 MonthExp = 4;
 DayExp = 21;
function CheckDate(y, m, d: Integer): Boolean;
begin
 Result := True;
 if (Date > EncodeDate(y, m, d)) then
 begin
 ShowMessage('End of usage exceeded. Download a new'+
 'version at' + ^j + homepage+ ^j + ' or contact: ' + email);
 Result := False;
 // halt;
 end;
end;
{$R *.RES}
begin
 if CheckDate(YearExp, MonthExp, DayExp) then
 begin
 Application.Initialize;
 Application.Title := 'Some Title';
 Application.CreateForm(TForm1, Form1);
 Application.Run;
 end;
end.
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 02153
Линза

Реализация 1 - на Паскале.
Если линза на экpане - окpужность (x0, y0, r0), то в точках (x, y), для котоpых
 (x-x0)2 + (y-y0)2 <= r02
pисуется точка, котоpая, если бы линзы не было, изобpажалась бы в точке
 (x0 + (x-x0)*k1, y0 + (y-y0)*k)
где
 k = const1 / ([sqrt]((x-x0)2+(y-y0)2) + const2)
Можно заpанее пpосчитать таблицу смещений - array[-r0..r0, -r0..r0] of Integer.
{$A+,B-,D+,E+,F-,G+,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}
uses CRT;
const
 vx0 = 3;
 vy0 = 2;
 v0 = vx0;
 r0 = 50;
 r02 = (r0-v0)*(r0-v0);
 d = r02 * 10 div 10;
type
 TScreenType = array[0..199, 0..319] of Byte;
 TDispType = array[-r0..r0, -r0..r0] of Integer;
var
 Screen : TScreenType absolute $a000:$0000;
 Buffer1, Buffer2 : ^TScreenType;
 Disp : ^TDispType;
 x, y, vx, vy,
 r2, c : LongInt;
procedure Move(var A, B; Count: Word); assembler;
asm
 push ds
 mov cx, Count
 les di, B
 lds si, A
 shr cx, 1
 jz @zero
 rep movsw
@zero:
 pop ds
end;
begin
 asm
 mov ax, $13
 int $10
 end;
 New(Buffer1);
 New(Buffer2);
 New(Disp);
 FillChar(Screen, SizeOf(Screen), 3);
 y := 0;
 repeat
 for x := 0 to 319 do
 Screen[y, x] := 11;
 Inc(y, 10);
 until y > 199;
 x := 0;
 repeat
 for y := 0 to 199 do
 Screen[y, x] := 11;
 Inc(x, 10);
 until x > 319;
 Move(Screen, Buffer1^, SizeOf(Screen));
 Move(Buffer1^, Screen, 64000);
 for y := -r0 to r0 do
 begin
 for x := -r0 to r0 do
 begin
 r2 := x * x + y * y;
 if r2 > r02 then
 Disp^[y, x] := y * 320 + x
 else
 Disp^[y, x] := (y*(r2+d) div (r02+d))*320 + (x*(r2+d) div (r02+d));
 end;
 end;
 x := r0;
 y := r0;
 vx := vx0;
 vy := vy0;
 repeat
 asm
 mov ax, Integer(y)
 mov bx, 320
 imul bx
 add ax, Integer(x)
 mov di, ax
 mov dx, -r0*320-r0
 les si, Disp
 mov ch, 2*r0+1
 @next_dy:
 mov cl, 2*r0+1
 @next_dx:
 mov es, Word(Disp+2)
 mov bx, es:[si]
 mov es, Word(Buffer1+2)
 mov al, es:[di+bx]
 mov bx, Seg(Screen)
 mov es, bx
 mov bx, dx
 mov es:[di+bx], al
 add si, 2
 inc dx
 dec cl
 jnz @next_dx
 add dx, 320-(2*r0+1)
 dec ch
 jnz @next_dy
 end;
 if ((x + vx) >= r0) and ((x + vx) <= 319 - r0) then
 Inc(x, vx)
 else
 vx := -vx;
 if ((y + vy) >= r0) and ((y + vy) <= 199 - r0) then
 Inc(y, vy)
 else
 vy := -vy;
 Delay(25);
 until Port[$60] = $01;
 Dispose(Buffer1);
 Dispose(Buffer2);
 Dispose(Disp);
 asm
 mov ax, $03
 int $10
 end;
end.
Source: http://algolist.manual.ru
ID: 04244
Category:Алгоритмы
Category:Математика
Category:Графика
Category:Assembler
Ловушки в Windows

=== Ловушки в Windows ===
Для отслеживания каких-то событий во всей Windows нужно установить ловушку (hook). Например, такая ловушка может отслеживать все события, связанные с мышью, где бы ни находился курсор. Можно отслеживать и события клавиатуры.
Для ловушки нужна функция, которая, после установки ловушки при помощи SetWindowsHookEx, будет вызываться при каждом нужном событии. Эта функция получает всю информацию о событии. UnhookWindowsHookEx уничтожает ловушку.
Эта программа отслеживает все сообщения, связанные с мышью и клавиатурой. CheckBox1 показывает состояние левой клавиши мыши, CheckBox2 показывает состояние правой клавиши мыши, а CheckBox3 показывает, нажата ли какая-либо клавиша на клавиатуре.
var
 HookHandle: hHook;
function HookProc(Code: Integer; WParam: Word; LParam: LongInt): LongInt; stdcall;
var
 msg: PEVENTMSG;
begin
 if Code >= 0 then
 begin
 Result := 0;
 msg := Pointer(LParam);
 with Form1 do
 case msg.Message of
 WM_MOUSEMOVE: Caption := IntToStr(msg.ParamL) + #32 + IntToStr(msg.ParamH);
 WM_LBUTTONDOWN: CheckBox1.Checked := True;
 WM_LBUTTONUP: CheckBox1.Checked := False;
 WM_RBUTTONDOWN: CheckBox2.Checked := True;
 WM_RBUTTONUP: CheckBox2.Checked := False;
 WM_KEYUP: CheckBox3.Checked := False;
 WM_KEYDOWN: CheckBox3.Checked := True;
 end;
 end
 else
 Result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 Form1.FormStyle := fsStayOnTop;
 CheckBox1.Enabled := False;
 CheckBox1.Caption := 'left button';
 CheckBox2.Enabled := False;
 CheckBox2.Caption := 'right button';
 CheckBox3.Enabled := False;
 CheckBox3.Caption := 'keyboard';
 HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 if HookHandle <> 0 then
 UnhookWindowsHookEx(HookHandle);
end;
ID: 02223
Локальный общий доступ

=== Локальный общий доступ ===
...я так понимаю, что LocalShare относится к ситуации, когда другие не-IDAPI приложения могут одновременно иметь доступ к одним и тем же файлам...
Примерно на такие мысли наталкивает поставляемая документация... к сожалению это не так.
LOCALSHARE=False говорит BDE о том, что он должен сам решать при необходимости вопрос о блокировке таблицы/записи в типичных ситуациях, например, когда BDE 'думает' что таблица находится на локальном диске он выключает блокировку для увеличения скорости доступа. К сожалению, логические диски общего пользования в сетях 'p-t-p' программно идентифицируются как локальные с предсказуемо липовыми результатами. Установка LOCALSHARE=True заставляет блокирующий механизм 'включаться' для всех дисков и, следовательно, решает эту проблему.
Сборник Kuliba
Author: Eryk Bottomley
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 02611
Манипулирование кнопками OpenDialog

=== Манипулирование кнопками OpenDialog ===
uses
 CommCtrl;
// Example: Hide the "Create New Folder" Button.
procedure TForm1.OpenPictureDialog1Show(Sender: TObject);
const
 TB_BTN_NEWFOLDER = 40962;
var
 hWndToolbar, wnd: HWND;
 tbInfo: TTBButtonInfoA;
begin
 tbInfo.cbSize := SizeOf(TTBButtonInfo);
 tbInfo.dwMask := TBIF_STATE;
 tbinfo.fsState := TBSTATE_HIDDEN or TBSTATE_INDETERMINATE;
 hWndToolbar := FindWindowEx(GetParent((Sender as TOpenPictureDialog).Handle), 0,
 'ToolbarWindow32', nil);
 SendMessage(hWndToolbar, TB_SETBUTTONINFO, TB_BTN_NEWFOLDER, LParam(@tbinfo));
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 01208
Манипуляция словами в TStringGrid

=== Манипуляция словами в TStringGrid ===
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var
 s: string;
 c: Byte;
begin
 with StringGrid1 do
 s := Cells[Col, Row];
 if Length(s) = 0 then
 begin
 if Key in ['a'..'z'] then
 begin
 c := Ord(Key) - 32;
 Key := Chr(c);
 end;
 exit;
 end;
 if s[Length(s)] = ' ' then
 if Key in ['a'..'z'] then
 begin
 c := Ord(Key) - 32;
 Key := Chr(c);
 end;
end;
// В обработчике события onKeyPress сделайте следующее:
if length(field.text) = 0 then
 key := upCase (key);
Source: http://delphiworld.narod.ru/
ID: 01097
Массив Edit-компонентов

=== Массив Edit-компонентов ===
procedure DoSomethingWithEditControls;
var
 K: Integer;
 EditArray: array[0..99] of Tedit;
begin
 try
 for K := 0 to 99 do
 begin
 EditArray[K] := TEdit.Create(Self);
 EditArray[K].Parent := Self;
 { Устанавливаем необходимые свойства TEdit }
 SetSomeOtherPropertiesOfTEdit;
 Left := 100;
 Top := K * 10;
 { Что-то делаем при перемещении мыши }
 OnMouseMove := WhatToDoWhenMouseIsMoved;
 end;
 { Делаем все что хотим с полученным массивом Edit-компонентов }
 DoWhateverYouWantToDoWithTheseEdits;
 finally
 for K := 0 to 99 do
 EditArray[K].Free;
 end;
end;
Source: http://delphiworld.narod.ru/
ID: 00978
----
...массив ячеек TEdit будет просто замечательным, но я не могу понять как мне их создавать и делать видимыми. 
Допустим, если они имеют имена с Edit1 по Edit 9, то можно попробовать сделать так:
var
 eds: array[1..3, 1..3] of TEdit;
 ix: integer;
 ed: TEdit;
begin
 for ix := 0 to 8 do 
 begin
 ed := FindComponent('Edit' + IntToStr(ix+1)) as TEdit;
 if ed <> nil then 
 eds[ix div 3 + 1, ix mod 3 + 1] := ed;
 end;
end;
Затем, допустим, вам захотелось скопировать текст из строки 1 в строку 2:
for ix := 1 to 3 do
 eds[2, ix].Text := eds[1, ix].Text;
Source: http://delphiworld.narod.ru/
ID: 00979
Массив без ограничения типа и размера

=== Массив без ограничения типа и размера ===
// к примеру опишем свой тип
type
 MyType = record
 zap1: longword;
 zap2: char;
 zap3: string[10];
 end;
// опишем НЕОГРАНИЧЕННЫЙ массив переменный типа MyType
// хотя, может использоваться абсолютно любой
var
 m: array of MyType;
//...
 
procedure TForm1.Button1Click(Sender: TObject);
var i: byte;
begin
 for i := 0 to 9 do // нумерация элементов начинается с нуля!
 begin
 SetLength(m, Length(m) + 1); // увеличение длины массива на 1
 m[i].zap1 := i; // присвоение
 m[i].zap2 := Chr(i); // полям
 m[i].zap3 := IntToStr(i); // значений
 end;
end;
//...
SetLength(m, 0); // освобождение памяти
end.
C Уважением,
Сергей Дьяченко, sd@arzamas.nnov.ru
Сборник Kuliba
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 00244
Масштабирование для Canvas

procedure SetCanvasZoomFactor(Canvas: TCanvas; AZoomFactor: Integer);
var
 i: Integer;
begin
 if AZoomFactor = 100 then
 SetMapMode(Canvas.Handle, MM_TEXT)
 else
 begin
 SetMapMode(Canvas.Handle, MM_ISOTROPIC);
 SetWindowExtEx(Canvas.Handle, AZoomFactor, AZoomFactor, nil);
 SetViewportExtEx(Canvas.Handle, 100, 100, nil);
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 bitmap: TBitmap;
begin
 bitmap := TBitmap.Create;
 try
 bitmap.Assign(Form1.image1.Picture.Bitmap);
 SetCanvasZoomFactor(bitmap.Canvas, 70);
 Canvas.Draw(30, 30, bitmap);
 finally
 bitmap.Free
 end;
end;
Source: http://www.swissdelphicenter.ch
ID: 03837
----
== См. также ==
* How to scale bitmap by percent?
* Изменение размера
* Растягивание изображения
* Масштабирование для Canvas
* Создание уменьшенной копии картинки
* Качественное увеличение изображения билинейной интерполяцией
Category:Графика
Category:Bitmap
Category:WinAPI
Масштабирование окон приложений, в зависимости от разрешения экрана

1. В ранней стадии создания приложения решите для себя хотите ли вы позволить форме масштабироваться. Преимущество немасштабируемой формы в том, что ничего не меняется во время выполнения. В этом же заключается и недостаток (ваша форма может бать слишком маленькой или слишком большой в некоторых случаях).
2. Если вы не собираетесь делать форму масштабируемой, установите свойство Scaled = False и дальше не читайте. В противном случае Scaled = True.
3. Установите AutoScroll = False. AutoScroll = True означает не менять размер окна формы при выполнении что не очень хорошо выглядит, когда содержимое формы размер меняет.
4. Установите фонты в форме на TrueType фонты, например Arial. Если такого фонта не окажется на пользовательском компьютере, то Windows выберет альтернативный фонт из того же семейства. Этот фонт может не совпадать по размеру, что вызовет проблемы.
5. Установите свойство Position в любое значение, отличное от poDesigned. poDesigned оставляет форму там, где она была во время дизайна, и, например, при разрешении 1280x1024 форма окажется в левом верхнем углу и совершенно за экраном при 640x480.
6. Оставляйте по крайней мере 4 точки между компонентами, чтобы при смене положения границы на одну позицию компоненты не "наезжали" друг на друга. Для однострочных меток (TLabel) с выравниванием alLeft или alRight установите AutoSize = True. Иначе AutoSize = False.
7. Убедитесь, что достаточно пустого места у TLabel для изменения ширины фонта - 25% пустого места многовато, зато безопасно. При AutoSize = False Убедитесь, что ширина метки правильная, при AutoSize = True убедитесь, что есть свободное место для роста метки.
8. Для многострочных меток (word-wrapped labels), оставьте хотя бы одну пустую строку снизу.
9. Будьте осторожны при открытии проекта в среде Delphi при разных разрешениях. Свойство PixelsPerInch меняется при открытии формы. Лучше тестировать приложения при разных разрешениях, запуская готовый скомпилированный проект, а редактировать его при одном разрешении. Иначе это вызовет проблемы с размерами.
10. Не изменяйте свойство PixelsPerInch!
11. В общем, нет необходимости тестировать приложение для каждого разрешения в отдельности, но стоит проверить его на 640x480 с маленькими и большими фонтами и на более высоком разрешении перед продажей.
12. Уделите пристальное внимание принципиально однострочным компонентам типа TDBLookupCombo. Многострочные компоненты всегда показывают только целые строки, а TEdit покажет урезанную снизу строку. Каждый компонент лучше сделать на несколько точек больше.
Author: Song
ID: 04528
Category:Разработка приложений
Category:Оптимизация и отладка
Масштабирование размера формы и размера шрифтов

=== Масштабирование размера формы и размера шрифтов ===
Когда мои программы работают на системах с установленными маленькими шрифтами, я получаю странный вид моей формы. К примеру, расположенные на форме компоненты Label становятся малы для размещения указанного теста, обрезая его в правой или нижней части. StringGrid не осуществляет положенного выравнивания и т.д. 
Попробуй следующий код. Он масштабирует как размер формы, так и размер шрифтов. Вызывай его в Form.FormCreate. Надеюсь это поможет. 
unit geScale;
interface
uses Forms, Controls;
procedure geAutoScale(MForm: TForm);
implementation
type
 TFooClass = class(TControl); { необходимо выяснить защищенность }
 { свойства Font }
procedure geAutoScale(MForm: TForm);
const
 cScreenWidth: integer = 800;
 cScreenHeight: integer = 600;
 cPixelsPerInch: integer = 96;
 cFontHeight: integer = -11; { В режиме проектирование значение из Font.Height }
var
 i: integer;
begin
 {
 ВАЖНО!! : Установите в Инспекторе Объектов свойство Scaled TForm в FALSE.
 Следующая программа масштабирует форму так, чтобы она выглядела одинаково
 вне зависимости от размера экрана и пикселей на дюйм. Расположенный ниже
 участок кода проверяет, отличается ли размер экрана во время выполнения
 от размера во время проектирования. Если да, Scaled устанавливается в True
 и компоненты снова масштабируются так, чтобы они выводились в той же
 позиции экрана, что и во время проектирования.
 }
 if (Screen.width &; lt > cScreenWidth) or (Screen.PixelsPerInch <>
 cPixelsPerInch) then
 begin
 MForm.scaled := TRUE;
 MForm.height := MForm.height * screen.Height div cScreenHeight;
 MForm.width := MForm.width * screen.width div cScreenWidth;
 MForm.ScaleBy(screen.width, cScreenWidth);
 end;
 {
 Этот код проверяет, отличается ли размер шрифта во время выполнения от
 размера во время проектирования. Если во время выполнения pixelsperinch
 формы отличается от pixelsperinch во время проектирования, шрифты снова
 масштабируются так, чтобы форма не отличалась от той, которая была во
 время разработки. Масштабирование производится исходя из коэффициента,
 получаемого путем деления значения font.height во время проектирования
 на font.height во время выполнения. Font.size в этом случае работать не
 будет, так как это может дать результат больший, чем текущие размеры
 компонентов, при этом текст может оказаться за границами области компонента.
 Например, форма создана при размерах экрана 800x600 с установленными
 маленькими шрифтами, имеющими размер font.size = 8. Когда вы запускаете
 в системе с 800x600 и большими шрифтами, font.size также будет равен 8,
 но текст будет бОльшим чем при работе в системе с маленькими шрифтами.
 Данное масштабирование позволяет иметь один и тот же размер шрифтов
 при различных установках системы.
 }
 if (Screen.PixelsPerInch <> cPixelsPerInch) then
 begin
 for i := MForm.ControlCount - 1 downto 0 do
 TFooClass(MForm.Controls[i]).Font.Height :=
 (MForm.Font.Height div cFontHeight) *
 TFooClass(MForm.Controls[i]).Font.Height;
 end;
end;
end.
Source: Взято с http://delphiworld.narod.ru
ID: 01928
Масштабирование формы под разрешение экрана

=== Масштабирование формы под разрешение экрана ===
Эта подпрограмма сделает жизнь программиста намного легче. Она делает так, чтобы ваша программа корректно масштабировалась при ЛЮБОМ разрешении экрана. Обратите внимание на число 640. Дело в том, что я разрабатываю свои приложения при разрешении 640x480. Вы можете настроить подпрограмму на ваше экранное разрешение при разработке программ и больше не беспокоиться о всевозможных низких и больших разрешений ваших пользователей. Разместите в обработчике события формы (которую вы хотите автомасштабировать) OnCreate следующую строку:
AdjustResolution(Self);
{ AdjustResolution ******************************************************* }
{ Данная процедура масштабирует все дочерние формы данной формы для }
{ соответствия текущему разрешению }
{ ************************************************************************ }
procedure AdjustResolution(AForm: TForm);
var
 iPercentage: Integer;
begin
 if Screen.Width > 640 then
 begin
 iPercentage := Round(((Screen.Width-640)/640)*100)+100;
 AForm.ScaleBy(iPercentage, 100);
 end;
end;
Source: http://delphiworld.narod.ru/
ID: 00810
Математика времени

=== Математика времени ===
Работа с временными величинами в Delphi очень проста, если пользоваться встроенными функциями преобразования. Определите глобальные Hour, Minute, Second и инициализируйте их следующим образом: 
Hour := EncodeTime(1,0,0,0);
Minute := EncodeTime(0,1,0,0);
Second := EncodeTime(0,0,1,0);
Или, если вы предпочитаете константы, сделайте так: 
Hour = 3600000 / MSecsPerDay;
Minute = 60000 / MSecsPerDay;
Second = 1000 / MSecsPerDay;
Теперь для того, чтобы добавить 240 минут к переменной TDateTime, просто сделайте 
T := T + (240 * Minute);
Source: http://delphiworld.narod.ru
ID: 00764
----
Есть более простой путь для работы с датой и временем чем прибегать к функциям зашитым в DateUtil. На самом деле тип TDateTime является обычным real - числом с плавающей точкой, который содержит количество дней прошедших с 30 декабря 1899 года (под Windows) или с 1 января 1900 года под Linux. Таким образом целая часть - есть дни. Чтобы взять дату днём позже достаточно просто прибавить 1, неделей позже - прибавить 7. Дробная часть даты это время, причём в днях, т.е. 1 час это 1/24 или 0.0416(6), 1 минута будет равна 1 / (24 * 60), а одна секунда соответственно 1 / (24 * 3600). Ну дальше всё просто... не сложнее арифметики за 3 класс очень средней школы...
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
ID: 00765
Меню дочерних MDI-форм

=== Меню дочерних MDI-форм ===
Так как MDI-приложения всегда объединяют меню дочерних окон с главным меню родительского окна, вы можете установить определенное значение для указания позиции элементов меню в новой, объединенной строке меню. Это называется индексом группы. Но работает оно только для видимых пунктов меню. 
Так, например, если ваше MDI-меню имеет:
 [Файл] [Вид] [О программе] 
(со значениями индексов групп 1 5 10) (Значения не имеют никакого значения (извините за невольный каламбур), они используются только лишь для сортировки), 
а меню дочерней MDI-формы имеет:
 [Файл] [Редактирование]
(и им присвоены значения 1 и 3), 
то при открытии дочернего MDI-окна пункт меню [Файл] заменит соответствующий пункт меню родительской MDI-формы. Пункт меню [Редактирование] будет расположен перед пунктами [Вид] и [О программе] родительской формы. 
Это может оказаться весьма полезным, поскольку меню [Файл] MDI-формы в нормальной ситуации может содержать меньшее количество пунктов меню по сравнению с ситуацией, когда имеется открытая дочерняя MDI-форма. 
К примеру, в описанной выше ситуации в меню [Файл] MDI-формы необходимы только пункты [Сохранить] или [Закрыть], а в случае отсутствия дочерних окон - [Открыть] и [Новое]. 
Все описанные выше пункты вы должны ввести в меню дочерней формы, поскольку оно заменит существующий пункт [Файл]. 
Вы все еще можете использовать код родительской формы в дочерней. 
Так, если у вас имеется процедура "parent.open1click", вы можете вызывать ее из меню [Файл] дочернего окна после его открытия.
Source: Взято с http://delphiworld.narod.ru
ID: 00495