nyuuzyou/wikis huggingface dataset:
Duplicate resource error

=== Duplicate resource error ===
When I try to add a resource to my project's .res file, I get a "Duplicate Resource" error when linking. The resource I have added is a unique resource. How can I successfully add the resource to my project?
The projects resource file is generated by the IDE wizard, and is not intended to be modified. To add additional resources to your project, create a separate resource file with a unique name that does not conflict with either the project or any of the unit names. Then to add the resource file to Delphi, simply add the following line to any unit file in the project:
 {$R MyRes.Res}
(where MyRes.Res is the name of the resource file).
To add the resource to Borland's C++ Builder, add the resource 
from the project manager.
ID: 00015
ENoResultSet Error creating cursor handle

=== ENoResultSet Error creating cursor handle ===
Почему не работает Query.Open(Query.ExecSQL)?
Что значит "ENoResultSet Error creating cursor handle"?
:1. Query.Open возвращает результат запроса в виде курсора(Cursor).
Когда мы выполняем запрос «select * from table1» мы получаем Набор данных (Cursor). Можете представит курсор как виртуальную таблицу, со строками и столбцами, определенными в запросе. В этом случае надо использовать Query.Open или Query.Active := True;
:2. Query.ExecSQL выполняет инструкции запроса и курсор не создается.
Если в запросах используются инструкции не создающие набор данных (курсор) - СREATE TABLE, INSERT, DELETE, UPDATE , SELECT INTO и т.д. то нужно вызывать метод ExecSQL.
ID: 02591
EOleSysError - как бороться?

=== EOleSysError - как бороться? ===
Перед тем как Дельфи сможет использовать любые ActiveX/COM (в том числе и ADO компоненты) должна быть выполнена строка Application.Initialize - которая инициализирует использование COM. Если пишется DLL или консольное приложение, которые не имеют объекта Application, то надо просто добавить в Uses ещё один модуль: "oleauto" 
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: http://forum.sources.ru
ID: 00027
Error: RPC Server is unavailable

=== Error: RPC Server is unavailable ===
The error is usually caused because the server can't be located. Make sure you can ping the server machine using the string you typed into the ComputerName property of the TRemoteServer.
You might also want to try using an IP address instead in case there is some problem with your DNS configuration or the hosts file. Try setting the "Default Authentication Level" to (Run DCOMCNFG on the server to do this.) Lastly, check the Microsoft Developer's Network on the Web for the latest information on this Microsoft transport. The MSDN can be located at the time of the writing at www.microsoft.com/msdn.
ID: 00023
Exception при попытке создать обьект класса TPrinter

В создании обьекта класса TPrinter с использованием TPrinter.Create нет необходимости, так как обьект класса TPrinter (называемый Printer) автоматически создается при использовании модуля Printers.
Пример:
uses Printers;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Printer.BeginDoc;
 Printer.Canvas.TextOut(100, 100, 'Hello World!');
 Printer.EndDoc;
end;
Author: Aziz (JINX)
Source: Взято из DELPHI VCL FAQ
ID: 03265
Category:Принтер
Explode / Implode a String?

=== Explode / Implode a String? ===
type
 TStrArray = array of string;
function Explode(var a: TStrArray; Border, S: string): Integer;
var
 S2: string;
begin
 Result := 0;
 S2 := S + Border;
 repeat
 SetLength(A, Length(A) + 1);
 a[Result] := Copy(S2, 0,Pos(Border, S2) - 1);
 Delete(S2, 1,Length(a[Result] + Border));
 Inc(Result);
 until S2 = ;
end;
// Как использовать:
procedure TForm1.Button1Click(Sender: TObject);
var
 S: string;
 A: TStrArray;
 AnzTokens, i: Integer;
begin
 S := 'Ein=Text=durch=Geleichzeichen=getrennt';
 AnzTokens := Explode(A, '=', S);
 for i := 0 to AnzTokens -1 do
 Memo1.Lines.Add(A[i]);
end;
ID: 00154
----
{
 * These 2 functions are from the programming language PHP, unite certainly well-known.
 * Now one can use it also in Delphi:)
}
{...}
//* Needed type declaration
type
 TExplodeArray = array of String;
{...}
function Implode(const cSeparator: String; const cArray: TExplodeArray): String;
var
 i: Integer;
begin
 Result := ;
 for i := 0 to Length(cArray) -1 do begin
 Result := Result + cSeparator + cArray[i];
 end;
 System.Delete(Result, 1, Length(cSeparator));
end;
function Explode(const cSeparator, vString: String): TExplodeArray;
var
 i: Integer;
 S: String;
begin
 S := vString;
 SetLength(Result, 0);
 i := 0;
 while Pos(cSeparator, S) > 0 do begin
 SetLength(Result, Length(Result) +1);
 Result[i] := Copy(S, 1, Pos(cSeparator, S) -1);
 Inc(i);
 S := Copy(S, Pos(cSeparator, S) + Length(cSeparator), Length(S));
 end;
 SetLength(Result, Length(Result) +1);
 Result[i] := Copy(S, 1, Length(S));
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 00155
FastReport - добавление QR-кода

== FastReport - добавление QR-кода ==
1. Заводится FPictureView: TfrPictureView;
2. На загрузке шаблона:
 View_ := frReport1.FindObject('QrCode');
 if View_ is TfrPictureView then
 FPictureView := TfrPictureView(View_)
 else
 FPictureView := Nil;
Дальше:
procedure TFormPrFrPach.frDBDataset1Next(Sender: TObject);
begin
 FillQrCode;
end;
procedure TFormPrFrPach.frDBDataset1First(Sender: TObject);
begin
 FillQrCode;
end;
И генерация QR в картинку:
procedure TFormPrFrPach.FillQrCode;
var
 QRCode_: TDelphiZXingQRCode;
 text_: string;
begin
 if FPictureView=nil then exit;
 text_ := FTmpTable.FieldByName('ID').AsString;
 QRCode_ := TDelphiZXingQRCode.Create;
 try
 QRCode_.RegisterEncoder(ENCODING_WIN1251, TWin1251Encoder);
 QRCode_.RegisterEncoder(ENCODING_URL, TURLEncoder);
 QRCode_.BeginUpdate;
 try
 QRCode_.Data := text_;
 QRCode_.Encoding := ENCODING_WIN1251;
 QRCode_.ErrorCorrectionOrdinal := ecoL;
 {
 L ~7% correction
 M ~15% correction
 Q ~25% correction
 H ~30% correction
 }
 QRCode_.QuietZone := 0;
 finally
 QRCode_.EndUpdate(True);
 end;
 MakeBmp(FPictureView.Picture.Bitmap, 10, QRCode_, clWhite, clBlack, 0);
 finally
 QRCode_.Free
 end;
end;
Author: Катерина Свиридова
Source: https://t.me/Delphi_Lazarus/363086
Category:Создание отчетов
Category:FastReport
File List View in File Dialogs

=== File List View in File Dialogs ===
// If an application asks user to select an icon, it's
// more convenient for the user to see list of files as
// large icons instead of small icons. Also, for selecting
// an image file, user will be happier to choose an image
// by seeing the thumbnails.
// The standard file dialog initialy shows the files in
// the LIST (small icon) style, and there is no documented
// way to change this behavior. So, if user wants to see
// the file list in another style, she/he should change
// it manually by selecting the desired view style form
// the provided popup menu.
// Here is a workaround for this limitation to select the
// reasonable view style for a file dialog.
type
 TFileViewStyle = (fvsIcons, fvsList, fvsDetails, fvsThumbnails, fvsTiles);
function SetFileDialogViewStyle(Handle: THandle; ViewStyle: TFileViewStyle): Boolean;
const
 CommandIDs: array[TFileViewStyle] of Word = ($7029, $702B, $702C, $702D, $702E);
var
 NotifyWnd: THandle;
begin
 Result := False;
 NotifyWnd := FindWindowEx(GetParent(Handle), 0, 'SHELLDLL_DefView', nil);
 if NotifyWnd <> 0 then
 begin
 SendMessage(NotifyWnd, WM_COMMAND, CommandIDs[ViewStyle], 0);
 Result := True;
 end;
end;
// Each time the file dialog opens, the above function should
// be called to set the desired view style. The OnShow event
// of the file dialogs seems to be the right place for this
// purpose, however at that time the list is not created yet
// and the function fails.
// When the file list is created, the dialog raises two events:
// OnFolderChange and OnSelectionChange events. We can use one
// of these events for our purpose. However, we have to consider
// that the function should be called just once for each show.
// Here is a sample usage of the introduced function:
procedure TForm1.Button1Click(Sender: TObject);
begin
 OpenDialog1.Tag := 0;
 OpenDialog1.Execute;
