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

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


Информационный Канал Subscribe.Ru

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

Выпуск : № 51


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


С наступающим Новым Годом!

Хочу сделать Вам маленький подарок.
В сети есть сайт www.dcomponents.narod.ru о создании компонентов. Сайт сделан в виде Help'a, довольно интересный, но скачать и спокойно почитать не получается, автор сделал там всё на скриптах. Но я всё же сумел скачать и упаковал в .chm формат (справки).
Так что пользуйтесь на здоровье. Ссылка.


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

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


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


Вопрос № 124 задаёт: Levtal 
Я знаю, как получить список открытых в системе окон (т.е. их хэндлы и текст заголовков). А как для каждого из этих окон (т.е. по хэндлу окна) получить информацию о полном пути к тому файлу программы, которая создала окно?

Ответы.

Ожидаются.


Статья:    "Сохраняем записи в потоке." Автор: Dynamic 

Хранение записей (record) в потоке (stream) или в типизированном файле не представляет особых трудностей даже для начинающих программистов, если размер всех полей записи известен еще на этапе компиляции, т.е. если поля имеют такие типы как Integer, Boolean, ShortString. Полем такой записи может быть даже другая запись, удовлетворяющая указанному условию. Но что делать, если необходимо хранить в файле записи с длинными строками, а подключать какую-либо базу данных нецелесообразно из соображений переносимости программы и уменьшения размера выходного EXE-файла? Вот тут нам на помощь приходят файловые потоки.

Файловый поток (FileStream) представляет собой поток данных, по которому можно перемещаться в процессе чтения или записи и манипулирует дисковым файлом, находящимся на локальном или сетевом диске. В библиотеке VCL Дельфи этот механизм реализован в классе TFileStream. Ниже представлены некоторые основные его свойства и методы:

  • property Size – размер потока;
  • property Position – текущая позиция в потоке;
  • procedure Seek – процедура изменения текущей позиции в потоке;
  • procedure ReadBuffer – процедура чтения данных из потока в буфер;
  • procedure WriteBuffer – процедура записи данных в поток из буфера;

Перед началом работы с потоком его надо создать:

var
   FS: TFileStream;
begin
   FS := TFileStream.Create(FileName, fmOpenRead);
   ...
end;

   Из примера видно, что конструктор потока принимает на входе 2 параметра: имя файла, с которым будет ассоциирован поток, и режим открытия файла. Полный список различных режимов можно посмотреть в исходном тексте модуля SysUtils или справке Дельфи, для нас же пока представляют интерес 2 режима:

  • fmCreate – создать файл;
  • fmOpenRead - открыть файл для чтения.

   Для примера создадим простую запись:

type
   TMyRec = record
    rInt: integer;
    rStr: string;
   end;

   Первой рассмотрим процедуру записи:

procedure WriteRecord(const FileName: string; Rec: TMyRec);

В процедуру передается 2 параметра: имя файла и переменная созданного нами ранее типа.

   Код:

procedure WriteRecord(const FileName: string; Rec: TMyRec);
begin
     FS := TFileStream.Create(FileName, fmCreate);
     // создаем файл
     with FS do
     try
      Seek(0, soFromBeginning);            // перемещаем указатель в начало потока
      WriteBuffer(Rec.rInt, SizeOf(Integer));// записываем целое
      _WriteStr(Rec.rStr);                   // записываем строку
     finally
      Free;                                // закрываем файл, освобождаем память
     end;
end;

Вторым параметром в метод Seekпередается указание перемещать потоковый указатель от начала потока, существуют следующие варианты (определены в модуле Classes):

  • soFromBeginning – от начала;
  • soFromCurrent – от текущей позиции;
  • soFromEnd – от конца.

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

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

   Для удобства подпрограмму записи строки мы опишем в теле главной функции, то есть объявим локальную процедуру. Вот как будет выглядеть код целиком:

