HTTP Client API в Delphi
Как-то относительно незаметно для меня прошло одно из нововведений Delphi – HTTP Client API. Этот API появился, оказывается, ещё в Delphi XE8 и, даже, получил развитие в Delphi 10.1 Berlin. Вполне возможно, что этот API прошел мимо меня по той простой причине, что для наибольшего количества приложений Delphi, использующих в работе HTTP-протокол я использовал библиотеку Synapse и других альтернатив особо не рассматривал. Однако, попался сегодня на глаза пример асинхронной загрузки файла с использованием HTTP Client API и я решил, что пора бы эту возможность Delphi изучить более подробно – вдруг окажется, что этот API совсем не плох и можно будет его использовать для работы.
Введение
Итак, что из себя представляет HTTP Client API в Delphi 10.3 Rio (предыдущие версии не рассматриваю по той причине, что они у меня не установлены). В папке %InstallDir%\source\rtl\net\ обнаружены следующие модули, относящиеся непосредственно к работе HTTP-протоколом:
- System.Net.FileClient.pas
- System.Net.HttpClient.pas
- System.Net.HttpClient.Android.pas
- System.Net.HttpClient.Mac.pas
- System.Net.HttpClient.Win.pas
- System.Net.HttpClientComponent.pas
- System.Net.Mime.pas
- System.Net.Socket.pas
- System.Net.URLClient.pas
- System.NetConsts.pas
Наличие файлов типа System.Net.HttpClient.ХХХХХХ.pas уже как бы намекает на то, что HTTP Client API можно свободно использовать в разных операционных системах, что хорошо.
В модуле System.Net.HttpClientComponent.pas содержатся два компонента, которые Вы можете обнаружить также в палитре компонентов на вкладке Net:
- TNetHTTPClient – это ваш HTTP-клиент для работы с сервером
- TNetHTTPRequest – ваш запрос к HTTP-серверу
Возник сразу вопрос: почему не сделали тогда и третий компонент, например, TNetHTTPResponse (ответ сервера), по аналогии с тем, что сделано в REST Clietn Library, тем более, что класс ответа как таковой имеется. Но об ответах – позже.
TNetHTTPClientTNetHTTPClient в плане построения напоминает аналогичный компонент от Indy, то есть каждый отдельный HTTP-метод (GET, POST, PUT и т.д.) представляет собой отдельный метод компонента и, соответственно, некоторые методы перезагружны (помечены как overload).
Попробуем воспользоваться HTTP-клиентом в Delphi, отправить какой-нибудь запрос и получить ответ. На форме тестового приложения я поместил TMemo для вывода результата, одну кнопку и компонент TNetHTTPClient. Обработчик метода OnClick кнопки сделал следующим:
procedure TForm4.Button1Click(Sender: TObject); begin Memo1.Lines.LoadFromStream(NetHTTPClient1.Get('http://webdelphi.ru').ContentStream); end;
Результат не заставил себя долго ждать:
Этот пример примечателен сам по себе по следующим причинам:
- во-первых, TNetHTTPClient сделал правильный редирект на необходимый адрес, так как блог webdelphi в настоящее время доступен по https и запрос на адрес http://webdelphi.ru возвращает код 301 (Moved Permanently).
- во-вторых, так как мне необходимо было только вывести содержимое главной страницы в Memo – я не создал ни одной лишней переменной в коде.
В принципе, возможности как по перенаправлению на необходимый адрес, так и работа с контентом без лишних манипуляций с переменными имеется и в той же Indy, однако, работа TNetHTTPClient организована несколько иначе. Рассмотрим по прядку.
Управление перенаправлением в
TNetHTTPClientУ компонента определено следующее свойство:
property RedirectsWithGET: THTTPRedirectsWithGET read GetRedirectsWithGET write SetRedirectsWithGET default CHTTPDefRedirectsWithGET; THTTPRedirectWithGET = (Post301, Post302, Post303, Post307, Post308, Put301, Put302, Put303, Put307, Put308, Delete301, Delete302, Delete303, Delete307, Delete308);
Это свойство позволяет нам настроить различное поведение компонента в зависимости от используемого HTTP-метода и возвращаемого кода статуса. Например, мы можем делать перенаправление, если при использовании метода POST сервер вернул нам код 301 и не перенаправлять пользователя на другой адрес, если сервер вернет код 302 и так далее.
Также определены и такие свойства как:
property HandleRedirects: Boolean read GetHandleRedirects write SetHandleRedirects; property MaxRedirects: Integer read GetMaxRedirects write SetMaxRedirects default 5;
Соответственно, свойство HandleRedirects позволяет или запрещает делать автоматические перенаправления, а MaxRedirects определяет максимально возможное количество перенаправлений пользователя.
В отличие от Indy, которая норовит по каждому поводу выкинуть какое-нибудь исключение,
Что ещё примечательно, так это, что Indy на примере, представленном выше, вообще не правильно сработала – при отключенном перенаправлении выдала код статуса 403, хотя в реальности сервер возвращает именно 301 код редиректа. Так что, 10 очков Гриффиндору HTTP Client API.
Двигаемся далее. Рассмотрим как работают различные методы в TNetHTTPClient
HTTP-методы в TNetHTTPClient
Компонент поддерживает следующие стандартные HTTP-методы:
HTTP-метод | Реализация в TNetHTTPClient |
DELETE | function Delete(const AURL: string; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; |
OPTIONS | function Options(const AURL: string; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; |
GET | function Get(const AURL: string; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; |
function GetRange(const AURL: string; AStart: Int64; AnEnd: Int64 = -1; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; | |
TRACE | function Trace(const AURL: string; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; |
HEAD | function Head(const AURL: string; const AHeaders: TNetHeaders = nil): IHTTPResponse; |
POST | function Post(const AURL: string; const ASourceFile: string; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; function Post(const AURL: string; const ASource: TStrings; const AResponseContent: TStream = nil; const AEncoding: TEncoding = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; function Post(const AURL: string; const ASource: TStream; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; function Post(const AURL: string; const ASource: TMultipartFormData; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; |
PUT | function Put(const AURL: string; const ASourceFile: string; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; function Put(const AURL: string; const ASource: TStrings; const AResponseContent: TStream = nil; const AEncoding: TEncoding = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; function Put(const AURL: string; const ASource: TStream = nil; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; function Put(const AURL: string; const ASource: TMultipartFormData; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; |
MERGE | function Merge(const AURL: string; const ASource: TStream; const AHeaders: TNetHeaders = nil): IHTTPResponse; function MergeAlternative(const AURL: string; const ASource: TStream; const AHeaders: TNetHeaders = nil): IHTTPResponse; |
PATCH | function Patch(const AURL: string; const ASource: TStream = nil; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; function PatchAlternative(const AURL: string; const ASource: TStream = nil; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload; |
На что обратил сразу внимание:
- Частичный Get выделен как самостоятельный метод. Мелочь, а приятно – не придётся заморачиваться лишний раз с заголовками.
- Разработчики заранее озаботились тем, что различные API онлайн-сервисов могут по разному работать с методами PATCH и MERGE. Поэтому в методах PatchAlternative и MergeAlternative используется обычный метод PUT с добавлением к запросу заголовка x-method-override.
Также, определен ещё один метод, позволяющий использовать запросы как в Synapse:
function Execute(const ARequest: IHTTPRequest; const AContentStream: TStream = nil): IHTTPResponse; overload; function Execute(const ARequestMethod: string; const AURI: TURI; const ASourceStream: TStream = nil; const AContentStream: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;
В первом случае мы должны передать в метод Execute интерфейс IHTTPRequest, содержащий информацию по запросу. Во втором случае мы передаем в метод строку с HTTP-методом, URL и, если необходимо, то определяем дополнительные параметры – поток для хранения результата и заголовки.
Если переписать пример выше на использование метода Execute, то получим следующий код:
Memo2.Lines.LoadFromStream(NetHTTPClient1.Execute('get', TURI.Create('http://webdelphi.ru')).ContentStream);
Наличие такого метода у TNetHTTPClient, с одной стороны, позволяет использовать компонент так, как мы привыкли в Synapse, а, с другой стороны (что более важно), реализовывать работу нашего клиента с использованием любых других методов, поддерживаемых сервером, например, реализовать свой собственные метод обмена данными со своим сервером.
В принципе, перечень поддерживаемых HTTP-методов достаточный, чтобы реализовать любую работу с HTTP, за это – еще один зачет HTTP Client API.
На этом шаге мы вплотную приблизились к рассмотрению запросов и ответов к серверу, а именно их реализации в HTTP Client API. Начнем с запросов.
Компонент TNetHTTPRequest – запрос
Компонент TNetHTTPRequest предназначен для обработки HTTP-запросов. Для его работы необходимо определить клиент, то есть задать свойство компонента:
property Client: TNetHTTPClient read GetClient write SetClient;
Компонент реализует те же HTTP-методы, что и TNetHTTPClient: GET, POST, PUT и так далее. Вместе с этим, TNetHTTPRequest расширяет работу TNetHTTPClient. Например, используя этот компонент можно реализовать загрузку страницы блога вот так:
var MS: TMemoryStream; begin MS:=TMemoryStream.Create; NetHTTPRequest1.ContentStream:=MS; NetHTTPRequest1.MethodString:='get'; NetHTTPRequest1.URL:='http://webdelphi.ru'; NetHTTPRequest1.Execute(); try Memo1.Lines.LoadFromStream(NetHTTPRequest1.ContentStream); finally FreeAndNil(MS) end; end;
Таким образом, чтобы выполнить запрос к серверу с использованием TNetHTTPRequest нам необходимо выполнить следующие обязательные условия:
- Определить поток для хранения результата (свойство ContentStream)
- Определить HTTP-метод (свойство MethodString)
- Выполнить метод Execute
Второй вариант – использовать методы Get, Post, Put, Head и другие, как это делалось при использовании TNetHTTPClient.
Класс TNetHTTPResponse – ответ
Этот класс реализует интерфейс IHTTPResponse (тот самый, который возвращается в результате выполнения методов клиента TNetHTTPClient).
Используя этот класс и реализуемый им интерфейс мы можем получить всю информацию по ответу сервера: код статуса, куки, заголовки, тело ответа и так далее.
Перепишем пример таким образом, чтобы получить максимум информации об ответе. Для этого я добавил на форму ещё несколько Memo:
Обработчик OnClick сделаем таким:
procedure TForm4.Button1Click(Sender: TObject); var MS: TMemoryStream; Resp: IHTTPResponse; Header: TNameValuePair; Cookie: TCookie; begin memHeaders.Lines.Clear; memCookies.Lines.Clear; memContent.Lines.Clear; MS:=TMemoryStream.Create; NetHTTPRequest1.ContentStream:=MS; NetHTTPRequest1.MethodString:='get'; NetHTTPRequest1.URL:=edURL.Text; Resp:=NetHTTPRequest1.Execute(); try //загружаем контент memContent.Lines.LoadFromStream(NetHTTPRequest1.ContentStream); //выводим заголовки for Header in Resp.Headers do MemHeaders.Lines.Add(Header.Name+': '+Header.Value); //выводим куки for Cookie in Resp.Cookies do memCookies.Lines.Add(Cookie.ToString); //выводим версию HTTP case Resp.Version of THTTPProtocolVersion.UNKNOWN_HTTP: lbHttpVer.Caption:='n/a'; THTTPProtocolVersion.HTTP_1_0: lbHttpVer.Caption:='1.0'; THTTPProtocolVersion.HTTP_1_1: lbHttpVer.Caption:='1.1'; THTTPProtocolVersion.HTTP_2_0: lbHttpVer.Caption:='2.0'; end; //выводим код статуса lbStatusCode.Caption:=Resp.StatusCode.ToString; finally FreeAndNil(MS) end; end;
Также TNetHTTPResponse содержит следующие полезные методы:
//Представляет поток ContentStream в виде строки с заданной кодировкой function ContentAsString(const AnEncoding: TEncoding = nil): string; override; //проверяет содержит ли список заголовков заголовок с именем Name function ContainsHeader(const AName: string): Boolean; virtual; //возвращает значение заголовка с именем Name function GetHeaderValue(const AName: string): string; virtual;
Заключение
В целом, поверхностный обзор HTTP Client API в Delphi мне показал, что этот относительно новый фреймворк для работы с протоколом HTTP в Delphi очень даже не плох. В качестве достоинств можно выделить:
- возможность управлять механизмом редиректов
- возможность использовать различные способы выполнения запросов к серверу
- достаточно удобная реализация работы с куками и заголовками
- кроссплатформенность.
За пределами этого обзора, конечно, остались такие интересные вопросы как использование прокси, сжатия, асинхронная работа, загрузка файлов в синхронном и асинхронном режимах и так далее, но для первого раза, думаю, пока хватит. Далее рассмотрим и эти вопросы.
Книжная полка
5 1 голос
Рейтинг статьи
Как послать информацию (String, Image, Record) другому приложению
Есть много ситуаций, когда Вы хотите обменяться информацией между двумя приложениями. Не нужно прибегать к отправке сообщений через TCP и сокеты (потому что эти приложения выполняются на одной машине). Вы можете просто послать, и также получить специальное сообщение Windows WM_COPYDATA.
Обработка сообщений Windows в Delphi очень проста: посылая запрос SendMessage с заполненными данными WM_COPYDATA.
WM_CopyData и TCopyDataStruct
Сообщение WM_COPYDATA дает Вам возможность послать данные из одного приложения в другое. Приложение получает данные в структуре TCopyDataStruct. TCopyDataStruct определен в модуле Windows.pas и включает в себя структуру COPYDATASTRUCT, которая содержит данные для передачи.
Вот объявление и описание TCopyDataStruct:
type
TCopyDataStruct = packed record
dwData: DWORD; // до 32 бит, которые нужно передать
// приложению-получателю
cbData: DWORD; // размер, в байтах данных, указателя lpData
lpData: Pointer; // Указатель на данные, которые нужно передать
// приложению-получателю. Может быть NIL.
end;
Пересылка String через WM_COPYDATA
Для приложения Sender, чтобы послать данные к Receiver, CopyDataStruct должен быть заполнен и передан, используя функцию SendMessage. Вот как можно послать строковое значение через WM_COPYDATA:
procedure TSenderMainForm.SendString() ;
var
stringToSend : string;
copyDataStruct : TCopyDataStruct;
begin
stringToSend := 'About Delphi Programming';
copyDataStruct.dwData := 0; // используем это, чтобы
// идентифицировать содержание сообщения
copyDataStruct.cbData := 1 + Length(stringToSend) ;
copyDataStruct.lpData := PChar(stringToSend) ;
SendData(copyDataStruct) ;
end;
Функция SendData находит получателя, используя вызов функции API FindWindow:
procedure TSenderMainForm.SendData(
const copyDataStruct: TCopyDataStruct) ;
var
receiverHandle : THandle;
res : integer;
begin
receiverHandle := FindWindow(PChar('TReceiverMainForm'),
PChar('ReceiverMainForm')) ;
if receiverHandle = 0 then
begin
ShowMessage('CopyData Receiver NOT found!') ;
Exit;
end;
res := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle),
Integer(@copyDataStruct)) ;
end;
В коде выше, приложение Receiver было найдено, используя функцию API FindWindow, передавая имя класса главной формы.
Обратите внимание: SendMessage возвращает целочисленное значение, назначенное кодом, который обработал сообщение WM_COPYDATA.
Приложение Receiver обрабатывает сообщение WM_COPYDATA как:
type
TReceiverMainForm = class(TForm)
private
procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;
{ ... }
implementation
{ ... }
procedure TReceiverMainForm.WMCopyData(var Msg: TWMCopyData) ;
var
s : string;
begin
s := PChar(Msg.CopyDataStruct.lpData) ;
//Отошлем что-нибудь назад
msg.Result := 2006;
end;
Запись TWMCopyData объявляется как:
TWMCopyData = packed record
Msg: Cardinal;
From: HWND;// Дескриптор окна, которое передает данные
CopyDataStruct: PCopyDataStruct; // передаваемые данные
Result: Longint;// Используйте , чтобы отослать значение назад "Sender"
end;
Пересылка String, Record или Image
Исходный код демонстрирует, как послать строку, запись и даже изображение другому приложению.
Вот пример, как переслать графику TBitmap:
procedure TSenderMainForm.SendImage() ;
var
ms : TMemoryStream;
bmp : TBitmap;
copyDataStruct : TCopyDataStruct;
begin
ms := TMemoryStream., copyDataStruct.cbData) ;
ms.Position := 0;
receivedImage.Picture.Bitmap.LoadFromStream(ms) ;
finally
ms.Free;
end;
end;
Вот и все!
Перевод с сайта www.delphi.about.com
DELPHI — Часто задаваемые вопросы и ответы на них
001 Как зделать, чтобы TEdit воспринимал одни цифры и DecimalSeparator002 Как осуществить быстрый поиск в Listbox
003 Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя?
004 Создание компонентов
005 TTimer работает не достаточно точно. Как получить более высокую точность?
006 Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение?
007 Как уменьшить размер исполняемого файла программы?
008 Как создать невизуальный компонент без иконоки, которая изображается в палитре компонентов в «design-time» (вроде TField)?
009 Как писать текст в StringGrid в стиле Exel (не обрезая, если он не помещается в ячейку)
010 Как заставить TEdit не ‘пикать’ при нажатии недопустимых клавиш?
011 Когда пользователь щелкает по listview, он переходит в режим редактирования. Как перевисти его в редим редактирования по нажатию клавиши (например F2)?
012 Как получить число и список всех компонентов, расположенных на TNoteBook?
013 Как узнать размеры TComboBox с показанным выпадающим списком до показа списка?
014 Как добится того чтобы TMemo и TEdit имели работали не только в режиме вставки символов, но и в режиме замены?
015 При попытке присвоить значение свойству «selected» ListBox’а вырабатывается exception «Index is out of bounds». В чем тут дело и как присвоить значение свойству selected?
016 Как ограничить длинну текста, вводимого в TEdit, так чтобы ширина текста не превышала ширину TEdit’а?
017 Как перемещать компонент мышкой во время работы программы «runtime»?
018 Как перехватить сообщения прокрутки в TScrollBox?
019 Можно ли использовать иконку как картинку на кнопке TSpeedButton?
020 Как поместить прозрачную фоновую каринку на компонент CoolBar?
021 Можно ли сделать так чтобы TStringGrid автоматически изменял ширину колонок, чтобы вместить самую длинную строчку в колонке?
022 Ползунок компонента TScrollBar все время мигает. Как это отключить?
023 Как поместить курсор в определенную позицию edit’а и подобных ему элементов управления?
024 Как сделать клавишу-акселератор (keyboard shortcut) компонету у которого нет заголовка?
025 Можно ли как-то уменьшить мерцание при перерисовке компонента?
026 Как запретить изменение размера моего компонента в design-time?
027 Можно ли уменьшить потребляемые компонентами TNotebook и TTabbedNotebook ресурсы?
028 Функция keybd_event() принимает значения до 244 — как мне отправить нажатие клавиши с кодом #255 в элемент управления Windows?
029 Можно ли обратиться к колонке или строке grid’а по заголовку?
030 Как использовать клавишу-акселератор в TTabsheets? Я добавляю клавишу-акселератор в заголовок каждого Tabsheet моего PageControl, но при попытке переключать страницы этой клавишей программа пикает и ничего не происходит.
031 При обработке события DrawCell компонента DrawGrid я пишу Font.Color := clRed; и получаю бесконечный цикл мерцаний. Почему?
032 При использовании BitBtn Caption(текст) и картинка(bitmap) из файла не видны одновременно. Почему?
033 Как сделать многострочную надпись на TBitBtn?
034 Можно ли динамически изменять свойство «owner» компонента во время выполнения программы?
035 Почему при изменении цвета букв StatusBar’а ничего не происходит?
036 Как программно «щелкнуть» по компоненту speed button? Я пытался использовать SendMessage но у Speedbuttons нет «handle».
037 Можно ли отключить определенный элемент в RadioGroup?
038 Как опеделить состояние списка ComboBox, выпал/скрыт?
039 Как создать эквивалент TEdit но только с выравниваением вводимого текста по центру или по правой стороне?
040 Как бы мне создать эдакий trackbar в котором вместо широкой белой полоски с ползунком была бы тонкая линия?
041 Как показывать нестандартный встроенный редактор (inplace editor) в ячейке stringgrid (например combobox).
042 В некоторых видео режимах прозрачная часть glyph’а стандартного TBitBtn становится видной. Как этого избежать?
043 Как создать невизуальный компонент без иконоки, которая изображается в палитре компонентов в «design-time» (вроде TField)?
044 В чем отличие между Create(Self) и Create(Application)?
045 Как разместить маленькие картинки в компоненте TPopUpMenu?
046 При перемещении фокуса ввода клавишей Tab чтобы переместить его в RadioGroup нужно нажать клавишу Tab дважды если какой нибудь пункт RadioGroup уже выбран, но только один раз если не выбран. Можно ли сделать поведение RadioGroup логичным?
047 Как использовать технологию Drag&Drock (перетаскивание элементов управления)
048 Возникла проблема: как скрыть/отобразить конкретную закладку в PageControl?
049 Как динамически подключить необходимый фрейм к Panel: TPanel во время выполнения программы?.
050 Зачем нужен TAction ?
051 Если я свой компонент наследую от чужого, и мне не нужны некотоpые его свойства, то есть ли способ от них избавиться? Hапpимеp, я не хочу, чтобы у панели был Caption. Пpобовал объявлять property в private/protected — не помогло.
052 Где достать всяких иконок, картинок для кнопок, etc. для своей программы?
053 Как вставить растровое изображение в компонент ListBox?
054 GUI. Перегрузка контролами
055 RTTI в действии
056 Дублирование компонентов и их потомков во время выполнения приложения
057 Дублирование компонентов и их потомков во время выполнения приложения 2
058 Как перемещать компоненты во время работы программы
059 Показ свойств во время выполнения программы
060 Свойство только для чтения во время выполнения программы
061 Создание компонент в Run-Time
062 Создание компонент во время выполнения программы и обработка их событий
063 Теория и практика использования RTTI
064 Пересборка индексов с помощью TBatchMove
065 Создавать таблицы такой же структуры
066 CHARTFX — минимум максимум
067 Использование ChartFX
068 Как использовать ChartFX
069 Пример CHARTFX
070 CheckBox в DBGrid
071 DBGrid — выбранные строки
072 DBGrid — сохранение конфигурации
073 DBGrid c FixedCols
074 DBGrid CutToClipboard
075 DBGrid DefaultDrawDataCell
076 DBGrid и Memo-поля
077 DbGrid и множественный выбор
078 DBGrid компонент, который отображает разными цветами удалённые, обновлённые и добавленные записи
079 DBGrid с номером строки
080 DBGrid с цветными ячейками
081 DBGrid с цветными ячейками 2
082 DBGrid с цветными ячейками 3
083 DbGrid со свойствами Col и Row
084 Grid с человеческим лицом
085 OnClick для DBGrid
086 OnClick для DBGrid 2
087 Буфер обмена и ячейки DBGrid
088 В DBGrid напротив некоторых строк можно поставить галочку
089 Вставить Combobox в DBGrid
090 Выделить все строки в DBGrid
091 Замечательные возможности DBGrid
092 Изменение месторасположение колонок в TDBGrid
093 Изменение размеров колонок DBGrid
094 Использование Enter как Tab в TDBGrid
095 Использование опции MultiSelect в DBGRID
096 Как в TDBGrid pазpешить только опеpации UPDATE записей
097 Как в TDBGrid узнать над каким полем висит мышь
098 Как выделить цветом текущую строку в TDBGrid
099 Как зафиксировать один или несколько столбцов в TDBGrid
100 Как зафиксировать один или несколько столбцов в TDBGrid 2
101 Как защитить запись в DBGrid от удаления
102 Как из DBGrid перенести данные в существующий Excel файл
103 Как изменить цвет отмеченных записей в DBGrid
104 Как изменить цвет ячейки TDBGrid в зависимости от текущего значения
105 Как изменить шрифт определённой строки в DBGrid
106 Как определить изменение фокуса строки в TDBGrid
107 Как остановить автодобавление из DBGrid
108 Как отобразить выбранную строку DBGrid различными цветами
109 Как отучить TDBGrid от автодобавления новой записи
110 Как показать DbGrid в режиме disabled
111 Как программно перевести DBGrid в режим редактирования
112 Как сделать, чтобы в DBGrid вместо цифр были соответствующие константы
113 Как сделать, чтобы необходимая ячейка DBGrid получила фокус ввода
114 Как удалить вертикальную полосу прокрутки (скроллбар) из DBGrid
115 Как узнать значения, которые пользователь вводит в TDBGrid
116 Как экспортировать содержимое DBGrid в Excel или ClipBoard
117 Копирование информации из DBGrid-а в Clipboard
118 Многострочный DBGrid
119 Модуль, позволяющий в Delphi осуществить форму запроса для компонентов DBGrid
120 Несколько таблиц в одном TDBGrid
121 Несколько таблиц в одном TDBGrid 2
122 Обрабатываем выделенные строки в DBGrid
123 Перемещение из DbGrid
124 Перемещение по таблице с помощью вертикальной полосы прокрутки
125 Позиция ячейки в TDBGrid
126 Поиск в DBGride без ввода искомого значения в поле ввода
127 Показ Memo-поля в DBGrid
128 Показ Memo-поля в DBGrid 2
129 Показ изображений в DBGrid
130 Помещение компонентов в DBGrid
131 Различные цвета строк в DBCtrlGrid
132 Решение проблемы передачи фокуса TDBGrid
133 Рисование текста в DBGrid
134 Рисование текста в DBGrid 2
135 Симуляция нажатия кнопки при наличии DBGrid
136 Сортировка колонок в DBGrid
137 Сохранить порядок колонок в DBGrid, после того как пользовать их перестроил
138 Текущая строка и поле в DBGrid
139 Цветной DBGrid
140 Шапка в TDBGrid
141 Экспортировать DBGrid в HTML
142 DBNavigator без иконок
143 Вызов кнопок DBNavigator
144 Выключение кнопок в DBNavigator
145 Настройки всплывающих подсказок в DBNavigator
146 Пример KeyDown компонента DBNavigator
147 Работа в коде с кнопками DBNavigator
148 Свойства кнопок DBNavigator
149 Edit с возможностью автоматического выбора
150 Insert и Override с помощью DBEdit
151 SetFocus в Edit на OnExit
152 TEdit с выравниваением текста по центру
153 Автоматический формат даты в компоненте Edit
154 Денежное поле редактирования
155 Изменить вид курсора TEdit или другого элемента управления Windows
156 Исправление DBEdit MaxLength
157 Как автоматически расширить TEdit
158 Как в TEdit расположить текст справа
159 Как в TEdit расположить текст справа 2
160 Как заставить TEdit не пикать при нажатии недопустимых клавиш
161 Как ограничить длину текста, вводимого в TEdit, так чтобы ширина текста не превышала ширину TEditа
162 Как очистить DBEdit
163 Как очистить все окошки редактирования на форме
164 Как перехватить клавишу табуляции Tab в TEdit
165 Как сделать, чтобы TEdit воспринимал одни цифры и DecimalSeparator
166 Как создать нестандартную процедуру переноса слов для TEdit, TMemo
167 Массив Edit-компонентов
168 Матрица на основе TEdit
169 Ограничение TEdit на ввод не-цифровой информации
170 Перевод в верхний регистр первого вводимого символа
171 Подстановка в TEdit
172 Поиск и управление TEdit и TField
173 Правое выравнивание текста в компоненте Edit
174 Проверка на соответствие содержимого TEdit
175 Числовая маска компонента Edit
176 Как заставить GroupBox прорисовать на форме свой Caption неактивным цветом
177 Рисование на GroupBox
178 TImage — эффект плавного перехода
179 TImageList. Не отображаются иконки на контролах
180 Изменение палитры при выводе изображения
181 Как бороться с квадратичностью Image
182 Как поместить картинку из базы данных, например MsSQL, в компонент TIMAGE
183 Как сделать картинки в TImageList прозрачными
184 Перемещение Image
185 Проблема хранения TDBImage
186 Рисование прямоугольника на изображении
187 Хитрость вывода изображения
188 3D-рамка для текстовых компонентов
189 TLabel и TEdit без контейнера
190 Как осуществить ввод текста в компоненте Label
191 Комбинация TLabel и TEdit
192 TListView и TTreeView — Windows Explorer
193 Virtual ListView с контекстным меню
194 Искать текст в TListView
195 Как ListView перевести в режим редактирования по нажатию на F2
196 Как поместить картинку в заголовок TListView
197 Как узнать, по какой колонке был клик в TListView
198 Перехват изменения размера колонки в TListView
199 Получить список файлов в ListView как в проводнике
200 Поменять местами пункты ListView
201 Прокрутка для TListView или TTreeView
202 Сортировка ListView в режиме vsReport при нажатии на заголовок колонки
203 Memo со своими шрифтами
204 Memo со свойствами Row и Col
205 RichEdit замена текста
206 RichEdit поиск текста
207 TDBMemo в TDBCtrlGrid
208 В TRichEdit или TMemo при нажатии Enter позиционирование курсора в позицию как в предыдущей строке
209 Вставка текста в TMemo в текущую позицию
210 Выделить строку в Memo
211 Добавление строк в Memo
212 Изменение величины табуляции в Memo
213 Импортирование файла в компонент Memo
214 Исправление загрузки RTF текста через поток
215 Как в Memo прокрутить текст
216 Как в компоненте TMemo перехватить нажатие Ctrl+V и вставить специальный текст не из буфера обмена
217 Как вставить содержимое файла в текущую позицию курсора в компоненте TMemo
218 Как выделить в RichEdit 4 строки
219 Как запихать в Мемо больше текста, чем оно может вместить по умолчанию
220 Как изменить стиль шрифта RichEdit нажатиями соответствующих клавиш (например включить курсив по нажатию Ctrl+I)
221 Как нарисовать что-нибудь на TMemo
222 Как настроить табуляцию в компоненте TMemo
223 Как получить определённую часть текста из RichEdit
224 Как прокрутить TRichEdit в конец
225 Как сделать окошко подсказки в редакторе как Delphi по CTRL-J
226 Как сделать отступ в Memo
227 Как сделать так, чтобы в Memo переносилось не слово целиком, а только та часть слова, которая не помещается
228 Как сделать, чтобы TMemo и TEdit работали в режиме вставки и замены
229 Как скопировать содержимое одного RichEdit в другой
230 Как узнать количество видимых строчек в TMemo
231 Как указать максимальный размер текста для RichEdit Control
232 Координаты курсора в Memo
233 Координаты курсора в Memo 2
234 Копирование текста DBMemo
235 Обнаружение прокрутки TMemo
236 Ограничение длины и количества строк компонента Memo
237 Ошибка RichEdit в Delphi2 под NT4
238 Перейти на строку в RichEdit
239 Подсветить HTML теги в RichEdit
240 Подсветка синтаксиса
241 Подсчет слов в Richedit
242 Поиск и замена текста в TMemo
243 Поиск строки текста в наследниках TCustomEdit
244 Поиск текста в DBMemo
245 Получить слово под курсором в RichEdit
246 Постраничная прокрутка Memo, когда фокус находится на Edit
247 Предел на размер текста в RichEdit
248 Прокрутка Memo
249 Событие Key Press и курсорные клавиши в TMemo
250 Сортировка строк в MEMO
251 Управление прокруткой Memo
252 TOutline OwnerDraw — значение индекса
253 Поточность TOutline
254 Пример отрисовки TOutline
255 Производная TOutline
256 Раскрытие пути к элементу TOutline по его индексу
257 Для создания панелей в двумя полосами слева, которые можно двигать
258 Как рисовать на органе управления, например, на TPanel
259 Компонент со вложенной панелью
260 Панель с изменяющимися размерами
261 Перемещение мышью панели на форме во время выполнения программы
262 Плавающие панельки
263 Сделать плавающую панель
264 Использование TParser
265 Недокументированный TParser
266 Пример TParser
267 Простое использование TParser
268 ProgressBar с невидимой рамкой
269 Как вставить ProgressBar в StatusBar
270 Как вставить ProgressBar в StatusBar 2
271 Как изменить стандартный цвет ProgressBar
272 Как изменить стандартный цвет ProgressBar 2
273 Создать ProgressBar в колонке TListView
274 Заголовок окна предварительного просмотра QuickReport
275 Переключение принтеров при печати в QuickReport
276 Проблемы со шрифтами у QuickReport
277 Как перехватить сообщения прокрутки в TScrollBox
278 Синхронизация двух компонентов ScrollBox
279 Splitter Bar
280 Конструирование Splitter
281 Как вывести цветную надпись на StatusBare
282 Обработчик события OwnerDraw в компоненте StatusBar
283 Показ всплывающих подсказок в строке состояния
284 Показ всплывающих подсказок в строке состояния 2
285 Показ даты, времени и состояния клавиш в строке состояния
286 Установить размер шрифта для панели StatusBar
287 Bitmap в StringGrid ячейке
288 CheckBox в StringGrid
289 CheckBoxes в StringGrid
290 SetFocus в TStringGrid
291 StringGrid без выделенной ячейки
292 StringGrid как DBGrid
293 Tab как Enter в StringGrid
294 TStringGrid и файловый поток
295 TStringGrid с фокусом (OnDrawCell)
296 Авторазмер для StringGrid
297 Авторазмер ширины колонок TStringGrid
298 В StringGrid ширина колонки подгоняется под длину самой длинной строки
299 Вставка и удаление строк в StringGrid
300 Выбор строки или колонки компонента TStringGrid
301 Выравнивание колонок StringGrid
302 Выравнивание колонок StringGrid 2
303 Выравнивание колонок StringGrid 3
304 Выравнивание колонок StringGrid 4
305 Выравнивание колонок StringGrid 5
306 Как перехватывать горячие клавиши в StringGrid
307 Как показывать встроенный редактор ComboBox в ячейке StringGrid
308 Как снять выделение в StringGrid
309 Как создать отдельную подсказку Hint для каждой ячейки StringGrid
310 Как удалить выделенную запись из TStringGrid
311 Компонет TWrapGrid, осуществляющий перенос текста в TStringGrid
312 Манипуляция словами в TStringGrid
313 Многострочность в заголовках колонок StringGrid
314 Многострочный TStringGrid
315 Многострочный TStringGrid 2
316 Множественный выбор в TStringGrid
317 Назначение цвета для каждой строки, вывод ячейки в несколько строк в StringGrid
318 Обновление картинки в ячейке StringGrid
319 Обратиться к колонке или строке StringGrid по заголовку
320 Ограничение длины поля TStringGrid
321 Перетащить колонки и строки в StringGrid
322 Покрашенный StringGrid
323 Покрашенный StringGrid 2
324 Помещение изображения в ячейку StringGrid
325 Помещение компонентов в StringGrid
326 После первого щелчка начать редактировать
327 Правое выравнивание ячеек TStringGrid
328 Пример TDrawGrid Drawcell
329 Проверить, выделена ли ячейка в StringGrid
330 Сменить цвет выделения в StringGrid
331 Событие OnDraw для TStringGrid
332 Сортировка StringGrid с целыми значения
333 Сохранение и чтение TStringGrid
334 Текст в ячейке StringGrid если не помещается переносится на следующую ячейку
335 Установка атрибута Только для чтения у столбцов компонента StringGrid
336 Фокус ячейки TStringGrid
337 Форматирование ячеек TStringGrid
338 Цвет неактивной ячейки StringGrid
339 Цветные ячейки в StringGrid и в DBGrid
340 Дублируем TTable со всеми индексами
341 Замена KeyFind
342 Записать TDataSet в Excel файл
343 Использование DBIopenlocklist
344 Как научить VCL делать Refresh для запросов правильно
345 Как обновить TQuery не потеряв при этом текущей записи
346 Можно ли вызвать хранимую процедуру через TQuery
347 Получение значения Memo-поля с помощью Query
348 Пример SetText, GetText строкового поля
349 Синхронизация таблицы и StringList
350 Создание компонента TTable без формы
351 Создание компонента TTable без формы 2
352 Создание компонента TTable без формы 3
353 Создание компонента TTable без формы 4
354 Создание таблицы в модуле
355 Текущая TTable пуста
356 Высокоточный таймер
357 Имплантация таймера в компонент
358 Как можно обойтись без TTimer и наиболее рационально использовать ресурсы системы
359 Как отчитывать промежутки времени с точностью
360 Класс TRyTimer
361 Элемент управления Edit, реагирующий на событие OnTimer
362 DBTreeView своими руками
363 TTreeView с возможностью MultiSelect
364 В TreeView текущий Node выделяется другим шрифтом
365 Возможность отмены вставки нового узла в TTreeView по нажатию кнопки Esc
366 Как убрать всплывающие подсказки в TreeView
367 Копировать и вставлять TreeNode
368 Получение доступа к узлам TreeView
369 Получить строковый путь в TTreeView
370 Поточность TreeView
371 Прокрутка TreeView, чтобы держать выделение посередине
372 Рекурсивные механизмы спуска по дереву
373 Ускорение работы TreeView
374 Ускорение работы TreeView 2
375 Хочется выделять некоторые строчки в TTreeView жирным
376 Хочется выделять некоторые строчки в TTreeView жирным или бледным
377 TWriter и TReader — читаем и пишем в файл
378 Пример TWriter и TReader
379 kaCtrls — библиотека компонент и классов
380 KOL — кодоэкономичная объектная библиотека для Delphi
381 Круглая кнопка, кнопка с изменяющимися размерами
382 Notebook — добавление и удаление страниц
383 Notebook как контейнер для форм
384 Notebook как контейнер для форм 2
385 Tabbednotebook и куча ресурсов
386 Включение и выключение закладки Notebook
387 Динамические PageControl и TabSheet
388 Динамические PageControl и TabSheet 2
389 Динамические создание объектов в TabbedNotebook
390 Динамические создание объектов в TabbedNotebook 2
391 Добавление элементов управления в TTabbedNotebook и TNotebook
392 Доступ к страницам Tabbednotebook
393 Изменяем цвет TPageControl
394 Итерация элементов управления компонента Notebook
395 Как использовать клавишу-акселератор в TTabSheets
396 Над какой закладкой курсор в TabControl
397 Как работать с формой, куда динамически передаются страницы (PageControl) из форм-хранителей (с использованием наследования)
398 Клавиши-акселераторы для TPageControl
399 Недоступная закладка в компоненте TabbedNotebook
400 Перемещение на страницу TabSet по имени
401 Проблема с освобождением ресурсов Notebook
402 Разделяемые элементы управления для Tabbednotebook
403 Разделяемые элементы управления для Tabbednotebook 2
404 Разделяемые элементы управления для Tabbednotebook 3
405 Синхронизация TabSet c ListBox
406 События KeyPress и KeyDown не вызываются для Tab — как определить ее нажатие
407 Создание страниц компонента Notebook во время работы приложения
408 Вывести информацию о классах
409 Иерархия классов
410 Изменить заголовки компонент различных классов
411 Информация о TClass
412 Информация о классах
413 Переназначения объектов
414 Поиск класса
415 Получение информации о классе и об окне
416 Как программно щелкнуть по компоненту SpeedButton
417 Получение ссылки на класс из объекта
418 Получение ссылки на класс из объекта 2
419 Регистрация классов
420 Создание потомка от класса зарегистрированного в Delphi
421 Создать компонент любого класса
422 Список объектов класса TDate
423 Удаление объектов, освобождение памяти
424 Автоматически нажимающаяся кнопка
425 Анимированная пиктограмма кнопки
426 Визуализация нажатия кнопки
427 Из ресурсов поочередно загружать глифы для кнопок SpeedButton
428 Изменить цвет TButton
429 Как текст на кнопке расположить под заданным углом
430 Кнопка с многострочным заголовком
431 Кнопка с многострочным заголовком 2
432 Кнопка со звуком
433 Многострочный заголовок у TBitBtn
434 Многострочный заголовок у TBitBtn 2
435 Расширяем возможности кнопок в Delphi
436 Смена иконки BitBtn во время работы приложения
437 Цветная кнопка
438 Класс для реализации списка Variant-ов на основе TCollection
439 Коллекции и работа с ними
440 Работа с коллекциями — сохранение и загрузка
441 Сохранение и загрузка данных в объекты на примере коллекций
442 Блокировка и разблокировка перерисовки компонента
443 Глобальный поиск компонента
444 Иерархия VCL
445 Использование холста в собственных компонентах
446 Как заставить произвольный компонент реагировать на изменения в TDataSource
447 Как передать фокус следующему контролу
448 Как получить число и список всех компонентов, расположенных на TNoteBook
449 Как получить ширину ScrollBar
450 Как работать с компонентами по их индексу
451 Клонирование объекта
452 Копирование компонента через TFileStream
453 Поменять владельца компонента
454 Работа с именем компонента
455 Связывание строки и компонента
456 Сохранить несколько контролов в один файл
457 Чтение и запись компонента
458 TRyMenu — собственная отрисовка меню
459 Автоматический выбор произвольного пункта PopupMenu
460 Блокировка меню без закрашивания серым
461 Выделение меню
462 Вызов контекстного меню в координатах курсора мыши
463 Вызов контекстного меню в позиции курсора
464 Вызов контекстного меню в позиции курсора 2
465 Вызов контекстного меню в позиции курсора 3
466 Динамическое добавление пунктов меню
467 Динамическое добавление пунктов меню 2
468 Динамическое добавление пунктов меню 3
469 Добавить пункт к системному меню приложения
470 Добавление иконки в меню
471 Добавлять новые пункты меню
472 Изменить системное меню
473 Иконки в PopupMenu
474 Использование контекстного меню с VBX
475 Исправление иконок выключенных пунктов меню
476 Как главное меню приложения вставить в TToolBar (как в Delphi)
477 Как динамически создавать пункты подменю в PopupMenu
478 Как поместить маленькие битмапы в TPopupMenu
479 Как программно заставить выпасть меню
480 Как рисовать картинки в пунктах меню (через OwnerDraw)
481 Как сделать пункты меню с картинками
482 Каким образом узнать, открыто меню или нет
483 Меню с правой стороны
484 Обработчик динамически созданного пункта меню
485 Очень длинные меню
486 Перехват клавиши SHIFT во время выбора пункта меню
487 Пишем свой текст в Меню
488 Прозрачные меню для XP, Win2000
489 Создание pop-up меню своего компонента и кое-что еще о классе TComponentExpert
490 Чтобы клавиши shortcut пунктов главного меню главной формы действовали только в этой форме (но не в модальных окнах)
491 Элементы меню на основе изображений
492 Если нет модуля Math
493 Имя класса компонента и модуля
494 Получение имени модуля
495 Текущий модуль и проект
496 FileReaderWriter-поток
497 TMemoryStream
498 Взять один символ из потока памяти
499 Вызов процедуры в другом потоке
500 Как при создании объекта TThread передать ему некоторое значение
501 Как реализовать обработку информации одновременно несколькими потоками
502 Как создавать потоки без класса TThread
503 Как создавать потоки без класса TThread 2
504 Копирование файлов потоком
505 Помещение формы в поток
506 Рассуждения о потоках
507 Реализация собственного потока
508 Сжимаем и разжимаем потоки
509 Сохранение и загрузка формы с компонентами потоком
510 Сохранение и чтение из потока данных объекта
511 Override, Vitual, Dynamic — методы
512 Вызов c-шной функции с переменным числом параметров
513 Вызов процедуры, имя которой содержится в переменной
514 Вызов процедуры, имя которой содержится в переменной 2
515 Выполнение процедуры по адресу
516 Динамические и виртуальные методы
517 Конфликт имен параметров
518 Макро-процедуры
519 Передача функции как параметра
520 Перекрытие виртуальных методов
521 Переменное количество параметров любого типа
522 Пример переменного количества параметров
523 Работа метода Assign
524 Вложенные свойства
525 Два и более обработчика события
526 Декларация события OnPassword
527 Делегирование события
528 Демонстрация DefineProperties
529 Имя свойства в течение выполнения программы
530 Интерфейсы и published свойства
531 Использование перечислимых констант
532 Как во время выполнения определить поддерживает ли обьект заданное свойство
533 Как определить, есть ли некоторое свойство у объекта
534 Как разделить обработку OnClick и OnDblClick
535 Как скрыть свойства объекта
536 Как убрать публичное свойство компонента
537 Код определения свойств
538 Назначение события во время выполнения программы
539 Определить и выставить значение текстового свойства
540 Определить каким свойством определяется заголовок у компонента, и изменить его
541 Поиск свойств
542 Получение имени обработчика события
543 Получить список свойств перечисляемого типа и список их значений
544 Получить список событий и их описание
545 Получить список типов свойств и их описание
546 Пример использования ActiveControl
547 Присвоить значение защищённому свойству класса
548 Присвоить одно событие всем компонентам
549 Проверка на существование свойства
550 Публикование свойств-наборов
551 Регистрация редактора свойства
552 Редактор свойств для точки
553 Редактор свойства Color с заданными ограничениями
554 Редактор свойства TStringListProperty
555 Свойства в Delphi
556 Свойство FileName в невизуальном компоненте
557 Синтаксис ссылки на событие
558 Создание редактора свойства
559 Создание свойства-массива компонентов
560 Создание события во время выполнения приложения
561 Как запретить изменение размера моего компонента в design-time
562 Как реализовать правильный выпадающий контрол (Combo)
563 Как сделать, чтобы орган управления, например, сложная линия, хваталась только за некий контур, и пропускала мышь под себя в других местах
564 Как создать TrackBar, в котором вместо широкой белой полосы была бы тонкая линия
565 Как создать клон произвольного компонента
566 Как создать невизуальный компонент без иконки, которая изображается в Design-Time
567 Компонент DirectoryTree
568 Компонент FontListBox
569 Компонент PowerControl
570 Компонент TMinMax
571 Компонент TrayIcon
572 Компонент для работы с FLIC-анимацией
573 Компонента HTML — редактора
574 Показ всплывающих подсказок компонентов
575 Пособие по написанию компонентов
576 Прерывание создания компонента
577 Пример компонента HotSpot
578 Пример компонента типа XPButton
579 Пример создания компонента TDBNavigationButton
580 Прозрачный компонент
581 Регистрация компонент
582 Решение для динамически создаваемых компонентов
583 Сгруппировать свойства наподобие Font
584 Создание компонента
585 Создание компонентов для работы с базами данных
586 Создание порядка компонент — решено
587 Установка границ для вновь создаваемых элементов управления
588 Элементы управления с автовыравниванием
589 FileListBox с двумя колонками
590 ListBox с графикой
591 PChar в TStringList
592 TStringList и потоки
593 TStringList, владеющий объектами
594 TStringList. Неустойчивость сортировки
595 TStringList.IndexOf. Зависимость от сортировки
596 Автозаполнение в ComboBox
597 Быстрая отрисовка BitMap в компоненте TListBox
598 Быстрый поиск в списке
599 Включение табуляторов в Listbox
600 Внешние данные и ListBox
601 Выравнивание в ListBox
602 Выровнять текст в TListBox вправо
603 Две колонки в DBLookupComboBox
604 Заполнение TDBComboBox
605 Значение DBLookupComboBox
606 Изменение шрифта в Listbox
607 Инкрементальный поиск в ListBox
608 Инкрементальный поиск в ListBox 2
609 Как вставить растровое изображение в компонент ListBox
610 Как добавить горизонтальную полосу прокрутки в TListBox
611 Как изменить фоновый цвет текста в различных строчках TListBox
612 Как определить состояние списка ComboBox, выпал или скрыт
613 Как показать Hint для частично видимых элементов ListBox
614 Как поместить графический элемент в TListBox
615 Как поместить картинки в ComboBox
616 Как присвоить значение свойству Selected в ListBox
617 Как сделать так, чтобы каждая строка в ListBox имела свой цвет
618 Как узнать размеры TComboBox с показанным выпадающим списком до показа списка
619 Как элемент списка нарисовать своим цветом
620 Когда я добавляю обьект в список TStrings как мне его потом уничтожить
621 Колонки в TListBox — Вставка символа табуляции
622 Компонент CheckList
623 Многостроковый TComboBox
624 Можно ли изменить число колонок и их ширину в компоненте TFileListBox
625 Навигация по выбранным элементам в ListBox
626 Наследник TComboBox, показывающий Hint для строки в ListBox-овой части, не видимой целиком
627 Несколько колонок в TComboBox
628 Обнаружение прокрутки TListBox
629 Обновить DBLookUpComboBox при скролинге таблицы
630 Отображение полных строк списка при перемещении мыши по списку
631 Показываемое DBLookupComboBox значение
632 Предварительная загрузка элементов
633 Пример OwnerDraw для Listbox
634 Проверка ситуации Выход За Границы Списка при нажатии правой кнопки на списке
635 Программное открытие ComboBox
636 Расширение компонента ListBox
637 Свойство TStringList
638 Создание TList со списком файлов, отсортированных по дате
639 Создание списка списков (TStringList)
640 Список объектов
641 Табуляция в графическом ListBox
642 Уменьшение мерцания ListBox в обработчике OwnerDraw
643 Щелчок в пустой области TListBox
644 TCheckListBox — использование методов LoadFromFile и SaveToFile
645 Видоизменяем чекбоксы в Delphi
646 Группа радиокнопок и ActiveControl
647 Как поместить TCheckBox в TRichEdit
648 Можно ли отключить определённый элемент в TRadioGroup
DelphiFeeds.Ru — лучшие Delphi блоги Рунета
DelphiFeeds.Ru — лучшие Delphi блоги Рунета http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Admin http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Admin2021-07-28 07:28:002021-07-28 07:57:44Как определить реальную версию Windows? http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Admin http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Admin2021-07-20 06:59:002021-07-20 07:02:45Выпущены Delphi и C++Builder 10.4.2 Community Edition http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Admin http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Admin2021-07-13 16:05:002021-07-13 16:56:31Delphi 10.5 отменяется – ждем Delphi 11 http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Admin http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Admin2021-07-12 13:59:002021-07-12 14:57:22Delphi, C++Builder и RAD Studio 10.5 Beta http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Андрей Ефимов http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Андрей Ефимов2021-07-12 01:06:002021-07-12 01:59:09[Android Service] Пример Started сервиса http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Андрей Ефимов http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Андрей Ефимов2021-07-12 01:03:002021-07-12 01:59:10[Android Service] Сервисы в Android http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Андрей Ефимов http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Андрей Ефимов2021-07-12 00:54:002021-07-12 00:58:40[Android Service] Добавление/удаление сервиса в FMX http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Александр Алексеев http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Александр Алексеев2021-07-09 15:53:002021-07-09 16:55:02Работа с криптографией в EurekaLog http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Admin http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Admin2021-07-06 06:06:002021-07-06 06:57:30Получение SHA1-хеша цифрового сертификата http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png 0 0 Андрей Ефимов http://delphifeeds2.ru/wp-content/uploads/2018/11/logo-копия-1-300×138.png Андрей Ефимов2021-07-04 16:53:002021-07-04 16:56:03[Сервисы #1]: Мастер создания сервисов Scroll to topTMemoryStream для чтения вне Delphi
Delphi и Delphi для .NetКажется, что Delphi для .Net медленнее, чем собственное приложение Delphi Win32. Я хотел бы знать, правда ли, что все приложения .Net медленнее, чем собственные приложения Win32, или это только Delphi для .Net. Ваша информация очень ценится, Инунг В 2011-06-21 18:20:17 +0100 Инунг Хуанг сказал: > Кажется, что Delphi для .Net работает медленнее, чем собственное приложение Delphi Win32. > Хотелось бы знать, правда ли все.Net приложение работает медленнее, чем > Нативное приложение Win32 или только Delphi для .Net. Если вы запускаете код в приложении только один раз, то да, да …
Компоненты SEPA для Delphi с исходным кодом (Delphi 5
Привет всем, в Европейском союзе в следующем году изменит формат Bankingformat на формат SEPA. Все люди и компании должны изменить банковское программное обеспечение и данные о клиентах в счетах с новыми номерами IBAN и BIC. Видеть: http: // www.arma-it.de/shop/artikelueber.php?wgruppeid=211&wgruppe_offen=211 Функции: — генерировать SEPA XML’S
— Расчет IBAN
— База данных BIC (DE, AT и CH) Вопросов: [email protected] PS:
Банковское ПО для разработчиков (только для Германии) http://www.arma-it.de/shop/artikelueber.php?wgruppeid=212&wgruppe_offen=212
El 26.10.13 21:38, A …
Delphi 7 to Delphi XE
Используют Delphi 7 много лун (есть более поздние версии, но никогда
повышен до) Моя первая проблема: Палитра компонентов.в XE это небольшая панель инструментов, закрепленная в правом верхнем углу в Delphi 7 это дает полный обзор всех компонентов. Я изо всех сил пытаюсь справиться / получить доступ к моим компонентам в Delphi XE. Могу ли я сделать панель инструментов палитры компонентов такого же размера, как Delphi 7, или
есть быстрый способ просмотреть / выбрать все доступные компоненты в XE, которые у меня есть
еще не заметили? С уважением, Роберт.
Здравствуй, Я знаю, что в Delphi 2010 и XE вы можете выбрать
между т…
Delphi 2007 to Delphi 7
Я написал класс в Delphi 2007, который не поддерживается в Delphi 7. Что
было бы лучшим способом достичь того, что я сделал в Delphi 2007 в Delphi 7? Спасибо,
Том тип BondConstants = class {Типы облигаций}
тип BondType = запись
const
КАЗНАЧЕЙСТВО = 3;
АГЕНТСТВО = 0;
CORP = 1;
MUNI = 2;
SBA = 5;
МБС = 4;
CMO = 6;
конец; {Методы подсчета дней}
тип DayCount = запись
const
ACTUAL_360 = 2;
ACTUAL_365 = 1;
ACTUAL_ACTUAL = 1;
d30_360 = 0;
…
Delphi XE / Delphi 2010
Здравствуйте! Я заметил, что Embarcadero® Delphi® 2010 Version отсутствует в списке продуктов на
Страница Embarcadero.
Или еще можно купить? Сможет ли RAD Studio XE без проблем компилировать программы, написанные на Delphi 2010? Спасибо.
Am 13.09.2010 09:04, Шриб Петра Немец: > Будет ли RAD Studio XE без проблем компилировать программы, написанные на Delphi 2010? Как всегда, вам, вероятно, придется воссоздать проекты в качестве импорта
еще немного — особенное.Христианин
Привет!
Кто-нибудь знает, можно ли получить пробную версию Delphi2010?
(если да, где)?
…
Delphi 5 To Delphi 2009
Я обновился до Delphi 2009 с D5. При установке указано, что я могу установить Delphi и / или C ++. Delphi установлен нормально, но я ничего не вижу в C ++. Что мне не хватает или мое обновление не включает C ++? Спасибо
Это зависит от того, что вы купили. Если вы купили только Delphi 2009, это
то, что вы получаете. Если вы купили Delphi 2009 и C ++ Builder 2009, вы получите
оба.Я предполагаю, что у вас есть только Delphi 2009. Самый простой способ проверить
Вот посмотрите ваш счет — он должен сказать, я бы подумал. Вы также можете перейти к
members.embarcadero.com, войдите, затем щелкните мои зарегистрированные продукты.
Будет текстовое описание …
Delphi 5 до Delphi 6 и выше
Уважаемый список, Пытаюсь добавить поддержку сжатия 7Zip в свое приложение delphi.
Я использую портированный 7Zip sdk (см. Их веб-сайт, у них есть ссылка). Я не понимаю, как переписать одну функцию: функция ReverseDecode (var Models: array of SmallInt;….): ….. где вход в основном представляет собой массив SmallInt фиксированного размера.
Этот код отлично компилируется и работает в Delphi 6 и новее, но в Delphi 5 я получаю ошибку:
Нет перегруженной версии ReverseDecode, которую можно было бы вызвать с этими аргументами. И, очевидно, ввод (фиксированный) не совпадает с параметром …
Delphi для PHP или Delphi PRISM
Привет, У меня есть возможность разработать веб-систему управления библиотекой.Ничего особенного, просто возможность делать обычные CRUD-вещи для книг и
предоставить средство поиска. Заимствование осуществляется по электронной почте.
администратору библиотеки, который затем отправляет книги. Поскольку оба Delphi
для PHP и Delphi PRISM позволит мне разработать приложение, которое
позволит мне доставить его за меньшее время, а также увеличить (даже как
small) моя конкурентоспособность как веб-разработчика? Спасибо. Филипп Флорес
Филипп Флорес писал: > Привет,
>
> Имею возможность развиваться…
Delphi 4 в Delphi 2007
Здравствуйте!
Придется перенести приложение D4 (с исходным кодом) на D2007.
с какой проблемой я могу столкнуться?
Завтра мне придется пойти на сайт заказчика, чтобы проанализировать его исходный код.
Чтобы процитировать работу, на что мне обратить внимание, чтобы оценить время переноса?
Спасибо
Джон Терри писал:
> Здравствуйте,
> Мне нужно будет перенести приложение D4 (с исходным кодом) на D2007.
> С какой проблемой я могу столкнуться?
> Мне придется завтра пойти на сайт заказчика, чтобы проанализировать его исходный код.
> Чтобы процитировать работу, о чем я должен думать, чтобы оценить время портирования? Вы, вероятно, сможете сделать это просто чанги…
Delphi 5 to Delphi XE4
Думаю о преобразовании. Конечно, у нас есть множество компонентов, таких как:
TurboPower AsyncPro,
TurboPower Орфей
ICS2
Synactis All-In-The-Box. У вас, ребята, есть какой-нибудь совет относительно усилий и времени, которые могут потребоваться. Это большое приложение, несколько сотен тысяч строк.
И вот что происходит при использовании сторонних компонентов, много дополнительной работы. Меня несколько раз обжигали. Теперь я ограничиваюсь использованием нескольких хорошо известных поставщиков, таких как TMS.Я «забанил» много других компонентов. С уважением,
Оле >
> Думаю о преобразовании …
Delphi 7 в Delphi XE2
Привет, Все еще использую эту старую рабочую лошадку, Delphi7, но собираюсь на конференцию в
Лондон, организованный Embarcadero на Delphi XE2. Хотя я бы хотел «идти в ногу со временем» и очень хочу получить
Поддержка UNICODE и 64-бит, предлагаемая последними IDE, я признаю, что
более чем немного напугали все UNICODE / String / AnsiString и 32/64
немного проблемы, я, вероятно, упаду.Все, кто недавно обновился с
Delphi7 в одну из последних IDE Delphi? Спасибо,
Ален
02.03.2012 08:55 Ален Деккер написал:
> Все еще использую ту старую рабочую лошадку, Delphi7, но …
от delphi 6 до delphi 2010
Привет.
Возможно, с компонентом RX, dxforumlibrary, InfoPower3000Pro,
StringAlignGrid.
Принимает связь BDE. Благодарю комментариями.
excequiel arostica написал: > Привет.
> Возможно, с компонентом RX, dxforumlibrary,
> InfoPower3000Pro, StringAlignGrid.Принимает связь BDE.
>
> Благодарю за комментарии. Rx мертв, и исходники принимаются jcl / jvcl. Я не знаю о
остальные компоненты, и у меня нет опыта работы с bde через
последние 9 лет.
excequiel arostica написал: > Привет.
> Можно, с компонентом RX, dxforumlibrary, …
Delphi и вирусом, или вирусом и Delphi.
Всем привет. Существует некоторая дискуссия о «новом» вирусе, нацеленном на Delphi (и
Разработчики).Статья на датском языке:
Delphi 4 в Delphi 2009
Здравствуйте! Спасибо всем, кто ответил на мой предыдущий вопрос. Это было большим подспорьем.
И наконец наш клиент согласился обновить нашу версию delphi с 4 до Delphi 2009. * Вздох *.
Но перед этим мне нужно дать оценку и стоимость перехода на delphi 2009. Может ли кто-нибудь сказать мне, есть ли какой-либо инструмент для перехода с delphi 4 на delphi 2009, или мне просто нужно скомпилировать наше приложение Delphi 4 в Delphi 2009.Я прочитал из матрицы функций delphi 2009, что импорт Delphi 1 — Delphi 2007 возможен в delphi 2009. Но я не уверен в этом, учитывая размер нашего приложения.
…
|
|
Страница не найдена 404
Страница не найдена 404Одна лицензия разработчика позволяет 1 разработчику использовать компоненты для разработки, получать бесплатные обновления и поддержку для полного цикла версий продукта. Лицензия не подлежит передаче.
Одна лицензия разработчика позволяет 1 разработчику использовать компоненты для разработки, получать бесплатные обновления и поддержку в течение 1 года.Лицензия не подлежит передаче.
Одна лицензия разработчика позволяет 1 разработчику использовать компоненты для разработки, получать бесплатные обновления и поддержку в течение 2 лет. Лицензия не подлежит передаче.
Маленькая командная лицензия позволяет 2 разработчикам в компании использовать компоненты для разработки, получать бесплатные обновления и поддержку для полного цикла версий продукта. Лицензия не подлежит передаче.
Небольшая командная лицензия позволяет 2 разработчикам в компании использовать компоненты для разработки, получать бесплатные обновления и поддержку в течение 1 года.Лицензия не подлежит передаче.
Небольшая командная лицензия позволяет 2 разработчикам в компании использовать компоненты для разработки, получать бесплатные обновления и поддержку в течение 2 лет. Лицензия не подлежит передаче.
Лицензия на сайт позволяет неограниченному количеству разработчиков в компании использовать компоненты для разработки, получать бесплатные обновления и поддержку для полного цикла версий продукта. Разработчики могут быть добавлены в любое время в течение цикла полной версии.
Лицензия на сайт позволяет неограниченному количеству разработчиков внутри компании использовать компоненты для разработки, получать бесплатные обновления и поддержку в течение 1 года. Разработчики могут быть добавлены в любое время в течение 1 года.
Лицензия на сайт позволяет неограниченному количеству разработчиков внутри компании использовать компоненты для разработки, получать бесплатные обновления и поддержку в течение 2 лет. Разработчики могут быть добавлены в любое время в течение 2-х летнего периода.
Скрыть менюИзвините, страница, которую вы ищете, не существует.
Вы можете выполнить поиск на сайте или вернуться на главную страницу. Roeselarestraat 180
8560 Wevelgem — Бельгия
По вопросам продаж
[email protected]
Авторские права © 1995-2021 TMS Software v5.0
Связанные статьи тега: «delphi 7»
Похожие статьи по тегу: «delphi 7»
CompareText Сравните размер двух строк, возвращаемое значение — -1 [когда a1
Delphi означает выскакивание ключевых слов: Break, Continue, Exit, Abort, Halt, RuNerror 1 break // Принудительный выход из цикла (только в цикле), используется для принудительного выхода из оператора For, оператора While или …
Служба Delphi [6] Подробная информация о событии службы (Onstart, Onexecute) Обычно для размещения кода службы используются два места: в событии Onexecute или ONStart. 1 、 OneExecute : Вы можете создать цепочку …
Сервисная процедура Delphi [5] описывает, открытие, остановка, получение 1.Описание не может быть установлено в служебной программе, оно может быть установлено следующим методом: 2, открыть, остановить, получить, состояние …
Сервисная программа Delphi [4] амфибия (системная служба и настольная программа) Метод 1: Метод 2: Время создания: 2021.01.21 Обновлено: …
Служебная программа Delphi [3] Установка, метод удаления 1, командное окно cmd Установка BAT (при условии генерации sertest.exe) Вы можете добавить параметры / Silent после командной строки, чтобы это произошло…
Delphi Service [2] Свойство TService, событие 1, свойства TSERVICE: AllowPause: // Приостановить ли Allowstop: // Следует ли останавливать Зависимости: // Настройка зависимости этой службы от других …
Арифметический оператор Delphi DIV и MOD div Значение x DIV Y — это значение x / y, а направление 0 округляется до ближайшего целого числа. mod Оператор MOD возвращает остаток своей операции …
Delphi Olevariant и String, TmemoryStream, взаимное преобразование Recordset 1, Olevariant и String 2, Olevariant и TmemoryStream 3, Olevariant и Recordset Время создания: 2021 г.02.05 Обновлено: …
Операция Delphi olevariant value / assignment Время создания: 2021.02.03 Обновлено: …
Delphi DB — TupdateStatus — указывает статус обновления записи. Единица: DB UpdateStatus указывает изменения в текущем кэше записей (если есть) Время создания: 2021.02.02 Обновлено: …
Delphi TdataSetProvider.UpdateMode — указывает, как найти записи для их обновления. Описание: UpdateMode Определяет расположение записи при вызове метода Applyupdates Unit: грамматика БД:…
Delphi char, pchar, взаимное преобразование строк 1, преобразование String и PCHAR 1.1. String переводится в PCHAR 2 способами 1,2 pchar превращает строку в 3 способа 2, преобразование String и Char 2.1 CHAR Turn Stri …
Delphi ADOConnection1.Errors Errors — это реализация коллекции ERRORS. Прототип синтаксиса: описать: используйте ОШИБКИ для доступа к коллекции ADO ErrorS объекта подключения ADO, представленного t …
Delphi получает метод всех имен таблиц и полей таблиц в базе данных 1 через встроенную функцию (getfieldnames) 2 через оператор SQL (например: SQL Server) Creat.