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

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

  Все выпуски  

Программирование на DELPHI в вопросах и ответах #13 испр.


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

Программирование на Delphi
Программирование на Delphi. Выпуск №13 от 02.01.05.


Добрый день, уважаемые читатели!

Ну вот и наступил долгожданный 2005 год! И особенно приятно, что мы начинаем его с выпуска рассылки номер 13! Но это магическое число никоим образом не повлияет на нашу рассылку. Лично мне это число наоборот приносит удачу. И день рождения у меня 13-го... Итак, а теперь про всё остальное. Дизайн рассылки вновь изменён. Просто очень хочется подобрать что-то приятное. Теперь, как вы уже можете видеть, всё выполнено в синеватом оттенке. Хотелось бы узнать ваше мнение по поводу дизайна. Пишите сюда. Также в рассылке разделы "Вопросы" и "Ответы" перемещены вверх. Так гораздо удобнее читать - раньше перед этим шла статья по Delphi. Статьи по-прежнему будут в каждых выпусках. Сегодня мы продолжим писать инсталлятор. Открыт новый раздел - "Кладовая". Его мы обсуждали в предыдущих выпусках, поэтому смотрите и предлагайте свои идеи.

Рассылка должна была быть 1 января переименована в "Программирование на Delphi". На текущий момент этого ещё не произошло. Приношу свои извинения. В новостях на сайте написано, что она уже переименована. Просто ещё не пришло подтверждение переименования. К следующему выпуску точно изменим. Так что не обращайте внимания ;)

Письмо от читателя...

Не обижайтесь, НО ЛЮДИ!!! Ответы на многие Ваши вопросы я нахожу в таких сборниках статей, как: "Delphi World", "Delphi Russian Knowledge Base", "Советы по Delphi от Валентина Озерова". Публиковать их под своим авторством некрасиво, копировать статью и указывать источник тоже неохти(но так и приходится делать), а не отвечать вообще - дык сильно хочется помочь,а вдруг никто не ответит. И поэтому хочу сделать предложение автору рассылки: сделать раздел в котором бы публиковались ссылки на разные архивы статей(off-line) и электронные книги по программированию (с указанием языка). Привожу свои ссылки: "Delphi World" (rus) где-то на сайте www.delphiworld.narod.ru(скачивал мой друг, поэтому точную
ссылку не знаю), "Советы по Delphi от Валентина Озерова" (rus) где-то на сайте http://delphi.hostmos.ru, "Delphi Russian Knowledge Base" (rus) http://www.sources.ru/delphi/drkb.zip.
[Рудов Антон].

Ну что, будем открывать такой раздел? Свои мнения пишите сюда. Я, конечно, как адмнистратор, мог бы сразу открыть этот раздел, не спрашивая вашего мнения, но оно мне очень важно. Также, если после открытия этого раздела, ответы на вопросы станут сплошными вырезками из документаций, зачислять такие ответы просто нет смысла. Я считаю, что нужно начислять баллы только за ответы, которые давали сами читатели, "писали" своей рукой, а не за те, что просто скопировали из сборника вопросов и ответов по Delphi. Короче говоря, я не против этого раздела, а только ЗА! Но также следует учесть, что вы, уважаемые читатели, должны будете быть активными, постоянно (или хотя бы изредка) присылать ссылки на подобные документации, архивы статей и книги. Если этого не будет происходить, раздел просто "завянет", а я не могу сидеть часами в поисковиках, просматривая все ссылки, найденные по слову "Учебники по Delphi" или "Вопросы по программированию"... Итак, жду ваших мыслей!

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

ВНИМАНИЕ!!! Конкурс! На одной из страниц нашего сайта (http://www.delphi-faq.fatal.ru/) есть зашифрованный текст. Найдите его и расшифруйте. Зашифрован он без использования каких-либо программ, соответственно расшифровать его может каждый. Но для начала вы должны его найти, что весьма непросто. Не думайте, что он ПРОСТО написан на какой-либо странице. Он хорошенько припрятан от ваших глаз, а найти его сможет только мышь... (это подсказка!). Первые десять человек, кто найдут текст и правильно его расшифруют, получат на свой счёт у нашего сайта 25 баллов! Это достаточно много, ведь самый простой способ заработать 25 баллов - это качественно ответить на 5 вопросов, что очень нелегко. Эти баллы серьёзно увеличат ваши шансы выиграть приз (подробности ниже). Свои ответы присылайте на наш ящик (Delphi-FAQ@list.ru) с темой "Deciphered_text", или просто нажмите на ЭТУ ссылку. Желаю удачи!

Ах да, чуть не забыл! Ранее было сказано, что читатель, который наберёт наибольшее количество баллов за указанный срок, получит возможность ярко прорекламировать свой сайт или себя любимого ;) Это предложение остаётся в силе и будет применено к тройке лидеров. А теперь, внимание!!! Читатель, который наберёт наибольшее количество баллов до 28 февраля включительно, получит в подарок CD!! Какой - пока секрет. И помните - чем полнее и обширнее вы будете отвечать на вопросы, присылать свои статьи, анекдоты, исходники программ, тем большее количество баллов будет на вашем счету и тем больше у вас шансов выиграть приз!

Top-3 (читатели, лидирующие по кол-ву баллов).

1.
58 балла
2.
43 балла
3.
38 баллов

Ну вот и всё, что хотел до вас донести. Приятного чтения!

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


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

40. Как мне определить скорость инета? Почитал msdn, понял, что надо юзать IPHLPAPI.DLL, а вот как? [Ответить].


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

36. (Изменение курсора на песочные часы). [Отвечает: Ершов Денис]: Проще пареной репы. Цитата из хелпа:
var
Save_Cursor:TCursor;
Begin
Save_Cursor := Screen.Cursor;
Screen.Cursor := crHourGlass; { Show hourglass cursor }
try
{ Do some lengthy operation }
finally
Screen.Cursor := Save_Cursor; { Always restore to normal }
end;
end; 

[Отвечает: Budkevich Evgeniy]: Предлагаю воспользоваться таким способом: Когда нужно поменять курсор на песочные часы пишите: Screen.Cursor :=crHourglass; Когда нужно вернуть стандартное изображение курсора Screen.Cursor := crArrow; А вообще в Help (TCursor type) есть информация. 

[Отвечает: Андрей Лучников]: Screen.Cursor:=crHourGlass; { тут что-то делаем } Screen.Cursor:=crDefault;

[Отвечает: Feniks]: Для изменения вида курсора мыши необходимо использовать свойство Cursor. Оно находится у всех Контролов и у Формы в том числе. А также еще можно менять курсор не только у отдельных Контролов, а у проги в целом, т.е. при наведении мыши на форму, не зависимо на какой компонент, мыша меняется. Для этого этого надо юзать Screen.Cursor. Подробно о классе TScreen написано в хелпе.

[Отвечает: Садовников Владимир]: Если неудобно это делать для каждого контрола по отдельности, то сделай всё в цикле: procedure TForm1.FormCreate(Sender: TObject);
var
I:Integer;
C:TClass;
begin
// Здесь мы просматриваем каждый компонент,
// и, если у него можно поменять свойство "курсор",
// меняем его
for I:=0 to Self.ComponentCount-1 do
begin
// Здесь обязательно надо проверить,
// является ли наш объект наследником TControl.
// Если нет - любая попытка
// изменить курсор вызовет исключение.
C:=Self.Components[I].ClassType;
// Цикл, пока все родительские классы не будут просмотрены,
// или не будет найден родительский класс TControl
while C<>nil do
begin
if C.ClassName='TControl' then
begin
// Если класс является наследником TControl,
// то меняем у него курсор и выходим из цикла
TControl(Self.Components[I]).Cursor:=crHourglass;
Break;
end
else
// Просматриваются все базовые классы,
// начиная сверху вниз (от сложного к простому)
C:=C.ClassParent;
end;
end;
// Ну, естественно, и сама форма меняет курсор.
Self.Cursor:=crHourglass;
end;

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

[Отвечает: Igor]: Форма, как и каждый визуальный компонент, имеет свойство Cursor. Чтобы сделать вместо обычного курсора песочные часы задайте ему значение crHourGlass. А чтобы вернуть опять обычный курсор задайте значение crDefault. В результате песочные часы будут над всей поверхностью вашей формы.

[Отвечает: NordVer]: Надо с помощью Image Editor создать файл ресурсов, поместить в него свой курсор. Затем в коде после директивы {$r *.DFM} добавьте {$R <имя файла ресурсов>.res}. После этого файл ресурсов окажется привязанным к программе. Для выбора курсора вводите в тексте программы: Screen.Cursors[1]:=LoadCursor(HInstance,'<имя курсора>'); Screen.Cursor:= 1;

[Отвечает: Рудов Антон]: 1 сп: Посмотри стандартный пример Delphi\Demos\Swat\swat.dpr. Может подойдёт, я в него не вникал :) 2 сп (самый лёгкий): Screen.Cursor:=crHourGlass;

35. (Загрузка базы данных из каталога программы). [Отвечает: Андрей Лучников]: Конечно можно. Простейший пример (написан навскидку, потому возможны варианты):
{ Таблицы хранятся в подкаталоге Data программы. }
procedure TDataModule1.
var MyDir :String; i :Integer;
Begin
// Получим путь к своей программе
MyDir:=ExtractFilePath(Application.ExeName);
// Установим для всех TTable путь к таблицам
For i:=0 to ComponentCount-1 do // пробежаться по всем компонентам, принадлежащем DataModule1
if Components[i] is TTable then // Если Компонент - TTable,
TTable(Components[i]).DatabaseName:=MyDir+'\Data'; // то установим ему значение
//DatabaseName так, как нам нужно
End;

[Отвечает: Feniks]: Можно. В свойстве DatabaseName надо указывать имя Алиаса, который создается в BDE Administrator. Если ты не хочешь его юзать, тогда можно в это свойство указать явный путь к папке, где лежат твои таблицы, но путь должен быть полный. Если вообще ничего не указывать, тогда будет браться текущий путь откуда была запущена прога. Это все описано в хелпе.

[Отвечает: Igor]: Да, можно, сам давно использую. Например, вот так:

//FileName - полное имя базы данных(наприм. 'C:\Database\Price.dbf').
Table1.DatabaseName := ExtractFileDir(FileName);
Table1.TableName := ExtractFileName(FileName);
Table1.Active := True; //обязательно!

[Отвечает: Звягинцев Павел]: Ну это смотря с какими ты базами работаешь. Если DBF и ее родственники, то пожалуйста. Получится нечто типа Procedure Form1.Create(.....); begin Table1.DataBaseName:=ExtractFileDir(ParamStr(0)); end; а если серьезно, то уж лучше полный путь прописывать именно в Table1.TableName.

39. (Загрузка текста DOS в элементы управления). [Отвечает: Андрей Лучников]: Отвечу на второй вопрос: Для ковертации Dos-Win и обратно нужно использовать процедуры AnsiToOem, OemToAnsy Для удобства же я написал на их основе свои функции {Пример для AnsiToOem, для OemToAnsi аналогично}

Function AnsiToOemS(s:string):string;
var p:PChar;
Begin
GetMem(p,Length(s)+1); // выделим память для PChar
p:=StrPCopy(p,s); // перенесем строку в PChar
AnsiToOem(p,p); // конвертнем
Result:=StrPas(p); // Вернем строку уже в новом виде
FreeMem(p,Length(s)+1); // Освободим память
end;

{ PS 1. Есть небольшой глюк (с причиной не разбирался): если строка > 2Mб она обрезается
2. Если в строке присутсвует нулевой символ (#0), то строка будет обрезана по нему }

[Отвечает: Иванов Сергей]: Ответ на второй вопрос. tmp_string:=oemtoansi(t1,t2); - переводит из ДОС-текста (t1) в Win-текст (t2). где: tmp_string:string (не используется никак); t1,t2:string.

[Отвечает: Igor]: 2. Для текста вам подойдет и обычный компонент Memo. Используйте функции переконвертации с кодировки Windows в кодировку DOS и обратно. Например, так:

//переконвертация с кодировки DOS в Windows:
OemToAnsi(PChar(TextInDOS), PChar(TextInWin));
Memo1.Text := TextInWin;
//переконвертация с кодировки Windows в DOS:
TextInWin := Memo1.Text;
AnsiToOem(PChar(TextInWin), PChar(TextInDOS));

Или их аналоги соответственно OemToChar и CharToOem.

[Отвечает: Звягинцев Павел]: Ну самый простой вариант - использовать шрифт Terminal, более красивый - поставить в систему шрифт с поддержкой не вин-кодировки, а досовской. Уж больно терминал некрасивый.

[Отвечает: Садовников Владимир]: обственно говоря, в системе есть функции CharToOEM, OEMToChar, OEMToCharBuff, CharToOEMBuff - для преобразования кодировок из DOS в Windows и обратно. Можно такую программку смастерить (по преобразованию OEM в ANSI):

procedure TForm1.Button1Click(Sender: TObject);
var
I:Integer;
S:string;
begin
if OpenDialog1.Execute then
begin
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
if (Memo1.Lines.Count>0) then
for I:=0 to Memo1.Lines.Count-1 do
begin
S:=Memo1.Lines.Strings[I];
OEMToChar(PChar(@S[1]),PChar(@S[1]));
Memo1.Lines.Strings[I]:=S;
end;
end;
end;
//От ведущего: очень хорошая идея, - написать программу преобразования DOS кодировок в Windows и наоборот. Открываем внутренний конкурс. Если кто-нибудь хочет этим заняться (особенно новички - начинайте учиться программировать), - пожалуйста! Напишите такую программу и присылайте её на наш ящик (Delphi-FAQ@list.ru). Примечание: присылать следует только исходники (файлы: *.pas, *.dfm, *.dcr, *.res), без exe-файла. Сторонние компоненты использовать запрещено. Таким образом, наша рассылка будет очень полезна новичкам - теперь мы будем периодически писать какие-то небольшие программы вместе :)

[Отвечает: Рудов Антон]: 2. Как я понял тебе надо перекодировать из DOS в Windows. Для этого есть WinAPI функция OemToChar. А вот решение твоей задачи:

procedure TForm1.Button1Click(Sender: TObject);
Var
F:TextFile;
s1:String;
s2:PAnsiChar;
begin
AssignFile(F,'1.txt');
Reset(F);
while not eof(F) do
begin
Readln(F,s1);
s2:=Pchar(s1);
OemToChar(s2,s2);
Form1.Memo1.Lines.Add(string(s2));
end;
CloseFile(F);
end;

34. (Озвучивание текста). [Отвечает: Иванов Сергей]: Эх, вспомнил студенчество :) Писал курсовую на ту же тему. Сдавать уже завтра, а ничего нет. Так я просто все буквы через микрофон озвучил, плюс согласные с мягким знаком (тут можно напридумывать). Затем просто делим фразу на участки и проигрываем каждый звуковой файл. Сделал за ночь. Хотя все это тупо и неправильно.
//От ведущего: интересно было бы послушать, как всё это будет "говориться". Синтезированные компьютерные голоса содержат записи не отдельных букв, а фонем.

[Отвечает: Feniks]: Для этого надо использовать ActiveX компоненты от Microsoft. Заходишь на сайт http://www.microsoft.com/msagent там ищешь и скачиваешь себе Агента 2.0, Движок речи, Преобразователь Речи и другие примочки и тулзы. Все ставишь и у тебя появляются ActiveX компоненты MSAgent 2.0 и для речи что-то вроде Microsoft Speach ..... (точные имена сказать не могу, т.к. они у меня не стоят). Далее запускаешь Делфи, выбираешь меню Component->Import ActiveX Control... Выбираешь их из списка и жмешь Install и у тебя на палитре вкладок они появляются. Теперь бери и юзай. НО НЕ ЗАБУДЬ, что бы твоя прога "умела говорить" на других компах используя эти библиотеки, они так же должны быть там установлены.

[Отвечает: Звягинцев Павел]: Посмотри библиотеку MMTools, а если точнее то Swiftsoft Multimedia Tools for Delphi. Эта библиотека содержит кучку компонентов для работы со звуком, правда примеры качать нужно отдельно, да оно того стоит. Там тебе и WinAmp в виде примера, и ревербератор и многое другое...

34. [Отвечает: Рудов Антон]: А вот ответ на вопрос (взято с Delphi World):
Как научить приложение Delphi разговаривать. Автор: Alec Bergamini.

11-го августа 2001 Microsoft объявила о выпуске SAPI 5.1 SDK. Данный продукт можно использовать в любом языке, который поддерживает OLE автоматизацию.

В данной статье я постараюсь раасказать, как установить SAPI 5.1 SDK. Затем мы посмотрим, как использовать SDK в приложении Delphi для преобразования текста в синтезированную речь. Синтезированная речь будет проигрываться через спикер. Всё это тестировалось в Delphi 5 и 6.

Чтобы скачать SAPI 5.1, необходимо зайти на сайт Microsoft?s Speech.net Technologies по адресу http://www.microsoft.com/speech/ и кликнуть по ссылке download. Далее будет предложено прочитать комментарии к данному продукту. Если в Вашей системе, язык по умолчанию отличается от US English, то настоятельно рекомендую прочитать эти комментарии до конца.

Если Вы используете beta версию операционной системы XP, то у Вас могут возникнуть некоторые проблемы. Проблемы связаны с тем, что большинство beta версий XP включают в себя ранние версии SAPI 5.1. Поэтому не пытайтесь инсталировать release версию SAPI 5.1 на XP, она не будет работать.

После того как Вы прочитаете комментарии, то приступайте к скачиванию Speech SDK 5.1. Всё что для этого потребуется, это нажать на ссылку Speech SDK 5.1 (68 MB). В архиве содержится сам SDK, докумантация, а так же текты на английском для примера.

Итак, после скачивания SAPI 5.1 SDK, запустите speechsdk51.exe для установки его на Ваш компьютер.

Теперь надо дать знать Delphi о новых объектах автоматизации SAPI. Для этого запустите Delphi 5 или 6 (Я не пробовал более ранние версии) и откройте Project | Import Type Library. В диалоге Import Type Library выберите ?Microsoft Speech Object Library (Version 5.1)?. Если Вы не нашли его в списке, значит во время инсталяции SAPI 5.1 произошли какие-то ошибки.

Delphi предложит поместить компоненты SAPI на станицу ActiveX. Я рекомендую разместить их в новой странице под названием ?SAPI 5?, так как количество компонент довольно большое (19). Так же рекомендую Вам выбрать ?Unit dir name? отличающуюся от той, которая предлагается по умолчанию. Убедитесь, что на ?Generate Component Wrapper? стоит галочка и нажмите кнопку "Install"

В диалоге Install выберите закладку ?Into new package? и в поле ?File name:? введите имя пакета наподобие ?SAPI5.dpk?, нажмите кнопку "Обзор..." (browse) и убедитесь, что dpk создан в той же директории, в которой были созданы компоненты. В диалоге Install в поле Description задайте какое-нибудь описание, например ?SAPI 5 automation components?. Нажмите OK

В подтверждающем диалоге нажмите yes. После этого новые компоненты будут установлены.

Теперь, если Вы посмотрите в директорию, которую указали для установки компонент, то обнаружите там файл SpeechLib_TLB.pas (и dcr) который содержит весь код компоненты (интерфайс, константы, типы, а так же другую полезную информацию). Эта директория так же содержит (если Вы следовали вышеприведённым инструкциям) SAPI5.dpk который является исходинком пакета.

А теперь самая интересная часть.

Давайте создадим приложение, которое будет синтезировать речь. В Delphi создайте новое приложение и поместите на форму кнопку. На странице компонент SAPI5 найдите SpVoice и перетащите его на форму.

Теперь создайте событие onClick для Вашей кнопки, которое должно выглядеть примерно так:

procedure TForm1.Button1Click(Sender: TObject);
begin
SpVoice1.Speak('Hello world!', SVSFDefault);
end;

Запустите программу и нажмите кнопку. Здорово?

Метод Speak объекта SPVoice предоставляет довольно большие возможности. Эти возможности можно использовать если поиграться со вторым параметром. В вышеприведённом примере я использовал режим поумолчанию, который позволяет функции вернуть управление только после завершения проигрывания звука. Избежать этого можно путём внедрения в текст специальных тэгов XML.

Документация по SDK содержит файл sapi.chm который можно найти в директории \Program Files\Microsoft Speech SDK 5.1\Docs\Help .

Sapi.chm содержит довольно много информации. Вот основные, часто используемые возможности компоненты и, соответствующие им флаги, которые передаются во втором параметре:

Воспроизведение текста находящегося в файле. (SVSFIsFilename) Асинхронный решим проигрывания звука. Позволяет функции вернуть управление немедленно, во время воспроизведения. (SVSFlagsAsync) Позволяет управлять воспроизведением через XML тэги (см. раздел под название ?XML TTS Tutorial?). Тэги позволяют настроить тональность звучания, скорость воспроизведения и многое другое.( SVSFIsXML) Одна из интересных вещей (не документирована) заключается в том, что можно озвучивать заголовок веб страницы путём установки флага в SVSFIsFilenam а имени файла в URL. Если Вы соединены с интернетом, попробуйте запустить следующую строчку:

SpVoice1.Speak('http://www.o2a.com', SVSFIsFilename);

Так же при помощи этого флага можно проигрывать wav файлы:

SpVoice1.Speak('C:\WINNT\MEDIA\Windows Logon Sound.wav',
SVSFIsFilename);

На самом деле у этой SAPI намного больше возможностей, чем я здесь привёл. В следующий раз, мы подробнее рассмотрим другие возможности.

34. [Отвечает: DENCH-RUS]: Можно воспользоваться инструментарием от Microsoft под названием SAPI 5.1 SDK. Доступна для скачивания вот здесь: http://www.microsoft.com/speech/ А это пряма ссылка на дистрибутив(68 MB): http://download.microsoft.com/download/speechSDK/SDK/5.1/WXP/EN-US/speechsdk51.exe Установив библиотеку, необходимо установить ее в IDE Delphi: 1. Откройте Project->Import Type Library. 2. В диалоге Import Type Library выберите "Microsoft Speech Object Libbrary (Version 5.1)" 3. Delphi предложит поместить компоненты SAPI на станицу ActiveX, но лучше и удобнее поместить их на новой странице. Еще неплохо было бы изменить "Unit dir name". Поставьте на “Generate Component Wrapper” галочку (если она не стоит), и нажмите кнопку "Install" 4. В диалоге Install выберите закладку “Into new package” и в поле “File name:” введите имя пакета типа “Voice.dpk”, нажмите кнопку "Обзор..." (browse) и убедитесь, что dpk создан в той же директории, в которой были созданы компоненты. В диалоге Install в поле Description задайте какое-нибудь описание, например “Voice components”, хотя и необязательно. Нажмите OK Теперь можно поэкспериментировать. Возьмите на странице Voice компонент SPVoice. Положите ее на форму и заодно прихватите кнопку. Для кнопки создайте событие: procedure TForm1.Button1Click(Sender: TObject); begin SpVoice1.Speak('Hello world!', SVSFDefault); end; Документация по SDK содержит файл sapi.chm который можно найти в директории \Program Files\Microsoft Speech SDK 5.1\Docs\Help, или где она там у вас лежит У этих компонент огромное количество возможностей. С их помощью можно озвучить файл, страницу HTML, проиграть файл wav... Почитайте SDK, там все есть.

32. (Вывод времени в строке состояния). [Отвечает: Feniks]: Правильно. Таймер нужен по любому, что бы через какой-то промежуток времени (например, 1 сек.) брать из системы текущее время. Вместо TTimer можно напрямую использовать API-функции таймера: - SetTimer - установка и запуск таймера. Когда он сработает, Винда отправляет сообщение WM_TIMER. - KillTimer - удаление таймера. - WM_TIMER - ловишь и обрабатываешь это сообщение. Например, берешь время и показываешь его в статусбаре. Эти АПИшки описаны в хелпе.

38. (Создание отчёта). [Отвечает: Звягинцев Павел]: Слишком мало информации. По идее при создании такого отчета нужно 1. иметь мастер-таблицу 2. иметь подчиненную таблицу, индексированную по ключевому полю 3. подчиненная таблица должна быть подключена к мастеру (связка master table, master field, index,..) ну а дальше шамансво чистейшей воды какой генератор отчетов ты пользуешь? если FastReport, FreeReport то цепляешь на свою конструкцию отчет и все работает. Вот со стандартным QuickReport я до сих пор недопонимаю следующее: иногда(часто) он соглашается "кто дома хозяин" и работает с такой структурой, а иногда даже при неиндексированной подчиненной таблице и соответственно не подключенной к мастеру работает нормально (получается сам создает эти связи на время отчета?),а изредка - как хочет.

Быстрые ответы

-2. Здравствуйте! Подписался недавно на Вашу рассылку. Если не по правилам пишу - прошу извинить. Очень рад, что появился раздел "Быстрые ответы". Мне нужна помощь. Когдато я программировал на Паскале, сейчас опять пришлось вернуться к программированию. Выбрал Delphi, но я его не знаю. Поэтому прошу извинить за элементарные вопросы. Итак: Создал главную форму, в которой отрисовывается "внешний вид" программы, создано главное меню. Как лучше организовать "рабочее место" для работы каждого пункта меню (должна появляться форма для ввода информации с последующей записью в таблицу БД)? Создавать новую форму (при создании новой формы у меня появляется новый проект, это нормально?) или каким-то образом создавать окно, которое потом будет закрываться при переходе к другому пункту меню? Спасибо. С наступающим!

[Отвечает: Администратор]: Сказать, что вы пишете "не по правилам" - можно частично. И повторю ещё раз для всех читателей: письма с вопросами должны иметь тему 'Question'. Довольно часто вы меняете тему письма и пишете "Вопрос". Работа нашей системы постепенно переходит на автоматизацию и письма с темой не 'Question' как вопросы распознаваться не будут. Они будут просто отсеиваться. Так что будьте внимательны. Насчёт самого вопроса - вопрос также несколько странный... Что вы хотите лично от меня? ;) Чтобы я вам сделал юзабилити? Программа не моя, а ваша. Насчёт создания нового проекта после добавления новой формы - наверное, глюк системы. Сносите свою Delphi и заново её ставьте. Ну вот, опять ушёл от темы... Если я правильно понял назначение программы, то рекомендую сделать следующим образом. Делаете окошко программы не очень большим (в смысле - не на весь экран, без кнопки "Развернуть") - окошко средних размеров. Меню, естественно, делаете сверху, как полагается. Снизу можете поставить статус-бар (строку состояния). А всё основное пространство отведите под вывод самой БД, например, в виде таблицы. Насчёт формы для добавления даных в БД - сделайте отдельную форму, где всё вводится. На мой взгляд, это интерфейс простейшей категории. Удачи!


Вы также можете ответить на предыдущие вопросы. Поскольку на них уже ответили как минимум раз, они больше не публикуются в рассылке. Но если вы можете что-то добавить к ответам других, пожалуйста, отвечайте - ответы будут опубликованы. Найти предыдущие вопросы вы можете на нашем сайте: http://www.delphi-faq.fatal.ru/.


Статья по Delphi.

Написание инсталлятора на Delphi (Часть 6).

Системный реестр

Системый реестр — это древовидная структура данных, в который вы можете хранить настройки своей программы. Помимо вас, в реестр складывают данные другие программы, в том числе и операционная система.

Реестр является не только важным этапом во время инсталляции, но и прекрасным источником самой различной информации, поэтому остановимся на нём подробнее.

Итак, реестр состоит из нескольких крупных деревьев, каждое из которых имеет уникальное название. Нас будут интересовать только два из них: HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE.

Дерево HKEY_LOCAL_MACHINE (часто сокращаемое до HKLM) может содержать настройки программы для текущей машины безотносительно к тому, кто за ней работает. В Windows NT пользователи, не обладающие правами администратора, не могут записывать данные в это дерево. Из этого следует один простой вывод — если программа имеет общепользовательские настройки, то устанавливать её на компьютер (и изменять эти настройки впоследствии) может только администратор.

HKEY_CURRENT_USER (HKCU) содержит настройки программы для текущего пользователя. Это дерево для каждого пользователя компьютера своё. Оно может храниться не только на локальной машине, но и на сервере, что позволяет пользователю на каждом компьютере сети иметь одни и те же настройки (обои, клавиши переключения раскладки и др.).

Для того, чтобы просматривать и редактировать реестр, вы можете запустить редактор реестра (эта программа, как и следовало ожидать, называется regedit.exe :) Если вы часто работаете с реестром, её лучше всего вынести в меню "Программы".

Деревья реестра состоят из разделов (keys, в редакторе реестра они выглядят, как папки). У каждого раздела могут пыть различные параметры (values). По крайней мере один параметр есть у каждого раздела — в редакторе реестра он называется "(По умолчанию)" (в английской версии, естественно, "(Default)").

Как работать с реестром, вы можете прочитать в документации (ключевое слово TRegistry). Я же всего лишь отмечу, что выбрать дерево вы можете, используя свойство RootKey; для чтения/записи данных, вам потребуется открыть раздел (метод OpenKey); чтобы данные сохранились, не забудьте раздел закрыть (метод CloseKey). Название параметра по умолчанию — пустая строка.

В Windows регламентированы правила записи параметров программы в реестр. Вы, конечно, можете помещать данные куда угодно, однако, знать эти правила вам не помешает.

В соответствии с правилами, параметры программы должны находиться в \Software\<Название фирмы>\<Название программы>\<Версия> Реальное же расположение поддерева вашей программы зависит только от вас. Если вам не требуется навороченной схемы работы с версиями, вы можете отказаться от <Версии>. Если у вас нет собственной фирмы :), можно отказаться и от <Названия фирмы> (но документация жутко не рекомендует этого делать). Например, программы RAR и FAR Евгения Рошала прописывают свои параметры в ветках HKCU\Software\WinRAR и HKCU\Software\FAR.

В реестре хранится куча полезной информации. Ниже я немного расскажу вам об этом, но прежде хочу заметить, что большая часть данных Windows находится в ветках HKLM\Software\Microsoft\Windows\CurrentVersion и HKCU\Software\Microsoft\Windows\CurrentVersion , поэтому в дальнейшем, в целях сокращения, вместо Software\Microsoft\Windows\CurrentVersion будем просто ставить три точки.

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

Нам потребуется раздел HKCU\...\Explorer\Shell Folders (обратите внимание, что Shell Folders пишется через пробел). Этот раздел содержит такие параметры (и не только их):

Desktop Рабочий стол (папка).
Favorites Избранное (папка).
Personal Мои документы (папка).
Programs Меню Программы (папка).
Start Menu Меню кнопки Пуск (папка).
Startup Меню Автозагрузка (папка).
Templates Шаблоны документов (папка).

Обычно, в эти каталоги помещаются не сами файлы, а ссылки на них (о ссылках мы поговорим чуть позже).

В NT существует ещё несколько папок, которые связаны с "меню для всех". Раздел, где их можно найти, практически такой же: HKLM\...\Explorer\Shell Folders (заметьте, что теперь он принадлежит ветке HKLM, а не HKCU).

Common Desktop Рабочий стол (папка).
Common Programs Меню Программы (папка).
Common Start Menu Меню кнопки Пуск (папка).
Common Startup Меню Автозагрузка (папка).

Обратите внимание на наличие пробела после слова Common.

Если вы хотите, чтобы ваша программа деинсталляции появилась в стандартном списке деинсталляторов (Панель управления/Установка и удаление программ/Закладка "Установка/Удаление"), вы можете прописать её в реестре. Создайте в ветке HKLM\...\Uninstall раздел с произвольным именем (чаще всего используют название программы) и добавьте к нему два строковых параметра: DisplayName (то, что будет показано в списке готовых к деинсталляции программ) и UninstallString (командная строка запуска деинсталлятора — можно использовать параметры).

Если вы инсталлируете на компьютер разделяемые файлы (которыми могут пользоваться два или более приложений), пропишите их в HKLM\...\SharedDLLs. Названием параметра служит имя разделяемого файла, а значением (целого типа) — количество ссылок на него. При инсталляции файла вы проверяете, существует ли он в реестре, и если да, просто увеличиваете количество ссылок на единицу. Если разделяемого файла в реестре нет, создайте его, и установите количество ссылок равным единице. При деинсталляции файла уменьшите количество ссылок на 1, и если оно стало равным нулю — удаляйте его.

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

Напоследок рассмотрим ещё несколько интересных разделов реестра. В ветках HKCU\...\Run, HKLM\...\Run, HKLM\...\RunOnce и HKLM\...\RunServiceOnce можно прописывать программы, которые вы хотите запускать при включении компьютера или входе в систему. Названием параметра может служить произвольная строка, а значением (строковым) будет путь к программе, которую вы хотите запустить.

Раздел Run просто запускает указанную программу всякий раз, когда пользователь входит в систему (действует аналогично папке Автозагрузка). Раздел RunOnce работает так же, как и Run, однако после выполнения программы, её параметр из RunOnce удаляется — это приводит к тому, что программа запускается только один раз. Наконец, RunServiceOnce действует точно также, как и RunOnce, но выполняется при включении компьютера, то есть ещё до того, как пользователь вошёл в систему.

Излишне, наверное, говорить, что HKCU\...\Run выполняется только для одного конкретного пользователя, а HKLM\...\Run — для любого пользователя компьютера.

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

Для этого нам придётся исследовать ещё одну ветку реестра — HKEY_CLASSES_ROOT (HKCR).

Примечание:
Эта ветка появилась в реестре самой первой (если углябляться в историю) и служила для хранения данных о COM-объектах (о тех же OLE-серверах, например), доступных системе. Это было ещё в Windows 3.x, то есть очень давно :)
Сейчас в реестре появилось ещё несколько веток, и поэтому HKEY_CLASSES_ROOT потеряла своё привилегированное положение. В связи с тем, что она обслуживает не только типы файлов, но и COM, ситуация с реестром немного запутанная. Мы разберём возможности этой ветки на примере программы WinRAR Евгения Рошала.
[HKEY_CLASSES_ROOT\.rar] @="WinRAR" "Content Type"="application/x-compressed" [HKEY_CLASSES_ROOT\.rar\ShellNew] "Data"=hex:52,61,72,21,1a,07,00,cf,
90,73,00,00,0d,00,00,00,00,00,00,00 [HKEY_CLASSES_ROOT\WinRAR] @="WinRAR archive" [HKEY_CLASSES_ROOT\WinRAR\shell] [HKEY_CLASSES_ROOT\WinRAR\shell\open] [HKEY_CLASSES_ROOT\WinRAR\shell\open\command] @="C:\\Program Files\\WinRAR\\WinRAR.exe \"%1\"" [HKEY_CLASSES_ROOT\WinRAR\DefaultIcon] @="C:\\Program Files\\WinRAR\\WinRAR.exe,0"
Для начала необходимо создать раздел HKCR\.ext (здесь ext — расширение файлов, с которым работает ваша программа). Параметром по умолчанию этого раздела должна быть некая уникальная строка (в нашем примере это WinRAR). Вы можете использовать имя программы, имя программы плюс тип, имя программы и версию, имя своей любимой бабушки, и вообще, любое имя. Далее этот идентификатор я буду называть ExtentionID.

Дополнительный возможный (необязательный) параметр — это Content type.

Необязательный подраздел HKEY_CLASSES_ROOT\.ext\ShellNew используется для того, чтобы пользователь мог создавать в Проводнике файлы вашего типа (правая кнопка мыши/Создать/.).

Следующий раздел — HKCR\ExtentionID. Значением по умолчанию этого раздела будет название файлов данного типа, например, WinRAR archive или Документ Microsoft Word. Это название используется Проводником (в том числе, и в подменю создания файлов). В дальнейшем эту строку я буду называть DocumentName.

Добавьте раздел HKCR\ExtentionID\shell\open\command для того, чтобы пользователь мог открывать файлы вашего типа двойным щелчком. Поскольку такой файл зачастую содержит несколько иконок, в случае необходимости указывайте порядковый номер иконки (нумеруются, начиная с нуля).

И, немного о том, как создаются новые файлы. Выше я написал, что для создания нового файла используется раздел HKEY_CLASSES_ROOT\.ext\ShellNew. В этом разделе может находится один из трёх параметров: FileName, Command и Data. В FileName записывается имя файла, который должен находится в каталоге с шаблонами документов (там лежат пустые файлы зарегестрированных типов) — он будет скопирован в указанный каталог с новым именем DocumentName.ext.

Примечание:
Каталог с шаблонами документов (см. таблицу выше), можно найти в разделах Shell Folders/User Shell Folders, параметр Templates.

Command задаёт имя программы, которая должна вызываться для создания файла. Этой программе может быть передан параметр — имя нового файла (DocumentName.ext).

Если пустой файл указанного типа очень прост, и состоит из нескольких байт, мы можем записать эти байты в реестр, в параметр Data. Проводник создаст новый файл DocumentName.ext, и скопирует эти данные в него.


Для завершения создания инсталлятора вам нужно будет прочитать 3 оставшиеся статьи. Если вы всё делаете так, как описано в статьях, то смело продолжайте, а мы в конце оценим ваш труд! Когда доделаете свой инсталлятор, то пришлёте его нам, а мы оценим ваши труды и прибавим на ваш счёт значительное количество баллов!

Присылайте свои статьи по адресу delphi-faq@list.ru с темой 'Clause' (без кавычек), и они будут опубликованы в ближайших выпусках рассылки. Большая просьба: статью оформляйте в -txt или -doc формате и используйте -zip или -rar сжатие (без самораспаковки).


Кладовая.

Итак, отныне данный раздел будет присутствовать в рассылке. Также он открыт и на сайте. Здесь могут находиться практически любые файлы, тем или иным образом, связанные с Delphi. Это могут компоненты, исходники программ, различные plug-in'ы для Delphi и всё, всё, всё... Если вам есть, что добавить сюда, - пишите, щёлкнув по этой ссылке. Только большая просьба: не присылайте файлы сразу! Итак, что же сегодня новенького?

Компоненты:

CorelButton - кнопка, потомок TButton, но выполненная в более приятном стиле, как в продуктах компании Corel.
[Скачать. Размер: 2.75 Кб, ZIP].

ButtonComps - 5 симпатичных кнопочек с возможностью полного изменения внешнего вида. Очень красивые!
[Скачать. Размер: 17.2 Кб, ZIP].

Исходники программ:

UnPass - Случалось ли у вас, что вы забывали пароль, который вбивали раньше? Что вам мешает его вспомнить? Правильно, звёздочки, которыми он загорожен! Программа позволяет узнать, что скрывается за этими звёздочками, если туда кликнуть с нажатым <Ctrl>.
[Скачать. Размер: 4.39 Кб, ZIP].

 


Друзья.

Здесь представлены ссылки на дружественные сайты нашего портала. Если вы тоже хотите стать нашим другом, разместите баннер на главной странице своего сайта. Подробнее о том, как стать другом, можно прочитать здесь: http://www.delphi-faq.fatal.ru/banner.htm, а узнать о всех наших друзьях - на странице http://www.delphi-faq.fatal.ru/friends.htm

http://www.x-program.narod.ru/ - На нашем сайте Вы найдёте некоторые наши программы. Также мы занимаемся создание ПО для любой версии ОС Windows под заказ.
http://www.basic.webhost.ru/ - Программирование на языках Basic и Visial Basic. На сайте Вы найдете версии Бейсик, игры, вопросы и ответы, статьи, а также многое другое...
http://www.sashook.nm.ru/ - Игры, флешки, обои, компьютерные приколы.
http://infomania2004.webhost.ru/ - Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом.
http://www.dcar.nm.ru - У Вас есть компьютер подключённый к интернет? Тогда у Вас есть всё, чтобы делать деньги прямо сейчас. Создайте свою собственную денежную машину.



Юмор.

Диалог в чате:
ОНО: Вошел в чат.
ОНО: Всем привет!
КТО-ТО: Привет.
ОНО: Дайте IP какого-нибудь лоха?
КТО-ТО: На вот - 127.0.0.1
ОНО: Спасибо! Щас он подохнет!!!
КТО-ТО: Не за что :)
ОНО: Вышел из чата...
[Прислал: DENCH_RUS].

Маленький мальчик пришел на сисопку,
'Linux - фигня!' - крикнул он громко.
Долго пинали мертвое тело,
Никто не вступился - пинали за дело!

Американские программисты очень долго не могли понять, почему их русские коллеги при зависании Windows все время повторяют фразу 'Твой Кролик Написал' (Your Bunny Wrote).

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

В тюремной камере:
- Тебе сколько дали?
- 15 лет.
- А за что?
- Окно разбил.
- Да где ж ты работаешь?
- В Microsoft'е...

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


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

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

Сайт рассылки: http://www.delphi-faq.fatal.ru E-mail: Delphi-FAQ@list.ru Рассылка: http://subscribe.ru/catalog/comp.soft.prog.delphifaq


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

В избранное