Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Интернет для Delphi-программиста 60


Интернет для Delphi программиста.

Выпуск : № 60


Здравствуйте уважаемые подписчики рассылки "Интернет для Delphi программиста". Данная рассылка предназначена для всех кого интересует Delphi, здесь будут выкладываться ссылки на различные ресурсы интернета так или иначе связанные с Delphi: книги, исходники, программы... Изучайте Delphi один из лучших языков программирования!!!


ЗАДАТЬ ВОПРОС :

Правила рассылки: 
1. Не присылайте ответов на вопросы типа "да, нет".  
2. Если отвечаешь на вопрос - то отвечай подробно с примерами (желательно с исходником примера).
3. Тема вопросов - программирование на Delphi.
Внимание авторам: - Я не указываю ваши адреса из-за спама, но кто хочет, чтобы его email был - пишите, иначе только имя(ник).
Отправить вопрос


Новые вопросы.


Вопрос № 152 задаёт: ZhenO Ответить  
создаю программно компонент TEdit, и текстовый файл как записать данныее введенные в TEdit в файл? ни как не могу разобраться :( main.pas
Вопрос № 153 задаёт: Середюк И. А. Ответить
Как при нахождении определенного файла определить его тип. Мне нужно, чтобы определить, является ли найденный файл таблицей баз данных типа FOXPRO (*.DBF), но расширение файла может быть и другим. И если он является таковым, то проверить, существуют ли в этой таблице поля с определёнными именами и определёнными типами. После этого надо реализовать его чтение, запись и т.д.
Вопрос № 154 задаёт: И.В.Крылов  Ответить
Как в Delphi7 считать данные из DBF файла на прямую, не используя BDE, используя Table или Query без разницы. Пытался сам сделать возникает ошибка не загружен драйвер.

Ответы.

Вопрос № 148 задаёт: Роман  Ответить
Как из Delphi подключиться к интерфейсу WMI.
Ну например нужно получить список логических дисков на удаленном компе
Отвечает:  LeVeL
Рекомендую скачать следующие файлы по данной теме, а там уже легче будет разобраться:

НА РУССКОМ ЯЗЫКЕ:
http://delphi.mtu-net.ru/zip/wmi.zip

А более подробные примеры (на английском):

Magenta Systems WMI and SMART Component
=====================================================================
URL: http://delphi.icm.edu.pl/ftp/d60free/magwmi50.zip
Size: 358081
contains WMI, SMART and SCSI PassThrough functions, of particular
use for getting hard disk information and configuring network
adaptors, but also for many other general uses. MagWMI which allows
access and update of windows system information using Windows
Management Instrumentation. MagWMI provides general view access
to any WMI information using SQL like commands, and also a number
of dedicated function relating to TCP/IP configuration, such as
setting the adaptor IP addresses, and the computer name and
domain/workgroup. There are also some examples for getting BIOS
and disk drive information using WMI, and also a method using SMART for getting disk information since WMI has limitations on Windows 2000. SMART also returns disk failing or fault information. For disks that don't support SMART, SCSI Pass Through is used to get the drive serial number.

=====================================================================

А вообще, люди, зачем только есть поисковики типа Google, Yandex, Rambler, ведь толко стоит набрать "Delphi WMI Source" и вы увидите множество ссылок на примеры использования WMI в Delphi.

=====================================================================
А насчет более подробной информации, если есть возможность купите диск с MSDN и в данной библиотеке, хоть и на англиском, но зато подробнейшее описание всех свойств WMI.

Вопрос № 149 задаёт: Середюк И. А. Ответить
Подскажите, пожалуйста, как добавить в компонент RichEdit событие OnDblClick? Или как узнать что в этом компоненте произошло двойное нажатие левой клавиши мыши?
Отвечает:   Константин Завальный
Я уже отвечал на этот вопрос:) ...
Вообще-то у компонента RichEdit нет события OnDblClick. Но можно сделать примерно так.
В событии OnMouseUp пропишите:

if clck=true then
begin
//Do something...
end else clck:=true;

Кинуть на форму таймер, в OnTimer пропишите clck:=false;
И не забудьте в разделе var объявить переменную clck типа boolean.
Работает это так: Изначально clck равна false. Если вы нажали один раз на компонент,
то clck примет true. Когда Вы второй раз щелкните по компоненту, то выполнится ваш код.
А чтобы задать максимально допустимый интервал между кликами, используется таймер,
обнуляющий clck. Удачи!

Отвечает: sattar  
File\Close All
File\New\Unit
Приведи код к следующему виду:
unit RichEdit1;
interface
uses
SysUtils, Classes, Controls, StdCtrls, ComCtrls;
type
TRichEdit1 = class(TRichEdit)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
property OnDblClick;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TRichEdit1]);
end;
end.


Сохрани юнит с названием TRichEdit1. Потом Component\InstallComponent. В
поле UnitFileName впиши путь и название файла, который ты создал. Потом
ОК,Yes,ОК. На закладке Samples найдешь компонент TRichEdit1, он будет
иметь сообщение OnDblClick.
Вопрос № 150 задаёт: Dead Lord  Ответить
Вообще глупая проблема: я создаю динамически панель и пытаюсь нарисовать на ней через Brush картинку, но прога при попытке нарисовать ругается на AccessViolation. Я так понял, что это из- за динамического создания, но как решить проблнму- не предстовляю:(
Помогите!
Отвечает:  Den
AccessViolation - значит объект, на котором ты рисуешь не существует (динамически создаёшь), при трассировке проекта панель твоя будет = nil.
Или ты рисуешь не на канве панели (TPanel.Canvas)
Вопрос № 151 задаёт:  amorfer Ответить
Пробую завершить работу одной из своих программ с помощью другой, используя в другой программе:
h:=FindWindow(nil, 'Заголовок_приложения');
  if h<>0 then
    begin
      SendMessage(h, WM_DESTROY, 0,0);

    end;
на что программа, которая должна завершить свою работу, никак не реагирует. Не срабатывает именно: SendMessage(h, WM_DESTROY, 0,0);
Как сделать, чтобы SendMessage выполнялась. Может есть другие варианты по завершению работы программы из другой?
Отвечает:  мэйл_рфдл2
Попробуй послать WM_CLOSE
Отвечает: Олег 
SendMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0)


Статья:    "Принципы работы с памятью в системе Windows 32." 

1. Введение

В данной статье изучаются принципы работы с памятью в системе Windows 32. Исследуется проблема накопления потоковых данных в специальных потоковых хранилищах. Работа с памятью является одной из важнейших функций любой программы. Выделение участков памяти для структур программы должно быть эффективным, поэтому программист должен хорошо разбираться в особенностях этого процесса.

В статье приводятся только основные принципы работы с памятью в системе Windows 32. Для подробного изучения всех тонкостей этого сложного процесса читатель может обратиться к специальной литературе. Особенно хочется отметить книгу: Дж.Рихтер, "Windows для профессионалов".

2. Организация виртуальной памяти в Windows

Как известно, Windows 32 - тридцатидвуразрядная операционная система (число 32 как раз это и обозначает). Прежде всего, из этого следует, что запущенная программа может адресовать линейное адресное пространство размером 2^32 байт = 4 ГБ, при этом адресация производится при помощи тридцатидвуразрядных регистров-указателей. Каждый запущенный в системе процесс обладает своим собственным адресным пространством, каждое из которых не пересекается с адресными пространствами других процессов. Распределение системных областей в адресном пространстве систем Windows 95/98 и Windows NT различно.

Программа может адресовать любую ячейку памяти в диапазоне адресов своего адресного пространства. Однако, это не значит, что программа может записать или считать данные из этой ячейки. Адресное пространство в Windows - виртуально, оно не связано напрямую с физическим пространством оперативной памяти вашего компьютера.

Механизм выделения памяти в Windows состоит из двух фаз. Первая фаза выделения памяти состоит в резервировании (захвате) участка необходимого размера в адресном пространстве процесса. При этом не выделяется ни байта реальной памяти (не считая системных структур ядра). Вы можете спокойно зарезервировать участок адресного пространства размером 100 мегабайт, и это ничего не будет стоить системе. Вы можете указать какие адреса вы хотели бы занять, а можете предоставить выбор участка необходимого размера самой системе. Стоит отметить, что адресное пространство резервируется с гранулярностью 64 кБ. Это значит, что несмотря на указанные вами адреса, базовый адрес реально зарезервированного участка памяти будет кратен 64 кБ. При резервировании участка в адресном пространстве можно указать желаемый атрибут, который регулирует доступ к этой памяти: запись данных, чтение данных, выполнение кода или комбинацию этих признаков. Нарушение правил доступа к памяти приводит к генерации системой исключения.

Вторая фаза выделения памяти в Windows - это выделение реальной, физической памяти в зарезервированный участок виртуального адресного пространства. На этом этапе системой выделяется реальная память, со всеми вытекающими из этого последствиями. Выделение реальной памяти также гранулярно. Минимальный блок реальной памяти, которым оперирует система, и который можно выделить, называется страницей памяти. Размер страницы зависит от типа операционной системы и составляет для Windows 95/98 - 4 кБ, а для Windows NT - 8 кБ. Гранулярность при резервировании участка памяти и при выделении реальной памяти призвана облегчить нагрузку на ядро системы.

Выделение реальной памяти происходит постранично, при этом существует возможность выделения произвольного количества страниц в произвольные (кратные размеру страницы) адреса заранее зарезервированного участка адресного пространства процесса. Каждой странице может быть назначен свой собственный атрибут доступа. Желательно указывать тот же самый атрибут, что имеет зарезервированный участок адресного пространства в котором происходит выделение страницы реальной памяти.

Важным моментом в механизме выделения памяти является механизм динамической выгрузки и загрузки страниц памяти. В самом деле, современный компьютер имеет оперативную память объемом 16-256 МБ, а для совместной работы нескольких программ необходимо гораздо больше. Windows, как и большинство современных операционных систем, выгружает страницы памяти, к которым давно не было обращений, на жесткий диск в так называемый своп-файл. При этом размер реальной памяти, доступной для программ, становиться равным суммарному объему оперативной памяти и своп-файла. По возможности, система старается держать все страницы в оперативной памяти, однако когда суммарный размер выделенных всеми процессами страниц превышает ее размер, система выгружает страницы с давним доступом на диск, а на их месте выделяет новые страницы. Если же выгруженная на диск страница затребуется владеющим ею процессом, система освободит для нее место в оперативной памяти путем выгрузки редко используемой страницы, загрузит затребованную страницу на ее место и вернет управление процессу.

Весь механизм динамической загрузки и выгрузки страниц абсолютно прозрачен для процессов, а реализация этого механизма полностью обеспечивается операционной системой. Процесс может абсолютно ничего не знать о существовании такого механизма - он обращается к своим ячейкам памяти, а система автоматически выгружает редко используемые страницы и загружает необходимые страницы; процесс может только регулировать некоторые нюансы работы этого механизма.

На основании вышеперечисленного можно сделать следующие выводы:

  • каждый процесс со всеми своими потоками имеет отдельное и независимое линейное адресное пространство размером 4 Гб;
  • выделение памяти состоит из двух фаз: резервирования адресного пространства и выделение в нем реальной памяти;
  • при резервировании участка адресного пространства существует гранулярность размером 64 кБ;
  • выделение реальной памяти производится постранично, размер страницы зависит от типа операционной системы;
  • каждой странице может быть назначен свой собственный атрибут доступа, нарушение которого приводит к генерации исключения системой;
  • операционная система динамически выгружает редко используемый страницы памяти на из оперативной памяти на жесткий диск, причем этот механизм прозрачен для всех процессов.

3. Кучи и менеджеры куч

Алгоритмы современных программ используют механизмы выделения и освобождения памяти очень интенсивно. Строки, динамические массивы, объекты, структуры, буфера - выделение и освобождение этих элементов происходит очень часто, при этом оказывается, что все эти элементы имеют небольшой размер.

Выделение у системы большого количества объектов небольшого размера оказывается неэффективным по следующим причинам.

  • частое обращение на выделение памяти снижает производительность, так как резервирование адресного пространства и выделение реальной памяти происходит на уровне ядра операционной системы;
  • из-за страничной организации памяти (гранулярности) выделение памяти происходит с большими издержками; запрос на выделение 100-байтного участка приводит к выделению одной страницы памяти с размером 4 или 8 кБ.

Решение этой проблемы организуется следующим образом: у операционной системы выделяется достаточно большой участок памяти, а уже из него для прикладной программы "нарезаются" небольшие участки. Такая организация называется кучей, а механизм, который следит за выделением и освобождением участков памяти называется менеджером кучи. Куча позволяет решить как проблему потери производительности - менеджер кучи может функционировать на уровне прикладной программы, так и проблему гранулярности - менеджер запрашивает у системы один большой участок памяти.

Windows имеет свою собственную реализацию менеджера кучи, который позволяет приложениям создавать, уничтожать кучи, а также производить с ними операции выделения и освобождения памяти в куче. Кроме того, для каждого вновь создаваемого процесса Windows специально создает кучу по умолчанию, которая используется при работе API функций, а также может быть использована прикладной программой. Все создаваемые Windows кучи потоко-безопасны, то есть существует возможность обращения к одной и той же куче из разных потоков одновременно.

Инженеры компании Borland по видимому не доверяют инженерам компании Microsoft, поэтому каждая программа на Delphi имеет свою собственную реализацию менеджера кучи, которая определена в системных модулях. Такое решение аргументируется инженерами Borland тем, что стандартный менеджер кучи Windows не обеспечивает достаточно эффективную работу с памятью. Конечно, как и любая Windows-программа, программа на Delphi имеет стандартную кучу по умолчанию, которую создает для нее система, однако функции New, Release, GetMem, FreeMem и некоторые другие оперируют с собственной реализацией менеджера куч. Менеджер кучи Delphi резервирует блоки адресного пространства размером 1 Мб, а выделяет блоки реальной памяти размером 16 Кб. Также вы можете написать и установить свою реализацию менеджера куч, если не доверяете ни инженерам Borland, ни инженерам Microsoft - для этого имеются все необходимые функции.

Хотя куча совершенно не предназначена для выделения больших участков памяти, запрос выделения большого участка у кучи не приведет к ошибке. Куча просто перенаправит ваш запрос операционной системе и вернет указатель на выделенный ею участок памяти.

4. Группы функций работы с памятью

В главе описываются группы базовых функций работы с памятью, которые доступны для программиста на Delphi. Включены описания как API-фукнций, так и Delphi-функций.

Delphi-функции

New(), Dispose()
Функции работают с менеджером кучи Delphi. Обеспечивают типизированное выделение и освобождение памяти. Используются для динамической работы со структурами.

GetMem(), FreeMem()
Функции работают с менеджером кучи Delphi. Обеспечивают нетипизированное выделение и освобождение памяти. Используются для динамической работы с небольшими бинарными блоками памяти (буфера, блоки).

API-функции

HeapCreate(), HeapDestroy(), ...
Функции работы со стандартным менеджером кучи Windows. Используются для создания и уничтожения куч, выделения и освобождения большого количества нетипизированных блоков памяти малого размера. Функции позволяют работать со стандартной кучей по умолчанию, которую создает операционная система для каждого процесса.

LocalAlloc(), LocalFree(), ... , GlobalAlloc(), GlobalFree(), ...
Так как в Windows 32 нет разделения на глобальные и локальные кучи, эти две группы функций идентичны. Функции работают со стандартной кучей по умолчанию, которую создает операционная система для каждого процесса. Функции морально устарели и Microsoft не рекомендует их использовать без крайней необходимости. Однако эти функции могут пригодиться, например, при работе с буфером обмена.

VirtualAlloc(), VirtualFree(), ...
"Основополагающие" функции выделения памяти в Windows. Используются как для резервирования адресного пространства, так и для выделения страниц реальной памяти в заранее зарезервированный участок адресного пространства. Позволяют выполнить обе фазы за один вызов функции. Используются для резервирования и выделения больших участков памяти.

5. Потоковые хранилища

Очень часто во многих программах встает проблема накопления потока поступающих данных. Например, это может быть запись звука, запись сигналов с датчиков, накопление данных с модема, коммуникационного порта, прием данных по сети и так далее. Если объем накапливаемых данных небольшой и заранее точно известен, то такая задача решается элементарно - под буфер выделяется блок памяти и эта память постепенно заполняется. Если же размер требуемого буфера достаточно большой, то выделение его полностью в самом начале может быть неэффективным - запись потока может прерваться гораздо раньше, а если же размер его неизвестен заранее, например когда запись данных останавливается по какому-либо внешнему сигналу, то встает проблема о выборе размера выделяемого блока.

В таких случаях используют динамические хранилища. В Delphi такими хранилищами являются динамические массивы, объект TMemoryStream, динамическое перераспределение памяти. Все эти хранилища работают на одном и том же принципе: под хранение данных выделяется блок памяти и поступающие данные последовательно записываются в этот блок, когда этот блок заполняется полностью, он перераспределяется с некоторым запасом (размер его увеличивается, а старые данные остаются). После того как каждый новый блок заполняется полностью он снова перераспределяется по мере поступления новых данных.