procedure WriteRecord(const FileName: string; Rec: TMyRec);
var FS: TFileStream;

 procedure _WriteStr(const S: string);
 var l: integer;
 begin
    with FS do
    begin
      l := Length(S);                 // вычисляем длину строки
      WriteBuffer(l, SizeOf(Integer)); // пишем длину в поток
      if l > 0 then                    // если есть что писать -
         WriteBuffer(S[1], l);         // пишем
    end;
 end;

begin
     FS := TFileStream.Create(FileName, fmCreate); // создаем файл
     with FS do
     try
      Seek(0, soFromBeginning);      // перемещаем указатель в начало потока
      WriteBuffer(Rec.rInt, SizeOf(Integer));// записываем целое
      _WriteStr(Rec.rStr);                   // записываем строку
     finally
      Free;                                // закрываем файл, освобождаем память
     end;
end;

 Процедура чтения структуры мало чем отличается от процедуры ее записи:

procedure ReadRecord(const FileName: string; var Rec: TMyRec);
var FS: TFileStream;

 function _ReadStr: string;
 var l: integer;
 begin
   Result := '';
   with FS do
   begin
     ReadBuffer(l, SizeOf(Integer));   // читаем длину
     if l > 0 then                     // если что-то писАли
     begin
      SetLength(Result, l);            // устанавливаем длину строки
      ReadBuffer(Result[1], l);        // читаем строку
     end;
   end;
 end;

begin
     // открываем для чтения
     FS := TFileStream.Create('teststream.txt', fmOpenRead);
     with FS do
     try
       Seek(0, soFromBeginning);              // начинаем сначала
       ReadBuffer(Rec.rInt, SizeOf(Integer)); // читаем целое
       Rec.rStr := _ReadStr;                  // читаем строку
     finally
      Free;
     end;
end;

 Длинная строка Дельфи, по сути, является динамическим массивом, то есть SizeOf(VarStr) = SizeOf(Pointer), причем перед началом собственно массива символов расположены скрытые 8 байт дополнительной служебной информации: 4 байта – длина строки без завершающего нуля, 4 байта – счетчик ссылок. Исходя из этого, при использовании строки в качестве буфера (см. пример) необходимо явно указывать адрес ее первого символа, то есть VarStr[1] или PChar(VarStr)[0]. Также одной из наиболее распространенных ошибок начинающих является то, что перед чтением строки из потока они забывают выделить для нее память процедурой SetLength.

   Вот, собственно, и все. Удачи в программировании.


Исходники:   

Tracert (12.10.2005) - исходник программы, который показывает принцип трассировки маршрута к WWW-адресу - Автор Александр "Rouse_" Багель.

Как это работает?

   Для начала нужно вспомнить формат заголовка IP-пакета, точнее одно из его полей - TTL (Time To Live).
   Это восьмибитное поле задает максимальное число хопов (hop - "прыжок" - прохождение дейтаграммы от одного маршрутизатора к другому) в течение которого пакет может находиться в сети.
   Каждый маршрутизатор, обрабатывающий эту дейтаграмму, выполняет операцию TTL=TTL-1.
   Когда TTL становится равным нулю, маршрутизатор уничтожает пакет, отправителю высылается ICMP-сообщение Time Exceeded.

   Утилита посылает в направлении заданного хоста пакет с TTL=1, и ждет, от кого вернется ответ "time exceeded".
   Отвечающий записывается как первый хоп (результат первого шага на пути к цели).
   Затем посылаются последовательно пакеты с TTL=2, 3, 4 и т.д. по порядку, пока при некотором значении TTL пакет не достигнет цели и не получит от нее ответ.
Скриншот | Скачать (14 Кб)

Info from IP (12.10.2005) - исходник программы, который демонстрирует получение информации о компьютере в сети - Автор Александр "Rouse_" Багель.
Скриншот | Скачать (22 Кб)

