Вопрос № 125692: В рамках обучания необходимо было написать программу длярасчета условной энтропии, тоесть вероятность вхождения одного слова после другого. Программу я написал работает нормально но есть два но, вот по ним собственно и вопрос. Первое замечание после ...Вопрос № 125701: Здравствуйте всеми уважаемые эксперты. Прошу помочь в написании SMTP Server, Как можно отправлять с него сообшения. Спасибо....Вопрос
№ 125703: Здравствуйте, уважаемые эксперты! Подскажите, пожалуйста, следующее:
1) Как программно добавить приложение в автозагрузку, при этом именно в MsConfig, т. е. само запущенное в данный момент приложение добавить (желательно, чтобы не требовалось под...Вопрос № 125704: Здравствуйте! Скажите пожалуйста:
1) Как можно прикомпилировать небольшой mp3 файл к приложению и после его использовать?
2) Как сделать на момент воспроизведения трека звук максимальным (программно)?
Заранее благодарен...
Вопрос № 125.692
В рамках обучания необходимо было написать программу длярасчета условной энтропии, тоесть вероятность вхождения одного слова после другого. Программу я написал работает нормально но есть два но, вот по ним собственно и вопрос. Первое замечание после нажатия на кнопку расчет происходит именно сам расчет, он соответствует функци в коде Button2Click, после того как выдается результат расчет появляется ошибка со следующим текстом "Invalid pointer operation", все последующие расчеты происходят нормально
пробовал пошагово проверят ошибка возникает там где написано в коментариях. После закрытия программы возникает ошибка с текстом "Runtime error 217 at 00402734" код всего юнита находится в приложении
В приложении код, работающий без описанных Вами ошибок.
Приложение:
Ответ отправил: Drbear (статус: 8-ой класс)
Ответ отправлен: 02.03.2008, 20:02 Оценка за ответ: 4 Комментарий оценки: Drbear я пробовал на трех компиляяторах Borland Delphi 7, Сode Gear 2007 и BDS2006 на всех трех выдает одну и ту же ошибку. Я создавал приложение не под платформу .net. В каком компиляторе и под какую платформу вы пробовали?
Вопрос № 125.701
Здравствуйте всеми уважаемые эксперты. Прошу помочь в написании SMTP Server, Как можно отправлять с него сообшения. Спасибо.
Отвечает: Genia007
Здравствуйте, Мокроусов Алексей Сергеевич!
Посмотрите статью Использование SMTP Relay Server на сайте Delphi World, пример для Delphi 7 сам не пробовал запускать.
Ответ отправил: Genia007 (статус: 7-ой класс)
Ответ отправлен: 03.03.2008, 13:21 Оценка за ответ: 3 Комментарий оценки:
Вопрос № 125.703
Здравствуйте, уважаемые эксперты! Подскажите, пожалуйста, следующее:
1) Как программно добавить приложение в автозагрузку, при этом именно в MsConfig, т. е. само запущенное в данный момент приложение добавить (желательно, чтобы не требовалось подтверждений со стороны пользователя);
2) Как сделать перезапуск компьютера, типа Halt'а, т. е. чтобы не было вариантов остановки?;
3) Будет ли такое приложение запускаться в безопасном режиме? Если да - то как это исправить?
Спасибо
Отвечает: Николай Владимирович / Н.В.
Здравствуйте, Silent_Control!
По первому вопросу. msconfig из разных мест берет программы. В том числе из ветки реестра HKCU\ Software\ Microsoft\ Windows\ CurrentVersion\ Run. Можно добавить приложение туда.
Ниже пример добавления
Автозагрузка в Delphi (исходники)
Очень часто программы прописывают себя в автозагрузку. Зачем это нужно? Да, в общем-то, цели разные. Иногда бывает нужно, чтобы программа грузилась вместе с операционной системой, например, как электронный органайзер. Или если вы пишите троян или вирус - это тоже может пригодиться. Цели разные и способы тоже. Мы рассмотрим самые популярные способы. В принципе стандартным способом автозагрузки в Windows XP является реестр. Если говорить по конкретней, то ключ HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run.
Именно сюда прописывается большинство программ. Прописать сюда свою программу очень просто, делается это так:
var Reg:TRegistry;
begin
Reg:=TRegIniFile.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('Software',true);
Reg.OpenKey('Microsoft',true);
Reg.OpenKey('Windows',true);
Reg.OpenKey('CurrentVersion',true);
Reg.OpenKey('Run',true);
Reg.WriteString('Здесь пишем что угодно, как правило имя проги',Application.ExeName);
Reg.CloseKey;
Reg.Free;
Код очень простой и не должен вызвать каких-либо трудностей, если вы работали с реестром. Кстати, не забудьте добавить в раздел uses модуль Registry для работы с реестром. Между прочим, необязательно добавлять программу именно в Run, ведь еще есть RunOnce и RunOnceEx . Еще пункт Run присутствует в ключе HKEY_CURRENT_USER . Ну, думаю с реестром все понятно, давайте рассмотрим следующий вариант. Это win.in . Чем он хорош, да тем, что о нем не каждый юзер знает, или знает, но все же не смотрит, а значит туда можно
вбивать свои пакостные программы. Еще одним плюсом win.in является полная совместимость с Windows 9х. А это дополнительное преимущество. Для начала добавьте в uses модуль inifiles, а не то проект просто не откомпилируется. Ну и запишем следующий код:
var Win:TIniFile;
warn:string;
begin
Win:=TIniFile.Create('Win.ini');
Win.ReadString('windows','run',warn);
if warn<>Application.ExeName then
Win.WriteString('windows', 'run',Application.ExeName);
Win.Free;
Теперь я объясню, что здесь происходит. В разделе var мы объявили две переменных Win типа TIniFile и warn типа строка. В первой строке кода (после ключевого слова begin) мы открываем файл. Далее читаем его параметр run. Если наша объявленная строка неравна приложению, то записываем вместо этой строки наше приложение. Освобождаем память. Как видите все очень просто. В принципе, все это, конечно, хорошо. Но как удалить программу из автозагрузки. Здесь просто нужно вместо строки Win.WriteString('windows', 'run',Application.ExeName);
вставить строку удаления автозапуска Win.Delete('windows', 'run',Application.ExeName); Вот исходник удаления из автозапуска:
var Win:TIniFile;
warn:string;
begin Win:=TIniFile.Create('Win.ini');
Win.ReadString('windows','run',warn);
if warn=Application.ExeName then Win.Delete('windows', 'run',Application.ExeName);
Win.Free;
C кодом я думаю все должно быть понятно. Это все, что я хотел рассказать про автозагрузку и, думаю, что вам этого вполне хватит.
Ответ отправил: Николай Владимирович / Н.В. (статус: Профессионал) Россия, Москва WWW:nvsoft.org ICQ: 420720 ---- Ответ отправлен: 02.03.2008, 21:00 Оценка за ответ: 5 Комментарий оценки: Действительно, мне этого вполне хватит! Опять-таки, с работой ini-файлов я знаком))), просто меня интересовал реестр. Все понятно. Большое спасибо! Удачи в постановке новых рекордов портала!
Отвечает: Genia007
Здравствуйте, Silent_Control! 1). Это можно сделать несколькими способами, но наиболее оптимальный - занесение файла в автозапуск реестра, который находится по следующему адресу: HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun
uses Registry;
procedure TForm1.FormCreate(Sender: TObject); var h: TRegistry;{Переменная реестра} begin h := TRegistry.Create; with h do begin RootKey := HKEY_LOCAL_MACHINE; {Перейти на ветку реестра} OpenKey('SoftwareMicrosoftWindowsCurrentVersionRun',
true); {Открыть ключ} WriteString('название программы', 'путь программы'); {Записать значение ключа} CloseKey;{Закрыть ключ} Free; end; end;
2). Из под винды 98 так: ExitWindowsEx(EWX_REBOOT,1), а под WIN NT есть два способа - корректно и некорректно(убивает процессы), предлагаю корректную перезагрузку:
procedure reboot; var hToken: THandle; tkp: _TOKEN_PRIVILEGES; DU
MMY: PTokenPrivileges; DummyRL: Cardinal; begin DUMMY := nil; if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken ) then raise TShutdownEx.Create('OpenProcessToken failed');
if (not LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid)) then raise TShutdownEx.Create('LookupPrivilegeValue failed');
if (GetLastError() <> ERROR_SUCCESS) then raise TShutdownEx.Create('AdjustTokenPrivileges failed');
if (not ExitWindowsEx(EWX_REBOOT, 0)) then raise TShutdownEx.Create('ExitWindowsEx failed'); end;
Ответ отправил: Genia007 (статус: 7-ой класс)
Ответ отправлен: 03.03.2008, 13:22 Оценка за ответ: 5 Комментарий оценки: Большое спасибо!
Все получилось!
Вопрос № 125.704
Здравствуйте! Скажите пожалуйста:
1) Как можно прикомпилировать небольшой mp3 файл к приложению и после его использовать?
2) Как сделать на момент воспроизведения трека звук максимальным (программно)?
Заранее благодарен
Отвечает: Николай Владимирович / Н.В.
Здравствуйте, Silent_Control!
По первому вопросу.
Как добавить в свою программу звук? Но не просто добавить, а сделать так, чтобы он играл не из какого-то файла, а был вшит в exe! И не просто звук, а чтобы это ещё и не сильно увеличивало размер программы!
Вопросы трекерной музыки отложим на потом. Сейчас поговорим об mp3.
Итак, наша задача засунуть mp3 в нашу программу и заставить его воспроизводиться по комманде.
Для этого нам, разумеется, понадобится сам файл.
Для тех кто не знает, как добавить его в ресурсы своей программы:
Создаем текстовый файл с именем sounds.rc
Прописываем в него наши файлы. Каждый файл в ресурсах = 1 строке. Пример содержимого файла:
Первое слово - имя, которое мы будем указывать в программе.
Второе - тип ресурса = wav файл
Третье - имя файла
сохраняем файл.
Компилим его из коммандной строки: brcc32 sounds.rc
В результате получаем откомпиленный файл - sounds.res.
Второй этап:
В программе подключаем этот файл:
{$R sounds.res}
Теперь для воспроизведения звука нужно дать комманду:
PlaySound('SND1', 0, SND_RESOURCE or SND_ASYNC);
, где первым параметром - имя, назначенное нами файлу в файле ресурсов
Предчувствую Ваше справедливое возмущение: "Как же так? Нам обещали mp3!"
Третий этап:
Открываем меню Пуск -> Программы -> стандартные -> Развлечения
Запускаем "Звукозапись". У кого нет, можно доустановить через установку/удаление программ или воспользоваться другой программой подобного рода.
Открываем наш wav файл: Меню -> Файл -> открыть.
Теперь превратим его в mp3: Меню -> Файл -> Свойства
Нажимаем кнопку "Конвертировать".
Выбираем формат MP3 и нужное нам качество воспроизведения.
Сохраняем: Меню -> Файл -> Сохранить.
Все. Теперь внутри нашего wav файлика реально сидит MP3, который без проблем воспроизводится через PlaySound при наличии в системе установленного MP3 кодека. А данный кодек установлен во всех Windows >= 2000 по умолчанию. В более ранние как правило попадает вместе с другими программами или наборами кодеков.
Ответ отправил: Николай Владимирович / Н.В. (статус: Профессионал) Россия, Москва WWW:nvsoft.org ICQ: 420720 ---- Ответ отправлен: 02.03.2008, 20:44 Оценка за ответ: 5 Комментарий оценки: Спасибо! Кстати, про прикомпилирование к *.res файлу алгоритм мне известен, но я не думал, что после указания его в программе и компилирования самого exeшника, больше держать в папке его не надо! Большое спасибо!
Отвечает: Genia007
Здравствуйте, Silent_Control!
1). Если mp3 файл небольшой его лучше переконвертировать в wav файл скомпилировать компилятором дэлфи в необходимый
ресурс и прогиграть его когда надо функцией PlaySound('название ресурса', HInstance, SND_RESOURCE or SND_ASYNC);
uses mmsystem;
Для построения проекта вам понадобиться:
Создайте звуковой файл с именем 'hello.wav' в каталоге проекта.
Создайте текстовый файл с именем 'snddata.rc' в каталоге проекта.
Добавьте следующую строку к файлу 'snddata.rc': HELLO WAVE hello.wav
В dos-сессии перейдите в ваш каталог приложения и скомпилируйте .rc-файл, используя компилятор ресурсов Borland (brcc32.exe): введите путь к brcc32.exe и передайте 'snddata.rc' в качестве параметра.
Пример:
binrcc32 snddata.rc
Это создаст файл 'snddata.res', который Delphi слинкует с EXE-файлом вашего приложения.
implementation
{$R snddata.res}
Ответ отправил: Genia007 (статус: 7-ой класс)
Ответ отправлен: 03.03.2008, 13:23 Оценка за ответ: 4 Комментарий оценки: Мне кажется, что этот ответ я уже получал)))