Перераспределение памяти занимает много ресурсов само по себе, а так как оно выполняется еще и в куче, то можно считать его вдвойне неэффективным, особенно если размеры перераспределяемых блоков становятся очень большими. Динамические массивы и динамическое перераспределение памяти используют менеджер кучи Delphi, а объект TMemoryStream использует стандартный менеджер кучи Windows.

Кроме того постоянное перераспределение участков памяти с разными размерами приводит к сильной дефрагментации памяти компьютера, что приводит к замедлению работы компьютера, а в конечном счете и к блокировке его работы.

Для решения проблемы накопления данных автором были разработаны два объекта накопления данных, основанные на двух разных принципах и имеющих разные характеристики.

 

TLinearStorage

Если размер буфера большой, но максимально возможный размер известен (например если есть ограничение на объем записываемых данных), то можно поступить следующим образом. В адресном пространстве процесса резервируется блок памяти необходимого размера, напомним, что такая операция не занимает ресурсов у системы. Затем по мере необходимости в этом зарезервированном участке памяти, по мере необходимости, последовательно выделяются страницы реальной памяти. Достоинством такого метода является линейное расположение ячеек в памяти друг за другом, то есть к такому хранилищу можно обращаться как к обычному линейному массиву. Недостатком - необходимость указания максимального размера.

TSectionStorage

Если размер буфера заранее неизвестен (ограничен лишь размером доступной реальной памяти), то предыдущее решение не подходит. В этом случае можно предложить другое решение. По мере необходимости, у системы можно запрашивать участки памяти одинакового размера и записывать в них поступающие данные. При этом буфер не будет иметь линейного адресного пространства, а будет состоять из одноразмерных "лоскутов" памяти - для вычислительного алгоритма такая организация буфера может стать серьезной помехой. Достоинством же такого решения является отсутствие необходимости изначально указывать какой либо размер буфера.

Если предполагается интенсивное увеличение-уменьшение хранилища, причем желательно, чтобы приращения были небольшими, то можно запрашивать память не у системы, а у стандартного менеджера кучи Windows, который создается для каждого хранилища отдельно. При этом, менеджер кучи выполняет роль кэша страниц памяти, увеличивая производительность.

Дополнительно, каждое хранилище имеет функции записи и чтения в стандартные потоки Delphi с упаковкой. Упаковка производится по стандартным алгоритмам библиотеки ZLIB.

6. Библиотека потоковых хранилищ

TBaseStorage - базовый класс

Оба хранилища, которые будут рассматриваться в дальнейшем, основаны на одном абстрактом базовом классе и имеют схожие свойства и методы.

Item[] - получение указателя на указанный элемент по его индексу.
ItemSize - запрос размера хранимого элемента.
Count - запрос и установка числа хранимых элементов.

Clear - очистка хранилища, установление его размера в нуль.
AddItems, GetItems, SetItems - добавление, запрос и установка блока элементов.
SaveStream, LoadStream - запись и загрузка хранилища в/из потока. Параметр Compression в этих процедурах означает следующее 0 - компрессия не производится, и хранилище записывается в линейном натуральном виде; 1 - наименьшая степень компрессии; 9 - наивысшая степень компрессии. Число между 1..9 - произвольная степень компрессии.

////////////////////////////////////////////////////////////////////////////////
// TBaseStorage
// _____________________________________________________________________________
// Базовый класс для хранилищ
////////////////////////////////////////////////////////////////////////////////
type
  TBaseStorage = class (TObject)
  public
    property    Item[Ind: Cardinal]: Pointer read GetItem; default;
    property    ItemSize: Cardinal read FItemSize;
    property    Count: Cardinal read FCount write SetCount;
  public
    procedure   Clear; virtual; abstract;
    procedure   AddItems(Items: Pointer; Count: Cardinal); virtual; abstract;
    procedure   SetItems(Items: Pointer; Index, Count: Cardinal); virtual; abstract;
    procedure   GetItems(Items: Pointer; Index, Count: Cardinal); virtual; abstract;
    procedure   SaveStream(Stream: TStream; Compression: Integer); virtual; abstract;
    procedure   LoadStream(Stream: TStream; Compression: Integer; Count: Cardinal); 
                  virtual; abstract;
  end;

Линейное хранилище

Линейное хранилище имеет линейное адресное пространство буфера, однако нуждается в указании максимальной емкости, пусть даже и очень большой.

Capacity - запрос и установка максимальной емкости хранилища. При установке емкости хранилища, все ранее хранимые данные теряются.
Memory - запрос указателя на линейный участок памяти, в котором хранятся данные, может быть использован в вычислительных алгоритмах.

Create - конструктор, в котором необходимо указать размер хранимого элемента.

////////////////////////////////////////////////////////////////////////////////
// TLinearStorage
// _____________________________________________________________________________
// Линейное хранилище
////////////////////////////////////////////////////////////////////////////////
type
  TLinearStorage = class (TBaseStorage)
  public
    property    Capacity: Cardinal read FCapacity write SetCapacity;
    property    Memory: Pointer read FMemory;
  public
    procedure   Clear; override;
    procedure   AddItems(Items: Pointer; Count: Cardinal); override;
    procedure   SetItems(Items: Pointer; Index, Count: Cardinal); override;
    procedure   GetItems(Items: Pointer; Index, Count: Cardinal); override;
    procedure   SaveStream(Stream: TStream; Compression: Integer); override;
    procedure   LoadStream(Stream: TStream; Compression: Integer; Count: Cardinal); 
                  override;
  public
    constructor Create(AItemSize: Cardinal);
    destructor  Destroy; override;
  end;

Секционное хранилище

Секционное хранилище хранит данные в кусочно-линейном буфере состоящем из участков одинакового размера. Хранилище не требует указания максимальной емкости, но взамен не позволяет обращаться к элементам как к массиву данных.

Block - список указателей на блоки, из которых состоит хранилище.
BlockSize - размер блоков, измеряемый в числе хранимых элементов.

Create - конструктор, в котором необходимо указать размер хранимого элемента в байтах и размер блока хранения.

////////////////////////////////////////////////////////////////////////////////
// TSectionStorage
// _____________________________________________________________________________
// Секционное хранилище
////////////////////////////////////////////////////////////////////////////////
type
  TSectionStorage = class (TBaseStorage)
  public
    property    Blocks: TList read FBlocks;
    property    BlockSize: Cardinal read FBlockSize;
  public
    procedure   Clear; override;
    procedure   AddItems(Items: Pointer; Count: Cardinal); override;
    procedure   SetItems(Items: Pointer; Index, Count: Cardinal); override;
    procedure   GetItems(Items: Pointer; Index, Count: Cardinal); override;
    procedure   SaveStream(Stream: TStream; Compression: Integer); override;
    procedure   LoadStream(Stream: TStream; Compression: Integer; Count: Cardinal); 
                  override;
  public
    constructor Create(AItemSize: Cardinal; ABlockSize: Cardinal);
    destructor  Destroy; override;
  end;

Вообще с объектом TMemoryStream связаны странные, необъяснимые истории. Как-то раз автор имел несчастье использовать этот объект в одной из своих программ для накопления потока данных с модема. Через некоторое время после запуска программа зависала сама и, кроме того, подвешивала Windows NT. Анализ с помощью диспетчера задач показал, что в процессе жизнедеятельности программы, она занимает все новые и новые участки памяти.

Поиск ошибок ни к чему ни привел, однако в конце концов пришлось обратить внимание на странности в поведении объекта TMemoryStream. Пришлось создать свой поток THeapStream путем формальной замены функций семейства Global... на функции GetMem, FreeMem, ReallocMem - то есть заменой стандартного менеджера кучи Windows на менеджер кучи Delphi. После этого все странности при работе программы исчезли.

Скорее всего это было связано с очень сильной дефрагментацией памяти, так как заполнение объекта TMemoryStream данными приводит к постоянному перераспределению участков памяти с разными размерами. От такой дефрагментации помогает только перезагрузка компьютера.


Компоненты:   

MMTimer [D6]

Компонент представляет собой мультимедийный таймер, скорость (точность) работы которого намного выше по сравнению с системным таймером (TTimer). Кроме того, он имеет два режима работы: 1) ttOneshot - отрабатывает один раз и останавливается. 2) ttPeriodic - в этом режиме компонент ведет себя как стандартный TTimer.

UpListView [D6] (обновился)

Компонент является наследником класса TListView. Его основное назначение, выводить картинку в заголовке таблицы в режиме vsReport. В компоненте появилось четыре новых свойства и три новых события. Более подробно читайте в ReadMe.txt в архиве. К компоненту прилагается пример.

TCube v.1.0

Если Вы хотите нарисовать на форме трёхмерный куб, то этот компонент позволит Вам это осуществить очень легко.

