Delphi

Tmemorystream delphi описание: TStream, TFileStream, TMemoryStream

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:

  1. TNetHTTPClient – это ваш HTTP-клиент для работы с сервером
  2. TNetHTTPRequest – ваш запрос к HTTP-серверу

Возник сразу вопрос: почему не сделали тогда и третий компонент, например, TNetHTTPResponse (ответ сервера), по аналогии с тем, что сделано в REST Clietn Library, тем более, что класс ответа как таковой имеется. Но об ответах – позже.

TNetHTTPClient

TNetHTTPClient в плане построения напоминает аналогичный компонент от 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, которая норовит по каждому поводу выкинуть какое-нибудь исключение, 

TNetHTTPClient работает “по-тихому”, как Synapse, то есть не считает, что коды 3хх – это тот случай, когда надо создавать исключение и останавливать работу, а просто сохраняет ответ и ожидает дальнейших действий.

Что ещё примечательно, так это, что 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;

На что обратил сразу внимание:

  1. Частичный Get выделен как самостоятельный метод. Мелочь, а приятно – не придётся заморачиваться лишний раз с заголовками.
  2. Разработчики заранее озаботились тем, что различные 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 нам необходимо выполнить следующие обязательные условия:

  1. Определить поток для хранения результата (свойство ContentStream)
  2. Определить HTTP-метод (свойство MethodString)
  3. Выполнить метод 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 воспринимал одни цифры и DecimalSeparator

002 Как осуществить быстрый поиск в 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 top

TMemoryStream для чтения вне 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 (и Разработчики).Статья на датском языке: но относится к этой статье: Из датской статьи POV кажется, что сам Delphi является уязвимым, что неправда. Насколько я понимаю, это вектор атаки, внедрение (исходного) кода в Блок «Sysconst». В чем дело? — С уважением Стиг Йохансен Возможно, проверяю другие треки…

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. Но я не уверен в этом, учитывая размер нашего приложения. …

Библиотека простого сжатия — сжатый поток Delphi

Обзор

Easy Compression Library — очень простая в использовании замена TFileStream, TMemoryStream и других потомков TStream их аналогами со сжатием / распаковкой и шифрованием.Сжатие прозрачное, все методы, свойства и поведение TFileStream и TMemoryStream поддерживаются, поэтому их очень просто заменить в коде приложения.

Easy Compression Library не поддерживает многофайловые архивы. Если вам нужно сжать несколько файлов в один архивный файл, попробуйте FlexCompress или ZipForge.




Текущая версия : 5.92 Выпущено : 21 января 2019 г. Цена : 199 долларов.
Мы сделали три запроса в службу технической поддержки, и, несмотря на то, что все это были вопросы по внедрению (а не ошибки в их программном обеспечении), мы получили поддержку в течение 24 часов. В наши дни редко можно получить такую ​​хорошую поддержку клиентов, и я очень ценю все, что ComponentAce сделал для нас.

Джейсон Гудридж, менеджер по развитию


Страница не найдена 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 a2] function CompareText (const a1, a2: string): Integer; При сравнении случай…

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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *