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

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


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

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

Выпуск : № 19


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


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

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


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


Ожидаются. 

Ответы.

Вопрос № 22 задаёт: Ирина Ответить
Добрый день! Прошу помочь разобраться по работе с записями таблиц, баз данных.
Как переносить запись из одной БД в другую? Обработчик событий записей данных.
Если можно с примером и ссылкой , где можно почитать.
Отвечает: Архангельский Андрей Германович http://www.az-design.ru
Если вопрос стоит о переносе данных из одной БД в другую то создавать особые механизмы не требуется. Правда БД должна понимать язык SQL. При создании БД паралельно создается простенькая программка, которая сохраняет БД в SQL-скрипте При заполнении новой БД SQL-скрипт считывается в БД стандартными средствами СУБД
Скрипт имеет структуру:
Insert into Table(Field1,Field2,Field3)
values (Val1,Val2,Val3);

и т.д.
Применение этого метода :
1) Перенос данных при изменении структуры БД. Часто невозможно изменить структуры БД с помощью инструментами администрирования типа EMS Manager, так как нормализованные БД имеют много связей.
2) Генерация данных для заполнения из простой структуры в сложную. НАпример, в БД которую я сейчас разрабатываю каталоги запчастей ВАЗа представляют собой две простые таблицы, которые с помощью программы преобразуются в одну таблицу с древовидной структурой и одновременно заполняется 5 деревьев.
3) Генерация массива данных по определенным правилам, для облегчения алгоритмов работы с БД.

И не читайте батенька Советских газет, т.е. этого шарлатана Архангельского А.Я., который впихивает свои книги своим студентам. По SQL класикой считается Мартин Грабер, начиная от "Введение в SQL", которой достаточно в 90% случаях, и кончая "SQL-99" По Delphi достаточно отслеживать пару Марко Кэнту "Delphi для профессионалов" и Стив Тейксейра, Ксавье Пачеко "Delphi 6 (5,4) - руководство разработчика", соответственно по версиям Delphi., серьезные полноценные руководства без трепологии.

Вопрос № 23 задаёт: Костик Z Ответить
Здраствуйте! Я раньше баловался бейсиком, теперь перешёл на Дельфи. Конечно, вопрос откровенно чайниковский (я им не являюсь!)...
У меня имеется программка из двух форм, причём вторая форма - основная. В её событии FormShow находится код: Form1.ShowModal; (*Показывается вторая форма*) Form2.Hide (*Основная форма прячется*); В unit1 (первая форма) выполняются действия, затем показывается основная форма (Form2.Show;) и скрывается текущая (Form1.Hide;). И всё это не работает, точнее работает, но вылетает с ошибкой. Подскажте, как делать корректно. Спасибо!
Отвечает: Gin
Какие именно ошибки - используйте Ctrl+F9.
Отвечает: SHKoder
несколько ужастный подход...
сделайте все проще и прозрачнее имея главную формы
Form1 как frmMain uMain
Form2 как frmModal1 uModal1
Form3 как frmModal2 uModal2

приступим...

из Project.dpr удалите строки
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);

или
Application.CreateForm(TfrmModal1, frmModal1);
Application.CreateForm(TfrmModal2, frmModal2);

и вернемся к Unit1 как uMain

на событие в uMain реагируем
procedure TfrmMain.Button1Click(Sender: TObject);
begin
Application.CreateForm(TfrmModal1, frmModal1);
frmModal1.ShowModal;
if frmModal1.ModalResult = mrOK then showmessage('OK')
else showmessage('Cancel')
frmModal1.Free;
end;

procedure TfrmMain.Button2Click(Sender: TObject);
begin
Application.CreateForm(TfrmModal2, frmModal2);
frmModal2.ShowModal;
if frmModal2.ModalResult = mrOK then showmessage('OK')
else showmessage('Cancel')
frmModal2.Free;
end;

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

имеем
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TfrmMain = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
{$R *.dfm}
end.

******************
program Project1;
uses
Forms,
uMain in 'uMain.pas' {frmMain},
Unit1 in 'Unit1.pas' {frmModal1},
Unit2 in 'Unit2.pas' {frmModal2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfrmModal1, frmModal1); // отображаем то что
//будет отображаться...
Application.Run;
end.

**********************
unit uModal1;
...
uses uModal2;

{$R *.dfm}

procedure TfrmModal1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TfrmModal2, frmModal2);
frmModal2.Show;
frmModal1.Free;
end;

end.
*********************
unit uModal2;
...
uses uModal1;

{$R *.dfm}

procedure TfrmModal2.Button1Click(Sender: TObject);
begin
Application.CreateForm(TfrmModal1, frmModal1);
frmModal1.Show;
frmModal2.Free;
end;

end.
******************
сорс прилагается последнего варианта

Отвечает: Dasha
Если одна форма использует другую, нужно в uses добавить имя юнита используемой формы. Но так можно делать только в одностороннем порядке. То есть если одна форма вызывает другую, то другая не сможет ее вызывать. Так что придется что-то в программе менять.

Наример:

во второй форме, которая вызывает первую:

Form2.Hide;
if Form1.ShowModal = mrOk then
Form2.Show;


на первой форме в том месте, где ее нужно спрятать:

ModalResult:=mrOK;
Отвечает: Джамшед Рахимов
В меню Project>Options установи главной Form2 и потом можно вызвать из второй формы первый.
Отвечает: msg-ballistik
Привожу полный текст примера:

program Project1;
uses Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
//Application.CreateForm(TForm1, Form1);
// эту форму будем создавать динамически
Application.CreateForm(TForm2, Form2); // главная форма
Application.Run;
end.

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Procedure LoadForm1;
var
Form1: TForm1;
implementation
Uses Unit2;
// подключение модуля основной формы
{$R *.dfm}
Procedure LoadForm1;
begin
try
begin
Unit2.Form2.Visible := false;
//делаем основную форму невидимой
Form1 := TForm1.Create(nil); //создаем новую
Form1.ShowModal; //отображаем и с ней делаем все,
//что надо
end
finally
begin
Unit2.Form2.Visible := true;
//делаем основную форму видимой
Form1.Free; //удаляем созданную форму
end; end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ModalResult := mrOK;
//даем команду на окончание работы
end;
end.

// код основной формы
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Unit1
// подкючаем модуль;
type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
Unit1.LoadForm1;
//просто вызываем процедуру, остальное отражено в ней
end;
end.

Т.о. будет проще, если форм будет еще больше. И в памяти висеть не будут, а создаваться по мере необходимости. Удачи в освоении...

Отвечает: Vadim
Во-первых, формы, перекрёстно ссылающиеся друг на друга, нужно подключать локально, после ключевого слова implementation.
Во-вторых, для вызова дочерней формы из главной формы "мягче" использовать процедуру Show, а не ShowModal (хотя и не обязательно).
В-третьих, для дочерней формы лучше использовать процедуру Close (тем более, что результатом является просто изменение свойства Visible), а не Hide, тогда к её событию OnClose останется привязать процедуру MainForm.Show; - что позволит корректно выходить при щелчке по "крестику" (системной кнопке на форме). И так, примерный вид форм MainForm и Form1, в процедурах переключения: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unit Main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TMainForm = class(TForm)
ButtonShow: TButton;
procedure ButtonShowClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

{$R *.DFM}

uses Unit1;

procedure TMainForm.ButtonShowClick(Sender: TObject);
begin
MainForm.Hide;
Form1.Show;
end;

end.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)

Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

uses Main;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MainForm.Show;
end;

end.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Вопрос № 24 задаёт: Виктор Ответить
Всем всего доброго.
Не подскажете, как добавить свое поле в контекстное меню Проводника. Делаю архиватор – и хотелось, чтобы была возможность архивации файлов как в Rar’e.
Отвечает: SHKoder
копай реестр
Отвечает: Sergey

Вы обращали внимание на то, что некоторые приложения после установки добавляют в системное контекстное меню свои собственные пункты? Так поступают многие архиваторы, антивирусные средства и другие утилиты. Эта возможность предоставляется оболочкой Windows.

Когда пользователь щелкает правой кнопкой мыши на любом объекте в пространстве имен, система создает контекстное меню из двух частей: стандартного меню для объектов данного типа и пунктов меню, добавляемых зарегистрированными обработчиками. Зарегистрированные обработчики — это СОМ-серверы, запускаемые в адресном пространстве процесса (in-process servers) и реализованные в виде динамических библиотек.

Ваш СОМ-объект, который расширяет системное контекстное меню, должен поддерживать как минимум два интерфейса — ishellExtinit и IContextMenu. существует и два новых интерфейса IContextMenu2 и icontextMenuS, но они вносят в логику работы контекстных меню лишь небольшие дополнения и здесь рассмотрены не будут. Интерфейс ishellExtinit отвечает за инициализацию меню, а интерфейс IContextMenu — за выполнение основных функций.

Методы интерфейса IContextMenu приведены в табл. 

Таблица. Методы интерфейса IContextMenu

Метод

Описание

function QueryContextMenu (Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uFlags: UINT) : HResult; stdcall;

Добавляет пункт к системному контекстному меню

function InvokeCommand(var- Ipici: TCMInvokeCommandlnfo): HResult; stdcall;

Осуществляет вызов обработчика

function GetCommandString (idCmd, uType: UINT; pwReserved: POINT; PszName: LPSTR; cchMax: UINT) : HResult; stdcall;

Возвращает описание добавленного пункта меню (подсказку или полное название)

Рассмотрим их подробнее. Параметры метода QueryContextMenu означают следующее:

  •  Menu — дескриптор системного меню;
  • IndexMenu — позиция в меню, в которую следует вставить пункт (пункты);
  •  IdCmdFirst,IdCmdLast — диапазон допустимых значений для идентификаторов вставляемых пунктов меню;
  •  uFlags — набор флагов, главные из которых означают:
  •  CMF_NORMAL — обычный вызов контекстного меню, пункты могут быть добавлены. Значение этого флага нулевое, проверять его следует, очистив все биты в параметре uFlags, кроме пяти младших (маска $1F);
  •  CMF_DEFAULTONLY — устанавливается, если пользователь задал с объектом действие по умолчанию (например, двойной щелчок). В этом случае пункты меню добавляться не должны;
  •  CMF_VERBSONLY — устанавливается, если меню создается для ярлыка объекта, а не для самого объекта. В этом случае многие пункты меню создаваться не должны;
  •  CMF_EXPLORE — устанавливается, если меню создается для объекта, находящегося на левой панели Проводника.

Для иллюстрации объектов — расширений контекстного меню — выберем пример ContMenu (поставляется с Delphi в папке DEMOSACTIVEX SHELLEXT). В этом примере для объектов типа "проект Delphi" добавляется возможность запуска компилятора в командной строке. При вызове метода QueryContextMenu нужный пункт добавляется с помощью функции

InsertMenu!

function TContextMenu.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,

idCmdLast, uFlags: UINT): HResult; 

begin

Result := 0; // или использовать MakeResult(SEVERITY_SUCCESS, // FACILITY_NULL, 0);

if ( (uFlags and $OOOOOOOF) = CMF__NORMAL) 

or

((uFlags and CMF_EXPLORE) о 0) then begin 

// Добавить один пункт меню во всплывающее меню 

InsertMenu(Menu, indexMenu, MF__STRING or MF_BYPOSITION, idCmdFirst, 'Compile...');

Result := 1; 

// или использовать MakeResult(SEVERITY_SUCCESS, // 

FACILITY_NULL, 1)

end; 

end;

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

Параметры Getcommandstring просты. Первый — idCmd — соответствует идентификатору пункта меню, второй — uType — запрос на тип информации (GCS_HELPTEXT — текст подсказки, GCS_VERB — полное название пункта меню). Наконец, параметры pszName и cchMax  задают буфер, в который будут копироваться текстовые данные. Полное название необходимо системе, чтобы с его помощью вызывать предусмотренные в пункте действия программно. В примере ContMenu возврат названия (т. е. обработка запроса GCS_VERB) не предусмотрен, а в ответ на запрос GCS_HELPTEXT возвращается текстовая строка "Compile the selected Delphi project".

Наиболее сложным является метод Invokecommand. Он вызывается при выборе пользователем вставленного вами пункта меню. По сути дела метод InvokeCommand представляет собой прямой аналог обработчика onclick обычных пунктов меню (объектов TMenuitem) в Delphi.

Единственным параметром метода является структура типа TCMinvoke-commandinfo, поля которой имеют такое предназначение:

  •  cbsize — размер структуры в байтах;
  •  hwnd — задает дескриптор окна, которое будет владельцем диалоговых окон, вызываемых из метода;
  •  fMask — определяет, заданы ли параметры dwHotkey/hicon;
  •  Ipverb — вызываемая команда;
  •  IpFarameters — параметры (если есть);
  •  IpDirectory — рабочая папка (поле не обязательно);
  •  nShow — флаг состояния окна, который будет передан в функцию ShowWindow (SW_*);
  •  dwHotKey — "горячая" комбинация клавиш, которая будет сопоставляться приложению, запускаемому из этого пункта меню (только если в параметре fMask установлен флаг CMIC_MASK_HOTKEY);
  • hIсоn — значок, который будет сопоставляться приложению, запускаемому из этого пункта меню (только если в параметре fMask установлен флаг CMIC_MASK_ICON);
  •  Monitor — монитор по умолчанию (поле не обязательно).

Отдельно следует остановиться на описании параметра ipverb. Как уже говорилось, он может представлять из себя как идентификатор пункта меню, так и его текст — строку, заканчивающуюся нулем. Чтобы выяснить это, нужно проверить старшее слово этого 32-разрядного параметра на равенство нулю. В примере ContMenu вызов по тексту не предусмотрен:

if (HiWord(Integer(Ipici.IpVerb)) <> 0) then

begin

Exit; 

end;

Для создания расширения контекстного меню мы должны породить объект, поддерживающий эти интерфейсы. К сожалению, мастера, предусмотренные в Delphi, не позволяют в автоматизированном режиме создавать объекты, реализующие уже существующие интерфейсы. Поэтому и описание, и реализацию методов придется делать "по старинке", вручную. В примере ContMenu описание объекта таково:

TContextMenu = class(TComObject, IShellExtlnit, IContextMenu) private

FFileName: array[0..MAX_PATHj of Char; 

protected

( IShellExtlnit }

function IShellExtlnit.Initialize = SEIInitialize;

function SEIInitialize(pidlFolder: PItemlDList; Ipdobj: IDataObject;

hKeyProgID: HKEY): HResult; stdcall; { IContextMenu }

function QueryContextMenufMenu: HMENU; 

indexMenu, idCmdFirst, idCmdLast,

uFlags: UINT): HResult;

  stdcall;

function InvokeCommand(var Ipici: TCMInvokeCommandlnfo): HResult; stdcall;

function GetCommandString(idCmd, uType: UINT; pwReserved: POINT;

pszName: LPSTR; cchMax: UINT): HResult;

stdcall; 

end;

Вас может насторожить конструкция, описывающая переименование метода initialize интерфейса ishellExtinit. На самом деле одноименный метод имеется у объекта TComObject, и приведенный синтаксис как раз и предназначен для выхода из подобных ситуаций.

Последняя часть работы — регистрация созданного обработчика. Самое подходящее место для этого — метод updateRegistry фабрики класса. Разработчики примера ContMenu породили класс TContextMenuFactory, который при регистрации СОМ-сервера регистрирует создаваемые фабрикой объекты:

Classic := GUIDToString(Class_ContextMenu);

CreateRegKey('DelphiProjectXshellex', '', '')/'

CreateRegKey

('DelphiProjectshellexContextMenuHandlers', '', '');

CreateRegKey

('DelphiProjectshellex ContextMenuHandlersContMenu', '', ClassID);

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

Резюме

Несколько тем могут дать лишь начальные представления о принципах работы с оболочкой Windows. Вы можете изучить составляющие ее объекты практически сколь угодно глубоко — были бы потребность да желание. Разумеется, чтобы не "наломать дров", перед этим надо отдать себе отчет в полном и правильном понимании механизмов СОМ.

Вопрос № 25 задаёт:SOURCE Ответить
Как найти все ListBox - ы, имя которых начинается с "Channel_" и удалить из них строку, значение которой равно строковой переменной S ?
********************************************************
Добро пожаловать на мою страничку http://sources.h11.ru/
********************************************************
Отвечает: TopGun
procedure TForm1.Button1Click(Sender: TObject);
var
I, J: Integer;
L: TListBox;
begin

// Бежим по всем компонентам на форме
for I := 0 to Self.ComponentCount - 1 do
// Проеверяем, содержит ли имя требуемую строчку
if(Length(Self.Components[I].Name) >= 8) and (Copy(Self.Components[I].Name, 1, 8) = 'Channel_') then
begin

// Если да, то ищем в ней искомую строку.
L := (Self.Components[I] as TListBox);
for J := 0 to L.Items.Count - 1 do
if L.Items[J] = '123' then
begin
L.Items.Delete(J);
L.Refresh;
Break;
end;
end;
end;

В этом примере я искал первое вхождение требуемой строки (тут я проверял на наличие строки '123'). Если нужно удалять все строки, содержащие 123, вместо цикла for используй цикл while или repeat.

Отвечает: Skyscraper Recluse
procedure Demo(const S: string);
var
i: integer;
IndexOfS: integer;
begin

// Свойство TWinControl.ControlCount возвращает количество
// дочерних контролов.
for i:=0 to ControlCount-1 do
// Итерирование множества дочерних контролов формы.
begin
// Индексированное свойство TWinControl.Controls[Index: integer]
// возвращает ссылку на дочерний контрол данного, имеющий индекс Index.

if (Controls[i] is TListBox) and (Pos('Channel_', Controls[i].Name) = 1) then
// Условие проверяет, является ли очередной контрол ListBox'ом и
// начинается ли его имя с 'Channel_' (подстрока 'Channel_' начинается
// в строке имени контрола с первой позиции).
begin
// Условие, проверяемое выше, гарантирует, что i-ый контрол имеет
// тип TListBox и дальнейшее динамическое приведение его к этому типу
// корректно.
with (Controls[i] as TListBox) do
begin

// Метод TStrings.IndexOf(const S: string) возвращает индекс строки S
// в списке, либо -1, если список не содержит такой строки. По условию,
// если строка имеется, то её нужно удалит. Удаляется только одна
// строка, равная S (в условии не говорится о том, что их может быть
// несколько).
IndexOfS := Items.IndexOf(S);
if (IndexOfS <> -1) then
Items.Delete(IndexOfS);
end;
end;
end;
end;

Процедура должна быть объявлена методом формы, содержащей данные ListBox'ы.

Отвечает: msg-ballistik
Вот пример:
procedure TForm2.Button1Click(Sender: TObject);
var i:integer;
begin
For i:=0 to Form2.ComponentCount -1 do
begin
if ( Form2.Components[i] is TListBox ) then
begin

// здесь можно обрабатывать Form2.Components[i].Name как
//необходимо, копировать, например часть имени, чтобы
//получить Ваше "Channel_" Для этого есть функция Copy
if ( Form2.Components[i].Name = 'ListBox2' ) then
ShowMessage('Нашел');
end;
end;
end;

Удачи.
Отвечает: Vadim
Показываю идею, а дальше сам..
procedure TMainForm.DeleteFromChannel_Click(Sender: TObject);
var
n, i: integer;
S, NameListBox: String;
begin
S:=ComboBox1.Text;
for n:=0 to MainForm.ComponentCount-1
do if (MainForm.Components[n] is TListBox)
then
begin
with MainForm.Components[n] as TListBox
do begin
NameListBox:=Name;
NameListBox:=Copy(NameListBox,1,8);
if NameListBox='Channel_'
then begin
for i:=0 to (Items.Count-1)
do if Items.Strings[i]=S
then Items.Strings[i]:='';
end;
end;
end;
end;


Книги http://podgoretsky.com/ftp/Docs/Delphi/

Сегодня представляю Вам библиотеку http://podgoretsky.com/ftp/Docs/ Здесь Вы найдёте много различных книг по програмированию например: Самая известная книга Фленова Михаила - "Библия Delphi". Ссылка ведёт на ftp сервер, где находятся примеры и pdf файлы книги, где-то 32.3 Мб. 
http://podgoretsky.com/ftp/Docs/Delphi/Fleonov/Bibble/


Проги Набор инструментов 3.0

Взято с сайта http://sources.h11.ru/index.html

Сканер портов. Показывает открытые порты на удаленных и локальных компьютерах
Пинг - аналог всем известной программы, входящей с состав Windows.
Телнет клиент. Позволяет подключиться к удаленному компьютеру через выбранный порт и управлять им.
Расшифровка паролей ICQ 2003a / 2003 b / Lite.
Получение информации о сайтах.
Маленький IRC клиент.
Управление запущенными программами.
Звонилка. Замена стандартной программы для подключения к Интернету.
Обычный таймер. Позволяет выключать компьютер, запускать программы и показывать сообщения в указанное время.

Скачать программу http://supermoney.nm.ru/soft/instruments.exe
Скачать исходники немного облегченного "Набора инструментов 2.5" для Delphi 7 http://supermoney.nm.ru/soft/instruments_sources.rar
Скачать дополнительные компоненты, используемые при написании программы
"Набор инструментов 2.5" http://supermoney.nm.ru/soft/instruments_components.rar

P.S. Надеюсь автор не в обиде, что выложил без спросу.


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

Если Вы написали программу и хотите поделиться с другими присылайте ссылку на Вашу программу и про неё узнают все.



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

На улице стоит маленький мальчик и громко плачет. Подходит к нему мент:
- Чего плачешь, малыш?
- Я потеря-я-ялся...
- А адрес свой знаешь?
- Да-а-а. asd.ddd.lpo.net!..
- А, мать твою! Это ж где? А хоть имя свое знаешь?
- Administra-a-a-ator...


Что написано пером - не прочтет CD-ROM


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


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


Это у других в России две проблемы - дураки и дороги, а у системного администратора - пользователи и сетка.


- В чем заключается многозадачность Windows95?
- Она глючит и работает одновременно.


Компьютер позволяет сделать из мухи слона легким движением мыши...


Звонок на радио:
- Поставьте, пожалуйста, песню Пугачевой про то, как у нее завис Windows!
ди-джей (после паузы): - Я не могу вспомнить у Пугачевой такой песни! Можете напеть?
- ну, там еще в припеве: "Кликну, а в ответ тишина, снова я осталась одна... Сильная женщина плачет у Окна..."


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

Рассылки Subscribe.Ru
Программирование на Delphi.
Всё о Delphi


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

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


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiinternet

Другие рассылки этой тематики
Отписаться
Вспомнить пароль

В избранное