TDiskInfo v.1.1

Компонент позволяет получать информацию о системных дисках.

Hard Disks, local, floppy disk, network drives, RAM Drives...

Может получать информации о:
  • Томах
  • Серийных номерах
  • Свободном/Занятом пространстве
  • Метках
  • Иконках в системе
  • Кластерах
  • Секциях
  • ио многом другом
Достаточно лишь поставить компонент на форму и определить букву диска.

LsFileExplorer28 v.2.886

LsFileExplorer28 (Версия 2.886) состоит из трёх компонентов, а именно:
  • TLsDirTree21 – это простой и полнофункциональный компонент Directory TreeView, который отображает структуру папки в TreeView и файлы выбранной директории появляются в FileListview. Компонент поддерживает создание, удаление, переименование, копирование, перемещение и перетаскивание папок. Также может работать сетевыми дисками.
  • TLsDirTreeCombo28 – это специализированный ComboBox с выпадающим TreeView. Отображает иерархическое древо дисков и каталогов файловой системы.
  • TLsFileListview28 – аналог компонента Listview, отличающийся большими возможностями и высокой скоростью доступа. В дополнение к обычным функциям, он также умеет:
    • Выполнять различные команды файлового менеджера, такие как копирование, вырезание, вставка, переименование, открытие, просмотр, отправка (send-to), перетаскивание (drag-drop) файлов;
    • Копирование или вставка файлов в проводник Windows или в другое приложение;
    • Перетаскивание файлов из проводника Windows;
    • Показывает статистические данные директорий или дисков
Компонент помимо английского языка поддерживает также китайский, голландский, французский, немецкий, итальянский, японский, корейский, польский, португальский, словацкий, словенский, испанский, шведский и турецкий языки. Полный исходный код и пример приложения включены. Более подробная информация в файле LsFileExplorer28.txt.

AlphaControls Lite Edition v.4.42

Пакет содержит 13 полностью бесплатных и полнофункциональных компонентов из пакет AlphaControls (TsSkinManager, TsSkinProvider, TsEdit, TsCheckBox, TsPanel, TsButton, TsScrollBar, TsLabel, TsWebLabel, TsBitBtn, TsComboBox, TsListBox и TsGauge). Используя эти компоненты, вы можете узнать основные особенности AlphaControls. Небольшой и пример и его исходный код включены в архив.

Особенности:
  • Легко менять скины уже в exe-файле;
  • Возможно обновлять скины, которые имеют очень простую структуру;
  • Вырисовка компонентов разбивается на несколько шагов, так компонент может быть полупрозрачным, иметь реалистичное обрамление, тень или другой привлекающий эффект.
  • Элементы каждого компонента вычисляются во время выполнения, поэтому он может быть свободно перемещён или его размеры изменены.
  • Кнопки поддерживают PNG – глифты (PNG-glyphs)
  • Работа с компонентами очень легка и интуитивно понятна.

rwLinkLabel v.1.0

Этот код позволит обычному компоненту Tlabel работать с гиперссылками. Он поддерживает большинство часто употребляемых URL и Skype. Просто скомпилировать и установить компонент, выберите тип uкl (http:, https:, ftp:, mailto:, file:, или skype:) и введите название ссылки. Когда пользователь нажмёт на надпись выполниться соответствующая команда. Вы можете добавлять свои команды ко всем типам url. Пример приложения, включённый в архив, показывает как можно использовать http:, skype: и mailto: Этот компонент был разработан, используя Delphi7 и не требует «специальных» модулей, поэтому он должен компилироваться и на других версиях Delphi. Полный исходный код также включён.

M3DGraphics v.1.0

M3DGraphics1 модуль для Delphi. Позволяет рисовать 3-х мерные фигуры.


Интересные и полезные сайты по Delphi: Если Вы хотите, чтобы Ваш сайт был в этом разделе пишите.
http://www.noil.pri.ee/     - Здесь вы можете почитать статьи, скачать исходники и компоненты, пообщаться на форуме.
http://www.delphi.int.ru/  - Ресурс для Delphi-программистов, где каждый найдёт что-то полезное!
http://www.ExCode.ru     - Программирование на высоком уровне
http://decoding.narod.ru - Сайт для Delphi-программистов со статьями автора, компонентами, FAQ, и другой полезной информацией.
http://www.p-lib.pp.ru/    - На сайте находится множество статей по Visual C++, Visual Basic, ASP.NET/ASP, Delphi, Java, Базам Данных, PHP, Perl и т. д. Кроме того есть каталог сайтов, свежие компьютерные новости, софт, книги и многое другое.