Download Plus (05.08.2005) - исходник программы, который показывает пример реализации менеджера загрузок на подобии таких программ, как: ReGet, FlashGet, GetRight. Основные функции: докачка файлов, установка приоритетов загрузки, поддержка прокси-серверов и многое другое - Автор Сергей "Ex" Леньков.
Скриншот | Скачать (192 Кб)

Userlist (27.06.2005) - исходник программы, предназначенной для вывода списка компьютеров подключенных к локальной сети - Автор неизвестен.
Скриншот | Скачать (12 Кб)

FTP MiniChat (11.06.2005) - исходник программы, предназначенной для общения в чате через FTP-соединение (FTP-клиент, работа с FTP сервером) - Автор H.K.D..
Скриншот | Скачать (151 Кб)

Traffic Info (28.12.2005) - исходник программы, предназначенной для показа и накопления информации о трафике Интернета и сети - Автор Алексей.
Скриншот | Скачать (20 Кб)

Net send (26.12.2005) - исходник программы, предназначенной для отправки сообщений по сети с помощью команды "net send Host/IP сообщение" - Автор Виктор Косоногов.
Скриншот |Скриншот Скачать (51 Кб)

XScanner (08.12.2005) - исходник достаточно простого для понимания и быстрого сканера портов - Автор XProger.
Скриншот | Скачать (9 Кб)

Alternative HTTP-Proxy (17.11.2005) - исходник простого HTTP-Proxy сервера с поддержкой аутентификации - Автор codeLocker.
Скриншот | Скачать (20 Кб)


Интересные и полезные сайты по Delphi: Если Вы хотите, чтобы Ваш сайт был в этом разделе пишите.
http://www.noil.pri.ee/ - Здесь вы можете почитать статьи, скачать исходники и компоненты, пообщаться на форуме.
http://www.delphi.int.ru/ - Ресурс для Delphi-программистов, где каждый найдёт что-то полезное!
http://www.ExCode.ru - Программирование на высоком уровне
http://decoding.narod.ru - Сайт для Delphi-программистов со статьями автора, компонентами, FAQ, и другой полезной информацией.

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

:)

Программист, ты стал совсем взрослый. У тебя уже растут руки.

:)

конечно, обучение юниксу -- это постель из роз, но серьезная работа с
НТ -- это унитаз из колючей проволоки...

:)

'Пользователь выполнил некорректную операцию и будет убит.'

:)

Встречаются двое юзеров. Один говорит:
- Я тут свежий антивирус достал, не хочешь себе установить?
- Нет, мне это не нужно.
- Почему?
- Да мой комп так глючит, что на нем ни один вирус не запустится.

:)

 Первый этап работы над составлением программы - шумиха.
Второй - неразбериха.
Третий - поиски виновных.
Четвертый - наказание невиновных.
Пятый - награждение непричастных.

:)

 Всех кого ты не спроси -
Программируют на С,
Нынче встретишь ты едва ли
Тех, кто пишет на Паскале.

:)

 Создали ученые супеpкомпьютеp (ну этот комп по идее должен был на
любые вопpосы ответить), ну и задают значит ему вопpос:
- Есть ли Бог?
Комп подумал немного, пожужжал и отвечает:
- Hедостаточно инфоpмации, подсоедините меня ко всем дpугим мощнейшим
компам планеты.
Hу ученые повздыхали, а делать нечего, подсоединили. Опять
спpашивают:
- Есть ли Бог?
Комп опять подумал пожужжал и отвечает:
- Hедостаточно инфоpмации. Подсоедините меня ко всем компам планеты
вообще.
Ученым тpудно было это сделать, но они все-таки подсоединили
супеpкомп ко всем компам планеты вообще. Опять задают тот же вопpос.
Комп пожужжал и говоpит:
- Hедостаточно инфоpмациии. Подсоедините меня ко всем электpонным
сетям, ко всем пpибоpам на пpоцессоpах, и т.п.
Hу ученые pазбились в лепешку, но и это сделали. Опять задают:
- Есть ли Бог?
Комп:
- Тепеpь есть.


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

Рассылки 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.


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiinternet
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное