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

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

  Все выпуски  

Программирование на DELPHI v3-7


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

ПРОГРАМИРОВАНИЕ НА DELPHI v1-7  Кол-во подписчиков: 5400+

  САЙТ/АРХИВ РАССЫЛКИ ::  НАШИ OFFLINE-ЖУРНАЛЫ   :: ФОРУМ

Привет вам, дельфяне!

Объявление от GoldFAQ.ru :

Экстренное сообщение для всех дельфийцев

Так как на данный момент большая часть посетителей этого сайта относится к любителям Delphi, то мы хотим их сказочно обрадовать! Так как недавно один очень хороший человек дал нам архив всяких статей, всего их где-то... ну около 2500 :0 Конечно мы не сможем выложить всё это чудо за один день, но в период с 16 по 27 февраля 2004 года мы постараемся выкласть их все! Так что оставайтесь с нами, не пожалеете...

В этом выпуске:

1)Простой способ организации системы сообщений о событиях...-->
2)Ответы-->
3)Вопросы-->

СТАТЬИ 

Простой способ организации системы сообщений о событиях происходящих в вверенной под вашу опеку компьютерной системе.
Автор: UNLX
Сайт автора: www.gala.net
Добавлена: 4.02.04

Смотря, очередной фантастический боевик, в котором ?умная? система управления приятным женским или мужским голосом сообщает герою, что если он не выполнит какие-то важные действия то дальше ему (ей) придется передвигаться без удобств на своих двоих или вообще дожидаться завершения фильма в виде беспорядочной горстки атомов.
Вы не раз задумывались вот бы сделать себе подобную сообщалку о всяческих опасных ситуациях возникающих в вереной Вам компьютерной системе или сети и предоставить начальству убедительные доказательства что средства потраченные на колонки и звуковые карты используются не только для развлечения.

Выполним не большую постановку задачи наметив шаги , которые мы должны реализовать для достижения поставленной цели:
1) организовать проверку критических для нашей системы событий;
2) создание и воспроизведение голосовых сообщений о них;
3) не очень перетрудится при реализации.

События, которые можно проверять ограничиваются исключительно Вашей фантазией.
Можно организовать каждые 5 минут с 9:00 до 18:00 c перерывом на обед посылку сигнала PING на конечные компьютеры сети и если не получен ответ поднимать тревогу.
Каждые пол часа проверять количество свободного места на HDD.
Наличие одновременно включенного (и при этом работающего) комплекта аппаратных средств (сервера, мосты, печатающие устройства). Или организовать на компьютере шефа проверку базы данных с информацией о заработной плате, если она не увеличилась в течении месяца на оговоренное заранее число ?президентов? сообщать шефу, мнение о нем как о руководителе и о фирме в целом.

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

procedure TForm1.Button1Click(Sender: TObject);
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Не показываем:}
IF (Wnd <> Application.Handle) AND {-Собственное окно}
IsWindowVisible(Wnd) AND {-Невидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0){-Окна без
заголовков}
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
ListBox1.Items.Add(StrPas(buff));
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
ListBox1.ItemIndex := 0;
end;

Еще несколько лет назад наличие звуковой карты в конфигурации считалось вершиной компьютеризации и взвинчивало цену до небес.
В данный момент практически у каждого уважающего себя производителя компьютерного железа в стандартной конфигурации присутствует звуковая карта, мне уже несколько раз попадались конфигурации, в которых производитель не упоминает о наличии звуковой карты как почти не упоминаются стандартные порты LPT1 и COM1 они должны быть и точка.

Поскольку до сих пор звуковая карта наиболее часто использовалась исключительно для воспроизведения audio CD и МР3 файлов, то дополнительно из техники нужно будет приобрести или отдолжить микрофон.

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

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

Естественно никто не запрещает Вам написать эту часть кода программы, самим, увеличивая размер исполнительного модуля, но думаю программисты фирмы MICROSOFT справились с этой задачей лучше .

Для воспроизведения WAV файлов используем описанную почти во всех солидных учебниках по программированию на DELPHI функцию WIN API
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);, или
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
полные описания которих находится в файле WIN32S.HLP

Откроем новый проект для уменьшения размера уничтожим в файле проекта код, отвечающий за создание окна
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;

Удаление этого кода даст нам дополнительный эффект активное окно не будет терять фокус при воспроизведении звукового сообщения.
В качестве примера проверим наличие файлов в указанной папке при помощи простого кода

rez:=FindFirst(?c:/*.*?, faAnyFile-16, SearchRec);
FindClose(SearchRec);
IF rez:=0 then
{--Возпроизведение звука---}
sndplaysound(pchar(?mysound.wav?),SND_SYNC);

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

Поскольку в программирование, все-таки скорее искусство, то в большинстве задач
существует альтернативные пути. Рассмотрим один из них, описать события, которым можно присвоить звуки в реестре WINDOWS. вызывая их потом из программы. Но для этого нужно иметь познания в структуре реестра и WIN API.
Как выполнить официально регистрацию событий которым присвоены звуки мне не удалось выяснить, возможно в глубинах WIN API обитает соответствующая функция.
а вот взглянул в регистр:

HKEY_CURRENT_USER\AppEvents\EventLabels\*
- перечисление: название (без пробелов) - заголовок

HKEY_CURRENT_USER\AppEvents\Schemes\Apps\*
перечисление групп
HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default - это Windows
HKEY_CURRENT_USER\AppEvents\Schemes\Apps\[название группы(без пробелов)]\*
перечисление сообщений в группе
HKEY_CURRENT_USER\AppEvents\Schemes\Apps\[название группы]\[название сообщения]\*
перечисление схем в которых назначено сообщение
или [.Current], обычно есть стандартные схемы [.Default] и [.None]

HKEY_CURRENT_USER\AppEvents\Schemes\Names\*
перечисление : название схемы - заголовок

термины :
название - текст без пробелов латиницей(наверное)
заголовок - любой текст, используется для отображения
перечисление (*) - список ключей
сообщение - Event

Займемся этим прямо сейчас, для чего придется
слегка поворошить, конечно же, реестр, сделав предварительно (на всякий
пожарный...) его копию (файлы SYSTEM.DAT и USER.DAT). После этого, с помощью Run из стартового меню можно смело запускать REGEDIT.
Оказавшись внутри этого архиважного компонента Windows, направляйтесь в
HKEY_CURRENT_USER\AppEvents\Schemes\Apps. Здесь щелкните правой кнопкой мышки на ключе Apps и выберите New, Key. Назовите только что созданный ключ по имени eхe-файла (без расширения и пути к нему), которому Вы решили присвоить "личные" звуки. Оставив
новоиспеченный ключ текущим, перейдите в правую панель и, щелкнув правой кнопкой
мыши по Default, выберите Modify. В строке Value data наберите текст, который
будет появляться в диалоге Sounds Properties. Теперь самое время добавить
события, на которые можно будет "повесить" звук. Для этого сделайте правый click
мышкой на Вашем ключе в левой панели и выберите New, Key. Этот ключ нужно
назвать именем из следующего списка:

из приведенного списка можно создать несколько, в соответствии с событиями, на
которые Вы желаете "прицепить" звук в избранном приложении. Все? Тогда
закрывайте REGEDIT и открывайте диалог Sounds Properties из панели управления
(иконка Sounds). Нашли свою писанину? Ну а уж звуки навешать - дело несложное.
Вроде все.

Простой пример программы анализа наличия файлов в папке.

program sexsot;
uses
Forms,Windows,SysUtils,MMsystem,inifiles,classes,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}
var REZ,i:integer;
erasefolder:Tstringlist;
inifilefolder:tinifile;
strpath,strmax,strcount,strsound:string;
SearchRec: TSearchRec;
begin
if FileExists(paramstr(1)) then
begin
erasefolder:=Tstringlist.create;

inifilefolder:=Tinifile.create(extractfilepath(paramstr(0))+paramstr(1));
inifilefolder.readsections(erasefolder);
for i:=0 to erasefolder.count-1 do
begin
strpath:=inifilefolder.readstring(erasefolder[i],'Pathlook','C:\*.*');
strmax:=inifilefolder.readstring(erasefolder[i],'maxcount','1');
strcount:=inifilefolder.readstring(erasefolder[i],'count','0');
strsound:=inifilefolder.readstring(erasefolder[i],'filesound','1.wav');

{---- Проверка наличия файлов------}
rez:=0;
rez:=FindFirst(strpath, faAnyFile-16, SearchRec);
FindClose(SearchRec);
{---------------------------------------------}
if rez=0 then
begin
inifilefolder.writestring(erasefolder[i],'count',inttostr(strtoint(strcount)+1));
end
else
begin
inifilefolder.writestring(erasefolder[i],'count','0');
end;
strcount:=inifilefolder.readstring(erasefolder[i],'count','0');
if strtoint(strcount)>=strtoint(strmax) then
{--Возпроизведение звука---}
sndplaysound(pchar(strsound),SND_SYNC);


end;
end;
end.


Структура файла INI

[modem]
PathLOOK=f:\mail\out\*.*
filesound=nosend.wav
maxcount=3
count=0

[email]
PathLOOK=с:\unlx\out\*.*
filesound=atasunlx.wav
maxcount=2
count=0

НОВЫЕ ОТВЕТЫ

Вопрос #31 от Dsmitriy Smirnoff

Привет всем!!!
У меня такая проблема: нужно чтобы программа при запуске определяла БУКВУ
ДИСКА (т.е. если программа запущена с CD-ROM'а, то она, например, выводила
на форму букву CD-привода)на котором она находится. Желательно в String.
Заранее спасибо.
Дмитрий "Упырь" Смирнов

Отвечает Sergey K

//ParamStr(0) - выводит путь и имя файла запущеного приложения (String).
procedure TForm1.Button1Click(Sender: TObject);
var
S:String;
begin
S:=ParamStr(0);
button1.Caption:=S[1];
end;
 

Отвечает Alexey

Можно попробовать так, по крайней мере у меня получилось:

Function GetDiskToChar:string; //ну лучше названия не придумал :) :)
var
str,disk:string;
begin
str:=ExtractFilePath(ParamStr(0));//кстати здесь ещё можно сделать так:
{
str:=ExtractFilePath(Application.ExeName);
потому что где-то читал, что paramStr(0) иногда передаёт нето, что нужно,
но у меня всё ок.
}
disk:=Copy(str,1,1);
{
если хочешь не только одну букву, но и с точками и косой чертой, то копирую больше символов, скажем три вот тогда и будет F:\
************ disk:=Copy(str,1,3); ******************
}
result:=disk;
end;
вот вроде и всё!!!

Отвечает santi@tut.by

s := ParamStr(0);
Edit1.Text := s[1];

Отвечает Золотарёв Сергей

Короче Дмитрий вот тебе такой код:

procedure TFrom1.OnCreate(Sender: TObject);
var BUKVA: String;
begin
BUKVA:=Application.ExeName[1]; //Делай теперь с ней что хочешь!
end;

Вот и всё. Теперь у тебя в переменной BUKVA внутри этой процедуры храниться буква диска, с которого запущена программа.

Отвечает Edward

Вот пример. При запуске выводит в Label букву диска
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:=copy(GetCurrentDir,1,2);
end;

end.

Отвечает Alexandr Belayev

Используй функцию:

function ExtractFileDrive(const FileName: string): string;

Description

ExtractFileDrive returns a string containing the drive portion
of a fully qualified path name for the file passed in the
FileName. For file names with drive letters, the result is in
the form '<drive>'. For file names with a UNC path
the result is in the form '\\<servername>\<sharename>'.
If the given path contains neither style of path prefix, the result is an empty string.

Отвечает p_kolya

Слышь, а ты это... вызывай procedure ExtractFilePath для своего
Application.ExeName а потом отсекай от этого 3 символа сначала( ну или
как там тебе?)... вот так...

Отвечает Sergey Larin

...
Label1.Caption:=Application.ExeName[1];
...

Естественно, модуль, где содержится данный код должен использовать модуль
Forms, а на форме должен присутсвовать TLabel с именем Label1.
 

Отвечает kama

Если нужна просто буква, то делается это легко:

var DriveChar: Char; // или string[1]
begin
DriveChar := ExtractFilePath(ParamStr(0))[1];
end;

А если нужен тип диска, то используй GetDriveType.

Отвечает Александр Козлов

А что, "Application.ExeName" уже не работает?
 

Отвечает Гладков Олег

Посмотри Help по функции ExtractFileDrive.

Отвечает KSTU Webmaster

Function GetDriveChar : char;
var
S : String;
begin
S := ParamStr(0);
Result := S[1];//вот и всё!
end;

Отвечает Алексей Лосев

Все очень просто:
s:=copy(Application.Exename, 1, 3);
В s будет записано 'D:\'.

Отвечает Edward

ExtractFileDrive(application.ExeName)

Отвечает Шпаковский Алексей

ExtractFileDrive(ParamStr(0))
Возвращает букву диска с двоеточием ('C:', 'c:', 'D:', 'd:',..), причём с разным регистром (при запуске из Delphi -
UpCase, из
TotalCommander - LowCase). Правда, в справке по ExtractFileDrive сказано, что для UNC путей результат приобретает вид
\\<servername>
\<sharename>. Может быть, это не самый лучший вариант, но в крайнем случае и он сойдёт.

Отвечает Misha

Чтобы программа при запуске определяла БУКВУ ДИСКА:

var
PathS: String;
DiskCh: Char; // Буква диска, которая тебе нужна
begin
// Определяем диск, где лежит EXE-шник
PathS:= ParamStr(0);
DiskCh:= PathS[1];
Edit1.Text:= DiskCh;
// Определяем текущий диск
GetDir(0, PathS);
DiskCh:= PathS[1];
Edit2.Text:= DiskCh;
end;

Отвечает старый Иван

юзай это:
ExtractFileDrive(ParamStr(0)); //paramstr(0) - путь к файлу


Вопрос #32 от Аппарат акима Иртышского района

Есть такой вопрос.

Как отловить нажатия мыши на заголовке (фиксированные строки StringGrid-а).
Например для вызова сортировки по определенному столбцу, не используя
сторонних компонентов типа StringGrid.
Кто знает пожалуйста напишите
vornik@mail.kz

Отвечает santi@tut.by

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
sss : String;
gd : TGridCoord;
begin
if Button = mbLeft then
begin
gd := StringGrid1.MouseCoord(X, Y);
ShowMessage('X: '+IntToStr(gd.X)+'; Y:'+IntToStr(gd.Y));
//теперь сравнивай, что if gd.X = 0 then .....
end;
end;

Отвечает p_kolya

Знаешь, прописывай нужный тебе код в OnClick нужного компанента,
предварительно проверив координаты... проверяй короче по координатам
этого заголовка... конечно немного тупо ;(

Отвечает Sergey Larin

В обработчике onClick надо определить координаты мыши (с пом. WinAPI), затем
"глобальные" (относительно всего экрана) координаты перевести в "локальные"
(относительно нужного компонента, TStringGrid, например), а затем вычислить
какой ячейке соответсвуют эти координаты и если ячейка фиксированная -
предпринимать нужные действия.

Отвечает kama

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var c, r: integer;
begin
StringGrid1.MouseToCell(X, y, c, r);
if (c = FixedCols-1) and (r = FixedRows-1) then
YourSort();
end;

Отвечает Щеткин А.Г.

Вот те строчка из helpa: Write an OnTitleClick event handler to take specific action when the user clicks in one of the column headers. The Column parameter is the TColumn object that corresponds to the column where the mouse was when the user released the left mouse button.
Я думаю, что дальше ты разберешься....


Вопрос #33 от Alexey

Всем здрасте!!!
Вот неожиданно возник вопрос:
можно ли как-то ставить что-то вроде ловушек на функции!!! из стандартных Windows'ких библиотек (Kernel32.dll,user32.dll ....),
чтобы, например, какая-то программа вызывает функцию SetSecurityObject, ну или любую другую, а моя прога это перехватывает и сначала делает сама что-нибудь :) :) :)
А потом можно и управление передать этой процедуре или не передать.

Отвечает KSTU Webmaster

Можно, только очень сложно.
Нужно будет следующее:
Для Windows NT\2000\XP
1) Иметь права администраторо или
пользователя который имеет право отладки процесса
2) написать резидентный отладчик который
запустит отладку и сделает attach на процесс в котором исполняются
код библиотек вызовы функций из которых нужно контролировать, т.е
работать в одном адресном пространстве с ними.
3) С помощью отладчика запустить отладку
и смотреть что и как вызывается
Для Windows 9х 1-й пункт опускается.


Вопрос #34 от Oleg666

Привет всем! Может быть кто-нибудь знает как работая с компонентом TIdSMTP можно узнать сколько байт вообще идёт на отправку и сколько уже отправлено

Отвечает p_kolya

А исходники то зачем? Ведь для всех этих компонентов есть исходники в
комплекте с Delphi!

Отвечает Шпаковский Алексей

У TIdSMTP есть событие OnWork.
Параметры:
AWorkMode: TWorkMode - режим работы (что делает), может быть wmRead (чтение) или wmWrite (запись)
AWorkCount: Integer - количество байт отправлено/получено


НОВЫЕ ВОПРОСЫ

Напоминаю всем, что свой вопрос вы можете задать по адресу delphi@goldfaq.ru с темой VOPROS

Вопрос #35 от wasilla

Народ, здрасте !
Народ, я занимаюсь базами даных, но я еще учюсь, и следовательно мне надо будет сдавать сесию. У кого есть хорошая обучаловка по сабжу, киньте пожалуйста в мыло, или дайте хороший совет с чего начать.
e_mail:
vasil@dubno.dcagro.com

ОТВЕТИТЬ


Вопрос #36 от Гришин Дмитрий

Всем привет.
Хотелось бы найти набор компонент (кнопки, чекбоксы, радиокнопки, гриды и т.п.), которые бы имели вид, полностью аналогичный виду сооветствующих элементов управления и редактирования в Windows XP. Для примера можно взглянуть на интерфейс программы SnagIt 7.0 (www.snagit.com). Устроит также невизуальный компонент, переопределяющий вид элементов, как например, это делает XP Menu (но это не совсем дизайн ОС WinХР, а, скорее, дизайн MS Office XP).
Заранее огромное спасибо!

ОТВЕТИТЬ


Вопрос #37 от Reno

Привет!
У меня вопрос - как засунуть прогу в System Tray ?

ОТВЕТИТЬ


Вопрос #38 от Буланов Сергей

Привет всем!!!
У меня такой вопрос: где в Internet можно найти хорошее описание Delphi?
Заранее спасибо!
Сергей.

ОТВЕТИТЬ


Вопрос #39 от Alex

Здравствуйте,

Я только начал работать с базами данных в Делфи, и у меня появлилсь такие вопросы.
1. Почему DBGrid при растягивании формы (и соответственно, сетки), не меняет своих размеров? Как их можно тоже менять в зависимости от размеров формы, а то получается очень страшная картина (размер полей не поменялся, а таблица растянулась и стало куча свободного места).
2. Если у меня первое поле с названием ID является AutoIncrement, то оно увеличивается на 1 с добавлением каждой записи (это понятно), но вот если у меня текущая запись, скажем, 15, то после ее удаления и добавления новой записи получатеся такая картина в поле ID: ...,12,13,14,16,... Почему новая запись продолжается под номером 16, а не 15? Это можно исправить?
3. Есть ли лучшие средства для работы с БД (локальной), чем Paradox + DBGrid?

ОТВЕТИТЬ


Вопрос #40 от Золотарёв Сергей

Кто знает как узнать имя процесса по его хендлу?
Т.е. есть у меня переменная типа THandle (к примеру H).
Так вот я вызываю GetModuleFileName(H) - а она возвращает имя модуля
моей проги, хотя хендл к примеру указывает на рабочий стол... Как это
лечить???

ОТВЕТИТЬ


Вопрос #41 от Voronin N.A.

Привет ВСЕМ.
Есть такой вопрос.

Как отловить нажатия мыши на заголовке (фиксированные строки StringGrid-а).
Например для вызова сортировки по определенному столбцу (код сортировки мне
в
принципе не нужен), не используя
сторонних компонентов типа StringGrid.
Кто знает пожалуйста напишите vornik@mail.kz

ОТВЕТИТЬ


Вопрос #42 от Рюриковичи мы

Здравствуйте!

ВОПРОС: Как определить размеры файла/папки?
FileSize работает только с уже открытым файлом.
Можно только через него?

Спасибо.

ОТВЕТИТЬ


Вопрос #43 от santa_k

Привет, дельфисты!!!
Помогите. Не могу разобраться в Rave Raports 5 для Delphi7.
Например, как добавить в DataVewDictionary->DataView новую запись
DataView2FieldName и вообще где можно взть толковую литературу по
этому направлению, а также толковые чаты или форумы. Спасибо.

ОТВЕТИТЬ


Вопрос #44 от Voronin N.A.

Всем привет.
Тут опять вопросец имеется.

Необходимо один столбец StringGrid-a заполнить CheckBox-aми и работать с
ними
как с нормальными объектами (компонентами).
Знаю про StringGrid.Objects[i,j], присваиваю ему (предварительно создав)
какой либо CheckBox но потом не могу с ним ничего делать.
Кто знает как по-человечески работать помогите.

ОТВЕТИТЬ


Ведущий рассылки Angel     Дизайн "LikSoftGroup - Design"  11-ый выпуск



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное