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

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 45)


Опрос
Полезные ссылки

Как часто Вы делаете апгрейд компьютера?

С появлением все более мощных и производительных комплектующих
Раз в месяц
Раз в полгода
Раз в год
Мне это не нужно, и так хватает
А что это такое?

Сайт "Программирование на Delphi":
http://www.delphi.int.ru/
Форум сайта:
http://www.delphi.int.ru/forum/
Архив рассылки:
На Subscribe.Ru
На сайте
Программирование на DELPHI
Выпуск #45 (01 апреля 2006 г.) 

Разделы сайта:

Новости сайта
Система "Эксперт"
Вопросы и Ответы
Отправить вопрос
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Форум
F.A.Q.
Архив рассылки
Каталог сайтов
Обратная связь



Связь:

Администратор
Система "Эксперт"
Информация

Доброго времени суток, уважаемые читатели!

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

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

Набор экспертов для новой системы начинается уже прямо сейчас. Хотелось бы, чтобы большинство тех, чьи ответы мы привыкли видеть в рассылке, радовали нас и далее... Однако, присоединиться к экспертам сможет любой из участников в любой момент, поэтому не расстраивайтесь, если забудьте записаться или просто не успеете :-) Система будет полностью открыта. По поводу регистрации напишите на info@delphi.int.ru. В ответ получите небольшую инструкцию по регистрации. Требование одно - использовать возможности системы смогут только зарегистрированные участники сайта. Если вы ещё не зарегистрировались, то вам прямиком сюда >>

Приглашаем всех экспертов!

Эта система действительно избавит всех от надоевших проблем. Например, был как-то разговор о том, что оценивать ответ должен автор вопроса, а не ведущий рассылки... И я не отрицал этого. Теперь всё будет в ваших руках! Кроме того, рассылка будет выходить чаще, так как часть работы будет выполняться системой автоматически. Ну а если возникнут проблемы и рассылка будет задерживаться (или вообще отпуск погуляет) - никаких проблем - участники по-прежнему смогут получать ответы на интересующие вопросы!

Ответы для следующего выпуска рассылки принимаются до 07.04.2006 18:00. Вопросы уже не принимаются. До встречи!

Разделы рассылки:

Авторское слово
Новые вопросы
Ответы на вопросы
Статья по Delphi
Файловый архив
Друзья
Юмор


Количество читателей рассылки: 5012.


Подписка на рассылку:

Программирование на DELPHI


Подписаться почтой

Лидеры по количеству баллов:

Ну... Предпоследний раз здесь публикуется эта таблица... Потом будет совсем другая... Поэтому напоследок стоит опубликовать побольше лидирующих мест :-)

Место
Имя
Баллы
Статус
1
Ermakova Dasha
329
Специалист
2
Dron
323
Специалист
3
Садовников Владимир
297
Практикант
4
Feniks
296
Практикант
5
Матвеев И.В.
280
Практикант
6
Iron Monk
200
Практикант
7
midav.land.ru
191
Практикант
8
Антон Трапезников
173
Практикант
9
PVS
157
Практикант
10
Ершов Денис
135
Студент
11
mvp
134
Студент
12
Лучников А.И.
131
Студент
13
Yurchik
110
Студент
14
VeroLom
90
Эксперт: 10-ый класс
15
Igor Danilevych
86
Эксперт: 9-ый класс
16
SHKoder@deagnostic.ru
74
Эксперт: 8-ой класс
17
Zeon
67
Эксперт: 7-ой класс
18
Деревянко Евгений
67
Эксперт: 7-ой класс
19
Антон Петров
61
Эксперт: 7-ой класс
20
SiNiK
54
Эксперт: 6-ой класс
21
Константин Ситников
51
Эксперт: 6-ой класс
22
Павел Звягинцев
50
Эксперт: 6-ой класс
23
Николай Фролов
48
Эксперт: 5-ый класс
24
Вадим Фурив
46
Эксперт: 5-ый класс
25
Сергей Азачем
40
Эксперт: 5-ый класс

Некоторая статистическая информация (по системе "Эксперт"):

Статистика
На текущий момент
В прошлом выпуске
Динамика
Количество участников:
160
157
+3
Общее количество баллов:
5210
5035
+175
Средний балл:
33
32
+1
Максимальный балл:
329
329
+6
Минимальный балл:
3
3
-
Адресов в зоне .RU:
116
114
+2


Основные правила нашей рассылки:

1. Не присылайте ответов на вопросы вроде "да я не знаю" или "да/нет". Такие ответы не публикуются.
2. Вопросы, не касающиеся Delphi, не принимаются (для этого существуют другие рассылки).
3. Запрещено присылать вложенные файлы, объёмом выше установленного ограничения (ограничения указаны в правилах).
4. Не изменяйте тем присылаемых писем. Письма с "неправильными" темами не обрабатываются! Используйте текстовый (не HTML) формат писем. HTML-теги применяйте только в том случае, если Вы уже достигли статуса, где это разрешено (см. правила).
5. Запрещено задавать вопросы, содержащие два (или несколько) вопросов разной тематики. Каждый из таких вопросов должен быть оформлен отдельным письмом.

Задать вопрос в рассылку   |   Задать вопрос с помощью web-формы   |   Система "Эксперт"


Вопросы

Вопрос #279 (автор вопроса: Mixa; вопрос отправлен: 24.03.2006 15:22):

Создал в Delphi табличку, в которой есть поле с типом DATE. Как мне правильно осущесвить поиск по этому полю с помощью sql-запроса? Напишите пожайлуста пример.  [Ответить на вопрос]

Вопрос #280 (автор вопроса: Katerina; вопрос отправлен: 26.03.2006 15:14):

Кто знает алгоритм рисования линии с заданными координатами начала и конца? Заранее спасибо.  [Ответить на вопрос]