end;
procedure TForm1.OpenDialog1FolderChange(Sender: TObject);
begin
 if OpenDialog1.Tag = 0 then
 begin
 SetFileDialogViewStyle(OpenDialog1.Handle, fvsIcons)
 OpenDialog1.Tag := 1;
 end;
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 01207
FindKey для нескольких полей

=== FindKey для нескольких полей ===
with Table1 do
begin
 SetKey;
 FieldByName('State').AsString := 'CA';
 FieldByName('City').AsString := 'Scotts Valley';
 GotoKey;
end;
Вы не можете использовать Findkey с файлами DBase более чем для одного поля.
oEmetb.IndexName := 'PrimaryKey';
if oEmeTb.FindKey([prCLient, prDiv, prEme]) then
где FindKey передаются параметры для Primary Keyfields.
Я обращаю ваше внимание на то, что имя индекса (Index) чувствительно к регистру, так что будьте внимательны.
Вы можете также воспользоваться oEmeTb.IndexFieldNames, но убедитесь в том, что ваш список ключевых полей в точности соответствуют ключевым полям, которые вы ищете.
oEmetb.IndexFieldNames := 'EmeClient;EmeDiv;EmeNo';
if oEmeTb.FindKey([123, 'A', 96]) then
Source: Взято с http://delphiworld.narod.ru
ID: 02568
Flash SWF в EXE

// S = Source file (swf)
// D = Destionation file (exe)
// F = Flash Player
function Swf2Exe(S, D, F: string): string;
var
 SourceStream, DestinyStream, LinkStream: TFileStream;
 flag: Cardinal;
 SwfFileSize: Integer;
begin
 Result := 'something error';
 DestinyStream := TFileStream.Create(D, fmCreate);
 try
 LinkStream := TFileStream.Create(F, fmOpenRead or fmShareExclusive);
 try
 DestinyStream.CopyFrom(LinkStream, 0);
 finally
 LinkStream.Free;
 end;
 SourceStream := TFileStream.Create(S, fmOpenRead or fmShareExclusive);
 try
 DestinyStream.CopyFrom(SourceStream, 0);
 flag := $FA123456;
 DestinyStream.WriteBuffer(flag, SizeOf(Integer));
 SwfFileSize := SourceStream.Size;
 DestinyStream.WriteBuffer(SwfFileSize, SizeOf(Integer));
 Result := ;
 finally
 SourceStream.Free;
 end;
 finally
 DestinyStream.Free;
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Swf2Exe('c:\somefile.swf', 'c:\somefile.exe',
 'c:\Program Files\Macromedia\Flash MX\Players\SAFlashPlayer.exe');
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 04308
Category:Конвертация
GIF для HTML в EXE

Есть программа на Delphi, котоpая отображает какой-то html. В html используется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился в exe как некий кусок кода. А когда надо будет, записать его обратно в gif-файл без изменений, выковырнув из exe?
Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван "RCDATA_1".
Если RxLib нет, то нужно создать файл описания ресурсов:
 === Begin gifs.rc ===
 mygif rcdata "имя_gif-файла.gif"
 mygif1 rcdata "RCDATA_1"
 === End dots.rc ===
Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res}
В своей программе необходимо написать:
var
 rs: TResourceStream;
 a: Pointer;
begin
 rs := TResourceStream.Create(hinstance, 'RCDATA_1', RT_RCDATA);
 try
 GetMem(a, rs.size);
 rs.Read(a^, rs.size); { Теперь a - динамический указатель на код }
 { Здесь делается все, что необходимо с кодом, используя указатель a }
 FreeMem(a);
 finally
 rs.Free;
 end;
end;
А можно и так, если необходимо записать ресурс в файл:
var
 rs: TResourceStream;
 fs: TFileStream;
begin
 rs := TResourceStream.Create(hInstance, 'mygif', RT_RCDATA);
 fs := TFileStream.Create('имя_gif-файла.gif', fmCreate);
 try
 fs.CopyFrom(rs, rs.Size);
 finally
 fs.Free;
 rs.Free;
 end;
end;
Source: http://delphiworld.narod.ru
ID: 03536
Category:Связь
Category:Web
GROUPFILE и ADDITEM для групп

Вот код для создания файла группы и добавления в группу файла-элемента. Чтобы использовать эту процедуру, определите DDE clientconv App как ProgMan.
procedure TMainForm.CreateWinGroup(Sender: TObject);
var
 Name: string;
 Name1: string;
 Macro: string;
 Macro1: string;
 Cmd, Cmd1: array[0..255] of Char;
begin
 { destDir - dos-каталог, хранящий YourFile.Ext' }
 Name := 'GroupName';
 Name1 := destDir + 'YourFile.Ext, FileName_in_Group ';
 Macro := Format('[CreateGroup(%s)]', [Name]) + #13#10;
 Macro1 := Format('[Additem(%s)]', [Name1]) + #13#10;
 StrPCopy(Cmd, Macro);
 StrPCopy(cmd1, Macro1);
 DDEClient.OpenLink;
 if not DDEClient.ExecuteMacro(Cmd, False) then
 MessageDlg('Невозможно создать группу ' + Name, mtInformation, [mbOK], 0)
 else
 begin
 DDEClient.ExecuteMacro(Cmd1, False);
 end;
 DDEClient.CloseLink;
end;
Source: Взято с http://delphiworld.narod.ru
ID: 03192
ID: 04499
Category:Файловая система
Category:DDE
HKey → String

=== HKey --> String? ===
const
 HKEYNames: array[0..6] of string =
 ('HKEY_CLASSES_ROOT', 
 'HKEY_CURRENT_USER', 
 'HKEY_LOCAL_MACHINE', 
 'HKEY_USERS',
 'HKEY_PERFORMANCE_DATA', 
 'HKEY_CURRENT_CONFIG', 
 'HKEY_DYN_DATA');
function HKEYToStr(const Key: HKEY): string;
begin
 if (key < HKEY_CLASSES_ROOT) or (key > HKEY_CLASSES_ROOT+6) then
 Result := ''
 else
 Result := HKEYNames[key - HKEY_CLASSES_ROOT];
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 00166
HTTP кодирование строки

function HTTPEncode(const AStr: string): string;
const
 NoConversion = ['A'..'Z', 'a'..'z', '*', '@', '.', '_', '-'];
var
 Sp, Rp: PChar;
begin
 SetLength(Result, Length(AStr) * 3);
 Sp := PChar(AStr);
 Rp := PChar(Result);
 while Sp^ <> #0 do
 begin
 if Sp^ in NoConversion then
 Rp^ := Sp^
 else if Sp^ = ' ' then
 Rp^ := '+'
 else
 begin
 FormatBuf(Rp^, 3, '%%%.2x', 6, [Ord(Sp^)]);
 Inc(Rp, 2);
 end;
 Inc(Rp);
 Inc(Sp);
 end;
 SetLength(Result, Rp - PChar(Result));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Edit1.Text := HTTPEncode(Edit1.Text);
end;
Source: http://www.swissdelphicenter.ch
ID: 04029
Category:Алгоритмы
Category:Связь
Hello ISAPI

На этой страничке вы узнаете как создать и запустить простейшее ISAPI приложение сервера.
:1. Запустите Delphi, нажмите на меню File | New
:2. В диалоговом окне New Items выберите Web Server Application и нажмите OK
:3. Появится диалоговое окно New Web Server Application. Пункт ISAPI/NSAPI Dynamic Link Library выбран по умолчанию, поэтому просто нажмите OK.
:4. Вы попали в интерактивную среду разработки ISAPI расширения сервера.
В вашем проекте содержится специальный модуль WebModule, он позволяет помещать в него различные компоненты и обеспечивает работу с ними.
:5. Дважды щелкните мышкой на WebModule, появится окно Action Editor, предназначенное для создания и редактирования обработчиков событий ActionItem.
:6. В диалоговом окне Action Editor нажмите кнопку Add New, при этом в окне Object Inspector отобразятся свойства и события созданного ActionItem.
:7. Установите свойство Default созданного ActionItem равным true.
:8. Создайте обработчик события OnAction для созданного ActionItem и напишите в него код:
Response.Content := '<html><body>Hello ISAPI!</body></html>';
У вас должен получиться код приведенный в примере 1.
Пример 1
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
 Request: TWebRequest; Response: TWebResponse;
var Handled: Boolean);
begin
 Response.Content := '<html><body>Hello ISAPI!</body></html>';
end;
:9. Нажмите на меню File | Save All, выберите имена main.pas и helloisapi.dpr для файлов проекта и сохраните их на диск.
:10. Нажмите на меню Project | Build helloisapi. Будет скомпилирован файл helloisapi.dll.
:11. Поместите полученный файл в каталог для ISAPI DLL вашего веб сервера. Для IIS 4.0 это каталог /cgi-bin/. Проверьте установлено ли право execute на этот каталог в веб сервере и установите доступ на чтение и запуск для соответствующих пользователей в NTFS.
:12.Запустите на выполнение ваше приложение, набрав в браузере полный URL. Например, если ваш сервер имеет URL http://localhost, вы положили DLL в каталог /cgi-bin/, то полный URL будет http://localhost/cgi-bin/helloisapi.dll.
Author: Delphi Web Development
ID: 03437
Category:Связь
Category:Web
Help по синтаксису SQL для MS Access (DAO/ADO/ODBC)

=== Help по синтаксису SQL для MS Access (DAO/ADO/ODBC) ===
Поставляется с MS Office, искать примерно здесь:
 C:\Program Files\Common Files\Microsoft Shared\Office10\1033\JETSQL40.CHM
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Взято из http://forum.sources.ru
ID: 02746
Hex → BIN

=== Hex --> BIN ===
function HexToBin(Hexadecimal: string): string;
 const
 BCD: array [0..15] of string =
 ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
 '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
 var
 i: integer;
 begin
 for i := Length(Hexadecimal) downto 1 do
 Result := BCD[StrToInt('$' + Hexadecimal[i])] + Result;
 end;
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 ShowMessage(HexToBin('FFA1'));
 // Returns 1111111110100001 
end;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 00943
Hex → Integer

=== Hex --> Integer ===
var
 i: Integer
 s: string;
begin
 s := '$' + '20FF';
 i := StrToInt(a);
end;
Source: Взято из http://forum.sources.ru
ID: 00937
----
CONST HEX: ARRAY['A'..'F'] OF INTEGER = (10,11,12,13,14,15);
VAR
 str : String;
 Int,
 i : integer;
BEGIN
 READLN(str);
 Int := 0;
 FOR i := 1 TO Length(str) DO
 IF str[i] < 'A' THEN
 Int := Int * 16 + ORD(str[i]) - 48
 ELSE
 Int := Int * 16 + HEX[str[i]];
 WRITELN(Int);
 READLN;
END.
Source: DelphiWorld 6.0 http://delphiworld.narod.ru/
ID: 00938
Hex → String

=== Hex --> String ===
procedure TForm1.Button1Click(Sender: TObject);
const
 Source: string = '4D 5A';
var
 S: string;
 t: Integer;
begin
 with TStringList.Create do
 try
 Text := StringReplace(Source, #32, #13#10, [rfReplaceAll]);
 S := ;
 for t := 0 to Count - 1 do
 S := S + Chr(StrToInt('$' + Strings[t]));
 ShowMessage(S);
 finally
 Free;
 end;
end;
Author: Song
Source: Взято из http://forum.sources.ru
ID: 00151
Hidden or missing IDE

===== Hidden or missing IDE =====
Occasionally in Delphi 5 the IDE will 'disappear'. This is to say you will launch Delphi, and most or all of your IDE will not be visible. Delphi is clearly running and working, as you can still use your hot keys and run and compile a program, you just can't see such useful items such as the object inspector or your component tool bar. 
This is caused by Delphi saving bogus information in its desktop preference files, or '.dsk' files. Delphi saves information about your environment options and settings in these files. In order to see your IDE again, all you need to do is delete these offending files. This will in no way harm Delphi or your project, as Delphi will dynamically generate these files as it needs them. You will however lose any environment settings that you had set previously. 
ID: 00006
Hint в выпадающем списке ComboBox

=== Hint в выпадающем списке ComboBox ===
В практике программирования довольно часто встречается ситуация когда информация, предназначенная для отображения в имеющемся компоненте, не помещается по длине. С подобным обычно сталкиваются в работе с базами данных. В таких случая выручают всплывающие подсказки - Hint. Но, в некоторых случаях, даже такая возможность не спасает. К таким ситуациям можно отнести работу с выпадающим списком в DBComboBox. Представьте, что размер поля увеличился, а изменить ширину DBComboBox на форме, по тем или иным причинам, нет возможности. Конечно, можно увеличить ширину выпадающего списка. Но выглядит это не всегда красиво да и не делает чести разработчику. Предлагаемая идея позволит создать более изящный компонент. Взгляните на рисунок: 
В демонстрационном примере в выпадающем списке появляется всплывающая подсказка для строки не помещающейся по длине. 
При работе с Hint нужно помнить - использовать ToolTip из API, бесполезная затея. Delphi игнорирует любые попытки работы ним. Для этих целей в Delphi предусмотрен класс - THintWindow. 
В своем компоненте объявите FTipHint:
type
 TVSComboBox = class(TCustomComboBox)
 private
 FHint: THintWindow;
 protected
 procedure WMCTLCOLORLISTBOX(var Message: TMessage); message WM_CTLCOLORLISTBOX;
и не забудьте выполнить инициализацию в конструкторе вашего компонента:
begin
 inherited Create(AOwner);
 FHint := THintWindow.Create(Self);
Чтобы получить информацию об активной строке в выпадающем списке ComboBox перехватите сообщение WM_CTLCOLORLISTBOX. В процедуре сообщения анализируйте - если длина строки больше ширины выпадающего списка - передайте "длинную" строку в ваш Hint и активируйте его:
FHint.ActivateHint(TextRC, Items[ItemIndex]);
где
* TextRC - прямоугольник для строки подсказки
* Items[ItemIndex] - "длинная" строка из выпадающего списка 
Если активная строка в выпадающем списке "короткая" - спрячьте Hint:
FHint.ReleaseHandle;
Для получения подробной информации о классе THintWindow воспользуйтесь Help из Delphi.
ID: 01266
Hint на системных кнопках, Как енто делается?

=== Hint на системных кнопках, Как енто делается? ===
Довольно сложный вопрос. Так просто не сделаешь. Нужно отлавливать WM_NCMOUSEMOVE и WM_NCHITTEST в них блокировать системный хинт и отрисовывать свой. Нет временипример делать. Но тут еще одно - если ты их решил модифицировать, то тебе нужно еще и два системных меню русифицировать. то которое в заголовке формы и то которое в тулбаре внизу. Это на порядок проще и делается вот таким кодом:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
 TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure ChangeMenuLanguage(AHandle: THandle);
const
 RusTranscriptionCount = 6;
 SysMenuID: array [0..RusTranscriptionCount - 1] of UINT =
 (SC_RESTORE, SC_MOVE, SC_SIZE, SC_MINIMIZE, SC_MAXIMIZE, SC_CLOSE);
 RusTranscription: array [0..RusTranscriptionCount - 1] of String =
 ( '&aВосстановить', '&Переместить', '&Размер', '&Свернуть',
 'Р&азвернуть', '&Закрыть'#9'Alt+F4');
var
 SysMenu: HMENU;
 MenuItem: TMenuItemInfo;
 ItemCount, I, A: Integer;
 MenuString: array [0..MAXCHAR - 1] of Char;
begin
 SysMenu := GetSystemMenu(AHandle, False);
 if SysMenu <> 0 then
 begin
 ItemCount := GetMenuItemCount(SysMenu);
 for I := 0 to ItemCount - 1 do
 begin
 ZeroMemory(@MenuItem, SizeOf(TMenuItemInfo));
 MenuItem.cbSize := SizeOf(TMenuItemInfo);
 MenuItem.fMask := MIIM_ID or MIIM_STRING or MIIM_BITMAP;
 MenuItem.dwTypeData := MenuString;
 MenuItem.cch := MAXCHAR;
 if GetMenuItemInfo(SysMenu, I, True, MenuItem) then
 for A := 0 to RusTranscriptionCount - 1 do
 if SysMenuID[A] = MenuItem.wID then
 begin
 MenuItem.dwTypeData := PChar(RusTranscription[A]);
 MenuItem.cch := Length(RusTranscription[A]);
 if not SetMenuItemInfo(SysMenu, I, True, MenuItem) then RaiseLastOSError;
 end;
 end;
 end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 ChangeMenuLanguage(Handle);
 ChangeMenuLanguage(Application.Handle);
end;
Author: Rouse_
Source: Взято из http://forum.sources.ru
ID: 01285