nyuuzyou/wikis huggingface dataset:
Использование многомерных массивов в процедурах и функциях из Math.pas

{ **** UBPFD *********** by kladovka.net.ru ****
>> Использование многомерных массивов в процедурах и функциях из Math.pas
Многим процедурам и функциям из Math.pas в качестве одного из параметров требуется одномерный открытый массив, например:
function Mean(const Data: array of Double): Extended;
function Sum(const Data: array of Double): Extended;
function MinValue(const Data: array of Double): Double;
function MaxValue(const Data: array of Double): Double;
Эти процедуры и функции можно применить также для работы с многомерными массивами или подмассивами одномерного массива, приводя их тип и заменяя описание открытого массива на пару "Data: pointer; Bound: integer", где первый параметр - указатель на первый обрабатываемый элемент массива, второй - количество обрабатываемых элементов минус 1.
Например, для доступа к функции MaxIntValue можно использовать тип:
TMaxIntValue = function(Data: Pointer; Bound: Integer): Integer;
Зависимости: Math
Автор: Александр Шарахов, alsha@mailru.com, Москва
Copyright: Александр Шарахов
Дата: 18 января 2003 г.
********************************************** }
type // Тип для доступа к MaxIntValue
 TMaxIntValue = function(Data: Pointer; Bound: Integer): Integer;
Пример использования:
type // Тип для доступа к MaxIntValue
 TMaxIntValue = function(Data: Pointer; Bound: Integer): Integer;
var
 a: array[1..2, 1..2, 1..2] of Integer;
 b: Integer;
begin
 // Эквивалент для b := MaxIntValue(a); если бы так можно было писать
 b := TMaxIntValue(@MaxIntValue)(@a, SizeOf(a) div SizeOf(Integer)-1);
end;
Author: Александр Шарахов
ID: 04254
Category:Алгоритмы
Category:Математика
Использование модуля ShareMem

=== Использование модуля ShareMem ===
Если динамическая библиотека в процессе работы использует переменные или функции, осуществляющие динамическое выделение памяти под собственные нужды (длинные строки, динамические массивы, функции New и GetMem), а также, если такие переменные передаются в параметрах и возвращаются в результатах, то в таких библиотеках обязательно должен использоваться модуль ShareMem. При этом в секции uses модуль должен располагаться на первом месте. Об этом напоминает комментарий, автоматически добавляемый в файл динамической библиотеки при создании (см. листинг 28.1). 
Управление этими операциями осуществляет специальный диспетчер печати BORLANDMM.DLL. Он должен распространяться вместе с динамическими библиотеками, использующими модуль ShareMem. 
ID: 01994
Использование нумерации в TFields

=== Использование нумерации в TFields ===
Я хочу хранить журнал транзакций в таблице Paradox и хотел бы писать и читать коды транзакций вместо простых целых чисел, которые они представляют в данный момент...
Можете попробовать сделать так:
type TCodes = (c1, c2, c3, c4);
var code: TCodes;
code := TCodes(Table1Field1.AsInteger);
if code in [c2, c4] then .....
 Table1Field1.AsInteger := Integer(code);
Source: Взято с http://delphiworld.narod.ru
ID: 02613
Использование обработчика OnHint при наличии нескольких форм

=== Использование обработчика OnHint при наличии нескольких форм ===
В Online Help и в Visual Component Library Reference описан пример обработчика
события OnHint объекта TApplication. Пример показывает, как можно использовать
панель для отображения подсказок (hint), связанных с другими компонентами. В
примере обработчик OnHint устанавливается во время обработки события OnCreate
для формы; в программе, включающей более чем одну форму, будет трудно
использовать эту технику.
Перемещение присваивания обработчика OnHint из события OnCreate формы в
событие OnActivate позволит различным формам данного приложения работать с
подсказками, как им нужно.
Ниже приведен измененный пример из OnLine Help и VCL Reference.
type
 TForm1 = class(TForm)
 Button1: TButton;
 Panel1: TPanel;
 Edit1: TEdit;
 procedure FormActivate(Sender: TObject);
 private
 { Private declarations }
 public
 procedure DisplayHint(Sender: TObject);
 end;
implementation
{$R *.DFM}
procedure TForm1.DisplayHint(Sender: TObject);
begin
 Panel1.Caption := Application.Hint;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
 Application.OnHint := DisplayHint;