Вопрос #281 (автор вопроса: Сидоров Андрей; вопрос отправлен: 27.03.2006 11:54):

Есть ли возможность в DBGrid'e изменять высоту строк не всех сразу, в зависимости от содержимого одного поля (Мемо)? Например: первая строка - высотой 1, вторая - 2, третья - 1, четвертая - 4. Или подскажите какие компоненты это делают?  [Ответить на вопрос]

Вопрос #282 (автор вопроса: KireaLL; вопрос отправлен: 28.03.2006 21:43):

Здраствуйте, подскажите пожалуйста, как с помощью Delphi программно (во время выполнения) создать связь типа "один ко многим" между двумя таблицами Paradox 7?  [Ответить на вопрос]

Вопрос #283 (автор вопроса: Будя; вопрос отправлен: 29.03.2006 07:14):

Хочу сделать упаковщик исполняемых Файлов, помогите? И киньте пожалуйста статьи про PE файлы.  [Ответить на вопрос]

Вопрос #284 (автор вопроса: lana; вопрос отправлен: 29.03.2006 14:25):

Доброе время суток. У меня D7. Подскажите, как выудить список всех имеюшихся в наличии sql-серверов?  [Ответить на вопрос]

Вопрос #285 (автор вопроса: jmiyushk; вопрос отправлен: 29.03.2006 20:40):

Please, помогите! Задали расчётку на програмную реализацию алгоритма Ньюэла-Санча для удаления невидимых поверхностей. Сделать надо на Delphi. Не успеваю, так как ещё 2 курсовых висит.  [Ответить на вопрос]


Ответы на вопросы

Вопрос #268:
Подскажите, как нужно написать программу, чтобы она выдавала список файлов в указанной папке с возможностью вывода на печать?

1. [Отвечает: PVS (статус: Практикант), 24.03.2006 15:22]: Приблизительно так:

ChDir('C:\КудаНадо');
Res:=FindFirst('*.*',$3F {если каталоги не нужны, то $2f}, SR);
while Res=0 do begin
RichEdit1.Lines.Add(SR.Name);
Res:=FindNext(SR);
end;
FindClose(SR);
RichEdit1.Print('Мои файлы');

Оценка за ответ: 5.

2. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 19:42]: Вашу задачу нужно поделить на две части.
1) Получить список файлов
2) Распечатать список.

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

var
i:Integer;
SR:TSearchRec;
begin
Memo1.clear;
if FindFirst('*.*', faAnyFile, sr) = 0 then
  begin
    Memo1.lines.add(sr.name);
    //sr.size        - а это размер файла в байтах
    //datetimetostr(FileDateToDateTime(sr.time)) - а это дата создания
    while FindNext(sr) = 0 do begin
      Memo1.lines.add(sr.name);
    end;
    FindClose(sr);
  end;

Вторая часть решается следующим способом:

uses Printers;
procedure PrintStrings(Strings: TStrings);
var
  Prn: TextFile;
  i: word;
begin
  AssignPrn(Prn);
  try
    Rewrite(Prn);
    try
      for i := 0 to Strings.Count - 1 do
        writeln(Prn, Strings.Strings[i]);
    finally
      CloseFile(Prn);
    end;
  except
    on EInOutError do
      MessageDlg('Error Printing text.', mtError, [mbOk], 0);
  end;
end;

Чтобы распечатать содержимое TMemo или TListbox, используйте следующие команды: PrintStrings(Memo1.Lines); или PrintStrings(Listbox1.Items);

Оценка за ответ: 5.

3. [Отвечает: LeVeL (статус: Эксперт: 3-ий класс), 24.03.2006 22:49]: Даю ответ на похожий вопрос с http://www.swissdelphicenter.ch, а насчет печати думаю это не очень сложно.

// процедура для поиска всех файлов в папке  Path и ее подпапко
procedure ScanDir(StartDir: string; Mask: string; List: TStrings);
var
  SearchRec: TSearchRec;
begin
  if Mask = '' then
    Mask := '*.*';
  if StartDir[Length(StartDir)] <> '\' then
    StartDir := StartDir + '\';
  if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then
  begin
    repeat Application.ProcessMessages;
      if (SearchRec.Attr and faDirectory) <> faDirectory then
        List.Add(StartDir + SearchRec.Name)
      else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')thenbegin
        List.Add(StartDir + SearchRec.Name + '\');
      ScanDir(StartDir + SearchRec.Name + '\', Mask, List);
  end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;

{ Пример вызова, параметры
1.StartDir - имя папки в котой надо искать
2. маска файлов для поиска, по умолчанию *.*
3. хранилище для резульатат, любой наследник от TString, например TStringList или Listbox.Items и т.д. }

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Clear;
  ScanDir('c:', '', ListBox1.Items);
  Label1.Caption := IntToStr(ListBox1.Items.Count);
end;

А что касается вывода на принтер, то смотрите в прикрепленном файле unit с того же http://www.swissdelphicenter.ch для печати StringList, Memo, ListBox.Stringlist с возможностью задания полей печати, шрифта, заголовка и подножия страницы.

Оценка за ответ: 5.

4. [Отвечает: Мартемьянов А.Б. (статус: Эксперт: 3-ий класс), 25.03.2006 8:41]:

type form1...
...
FileListBox1 : TFileListBox
...
end

Обработчик:
for i := 0 to FileListBox1.Items.Count - 1 do
begin
   CurrentFileName := FileListBox1.Items[ i ];
    Вывод файла CurrentFileName на канву принтера- описано в любом "delphi для чайников"
end;

Оценка за ответ: 3.

5. [Отвечает: SiNiK (статус: Эксперт: 6-ой класс), 25.03.2006 16:21]: Вот пример кода:

uses
  ..., Printers;

public
     procedure ScanDir(Dir: string; list: TMemo);
end;

..

procedure PrintStrings(Strings: TStrings);
var
  Prn: TextFile;
  i: word;
begin
  AssignPrn(Prn);
  try
    Rewrite(Prn);
    try
      for i := 0 to Strings.Count - 1 do
        writeln(Prn, Strings.Strings[i]);
    finally
      CloseFile(Prn);
    end;
  except
    on EInOutError do
      MessageDlg('Error Printing text.', mtError, [mbOk], 0);
  end;
end;

procedure TForm1.ScanDir(Dir: string; list: TMemo);
var
  SearchRec: TSearchRec;
begin
  if Dir <> '' then
    if Dir[length(Dir)] <> '\' then
      Dir := Dir + '\';
  if FindFirst(Dir + '*.exe', faAnyFile, SearchRec) = 0 then
    repeat
      if (SearchRec.name = '.') or (SearchRec.name = '..') then
        continue;
      if (SearchRec.Attr and faDirectory) <> 0 then
        ScanDir(Dir + SearchRec.name, list)
      else
        application.ProcessMessages;
      list.lines.Add(Extractfilename(Dir + SearchRec.name));
    until FindNext(SearchRec) <> 0;
  FindClose(SearchRec);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.Clear; // Чистим Memo
  ScanDir(`C:\WINDOWS\system32\`, memo1); // Поиск только в текущей папке
  PrintStrings(memo1.Lines); // Печатаем
end;

6. [Отвечает: sattar (статус: Эксперт: 4-ый класс), 27.03.2006 17:51]: Список файлов:

var
S:TSearchRec;
begin
if FindFirst(ShellTreeView1.Path+'\*.*',faAnyFile,S)=0 then
repeat
RichEdit1.Lines.Add(S.Name);
until FindNext(S)<>0 ;
FindClose(S);
RichEdit1.Lines.Delete(0);
RichEdit1.Lines.Delete(0);
end;

Вывод на печать:

RichEdit1.Print('');

Оценка за ответ: 5.

Вопрос #269:
Здраствуйте, подскажите пожалуйста, как с помощью Delphi написать программу, которая закрывает все окна в принудительном порядке, без сохранения всех изменений или данных?

1. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 19:50]: Для этого надо пробежаться по списку всех окон и отослать им команду "закрыться". Правда некоторые программы могут "сопротивляться" Ниже приведен код, который поможет вам завершить ВСЕ задачи без всяких уведомлений о необходимости сохранения данных. Поэтому, прежде чем запустить этот код, убедитесь в наличии сохраненных данных и в том, что пользователь осведомлен об этой операции.

procedure TForm1.ButtonKillAllClick(Sender: TObject);
var
  pTask: PTaskEntry;
  Task: Bool;
  ThisTask: THANDLE;
begin
  GetMem(pTask, SizeOf(TTaskEntry));
  pTask^.dwSize := SizeOf(TTaskEntry);
  Task := TaskFirst(pTask);
  while Task do
  begin
    if pTask^.hInst = hInstance then
      ThisTask := pTask^.hTask
    else
      TerminateApp(pTask^.hTask, NO_UAE_BOX);
    Task := TaskNext(pTask);
  end;
  TerminateApp(ThisTask, NO_UAE_BOX);
end;

Оценка за ответ: 5.

2. [Отвечает: LeVeL (статус: Эксперт: 3-ий класс), 24.03.2006 22:49]: Вот пример закрытия всех видимых окон первого уровня (т.е. окон программ):

function EnumWindowsProc(Wnd: HWND; lParam: lParam): BOOL; stdcall;
begin
   Result := True;
   if (IsWindowVisible(Wnd) or IsIconic(wnd)) and
     ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
     (GetWindowLong(Wnd, GWL_HWNDPARENT) = GetDesktopWindow))  then
     begin
      SendMessage(Wnd, WM_CLOSE, 0, 0);
      SendMessage(Wnd, WM_CLOSE, 0, 0);
     END:
end;


// ПРИМЕР ВЫЗОВА
procedure TForm1.Button1Click(Sender: TObject);
var
   Param: Longint;
begin
   EnumWindows(@EnumWindowsProc, Param);
end;

Оценка за ответ: 5.

Вопрос #270:
Как сделать в Delphi 6 редактор (я его сделал уже), чтобы он был установочный, т.е. инсталлятор? Помогите пожалуйста.

1. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 19:56]: Воспользоваться программой, которая делает инсталяторы. Их очень много. Мне к примеру нравиться NSIS( http://nsis.sourceforge.net/Main_Page). Поначалу он кажеться сложным, но как только к нему качаешь редактор (http://hmne.sourceforge.net/) - он сразу стаёт проще. К тому же он полностью бесплатен. Сам язык скриптов, который используется в нён достаточно прозрачен и позволяет делать отличные специфекты.

Оценка за ответ: 5.

2. [Отвечает: LeVeL (статус: Эксперт: 3-ий класс), 24.03.2006 22:49]: Насколько я понял из вопроса Вам нужно создать инсталятор для своей программы. (по другому создать дистрибутив программы для распространения)

Для этих целей существует множество программ, в состав Delphi уже входит IstallShield Express (урезанная версия, но для не очень сложных программ подойдет), но у нее большой размер самого инсталятора, т.е. нет смысла использовать этот инсталятор для программ меньше 10 Мб. Подробнее читайте чуть ниже.

Inno Setup 5 _________________________________________________________
Также рекомендую инсталятор Inno Setup 5 (тем более, что он бесплатен, написан на Delphi и с открытыми исходниками) размер самого инсталятора равен 53 Кб, может сжимать методом lzma (как архиватор 7z - лучше RAR). Но за все эти прелести придется платить тем, что инсталятор создается "вручную", т.е. надо самому писать сценарий установки, но встроенный мастер и примеры научат вас этому очень быстро. С качать можно с: http://www.jrsoftware.org/

Но для этого инсталятора существуют дополнения которые существенно упрощают создание сценариев установки:

Одно из лучших, на мой взгляд, это ISTool (бесплатная), с помощью данной утилиты создание сценария превращается всего лишь в простановку галочек, т.е. вы просто выбераете с помощью диалогов что надо сделать, а эта утилита сама уже напишет сценарий установки, скачать можно с
ttp://www.istool.org/

NSIS _________________________________________________________________
Есть еще один бесплатный open-source инсталятор NSIS (Nullsoft Scriptable Install System), это инсталятор созданный авторами Winamp, т.е. именно его вы видите при установке этого проигрывателя.
Это тоже скриптовый инсталятор, т.е. опять надо самому писать сценарий установки, но и для него есть программы которые сделают это за вас, например:
- "HM NIS Edit 2" ( http://hmne.sourceforge.net/) , на мой взляд лучший редактор сценариев для NSIS, также присутствует мастер создания сценариев установки. Бесплатный и Open-source
- "Venis IX" ( http://www.spaceblue.com/venis/ ) также редактор сценариев с мастером создания сценариев. Бесплатен для некомерческого использования.

Сам же NSIS скачать можно с
http://nsis.sourceforge.net/

GkSetup ( http://www.gkware.com/ ) __________________________________
Просто неплохой бесплатный инсталлятор, простой и понятный. Интерфейс инсталляции максимально приближен к стандарту - InstallShield. Использование его вместе с IExpress позволяет достичь минимально возможного размера дистрибутива (надо перед сжатием IExpress'ом распаковать файл setup.da_ командой expand setup.da_ setup.dat и затем переименовать dat в da_).

=====================================================================
ТЕПЕРЬ РАССМОТРИМ ПЛАТНЫЕ ИНСТАЛЯТОРЫ (взято из SWRUS FAQ, Составление - (p) Александр Лысковский )

CreateInstall ( http://www.gentee.com/ ) ____________________________
Простой, легкий в освоении и компактный инсталлятор. Может удовлетворить все основные потребности при создании инсталляций. Довесок к вашим упакованным файлам будет составлять всего 40KB. В отличии от других инсталляторов - это российская разработка и для российских авторов и компаний он стоит 150 руб, которые можно оплатить денежным переводом.

MindVision's Installer VISE ( http://www.mindvision.com/ )___________
Мощнейший профессиональный инсталлятор, используется даже крупными корпорациями (Netscape, Adobe, Claris, Symantec, Microsoft, Kodak...). Стоимость - $695 за первый год и $295 за последующие обновления. Однако для авторов freeware/shareware он бесплатный (правда, выдает соответствующий экран при старте инсталляции, что многих раздражает).

WISE ( http://www.wisesolutions.com/ ) _______________________________
Славу себе он завоевал самым маленьким (среди инсталляторов-"монстров", конечно) размером получающегося дистрибутива, при этом его возможности не уступают ни InstallShield, ни VISE. Как и VISE, он позволяет вызывать любые функции из DLL и WinAPI. Он имеет свой богатый скриптовый язык, но знать его необязательно - дистрибутив можно сделать в считанные минуты при помощи Installation Expert Wizard. Стоимость - $195.

InstallShield Professional ( http://www.installshield.com/ ) ___________
Этот продукт владеет огромной долей рынка - по информации самой компании, 90 из Top100 программных компаний используют InstallShield. Это старейший продукт, ровесник самой Windows, и за время ее существования стал стандартом де-факто. Он действительно обладает всеми необходимыми возможностями для создания сколь угодно сложных сценариев установки.

Однако это не значит, что для авторов shareware он будет лучшим выбором. Во-первых, стоимость Professional-версии составляет $695, хотя с Delphi и Visual C++ поставляются облегченные бесплатные варианты Express. Во-вторых, размер дистрибутива превосходит все остальные инсталляторы, что только создает лишние трудности при распространении программы через Интернет. И главное, его конкуренты обладают не меньшими возможностями, так что нам есть из чего выбирать.

InstallShield создал себе репутацию монстра, и я бы рекомендовал его использовать для инсталляции не менее монструозных корпоративных продуктов (мегабайт так на 40-50).

______________________________________________________________________
Честно говоря описывать инсталяторы можно очень долго, так как их существует великое множество, и описать в подписке просто невозможно, поэтому описал только наиболее распространенные.

Оценка за ответ: 5.

3. [Отвечает: Мартемьянов А.Б. (статус: Эксперт: 3-ий класс), 25.03.2006 8:46]: Инсталляторы обычно делаются с помощью таких программ, как InstallShield Express (поставляется с Delphi) или InstallShield Developer (более полная версия). Есть также мастер инсталлятров Wise, и множество других (более слабых), которые можно найти почти на каждом сервере с фриварным софтом для программиста (на freeware.ru и многих других лежит свободно например EasyInstall). В большинстве случаев этих средств хватает и нет нужды писать что-то свое.

Оценка за ответ: 5.

4. [Отвечает: SiNiK (статус: Эксперт: 6-ой класс), 25.03.2006 16:21]: Для этого можно использовать инсталляторы, например (Inno Setup, Wise, NSIS); Если выберешь NSIS, то скачай редактор скриптов NIS Edit. Это во много раз упростит написание скриптов.

Оценка за ответ: 4.

5. [Отвечает: Матвеев И.В. (статус: Практикант), 26.03.2006 13:33]: Используйте стандартный инсталлятор InstallShield, он поставляется вместе с Delphi, должен находиться на компакт диске.

Вы также можите использовать другие утилиты для создания инсталляций:

- WISE Install Manager / WISE Installation System / WISE for Windows Installer
- SFXFactory, www.emerge.de
- Quick Install Maker, www.mjksw.com
- Nullsoft Install System
и другие.

Вы, также, можете воспользоваться sfx архивами, например WinRar позволяет использовать скрипты, заменять иконку sfx архива и т.д. Ну и наконец, Вы можете сами написать инсталляцию - для сжатия используйте библиотеку Zlib, если писать без VCL, а потоки (TStream) периписать, получится довольно компактный инсталляционный модуль. Это довольно сложно, но зато здесь Вы будите точно знать что делает Ваша инсталляция, и потом, один раз написанную заготовку можно использовать несколько раз - только текст меняйте.

Оценка за ответ: 5.

6. [Отвечает: Дмитрий Гордиенко (статус: Эксперт: 3-ий класс), 27.03.2006 14:42]: Уточню вопрос. Редактор (текстовый или какой либо) уже готов и требуется создать инсталлятор? Если да, то порекомендовал бы замечательную программу Inno Setup . Взять можно здесь http://www.jrsoftware.org/isinfo.php.

Оценка за ответ: 4.

Вопрос #271:
Добрый день! У меня такой вопрос: как написать функцию, которая будет соединяться с POP3 сервером и скачивать на компьютер новые письма, после чего удалять их на сервере (как The Bat! или Outlook)? Или какой компонент существует для этой цели, и где можно найти описание этого компонента на Великом и Могучем?

1. [Отвечает: Home (статус: Эксперт: 1-ый класс), 01.04.2006 9:49]: Для этого существует компонент Indy POP3 он обычно устанавливаеться вместе с Делфи старше 5 версии. Там всё просто: Нам понадобится 2 компонента: idPOP3 (со вкладки Indy Clients) и idMessage (Indy Misc).

var
i,k:integer;
begin
idPop3.Host:=`mail.pochta.com`;  //Адрес сервера
idPop3.Port:=110;                      //Порт сервера
idPop3.Username:=`Vanya`;        //Логин на сервере
idPop3.Password:=`Pupkin`;              //Пароль на сервере
idPop3.Connect();
if idPop3.Connected then
begin
i:=idPop3.CheckMessages;
for k := i downto 1 do
begin
    idPop3.Retrieve(k,idMessage1);
     idPop3.Delete(k);
end;
idPop3.Disconnect;
end;

Оценка за ответ: 5.

2. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 20:02]: Можно воспользоваться компонентами Indy, которые есть в поставке делфи, начиная с 6. Правда в 7 почемуто демки к нему не положили, но их можно выкачать с http://www.indyproject.org/Sockets/Download/index.en.iwp. В глубинах инета видел книгу, которая называется "Глубины Indy" - одна с единственных книг на "могучем". Но примеры, которые там есть вполне приличны.

Оценка за ответ: 4.

3. [Отвечает: Aleksey Mayboroda (статус: Эксперт: 2-ой класс), 25.03.2006 12:07]: Есть несколько способов. Во-первых, использовать компонент idPOP3спалитры Indy Clients. Пример его применения можно найти в папке Demos в каталоге Delphi. Помоему там все достаточно хорошо расписано и с комментариями. Во-вторых (именно так делаю я): использовать сокеты и напрямую общаться с сервером почты. Описание протокола POP3можнонайтилибов RFC, либо, например, на delphiworld.narod.ru. Протокол совсем не сложный буквально вам понадобиться несколько команд. Для разбора письма в делфи также присутствуют необходимые компоненты (декодирование Base64 например).

Оценка за ответ: 5.

4. [Отвечает: Мартемьянов А.Б. (статус: Эксперт: 3-ий класс), 25.03.2006 8:52]: Ты можешь даже готовый OpenSource почтовый клиент скачать на citkit.ru. Называется он siMail. Интересующие тебя функции в нем прекрасно реализованы.

Оценка за ответ: 4.

5. [Отвечает: Дмитрий Гордиенко (статус: Эксперт: 3-ий класс), 27.03.2006 14:48]: Да есть компоненты это Indi. На великом и могучем описание здесь http://www.delphiplus.org/downloads/doc/delphi/indy_in_depth_pdf.zip (автор перевода Анатолий Подгорецкий).

Оценка за ответ: 5.

6. [Отвечает: Матвеев И.В. (статус: Практикант), 29.03.2006 13:06]: Используйте компонент NMPOP3. Вам нужно указать свойства:

NMPOP3.Host := адрес сервера
NMPOP3.UserID := ваш идентификатор - логин в системе
NMPOP3.Password := пароль на ящик
NMPOP3.DeleteOnRead := удалять с сервера

Затем вызываете NMPOP3.Connect; и в событии NMPOP3.OnConnect уже проверяете письма.Сначала получаете общее число писем на сервере NMPOP3.MailCount, затем вызываете GetMailMessage(i) для скачивания отдельного письма, i - номер письма, нумеруется с 1. Само письмо помещается в объект NMPOP3.MailMessage. После всех операций вызовите NMPOP3.Disconnect;

Оценка за ответ: 5.

Вопрос #272:
Возвращаясь к вопросу № 242 предыдущей рассылки. Я не совсем правильно его сформулировал. Мне нужно подсчитать количество трафика, проходящего через мой компьютер. Можно посмотреть (например в свойствах соединения) общее количество входящего и исходящего трафика. А если его нужно расписать: Сколько куда ушло? Или, например поделить трафик на месный (Украинский) и зарубежный. Хотелось написать программу, которая будет всё это подсчитывать, вести логи, и предупреждать о превышении предоплаченого провайдером трафика.

1. [Отвечает: LeVeL (статус: Эксперт: 3-ий класс), 24.03.2006 22:49]: Описать данный материал в рассылке, на мой взгляд, невозможно из-за объемности материала, но в сети есть хорошие примеры учета трафика. Возможно вам поможет этот пример:
Network traffic monitor, 23 Кб
(исходники: http://delphi.about.com/library/weekly/code/src112903.zip)
Скорее всего вам нужно именно этот пример, так как достаточно понимаемые исходники, и полностью отвечает на Ваш вопрос. Единственное что Вам придется написать самим, так это разделение учета на Украинский и не. Но в принципе это можно сделать по IP.

Оценка за ответ: 5.

Вопрос #273:
Проблема. В программе много справочников. Хочу их поместить в динамические библиотеки. Использую ADO. Не знаю, как передать соединение ADOConnection в DLL и привязать его там к ADOStoredProc или ADODataSet. Заранее спасибо.

1. [Отвечает: Деревянко Евгений (статус: Эксперт: 7-ой класс), 26.03.2006 21:19]: Для этого можно передать по ссылке сам ADOConnection в функцию из dll. Для этого надо объявить ф-ю в dll:

procedure Proc1(Var con: TADOConnection);
var
t: TADOTable;
begin
t.Connection := con;
.......
end;

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

Оценка за ответ: 4.

Вопрос #274:
Здравствуйте! Не подскажите ли Вы, как можно сделать такую форму на которой имеется кнопка, по нажатии которой появлялось дополнительное место на форме с другими компонентами, а при повторном нажатии это место опять скрывалось (наподобие кнопок VIDEO/VIS и CONFIG в Winamp'e)?

1. [Отвечает: PVS (статус: Практикант), 24.03.2006 15:10]: Форме на которой все происходит надо поставить AutoSize=True, для дополнительных компонент сделать невидимую (или видимую - тут уж смотрите как вам лучше) панельку ExtPanel, а на кнопку написать: ExtPanel.Visible:=not(ExtPanel.Visible).

Оценка за ответ: 5.

2. [Отвечает: Vadim (статус: Эксперт: 1-ый класс), 24.03.2006 20:11]: Здесь нет ничего сложно! Делаете обычную форму, но в "развёрнутом состоянии". Ставите кнопку "Свернуть-развернуть".В ней пишите приблизительно следующий код:

if Height > 200 then Height:=200 else Height:=300;

Числа 200 и 300, как можно догадаться - это размеры нашей формы. Только не забудем выставить для формы BorderStyle в bsDialog. Это поможет избежать полос прокрутки и зачем пользователю ручками растягивать форму?

Оценка за ответ: 5.

3. [Отвечает: Мартемьянов А.Б. (статус: Эксперт: 3-ий класс), 25.03.2006 9:02]: Можно например так:
Показываешь панель с кнопками:
form1.Width := form1.Width + Panel1.Width;
Panel1.Visible := TRUE;

Прячешь панель с кнопками:
form1.Width := form1.Width - Panel1.Width;
Panel1.Visible := FALSE;

Если хочешь чтобы показывалось/пряталось с одной кнопки, то делаешь так:
const NormalFormWidth = 700; // = form1.Width когда панель спрятана
procedure SpeedButton1OnClick(sender:tobject);
begin
if SpeedButton1.Down then // Добавляешь место под панель с кнопками
form1.Width := NormalFormWidth + Panel1.Width
else // Прячешь место под панель с кнопками
form1.Width := NormalFormWidth - Panel1.Width;
// Показываешь/прячешь саму панель:
Panel1.Visible := SpeedButton1.Down
end;

Оценка за ответ: 5.

4. [Отвечает: SiNiK (статус: Эксперт: 6-ой класс), 25.03.2006 16:21]: Если я правильно понял. Кидай на форму Button, Panel. У Panel ставь Visible - False и на Button1Click пиши:

  if Panel1.Visible then begin
    Panel1.Visible:=False;
    Button1.Caption:='<<<';
  end else begin
    Panel1.Visible:=True;
    Button1.Caption:='>>>';
  end;

Ну и потом F9 :)

Оценка за ответ: 5.

5. [Отвечает: Деревянко Евгений (статус: Эксперт: 7-ой класс), 26.03.2006 21:22]: Попробуй использовать TFrame, TPanel или ещё какой-нибудь контейнер. Помести туда нужные компоненты, а по нажатию на кнопку можно показывать и прятать весь контейнер. Будет работать для всех компонентов на нём. Что-то типа этого:

begin
Panel1.Visible := not Panel1.Visible;
end;

Оценка за ответ: 5.

6. [Отвечает: Ершов Денис (статус: Студент), 27.03.2006 14:58]: Поступаем следующим образом. На форму ложем панель (pnMain), делаем ее по размером клиентской части окна в исходном положении. На нее кладется кнопка "More >>".Рядомпристраиваемвторуюпанель (pnOther), которая обозначит пространство, открываемое по нажатию волшебной кнопки. Для того, чтобы панели не были доступны глазу пользователя, удаляем у обеих Caption, а BevelOuter выставляем в bvNone. После этого у формы выставляем включаем свойство AutoSize. Это заставит форму автоматически занимать минимальный размер по видимым компонентам формы. В обработчике кнопки пишем: pnOther.Visible := not pnOther.Visible; Данный способ так же защищает скрытые элементы от их выделения клавишей "Tab".

Оценка за ответ: 5.

7. [Отвечает: sattar (статус: Эксперт: 4-ый класс), 27.03.2006 17:51]:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if  SpeedButton1.Tag=0 then begin
Width:=Width-200;
Speedbutton1.Caption:='>>';
SpeedButton1.Tag:=1;  end else begin
SpeedButton1.Caption:='<<';
SpeedButton1.Tag:=0;
Width:=Width+200;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
SpeedButton1.Caption:='<<';
BorderStyle:=bsDialog;
end;

Оценка за ответ: 5.

8. [Отвечает: Матвеев И.В. (статус: Практикант), 30.03.2006 17:45]: Вот:

if Form1.Width < 400 then
Form1.Width := 400 else Form1.Width := 300;

Изначально ширина формы должна быть < 400. При нажатии ширина формы станет 400, а при повторном нажатии - 300.

Оценка за ответ: 5.

9. [Отвечает: Yurchik (статус: Студент), 30.03.2006 22:45]: Пожалуй, удобнее всего дополнительные компоненты поместить на панельку, а саму панельку разместить c выравниванием по какому-то краю формы (то есть свойсво Align установить в alBottom, alRight и т.д.) А потом прятать/показывать панельку с соответствующим изменением размера формы. Для случая размещения панельки внизу обработчик события кнопки будет выглядеть примерно так:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Panel1.Visible then
  begin
    Panel1.Visible:= False;
    Form1.Height:= Form1.Height - Panel1.Height;
  end
  else
  begin
    Form1.Height:= Form1.Height + Panel1.Height;
    Panel1.Visible:= True;
  end;
end;

Оценка за ответ: 5.

Вопрос #276:
Может кто знает, как заблокировать открытие CD-ROM'а, чтобы при нажатии на кнопку на приводе он не открывался? Требуется для того, чтобы обезопасить компьютер от посягательств 2-х летнего сына :)

1. [Отвечает: PVS (статус: Практикант), 24.03.2006 15:06]: Надо отключить питание CD-ROM'а :)

Оценка за ответ: 1.

2. [Отвечает: Мартемьянов А.Б. (статус: Эксперт: 3-ий класс), 25.03.2006 9:16]: // заблокировать
void CMFcDlg::OnBnClickedButton1(){
HANDLE hDevice = CreateFile ("\\\\.\\E:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
DWORD dwBytesReturned = 0;
PREVENT_MEDIA_REMOVAL pmr = {TRUE};
if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be locked");
CloseHandle (hDevice);
}


//разблокировать
void CMFcDlg::OnBnClickedButton2(){
HANDLE hDevice = CreateFile ("\\\\.\\E:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
DWORD dwBytesReturned = 0;
PREVENT_MEDIA_REMOVAL pmr = {FALSE};
if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be unlocked");
CloseHandle (hDevice);
}

Перевести на Delphi труда думаю не составит. А можно посмотреть и тут http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shutdown/base/how_to_lock_the_workstation.asp

Оценка за ответ: 4.

3. [Отвечает: SiNiK (статус: Эксперт: 6-ой класс), 25.03.2006 16:21]: Взято из Delphi World: Блокировка и разблокировка CD-ROM 2 [Автор: ReLock]. Я сам долго искал, как блокировать/разблокировать CD-ROM на Delphi. Поэтому не претендую на авторство этой статьи. Просто собрал все, так сказать, в кучу. Проверено на D7.

procedure TMainForm.CD_Lock(Locked: Boolean, DriveLetter: string);
const
  IOCTL_STORAGE_MEDIA_REMOVAL = $002D4804;
var
  hDrive: THandle;
  Returned: DWORD;
  DisableEject: boolean;
begin
  hDrive := CreateFile(PChar('\\.\' + DriveLetter), GENERIC_READ,
    FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
    0);
  if GetLastError <> 0 then
    MessageDlg('Error:' + IntToStr(GetLastError), mtError, [mbOK], 0);
  try
    DisableEject := Locked;
    if not DeviceIoControl(hDrive,
      IOCTL_STORAGE_MEDIA_REMOVAL, // PREVENT_MEDIA_REMOVAL,
      @DisableEject,
      SizeOf(DisableEject),
      nil,
      0,
      Returned,
      nil) then
      MessageDlg('Ошибка:' + IntToStr(GetLastError), mtError, [mbOK], 0)
  finally
    CloseHandle(hDrive)
  end;
end;

CD_Lock(True) - блокирует CD-ROM
CD_Lock(False) - разблокирует CD-ROM

Для полного веселья можно заблокировать все CD-ROMы в системе через это:

procedure TMainForm.LockCDROMs;
var
  w: dword;
  Root: string;
  i: byte;
begin
  w := GetLogicalDrives;
  Root := '#:\';
  for i := 0 to 25 do
  begin
    Root[1] := Char(Ord('A') + i);
    if (W and (1 shl i)) > 0 then
      if GetDriveType(PChar(Root)) = DRIVE_CDROM then
      begin
        DriveLetter := Copy(Root, 1, Length(Root) - 1);
        CD_Lock(True, DriveLetter)
      end
  end;
end;

Оценка за ответ: 5.

4. [Отвечает: Матвеев И.В. (статус: Практикант), 26.03.2006 11:35]: Используйте вот эту функцию:

function LockCD(DriveCD: Char; Locked: Boolean): Boolean;
const
  IOCTL_STORAGE_MEDIA_REMOVAL = $002D4804;
var
  hDrive       : THandle;
  Returned     : DWORD;
  DisableEject : Boolean;
  Drv          : string;
begin
Result := False;
Drv := '\\.\' + DriveCd + ':';
hDrive := CreateFile(PChar(Drv), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING,
             FILE_ATTRIBUTE_NORMAL, 0);
if GetLastError <> 0 then Exit;
try
   DisableEject := Locked;
   Result:=DeviceIoControl(hDrive, IOCTL_STORAGE_MEDIA_REMOVAL,
   @DisableEject, SizeOf(DisableEject), nil, 0, Returned, nil);
finally
  CloseHandle(hDrive);
end;
end;

После ее выполнения с Locked=True каретка указанного привода не будет выезжать или возвращаться назад, если на момент вызова функции каретка была выдвинута. Блокировка сохраняется до перезагузки или пока не функция не будет вызвана с параметром Locked=False.

Оценка за ответ: 5.

Вопрос #277:
Есть Word-документ с шаблоном... В некоторых полях поставлены $переменные... Как с Delphi сделать вывод текста вместо этих переменных? Например: в Word стоит $FIO, при формировании с Delphi вместо этого нужно, чтобы подтянуло фамилию, заполненую в Delphi в формочке. Как организовать код?

1. [Отвечает: PVS (статус: Практикант), 24.03.2006 15:05]: WordDocument1.Selection.Find.Execute(......)
А дальше - параметры: что искать, где искать, на что менять, менять все и т.д. Такую конструкцию надо прогнать в цикле для всех параметров, которые надо менять.

Оценка за ответ: 5.

2. [Отвечает: Мартемьянов А.Б. (статус: Эксперт: 3-ий класс), 25.03.2006 9:06]: Пример лежит на официальном сайте Борланда (статья Артемия Трепалина).

Оценка за ответ: 2.

Вопрос #278:
Пытаюсь получить доступ к "Личной адресной книге" Outlook. В цикле почему-то на метод Count вываливает ошибку - OLE error 00040482. Как побороть?

1. [Отвечает: Мартемьянов А.Б. (статус: Эксперт: 3-ий класс), 25.03.2006 9:20]:
for i := 1 to 100 {MyAddressBook.AddressEntries.Count} do
... MyAddressBook.Item[i];

Номера Item'ов не от 1 до Count а от 0 до Count - 1. В приведенном тобой коде при последнем выполнении цикла происходит обращение к несуществующему элементу Item[Count], тогда как последний элемент массива Item имеет номер Count-1.

Оценка за ответ: 5.

Все вопросы и ответы на них Вы всегда можете найти на нашем сайте в разделе "Delphi-Эксперт".


Статьи  >>

Новых статей пока что нет...

Любой из читателей может присылть свои статьи по адресу info@delphi.int.ru и они будут опубликованы в ближайших выпусках рассылки и на сайте. Статьи, полностью взятые с других сайтов, без указания ссылок на авторство, не публикуются.


Файловый архив  >>

Из данного раздела Вы можете скачать различные файлы: компоненты, plug-in'ы для Delphi, документацию по программированию, программы, игры, написанные на Delphi и всё остальное... Вы можете добавить свои файлы в данный раздел. Чтобы сделать это, пожалуйста, заполните форму на сайте.

За последнюю неделю на сайте появились следующие файлы:

Название
Описание
Категория
Объём
Ссылки
RegAsso
Компонент для регистрации новых расширений и ассоциации с ними ваших программ.
1.16 Кб
ResManager
Удобный компонент для хранения и быстрого использования ресурсов в ваших программах или играх. Поддерживается компрессия zip и криптостойкое шифрование.
558 Кб
Shaped Form
Компонент для создания региона по маске и присвоения этого региона форме. Очень удобный; работает быстрее, чем аналогичный компонент из JediVCL.
4.52 Кб
Winamp Control
WinampControl - программа для управления плеером Winamp на горячих главишах (Win + Key). Показывает текущий трэк, инфо время по нему. Есть 2 встроенных таймера и много другое + добавлено удаленное управление (по сети и т.д.). Поддержка разных языков. Также теперь присутсвует Help к программе. Более подробнее на сайте или в файле History.txt в архиве с программой. Написана на чистом Win32 API и соответсвенно быстро работает.
Winamp Control 2.7 Screenshot
126 Кб
Ссылки  >>

Здесь представлены ссылки на дружественные сайты. Обмен ссылками и баннерами приветствуется для сайтов схожей тематики. Здесь представлены самые последние ссылки:

Программирование на Visual Basic & Basic. Статьи, контролы, исходники, примеры, игры, ActiveX, форум по VB, а также многое другое на одном сайте!
http://xskernel.excode.ru/
Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source - наше направление.
http://infomania2004.webhost.ru/
Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, оставьте заявку на её поиск...
 
Рассылки Subscribe.Ru
Интернет для Delphi-программиста
Visual Basic для новичков и профессионалов
   
 

Юмор.

Умеp Билли Гейтс и попал на небо к Богy.
- Заслyги твои велики так что можешь сам выбpать в Ад или в Рай. Посмотpи сам. Hy пошел Билли в Рай там литавpы игpают, нектаp пьют. Скyчно емy стало. Пошел в Ад. Там вино pекой, девочки...
- Hy все я pешил. Я идy в Ад.
- Ты хоpошо подyмал? Hазад доpоги нет.
- Да. Откpывается люк и Билли пpоваливается в Ад. Пpямо в котел и чеpти давай его пиками колоть. Он орет:
- Как же так! Я тyт совсем не это видел!
Добродушные черти:
- ТАК ЭТО БЫЛА ДЕМОВЕРСИЯ!

:))

Российские хакеры взломали бортовой компьютер российского истребителя СУ-27.
Теперь боекомплект самолёта пополняется автоматически и у летчика есть шанс выйти на следующий уровень.

:))

После смерти Моисей, Эйнштейн и Билл Гейтс каждый в свое время попали в рай. Бог каждого спрашивает:
- Что бы Вы хотели меня спросить?
Моисей:
- Я бы хотел узнать, как правильно исполнять Твою волю.
Эйнштейн:
- Я бы хотел узнать законы, по которым Ты построил мир.
Билл Гейтс:
- Какого фига ты расселся на моем месте?

:))

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

:))

Фидошник игpает в Поле Чудес, на табло: ***
Якубович читает задание:
- Часть тела.
Фидошник сpазу:
- Hога!
- Hо ведь в задании только тpи буквы...
- :-/ А я думал у вас H не настpоена.

:))

Ну и запросы у вас - сказала база данных и повисла.

:))

...Ну! И кто открывал бутылку об F8 ?!

:))

Анекдоты прислал: Bruder.

Присылайте компьютерные анекдоты и истории по этой ссылке: info@delphi.int.ru и они обязательно будут опубликованы.

Товарищи программисты! Проявляйте свою активность. Давайте помогать друг другу! Если вы не нашли ответа на свой вопрос, не отчаивайтесь! Количество подписчиков постоянно растёт и, наверняка, найдётся тот человек, который поможет вам!
Ведущий рассылки, Ерёмин Андрей.

В избранное