Немного юмора:  :))

:)

Откуда дровишки? С И-нета вестимо...

:)

Пропал исходный модуль, нашедшего просим вернуть отлаженным за приличное вознаграждение.

:)

Звонок в фирму.
- Здравствуйте. Вы продаете компьютеры?
- Вы что! Это филармония! (и уже спокойным голосом) А вам какие
компьютеры нужны?..

:)

Здравствуйте !
Я новый полиморфный вирус-троян и распространяюсь по интернету.
Поскольку мой автор не умеет писать вирусов приносящих вред,
Вы должны мне помочь.
Сделайте пожалуйста следующее:
1. Сотрите у себя на диске каталог c:\windows и C:\Program files
2. Отправьте это сообшение всем своим знакомым
Заранее благодарен

:)

Адвокат говорит на суде речь:
- Прошу принять во внимание, Ваша честь, что у моего подзащитного
было тяжелое детство - родители не купили ему персонального
компьютера.

:)

В конференции по Win95 кто-то написал фразу "у меня мастдай повис".
Модератор ответил плюсом (замечание за некорректное поведение)
за неуважительное высказывание в адрес темы конференции.
- Да это я не про Windows, это моя программа мастдай - попытался
оправдаться потерпевший, на что модератор возразил:
- Не надо демагогии, здесь все знают, кто такой мастдай!


Дружественные рассылки:

Рассылки Subscribe.Ru
Программирование на Delphi
Рассылка сайта Delphi coding


Все кто хочет изучить Delphi и реально научиться писать свои программы, ЦПИ "Эверест" поможет Вам.
Всё, что Вам нужно это компьютер и доступ к интернету - для получения уроков.

10 причин в пользу платного обучения в ЦПИ "Эверест"…

1. Когда Вы платите деньги- появляется дополнительный стимул против лени: надо учиться, ведь деньги уже уплачены….
2. Учась платно, получаете удобный для Вас график работы.
3. Весь необходимый справочный материал Вы получите в свое время и на русском языке.
4. Используя интернет в качестве бесплатной библиотеки, Вы получаете все ее минусы:

  • трата времени на поиск необходимого материала (а это потерянные деньги и время). А у Вас есть лишние время и деньги?;
  • отсутствие гарантии, что Вы "осилите" данный материал, ведь пишут его, в основном, не педагоги- профессионалы, а программисты- профессионалы, а они пишут для таких же, как они. А Вы программист- профессионал?
  • отсутствие системности в скачиваемом материале (ведь человек, писавший для Вас материал, не знает, чем Вы владеете). А Вы обладаете системой знаний по Delphi?;

5. Стоимость обучения одного месяца в ЦПИ "Эверест" сравнима с ценой хорошей книги. Но часто ли Вам попадались книги, рассчитанные именно на Вас. Мы же работаем индивидуально.
6. Автор книги или магазин не несет никакой ответственности за то, поняли ли Вы материал или нет, мы же закрепляем за каждым курсантом преподавателя, курирующего Вас.
7. Освоив программирование в Delphi - Вы освоите:

  • основы настоящего программирования- структурного и процедурного программирования ;
  • систему работы с базами данных и SQL- запросами, а это одно из самых перспективных направлений в программировании;
  • язык программирования ObjectPascal, что позволит Вам легко перейти, при желании, на С или Паскаль;
  • работу с компьютерной графикой;
  • при желании - основы низкоуровневого программирования ( Ассемблер).

8. А это значит, что …Мы предлагаем получить "высшее образование" - профессию программиста всего за 1 год и 144 доллара, любой ВУЗ попросит в 3 раза больше за один только семестр.
9. Вы получаете самый практический курс в сети, поскольку теория дается только тогда, когда она действительно необходима…
10. Учиться у нас легко и просто. Весь материал доступен и простым людям, не имеющим никогда дел с программированием….


По всем вопросам обращайтесь ко мне.

Если вы встретили в интернете интересный сайт или статью, да и вообще, что угодно связанное с Delphi, поделитесь ссылкой.
Если можете написать статью связанную с Delphi - присылайте с радостью выложу.
Давайте поможем друг другу!  Архив рассылки.

Предложения, критику и пожелания пишите на e-mail.


В избранное