end;
Source: http://dmitry9.nm.ru/info/
ID: 01281
Использование русских кодировок приводит к ошибке

=== Использование русских кодировок приводит к ошибке ===
Я установил Delphi X.0 C/S, но почему-то использование русских кодировок приводит к ошибке ?
Проблемы с созданием БД с кодировкой WIN1251 могут быть если у Вас бета-версия Delphi. Еще одна причина - пробелы в имени каталога, в котором находятся файлы локального IB (Program Files\Borland\Delphi X.0\IntrBase), или база данных (gdb-файл).
Если вам не хочется переустанавливать IB, то вы можете сделать следующее:
* предварительно выгрузив локальный IB (если он виден на TaskBar), переместите каталог IntrBase в каталог, не содержащий в имени пробелов или на диск C: (C:\IntrBase).
* Запустите RegEdit. В Registry реально к IB имеют отношение две строки: автоматический запуск Local IB и путь к файлу лицензии IB.
* Найдите эти две строки и измените путь в этих строках на новый.
Author: Дмитрий Кузьменко (http://www.ibase.ru)
ID: 02878
Category:Базы данных
Category:Interbase
Использование табличных переменных

=== Использование табличных переменных ===
Табличные переменные объявляются очень похоже на запрос по созданию таблиц и могут использоваться как обычные таблицы
Declare @MyMemoryTable Table (id int, Field1 varchar(30))
Insert into @MyMemoryTable
Select ID, Field1 From MyTable Where Field2=0
Select * From @MyMemoryTable
Примечания:
# Табличные переменные чрезвычайно эффективны как временное хранилище данных небольшого размера, они более эффективны чем временные таблицы. Следует их использовать везде где только можно вместо временных таблиц
# Не следует использовать табличные переменные при количестве записей больше нескольких тысяч
# Табличные переменные нельзя передавать как параметры в процедуры и функции
# Табличные переменные не поддерживают вставку из SELECT ... INTO ... Следующий код работать не будет:
SELECT * INTO @MyTempTable FROM MyTable
Author: Vit
ID: 02813
Category:Базы данных
Category:MS SQL Server
Category:T-SQL
Использование указателей на целое

=== Использование указателей на целое ===
Сначала вы должны создать тип:
type PInteger: ^Integer;
var MyPtr: PInteger;
Мне кажется, что в начале вы использовали плохой пример, имеет смысл использовать 32-битный указатель для 16-битной величины или распределять 10 байт для переменной. 
Pascal позволяет вам использовать методы NEW и DISPOSE, которые автоматически распределяют и освобождают правильные размеры блока. 
Например:
New(MyPtr) = GetMem(MyPtr, SizeOf(MyPtr))
Возможно, вы захотите подсчитать количество целочисленных переменных. В этом случае ознакомьтесь с возможностями TList. Пока лучше используйте линейный массив (или указатель на первый элемент, чтобы вычислить их количество, достаточно разделить количество занимаемой массивом памяти на количество элементов). 
Для полноты, это должно быть:
New(MyPtr) = GetMem(MyPtr, SizeOf(MyPtr^));
SizeOf(MyPtr) всегда будет равен 4 байта, как 16-битный указатель. 
Если я правильно разобрался в том, что вы хотите (динамический массив целых, количество элементов которого может быть известно только во время выполнения приложения), вы можете сделать так:
type
 pIntArr = ^IntArr;
 IntArr = Array[1..1000] of Integer;
var
 MyPtr : pIntArr;
begin
 GetMem(MyPtr, 10); { 10 = SizeOf(Integer) * 5 !!)
 { MyPtr[2]:=1; }
 // <<<< Заполняем массив >>>>
 MyPtr[2]^:=1;
 FreeMem(MyPtr,10);
end;
Технология похожа на ту, которая Delphi использует при работе с pchar. Синтаксис очень похож:
type
 intarray = array[0..20000] of integer;
procedure TForm1.Button1Click(Sender: TObject);
var
 xptr: ^IntArray;
begin
 GetMem(xptr, 10);
 xptr^[idx] := 1; { где idx от 0 до 4, поскольку мы
 имеем 10 байте = 5 целых }
 FreeMem(xptr, 10);
end;
Обратите внимание на то, в вам в действительности нет необходимости распределять массив для 20,000 элементов, но проверка диапазона Delphi не будет работать, если диапазон равен 20,000. (Предостережение будущим пользователям!) 
Source: Взято с http://delphiworld.narod.ru
ID: 00258
Использование функций перечисления WinAPI

=== Использование функций перечисления WinAPI ===
Для получения информации о множественных объектах Windows (окнах, принтерах, шрифтах, настройках экрана и так далее - всего несколько десятков вариантов) используются функции, начинающиеся с Enum. Эти функции работают по принципу, аналогичному итератору TCollection.FirstThat, то есть они вызывают функцию, переданную им в качестве параметра для каждого перечисляемого объекта, передавая ей в параметрах данные объекта и, в последнем параметре, указатель на пользовательские данные, переданный функции EnumXXX. Перечисление продолжается до тех пор, пока не будут перечислены все объекты. Немедленно прекратить перечисление можно, возвратив False. Ниже приведен пример заполнения списка ListBox1 данными по всем окнам Windows в виде " класс - заголовок" по нажатию кнопки Button1. 
function AddWinInfo(WinHandle: HWnd; List: TStringList): Boolean; stdcall;
var
 WinCaption, WinClass: array[0..255] of Char;
begin
 Result := True;
 GetClassName(WinHandle, WinClass, SizeOf(WinClass));
 GetWindowText(WinHandle, WinCaption, SizeOf(WinCaption));
 List.Add(WinClass + ' - ' + WinCaption);
end;
procedure TfrmMain.Button1Click(Sender: TObject);
begin
 with ListBox1, Items do
 begin
 Clear;
 EnumWindows(@AddWinInfo, LParam(Items));
 end;
end;
Source: Взято с http://delphiworld.narod.ru
ID: 02025
Category:WinAPI
Использовать TTime для более 24 часов

=== Использовать TTime для более 24 часов ===
function TextToTime(S: string): Integer;
var
 p, i: Integer;
 Sh, Sm, Ss: string;
begin
 Sh := ;
 SM := ;
 SS := ;
 i := 1;
 p := 0;
 while i do
 begin
 if (s[i] <> ':') then
 begin
 case P of
 0: SH := Sh + s[i];
 1: SM := SM + S[i];
 2: SS := SS + S[i];
 end;
 end
 else
 Inc(p);
 Inc(i);
 end;
 try
 Result := (StrToInt(SH) * 3600) + (StrToInt(SM) * 60) + (StrToInt(SS))
 except
 Result := 0;
 end;
end;
function TimeToText(T: Integer): string;
var
 H, M, S: string;
 ZH, ZM, ZS: Integer;
begin
 ZH := T div 3600;
 ZM := T div 60 - ZH * 60;
 ZS := T - (ZH * 3600 + ZM * 60);
 if ZH then H := '0' + IntToStr(ZH)
 else
 H := IntToStr(ZH);
 if ZM then M := '0' + IntToStr(ZM)
 else
 M := IntToStr(ZM);
 if ZS then S := '0' + IntToStr(ZS)
 else
 S := IntToStr(ZS);
 Result := H + ':' + M + ':' + S;
end;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 00776
Исправление загрузки RTF текста через поток

=== Исправление загрузки RTF текста через поток ===
В версии Borland Delphi 3 Client/Server я обнаружил, что при загрузке текста формата RTF методом "LoadFromStream" в компонент TRichEdit он не интерпретируется как RTF, а отображается полностью (со всеми управляющими символами). Разбираясь в исходном тексте модуля COMCTRLS.PAS (дата создания: 4 августа 1997 года, размер: 391728 байт) я нашел причину, из-за которой вышеуказанный метод не работал как надо. Ниже я привожу исходный и исправленный тексты реализации метода "TRichEditStrings.LoadFromStream" (измененные строки отмечены символом "!"): 
1. Исходный текст
procedure TRichEditStrings.LoadFromStream(Stream: TStream);
var
 EditStream: TEditStream;
 Position: Longint;
 TextType: Longint;
 StreamInfo: TRichEditStreamInfo;
 Converter: TConversion;
begin
 StreamInfo.Stream := Stream;
 if FConverter <> nil then
 Converter := FConverter
 else
 Converter := RichEdit.DefaultConverter.Create;
 StreamInfo.Converter := Converter;
 try
 with EditStream do
 begin
 dwCookie := LongInt(Pointer(@StreamInfo));
 pfnCallBack := @StreamLoad;
 dwError := 0;
 end;
 Position := Stream.Position;
 if PlainText then
 TextType := SF_TEXT
 else
 TextType := SF_RTF;
 SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));
 if (TextType = SF_RTF) and (EditStream.dwError <> 0) then
 begin
 Stream.Position := Position;
 {!} if PlainText then
 TextType := SF_RTF
 {!}
 else
 TextType := SF_TEXT;
 SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));
 if EditStream.dwError <> 0 then
 raise EOutOfResources.Create(sRichEditLoadFail);
 end;
 finally
 if FConverter = nil then
 Converter.Free;
 end;
end;
2. Текст с исправлением:
procedure TRichEditStrings.LoadFromStream(Stream: TStream);
var
 EditStream: TEditStream;
 Position: Longint;
 TextType: Longint;
 StreamInfo: TRichEditStreamInfo;
 Converter: TConversion;
begin
 StreamInfo.Stream := Stream;
 if FConverter <> nil then
 Converter := FConverter
 else
 Converter := RichEdit.DefaultConverter.Create;
 StreamInfo.Converter := Converter;
 try
 with EditStream do
 begin
 dwCookie := LongInt(Pointer(@StreamInfo));
 pfnCallBack := @StreamLoad;
 dwError := 0;
 end;
 Position := Stream.Position;
 if PlainText then
 TextType := SF_TEXT
 else
 TextType := SF_RTF;
 SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));
 if (TextType = SF_RTF) and (EditStream.dwError <> 0) then
 begin
 Stream.Position := Position;
 {!} if PlainText then
 TextType := SF_TEXT
 {!}
 else
 TextType := SF_RTF;
 SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream));
 if EditStream.dwError <> 0 then
 raise EOutOfResources.Create(sRichEditLoadFail);
 end;
 finally
 if FConverter = nil then
 Converter.Free;
 end;
end;
Исчезает главное меню Delphi, почему?

===== Исчезает главное меню Delphi, почему? =====
Дельфи до 6й версии неправильно распознают профили пользователей в 2000/XP. Надо установить Дельфи под тем пользователем под которым будете его использовать.
Source: http://forum.vingrad.ru
ID: 00004
Как, зная Handle окна программы, определить имя EXE?

=== Как, зная Handle окна программы, определить имя EXE? ===
function ExeNameByHandle(aWinHandle:HWND):string;
// Для начала определяешь какому процессу принадлежит окно:
var pProcID: ^DWORD;
begin
 GetMem(pProcID, SizeOf(DWORD));
 GetWindowThreadProcessId(aWinHandle, pProcID);
 Result := GetExeNameByProcID(pProcID^);
 FreeMem(pProcID);
end;
// а после этого используешь TProcessEntry32 примерно так:
function GetExeNameByProcID(ProcID: DWord): string;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
 Result := ;
 while (Integer(ContinueLoop) <> 0) and (Result = ) do
 begin
 if FProcessEntry32.th32ProcessID = ProcID then
 Result := FProcessEntry32.szExeFile;
 ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;
 CloseHandle(FSnapshotHandle);
end;
// Не забудь в uses добавить Tlhelp32
Код исправлен Мыш
Source: Взято из http://forum.sources.ru
ID: 02111
Как ListView перевести в режим редактирования по нажатию на F2

=== Как ListView перевести в режим редактирования по нажатию на F2 ===
procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if Ord(Key) = VK_F2 then
 ListView1.Selected.EditCaption;
end;
Source: http://delphiworld.narod.ru/
ID: 01133
Как автоматически заполнить поля формы в IE?

{
 This example shows how to automatically fill in a search string
 in the "Search Tip" page and click the search button.
}
uses
 MSHTML_TLB;
// first navigate to tipspage
procedure TForm1.Button1Click(Sender: TObject);
begin
 Webbrowser1.Navigate('http://www.swissdelphicenter.ch/en/tipsuchen.php');
end;
// Try to access IE instance and fill out the search field with
// a text and click the search button
procedure TForm1.Button3Click(Sender: TObject);
var
 hIE: HWND;
 ShellWindow: IShellWindows;
 WB: IWebbrowser2;
 spDisp: IDispatch;
 IDoc1: IHTMLDocument2;
 Document: Variant;
 k, m: Integer;
 ovElements: OleVariant;
 i: Integer;
begin
 ShellWindow := CoShellWindows.Create;
 // get the running instance of Internet Explorer
 for k := 0 to ShellWindow.Count do
 begin
 spDisp := ShellWindow.Item(k);
 if spDisp = nil then Continue;
 // QueryInterface determines if an interface can be used with an object
 spDisp.QueryInterface(iWebBrowser2, WB);
 if WB <> nil then
 begin
 WB.Document.QueryInterface(IHTMLDocument2, iDoc1);
 if iDoc1 <> nil then
 begin
 WB := ShellWindow.Item(k) as IWebbrowser2;
 begin
 Document := WB.Document;
 // count forms on document and iterate through its forms
 for m := 0 to Document.forms.Length - 1 do
 begin
 ovElements := Document.forms.Item(m).elements;
 // iterate through elements
 for i := 0 to ovElements.Length - 1 do
 begin
 // when input fieldname is found, try to fill out
 try
 if (CompareText(ovElements.item(i).tagName, 'INPUT') = 0) and
 (CompareText(ovElements.item(i).type, 'text') = 0) then
 begin
 ovElements.item(i).Value := 'FindWindow';
 end;
 except
 end;
 // when Submit button is found, try to click
 try
 if (CompareText(ovElements.item(i).tagName, 'INPUT') = 0) and
 (CompareText(ovElements.item(i).type, 'SUBMIT') = 0) and
 (ovElements.item(i).Value = 'Search') then // Suchen fьr German
 begin
 ovElements.item(i).Click;
 end;
 except
 end;
 end;
 end;
 end;
 end;
 end;
 end;
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03515
Category:Связь
Category:WebBrowser
Как автоматически помещать курсор мышки в центр контрола получившего фокус?

=== Как автоматически помещать курсор мышки в центр контрола получившего фокус? ===
Нам потребуется универсальная функция, которую можно будет применять для различных визуальных контролов.
Вот пример вызова нашей функции:
procedure TForm1.Button1Enter(Sender: TObject);
begin
 MoveMouseOverControl(Sender);
end;
Сама функция:
procedure MoveMouseOverControl(Sender: TObject);
var
 Point: TPoint;
begin
 with TControl(Sender) do
 begin
 Point.X := Left + (Width div 2);
 Point.Y := Top + (Height div 2);
 Point := Parent.ClientToScreen(Point);
 SetCursorPos(Point.X, Point.Y);
 end;
end;
Исправлено Stolzen 
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 01586
Как автоматически расширить TEdit?

=== Как автоматически расширить TEdit? ===
Следующий компонент автоматически подстраивается под текст, вводимый в него:
unit ExpandingEdit; 
interface 
uses 
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
 StdCtrls; 
type 
 TExpandingEdit = class(TEdit) 
 private 
 FCanvas: TControlCanvas; 
 protected 
 procedure Change; override; 
 public 
 constructor Create(AOwner: TComponent); override; 
 destructor Destroy; override; 
 end; 
procedure Register; 
implementation 
constructor TExpandingEdit.Create(AOwner: TComponent); 
begin 
 inherited Create(AOwner); 
 FCanvas := TControlCanvas.Create; 
 FCanvas.Control := Self; 
end; 
destructor TExpandingEdit.Destroy; 
begin 
 FCanvas.Free; 
 inherited Destroy; 
end; 
procedure TExpandingEdit.Change; 
const 
 EditMargin = 8; 
var 
 W: Integer; 
begin 
 inherited Change; 
 if not HandleAllocated then Exit; 
 FCanvas.Font := Font; 
 W := FCanvas.TextWidth(Text) + (2 * EditMargin); 
 if (Width < W) then Width := W; 
end; 
procedure Register; 
begin 
 RegisterComponents('Samples', [TExpandingEdit]); 
end; 
end.
Source: Взято из http://forum.sources.ru
ID: 00533
Как активизировать предыдущий экземпляр вашей программы?

=== Как активизировать предыдущий экземпляр вашей программы? ===
Если внутренняя переменная hPrevInst не равна нулю, то она содержит дескриптор предыдущего запущенного экземпляра вашей программы. Вы просто находите открытое окно по его дескриптору и, при необходимости, выводите на передний план. Весь код расположен в файле .DPR file, НЕ в модуле. Строки, которые вам необходимо добавить к вашему .DPR-файлу, в приведенном ниже примере помечены {*}. 
program Once;
uses
{*} WinTypes, WinProcs, SysUtils,
Forms,
Onceu in 'ONCEU.PAS' {Form1};
{$R *.RES}
{*}TYPE
{*} PHWND = ^HWnd;
{*} FUNCTION EnumWndProc(H : hWnd; P : PHWnd) : Integer; Export;
{*} VAR ClassName : ARRAY[0..30] OF Char;
{*} BEGIN
{*} {Если это окно принадлежит предшествующему экземпляру...}
{*} IF GetWindowWord(H, GWW_HINSTANCE) = hPrevInst THEN
{*} BEGIN
{*} {... проверяем КАКОЕ это окно.}
{*} GetClassName(H, ClassName, 30);
{*} {Если это главное окно приложения...}
{*} IF StrIComp(ClassName, 'TApplication') = 0 THEN
{*} BEGIN
{*} {... ищем}
{*}{*} P^ := H;
{*} EnumWndProc := 0;
{*} END;
{*} END;
{*} END;
{*} PROCEDURE CheckPrevInst;
{*} VAR PrevWnd : hWnd;
{*} BEGIN
{*} IF hPrevInst <> 0 THEN
{*} {Предыдущий экземпляр запущен}
{*} BEGIN
{*} PrevWnd := 0;
{*} EnumWindows(@EnumWndProc, LongInt(@PrevWnd));
{*} {Ищем дескриптор окна предыдущего}
{*} {экземпляра и активизируем его}
{*} IF PrevWnd <> 0 THEN
{*} IF IsIconic(PrevWnd) THEN
{*} ShowWindow(PrevWnd, SW_SHOWNORMAL)
{*} ELSE BringWindowToTop(PrevWnd);
{*} Halt;
{*} END;
{*} END;
begin
{*} CheckPrevInst;
Application.Title := 'Once';
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Source: Взято с http://delphiworld.narod.ru
ID: 02044
Как бы мне создать эдакий trackbar в котором вместо широкой белой полоски с ползунком была бы тонкая линия?

=== Как бы мне создать эдакий trackbar в котором вместо широкой белой полоски с ползунком была бы тонкая линия? ===
В примере создается компонент, унаследованный от TTrackbar который переопределяет метод CreateParams и убирает флаг TBS_ENABLESELRANGE из Style. Константа TBS_ENABLESELRANGE объявлена в модуле CommCtrl. 
uses CommCtrl, ComCtrls;
type
 TMyTrackBar = class(TTrackBar)
 procedure CreateParams(var Params: TCreateParams); override;
 end;
procedure TMyTrackBar.CreateParams(var Params: TCreateParams);
begin
 inherited;
 Params.Style := Params.Style and not TBS_ENABLESELRANGE;
end;
var
 MyTrackbar: TMyTrackbar;
procedure TForm1.Button1Click(Sender: TObject);
begin
 MyTrackBar := TMyTrackbar.Create(Form1);
 MyTrackbar.Parent := Form1;
 MyTrackbar.Left := 100;
 MyTrackbar.Top := 100;
 MyTrackbar.Width := 150;
 MyTrackbar.Height := 45;
 MyTrackBar.Visible := true;
end;
ID: 01320
Как быстро выводить графику?

Как быстро выводить графику (a то Canvas очень медленно работает)
Вот пример заполнения формы точками случайного цвета:
type
 TRGB = record
 b, g, r: Byte;
 end;
 ARGB = array[0..1] of TRGB;
 PARGB = ^ARGB;
var
 b: TBitMap;
procedure TForm1.FormCreate(Sender: TObject);
begin
 b := TBitMap.Create;
 b.PixelFormat := pf24bit;
 b.Width := ClientWidth;
 b.Height := ClientHeight;
end;
procedure TForm1.Tim1OnTimer(Sender: TObject);
var
 p: PARGB;
 x, y: Integer;
begin
 for y := 0 to b.Height - 1 do
 begin
 p := b.Scanline[y];
 for x := 0 to b.Width - 1 do
 begin
 p[x].r := Random(256);
 p[x].g := Random(256);
 p[x].b := Random(256);
 end;
 end;
 Canvas.Draw(0, 0, b);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 b.Free;
end;
Source: http://delphiworld.narod.ru
ID: 03723
Category:Графика
Category:Bitmap