Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизДвадцатка самых популярных вопросов. Найти похожие ветки
← →
Тимохов © (2004-03-29 17:09) [160]
> Игорь Шевченко © (29.03.04 17:01) [158]
как точно человек все определил...
← →
Тимохов © (2004-03-29 17:09) [160]
> Игорь Шевченко © (29.03.04 17:01) [158]
как точно человек все определил...
← →
panov © (2004-03-29 17:14) [161]Удалено модератором
← →
panov © (2004-03-29 17:14) [161]Удалено модератором
← →
panov © (2004-03-29 17:16) [162]6 вопрос.
Как запустить другую программу и дождаться ее окончания.
Пример:
unit ufCreateProcess;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//Функция для создания нового процесса
//Параметры:
// aCommand: Строка для выполнения исполняемого файла(полный путь)
// aShow: Показывать/не показывать окно нового процесса
// aWaitExit: Ожидать/не ожидать завершения процесса
function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
pi:PROCESS_INFORMATION;
si:STARTUPINFO;
cmdLine,Path: String;
begin
Result := False;
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
Path := ExtractFilePath(aCommand);
cmdLine := aCommand;
Result :=
CreateProcess( nil, // No module name (use command line).
PChar(cmdLine), // Command line.
nil, // Process handle not inheritable.
nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
nil, // Use parent"s environment block.
PChar(Path), // Use parent"s starting directory.
si, // Pointer to STARTUPINFO structure.
pi ); // Pointer to PROCESS_INFORMATION structure.
if Result then
begin
if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ExecCmd(ExtractFilePath(ParamStr(0))+"pkzip test.zip",True,False);
end;
end.
← →
panov © (2004-03-29 17:16) [162]6 вопрос.
Как запустить другую программу и дождаться ее окончания.
Пример:
unit ufCreateProcess;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//Функция для создания нового процесса
//Параметры:
// aCommand: Строка для выполнения исполняемого файла(полный путь)
// aShow: Показывать/не показывать окно нового процесса
// aWaitExit: Ожидать/не ожидать завершения процесса
function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
pi:PROCESS_INFORMATION;
si:STARTUPINFO;
cmdLine,Path: String;
begin
Result := False;
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
Path := ExtractFilePath(aCommand);
cmdLine := aCommand;
Result :=
CreateProcess( nil, // No module name (use command line).
PChar(cmdLine), // Command line.
nil, // Process handle not inheritable.
nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
nil, // Use parent"s environment block.
PChar(Path), // Use parent"s starting directory.
si, // Pointer to STARTUPINFO structure.
pi ); // Pointer to PROCESS_INFORMATION structure.
if Result then
begin
if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ExecCmd(ExtractFilePath(ParamStr(0))+"pkzip test.zip",True,False);
end;
end.
← →
stone © (2004-03-29 17:19) [163]
> panov ©
ExtractFileDir
ЗЫ. еще pkzip не работает с длинными именами
← →
stone © (2004-03-29 17:19) [163]
> panov ©
ExtractFileDir
ЗЫ. еще pkzip не работает с длинными именами
← →
stone © (2004-03-29 17:23) [164]сорри не доглядел
← →
stone © (2004-03-29 17:23) [164]сорри не доглядел
← →
zamkom © (2004-03-29 17:30) [165]Игорь Шевченко © (29.03.04 16:37) [153]
Прошу прощения, но если использовать
OemToChar(PChar(S),PChar(S))
не в функции как указано вами а при обработке т.е.
вот так
S:="текст";
OemToChar(PChar(S),PChar(S));
То при выполнении этого кода возникает ошибка.
Предлагаю использовать вот такой код
CharToOem(@Result[1],@Result[1]);
В этом случае даже если писать так
S:="текст";
CharToOem(@S[1],@S[1]);
то никакой ошибки не выскочит и текст благополучно сконвертится.
← →
zamkom © (2004-03-29 17:30) [165]Игорь Шевченко © (29.03.04 16:37) [153]
Прошу прощения, но если использовать
OemToChar(PChar(S),PChar(S))
не в функции как указано вами а при обработке т.е.
вот так
S:="текст";
OemToChar(PChar(S),PChar(S));
То при выполнении этого кода возникает ошибка.
Предлагаю использовать вот такой код
CharToOem(@Result[1],@Result[1]);
В этом случае даже если писать так
S:="текст";
CharToOem(@S[1],@S[1]);
то никакой ошибки не выскочит и текст благополучно сконвертится.
← →
Игорь Шевченко © (2004-03-29 17:41) [166]zamkom © (29.03.04 17:30)
Как объявлена переменная S ? и как установлена опция компилятора $H ?
← →
Игорь Шевченко © (2004-03-29 17:41) [166]zamkom © (29.03.04 17:30)
Как объявлена переменная S ? и как установлена опция компилятора $H ?
← →
Юрий Зотов © (2004-03-29 17:53) [167]CloseHandle(pi.hThread) лучше вызывать ДО WaitForSingleObject, чтобы сразу освободить ненужный системный ресурс.
← →
Юрий Зотов © (2004-03-29 17:53) [167]CloseHandle(pi.hThread) лучше вызывать ДО WaitForSingleObject, чтобы сразу освободить ненужный системный ресурс.
← →
zamkom © (2004-03-29 17:53) [168]Игорь Шевченко © (29.03.04 17:41) [166]
var
S : String;
а насчет компилятора $H так ниче не трогал и не изменял как по умолчанию там все стоит так и не трогал.
← →
zamkom © (2004-03-29 17:53) [168]Игорь Шевченко © (29.03.04 17:41) [166]
var
S : String;
а насчет компилятора $H так ниче не трогал и не изменял как по умолчанию там все стоит так и не трогал.
← →
panov © (2004-03-29 17:54) [169]>Юрий Зотов © (29.03.04 17:53) [167]
CloseHandle(pi.hThread) лучше вызывать ДО WaitForSingleObject, чтобы сразу освободить ненужный системный ресурс.
Не помню, в каком случае, но у меня возникала ошибка, если в таком порядке были написаны операторы(CloseHandle(pi.hThread) до Wait)
← →
panov © (2004-03-29 17:54) [169]>Юрий Зотов © (29.03.04 17:53) [167]
CloseHandle(pi.hThread) лучше вызывать ДО WaitForSingleObject, чтобы сразу освободить ненужный системный ресурс.
Не помню, в каком случае, но у меня возникала ошибка, если в таком порядке были написаны операторы(CloseHandle(pi.hThread) до Wait)
← →
Verg © (2004-03-29 17:55) [170]
> zamkom © (29.03.04 17:30) [165]
> не в функции как указано вами а при обработке т.е.
Ну так, на то там и фунция.
S:="текст";
S:= Win2Dos(S);
Вот и не будет никаких ошибок.
Просто @S[1] и pchar(S) - это две болших разницы.
← →
Verg © (2004-03-29 17:55) [170]
> zamkom © (29.03.04 17:30) [165]
> не в функции как указано вами а при обработке т.е.
Ну так, на то там и фунция.
S:="текст";
S:= Win2Dos(S);
Вот и не будет никаких ошибок.
Просто @S[1] и pchar(S) - это две болших разницы.
← →
Юрий Зотов © (2004-03-29 17:59) [171]> panov © (29.03.04 17:54) [169]
> Не помню, в каком случае, но у меня возникала ошибка, если в
> таком порядке были написаны операторы CloseHandle(pi.hThread)
> до Wait
Тут и помнить не надо - при любой попытке использовать pi.hThread после CloseHandle(pi.hThread) будет ошибка. Если такой попытки нет - ошибки не будет.
← →
Юрий Зотов © (2004-03-29 17:59) [171]> panov © (29.03.04 17:54) [169]
> Не помню, в каком случае, но у меня возникала ошибка, если в
> таком порядке были написаны операторы CloseHandle(pi.hThread)
> до Wait
Тут и помнить не надо - при любой попытке использовать pi.hThread после CloseHandle(pi.hThread) будет ошибка. Если такой попытки нет - ошибки не будет.
← →
panov © (2004-03-29 18:11) [172]>Юрий Зотов © (29.03.04 17:59) [171]
Ну не думаю, что здесь порядок имеет существенное значение в любом случае-)
← →
panov © (2004-03-29 18:11) [172]>Юрий Зотов © (29.03.04 17:59) [171]
Ну не думаю, что здесь порядок имеет существенное значение в любом случае-)
← →
Игорь Шевченко © (2004-03-29 18:13) [173]zamkom © (29.03.04 17:53)
Все правильно, возникает ошибка. Потому что в этом случае константа находится в сегменте кода и по месту ее преобразовывать нельзя. Нужно функцию использовать.
Почему срабатывает @S[1] - потому что в этом случае компилятор делает копию строки. Но для функции в FAQ это не требуется.
← →
Игорь Шевченко © (2004-03-29 18:13) [173]zamkom © (29.03.04 17:53)
Все правильно, возникает ошибка. Потому что в этом случае константа находится в сегменте кода и по месту ее преобразовывать нельзя. Нужно функцию использовать.
Почему срабатывает @S[1] - потому что в этом случае компилятор делает копию строки. Но для функции в FAQ это не требуется.
← →
Юрий Зотов © (2004-03-29 18:20) [174]> panov © (29.03.04 18:11) [172]
IMHO, для ПРИМЕРА как раз имеет. Потому что именно ПРИМЕР должен показывать ГРАМОТНОЕ решение. Мы все помним пресловутый пример с "Synhronize аж во весь Execute" - а ведь тоже вполне правильный пример.
← →
Юрий Зотов © (2004-03-29 18:20) [174]> panov © (29.03.04 18:11) [172]
IMHO, для ПРИМЕРА как раз имеет. Потому что именно ПРИМЕР должен показывать ГРАМОТНОЕ решение. Мы все помним пресловутый пример с "Synhronize аж во весь Execute" - а ведь тоже вполне правильный пример.
← →
panov © (2004-03-29 18:41) [175]>Юрий Зотов © (29.03.04 18:20) [174]
Согласен, что это так-)
Так и сделаю, но теперь уже не вспомнить, почему же я стал сам так делать. ПРограмма работала именно так, и никак иначе-)
← →
panov © (2004-03-29 18:41) [175]>Юрий Зотов © (29.03.04 18:20) [174]
Согласен, что это так-)
Так и сделаю, но теперь уже не вспомнить, почему же я стал сам так делать. ПРограмма работала именно так, и никак иначе-)
← →
N169 (2004-03-29 18:57) [176]+ кстати, "вечным" вопросам (иконка в трее, перехват ctrl-alt-del) можно было бы сопоставлять специальный значок-картинку, которая была бы ссылкой на соотв. раздел FAQ или список связанных тем (в архиве). Очень удобно.
← →
N169 (2004-03-29 18:57) [176]+ кстати, "вечным" вопросам (иконка в трее, перехват ctrl-alt-del) можно было бы сопоставлять специальный значок-картинку, которая была бы ссылкой на соотв. раздел FAQ или список связанных тем (в архиве). Очень удобно.
← →
panov © (2004-03-29 19:19) [177]>stone © (29.03.04 17:19) [163]
ExtractFileDir
Если эту функцию использовать, то в конец нужно добавлять вручную еще "\".
← →
panov © (2004-03-29 19:19) [177]>stone © (29.03.04 17:19) [163]
ExtractFileDir
Если эту функцию использовать, то в конец нужно добавлять вручную еще "\".
← →
Piter © (2004-03-29 19:35) [178]panov (29.03.04 18:41) [175]
опубликуй еще раз полный список вопросов - а то я запутался...
← →
Piter © (2004-03-29 19:35) [178]panov (29.03.04 18:41) [175]
опубликуй еще раз полный список вопросов - а то я запутался...
← →
panov © (2004-03-29 20:23) [179]Пока обрабатывается такой список вопросов:
Как поместить иконку приложения в System Tray
Как спрятать (свернуть) приложение при нажатии на кнопку «закрыть» в области заголовка формы или при нажатии Alt-F4
Как получить список файлов в каталоге и его подкаталогах
Как перекодировать строку из кодировки OEM в ANSI и обратно.
Как выполнить длительную(по времени) процедуру в дополнительном потоке и одновременно обновлять TProgressBar в основном потоке.
Как запустить другую программу и дождаться ее окончания.
Как запустить процесс от имени другого пользователя
Почему во время выполнения дополнительного потока не обновляются объекты на основной форме (Synchronize аж во весь Execute)
Как создать таймер средствами Win32Api
Как получить список процессов
Как преобразовать тип String к Pchar и обратно
Как уменьшить размер программы
Динамическое создание объектов, включая создание массива объектов и назначения единой процедуры обработки
Почему при динамическом создании объект остается невидимым.
Как найти компонент по имени.
Как послать сообщение окну.
Как эмулировать нажатие клавиши или кнопки мыши.
Как прочитать заголовок или Edit из чужого окна
Как передать строку (длинные данные) из одной программы в другую
Как закрыть чужое приложение из моего
Как узнать время работы Windows после последней загрузки системы
Как перехватить Ctrl+Alt+Del
Как скрыть программу от Ctrl+Alt+Del
Как не дать снять мою программу из Task Manager
Как передать String из EXE в DLL и обратно
Почему текст не загружается целиком в TMemo(символ #0 в середине текста)
Глобальные хуки (стандартная ошибка - неглобальные переменные)
Как избавиться от Scrollbars в MDIForm
Как перенести/установить/настроить алиасы BDE на другой компьютер
Как нормализовать вид ScrollBar (90% ответ - Fetchall :)).
Вопрос про точное хранение денежных сумм и т.п..
Как в выпадающий список DBComboBox вывести все значения поля из таблицы?
Как вставить TCheckBox в поле DBGrid ?
Как раскрасить отдельные строки в TDBGgrid
Определение IP по DNS-имени хоста и наоборот
Где взять proxies.pas
Куда делись TClientSocket/TServerSocket из Delphi7 и где их взять
Как узнать локальный МАС (IP) локального и удаленного компьютера
Как отправить файл по сети на другой компьютер
Как разговаривать по сети
Как отправить письмо с вложением
Как установить - разорвать соединение DialUp
Как запретить доступ к моему компу, но чтоб остались общие ресурсы
Как получить доступ к общим ресурсам удаленного компьютера, зная пароль
Как самому написать Sniffer
Как самому написать Proxy
Как самому написать FireWall
Как получить в локальной сети список:
- имен пользователей
- ресурсов
- доменов
- рабочих групп,
Как работать с низкоуровневыми сокетами WinSock
Как уменьшить мерцание на TImage?
Как сграбить экран?
Как распечатать рисунок?
Как отобразить рисунок очень больших размеров?
Как создать AVI из последовательности BMP?
Как преобразовать JPEG<->BMP
Как преобразовать ... в MP3?
Как создать (полу)прозрачную форму?
Как записать байт в порт (LPT,COM,USB,TCP/IP) и поймать его обратно со второй ножки.
Как русифицировать кнопки на стандартном окне MessageDlg
Как в Word:
- открыть документ
- напечатать документ
- работать с таблицами
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1077992645&n=0
Диалог выбора папки:
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078389217&n=0
Хинт :
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078223087&n=0
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078646471&n=1
← →
panov © (2004-03-29 20:23) [179]Пока обрабатывается такой список вопросов:
Как поместить иконку приложения в System Tray
Как спрятать (свернуть) приложение при нажатии на кнопку «закрыть» в области заголовка формы или при нажатии Alt-F4
Как получить список файлов в каталоге и его подкаталогах
Как перекодировать строку из кодировки OEM в ANSI и обратно.
Как выполнить длительную(по времени) процедуру в дополнительном потоке и одновременно обновлять TProgressBar в основном потоке.
Как запустить другую программу и дождаться ее окончания.
Как запустить процесс от имени другого пользователя
Почему во время выполнения дополнительного потока не обновляются объекты на основной форме (Synchronize аж во весь Execute)
Как создать таймер средствами Win32Api
Как получить список процессов
Как преобразовать тип String к Pchar и обратно
Как уменьшить размер программы
Динамическое создание объектов, включая создание массива объектов и назначения единой процедуры обработки
Почему при динамическом создании объект остается невидимым.
Как найти компонент по имени.
Как послать сообщение окну.
Как эмулировать нажатие клавиши или кнопки мыши.
Как прочитать заголовок или Edit из чужого окна
Как передать строку (длинные данные) из одной программы в другую
Как закрыть чужое приложение из моего
Как узнать время работы Windows после последней загрузки системы
Как перехватить Ctrl+Alt+Del
Как скрыть программу от Ctrl+Alt+Del
Как не дать снять мою программу из Task Manager
Как передать String из EXE в DLL и обратно
Почему текст не загружается целиком в TMemo(символ #0 в середине текста)
Глобальные хуки (стандартная ошибка - неглобальные переменные)
Как избавиться от Scrollbars в MDIForm
Как перенести/установить/настроить алиасы BDE на другой компьютер
Как нормализовать вид ScrollBar (90% ответ - Fetchall :)).
Вопрос про точное хранение денежных сумм и т.п..
Как в выпадающий список DBComboBox вывести все значения поля из таблицы?
Как вставить TCheckBox в поле DBGrid ?
Как раскрасить отдельные строки в TDBGgrid
Определение IP по DNS-имени хоста и наоборот
Где взять proxies.pas
Куда делись TClientSocket/TServerSocket из Delphi7 и где их взять
Как узнать локальный МАС (IP) локального и удаленного компьютера
Как отправить файл по сети на другой компьютер
Как разговаривать по сети
Как отправить письмо с вложением
Как установить - разорвать соединение DialUp
Как запретить доступ к моему компу, но чтоб остались общие ресурсы
Как получить доступ к общим ресурсам удаленного компьютера, зная пароль
Как самому написать Sniffer
Как самому написать Proxy
Как самому написать FireWall
Как получить в локальной сети список:
- имен пользователей
- ресурсов
- доменов
- рабочих групп,
Как работать с низкоуровневыми сокетами WinSock
Как уменьшить мерцание на TImage?
Как сграбить экран?
Как распечатать рисунок?
Как отобразить рисунок очень больших размеров?
Как создать AVI из последовательности BMP?
Как преобразовать JPEG<->BMP
Как преобразовать ... в MP3?
Как создать (полу)прозрачную форму?
Как записать байт в порт (LPT,COM,USB,TCP/IP) и поймать его обратно со второй ножки.
Как русифицировать кнопки на стандартном окне MessageDlg
Как в Word:
- открыть документ
- напечатать документ
- работать с таблицами
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1077992645&n=0
Диалог выбора папки:
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078389217&n=0
Хинт :
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078223087&n=0
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078646471&n=1
← →
Piter © (2004-03-29 21:31) [180]panov (29.03.04 17:16) [162]
ZeroMemory(@si,sizeof(si));
а нафига?
извините, что убегаю немного:
Как получить список процессов
вопрос N10
Будем пользоваться функциейCreateToolhelp32Snapshot
, она реализована как в NT системах, так и в 9x. В NT она использует пресловутуюNtQuerySystemInformation
, которая недокументированна.
ЗаголовокCreateToolhelp32Snapshot
и остальные типы описаны в модулеTlHelp32
.CreateToolhelp32Snapshot
может делать снимок процессов и куч, модулей, потоков, используемых процессом. Она заносит требуемые данные в некоторую структуру (снимок) и возвращает ее описатель. После использования нужно закрыть описатель.
Работать со снимком можно с помощью функций Process32First, Process32Next, Thread32First , Thread32Next и так далее (описаны в Win32 SDK в разделе "Tool Help Functions"). Эти функции заносят информацию о конкретном процессе, потоке и т.д. из снимка в структуры типа TProcessEntry32, TThreadEntry32.
Итак, будем получать список процессов и заносить их названия в ListBox1, который лежит у нас на форме:procedure TForm1.Button1Click(Sender: TObject);
var HSnapShot: THandle;
pe: TProcessEntry32;
begin
listbox1.Clear; //очишаем наш ListBox1
HSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //нам нужен снимок процессов
pe.dwSize := sizeof(ProcessEntry32); //перед использованием TProcessEntry32 нужно заполнить поле dwSize
if Process32First(HSnapShot, pe) then // если первая запись о процессах получена - продолжаем
repeat
listbox1.Items.Add(pe.szExeFile); // добавляем в ListBox
until ( not Process32Next(HSnapShot,pe) ); // получаем запись о следующем процессе, если не получаем - выходим из цикла
closehandle(HSnapShot); // закрываем описатель снимка
end;
← →
Piter © (2004-03-29 21:31) [180]panov (29.03.04 17:16) [162]
ZeroMemory(@si,sizeof(si));
а нафига?
извините, что убегаю немного:
Как получить список процессов
вопрос N10
Будем пользоваться функциейCreateToolhelp32Snapshot
, она реализована как в NT системах, так и в 9x. В NT она использует пресловутуюNtQuerySystemInformation
, которая недокументированна.
ЗаголовокCreateToolhelp32Snapshot
и остальные типы описаны в модулеTlHelp32
.CreateToolhelp32Snapshot
может делать снимок процессов и куч, модулей, потоков, используемых процессом. Она заносит требуемые данные в некоторую структуру (снимок) и возвращает ее описатель. После использования нужно закрыть описатель.
Работать со снимком можно с помощью функций Process32First, Process32Next, Thread32First , Thread32Next и так далее (описаны в Win32 SDK в разделе "Tool Help Functions"). Эти функции заносят информацию о конкретном процессе, потоке и т.д. из снимка в структуры типа TProcessEntry32, TThreadEntry32.
Итак, будем получать список процессов и заносить их названия в ListBox1, который лежит у нас на форме:procedure TForm1.Button1Click(Sender: TObject);
var HSnapShot: THandle;
pe: TProcessEntry32;
begin
listbox1.Clear; //очишаем наш ListBox1
HSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //нам нужен снимок процессов
pe.dwSize := sizeof(ProcessEntry32); //перед использованием TProcessEntry32 нужно заполнить поле dwSize
if Process32First(HSnapShot, pe) then // если первая запись о процессах получена - продолжаем
repeat
listbox1.Items.Add(pe.szExeFile); // добавляем в ListBox
until ( not Process32Next(HSnapShot,pe) ); // получаем запись о следующем процессе, если не получаем - выходим из цикла
closehandle(HSnapShot); // закрываем описатель снимка
end;
← →
Игорь Шевченко © (2004-03-30 10:34) [181]Piter © (29.03.04 21:31)
> Будем пользоваться функцией CreateToolhelp32Snapshot, она
> реализована как в NT системах, так и в 9x.
Кроме Windows NT.
"Requires Windows XP, Windows 2000 Professional, Windows Me, Windows 98, or Windows 95."
← →
Игорь Шевченко © (2004-03-30 10:34) [181]Piter © (29.03.04 21:31)
> Будем пользоваться функцией CreateToolhelp32Snapshot, она
> реализована как в NT системах, так и в 9x.
Кроме Windows NT.
"Requires Windows XP, Windows 2000 Professional, Windows Me, Windows 98, or Windows 95."
← →
VMcL © (2004-03-30 16:02) [182]2 [0]
Работа со значками на рабочем столе.
P.S. У меня есть небольшой простой пример:
http://igp.org.ua/vmcl/?id=view_article&aid=1
http://vvmcl.amillo.net/?id=view_article&aid=1 (зеркало)
Зацените, если будет время. С замечаниями прошу в ICQ или сюда.
← →
VMcL © (2004-03-30 16:02) [182]2 [0]
Работа со значками на рабочем столе.
P.S. У меня есть небольшой простой пример:
http://igp.org.ua/vmcl/?id=view_article&aid=1
http://vvmcl.amillo.net/?id=view_article&aid=1 (зеркало)
Зацените, если будет время. С замечаниями прошу в ICQ или сюда.
← →
Юрий Зотов © (2004-03-30 16:33) [183]> panov
Еще один супервопрос - как определить версию системы.
Готовый ответ здесь:
http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1077391423&n=2
← →
Юрий Зотов © (2004-03-30 16:33) [183]> panov
Еще один супервопрос - как определить версию системы.
Готовый ответ здесь:
http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1077391423&n=2
← →
Rouse_ © (2004-03-30 16:51) [184]Ребят, мы забыли еще одну вещь, я сейчас специально пересмотрел все вопросы - а где вопросы по базам? Там же их тоже куча должна быть?
← →
Rouse_ © (2004-03-30 16:51) [184]Ребят, мы забыли еще одну вещь, я сейчас специально пересмотрел все вопросы - а где вопросы по базам? Там же их тоже куча должна быть?
← →
Romkin © (2004-03-30 16:55) [185]Нету? Любимый вопрос всех времен и народов - как загрузить jpeg в BLOB и потом ея оттуда извлечь?
function GetStreamImgType(Stream: TStream): TClass;
var
StreamPos: int64;
ImgSign: string;
begin
StreamPos := Stream.Position;
try
//BMP если не определено
Result := Graphics.TBitmap;
//JPEG
SetLength(ImgSign, 4);
Stream.Seek(6, soFromCurrent);
Stream.Read(ImgSign[1],4);
if (UpperCase(ImgSign) = "JFIF") or (UpperCase(ImgSign) = "EXIF") then
Result := Jpeg.TJPEGImage;
//WMF
Stream.Position := StreamPos;
SetLength(ImgSign, 4);
Stream.Read(ImgSign[1],4);
if ImgSign = #$D7#$CD#$C6#$9A then
Result := Graphics.TMetafile;
finally
Stream.Position := StreamPos;
end;
end;
procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
Img: TGraphic;
StreamPos: int64;
begin
StreamPos := Stream.Position;
Img := TGraphicClass(GetStreamImgType(Stream)).Create;
try
Stream.Position := StreamPos;
Img.LoadFromStream(Stream);
Picture.Graphic := Img;
finally
Img.Free;
end;
end;
function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
var
Stream: TStream;
begin
Result := False;
if not Field.isNULL then
begin
Stream := TMemoryStream.Create;
try
Field.SaveToStream(Stream);
Stream.Position := 0;
LoadProperImage(Stream, Picture);
Result := True;
finally
Stream.Free;
end;
end;
end;
procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
var
Stream: TStream;
begin
if not (Field.DataSet.State in [dsEdit, dsInsert]) then
Field.DataSet.Edit;
Field.Clear;
if Assigned(Picture.Graphic) then
if not Picture.Graphic.Empty then
begin
Stream := TMemoryStream.Create;
try
Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
Field.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
end;
Правда, не фонтан :((( Для метафайла и иконки есть предопределенные константы сигнатур. Да и считывание в поток, а потом из него - тоже не особо.
← →
Romkin © (2004-03-30 16:55) [185]Нету? Любимый вопрос всех времен и народов - как загрузить jpeg в BLOB и потом ея оттуда извлечь?
function GetStreamImgType(Stream: TStream): TClass;
var
StreamPos: int64;
ImgSign: string;
begin
StreamPos := Stream.Position;
try
//BMP если не определено
Result := Graphics.TBitmap;
//JPEG
SetLength(ImgSign, 4);
Stream.Seek(6, soFromCurrent);
Stream.Read(ImgSign[1],4);
if (UpperCase(ImgSign) = "JFIF") or (UpperCase(ImgSign) = "EXIF") then
Result := Jpeg.TJPEGImage;
//WMF
Stream.Position := StreamPos;
SetLength(ImgSign, 4);
Stream.Read(ImgSign[1],4);
if ImgSign = #$D7#$CD#$C6#$9A then
Result := Graphics.TMetafile;
finally
Stream.Position := StreamPos;
end;
end;
procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
Img: TGraphic;
StreamPos: int64;
begin
StreamPos := Stream.Position;
Img := TGraphicClass(GetStreamImgType(Stream)).Create;
try
Stream.Position := StreamPos;
Img.LoadFromStream(Stream);
Picture.Graphic := Img;
finally
Img.Free;
end;
end;
function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
var
Stream: TStream;
begin
Result := False;
if not Field.isNULL then
begin
Stream := TMemoryStream.Create;
try
Field.SaveToStream(Stream);
Stream.Position := 0;
LoadProperImage(Stream, Picture);
Result := True;
finally
Stream.Free;
end;
end;
end;
procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
var
Stream: TStream;
begin
if not (Field.DataSet.State in [dsEdit, dsInsert]) then
Field.DataSet.Edit;
Field.Clear;
if Assigned(Picture.Graphic) then
if not Picture.Graphic.Empty then
begin
Stream := TMemoryStream.Create;
try
Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
Field.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
end;
Правда, не фонтан :((( Для метафайла и иконки есть предопределенные константы сигнатур. Да и считывание в поток, а потом из него - тоже не особо.
← →
Rouse_ © (2004-03-30 16:55) [186]С постановкой некоторых из вопросов я немного не согласен, но ответы привел:
Вопрос:
Как определить имя DNS-хоста (компьютера) по IP?
Ответ:
Для этого воспользуемся функцией gethostbyaddr
Пример:
uses ..., WinSock;
function GetNameFromIP(const IP: String): String;
const
ERR_INADDR = "Can not convert IP to in_addr.";
ERR_HOST = "Can not get host information.";
RES_UNKNOWN = "Unknown";
ERR_WSA = "Can not initialize WSA.";
WSA_TYPE = $101; //$202;
var
WSA : TWSAData;
Host : PHostEnt;
Addr : Integer;
Err : Integer;
begin
Result := RES_UNKNOWN;
Err := WSAStartup(WSA_TYPE, WSA);
if Err <> 0 then
begin
MessageDlg(ERR_WSA, mtError, [mbOK], 0);
Exit;
end;
Addr := inet_addr(PChar(IP));
if Addr = INADDR_NONE then
begin
MessageDlg(ERR_INADDR, mtError, [mbOK], 0);
WSACleanup;
Exit;
end;
Host := gethostbyaddr(@Addr, SizeOf(Addr), PF_INET);
if Assigned(Host) then
Result := Host.h_name
else
MessageDlg(ERR_HOST, mtError, [mbOK], 0);
WSACleanup;
end;
Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GetNameFromIP("192.168.24.1");
end;
==============================================================================
Вопрос:
Как получить IP по имени DNS-хоста (компьютера)?
Ответ:
Воспользуемся функцией GetHostByName
Пример:
uses ..., WinSock
function GetIPFromName(DNS: string): string;
const
ERR_HOST = "Can not get host information.";
RES_UNKNOWN = "Unknown";
ERR_WSA = "Can not initialize WSA.";
WSA_TYPE = $101; //$202;
var
WSA : TWSAData;
Host : PHostEnt;
Err : Integer;
begin
Result := RES_UNKNOWN;
Err := WSAStartup(WSA_TYPE, WSA);
if Err <> 0 then
begin
MessageDlg(ERR_WSA, mtError, [mbOK], 0);
Exit;
end;
Host := GetHostByName(PChar(DNS));
if Assigned(Host.h_addr_list) then
Result :=
inet_ntoa(PInAddr(Host.h_addr_list^)^)
else
MessageDlg(ERR_HOST, mtError, [mbOK], 0);
WSACleanup;
end;
Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GetIPFromName("Rouse");
end;
==============================================================================
Вопрос:
Где взять proxies.pas
Ответ:
Данный модуль необходим только для DesignTime. Его требует DesignEditors.
Суррогатный способ обойти данное препятствие заключается в его "урезаном" аналоге:
unit Proxies;
interface
function IsProxyClass(ComponentClass: TClass): Boolean;
implementation
function IsProxyClass(ComponentClass: TClass): Boolean;
begin
Result := True;
end;
end.
А также существует правильный способ:
Просто реорганизуйте ваш проект на использование RunTime пакетов и добавьте "DesignIDE.dcp" к вашему списку RunTime пакетов. Proxies.pas находится именно здесь, и вам не нужен исходный текст вообще.
Почему это сделано? Просто доля уверенности, что вы не сможете распространять Design Time части (Property Editors, Component Editors), это запрещено по лицензии. DesignIDE.bpl не является свободно распространяемым, вы имеете право использовать его только на машине на которой установлена Delphi, подобно Component Libraries.
← →
Rouse_ © (2004-03-30 16:55) [186]С постановкой некоторых из вопросов я немного не согласен, но ответы привел:
Вопрос:
Как определить имя DNS-хоста (компьютера) по IP?
Ответ:
Для этого воспользуемся функцией gethostbyaddr
Пример:
uses ..., WinSock;
function GetNameFromIP(const IP: String): String;
const
ERR_INADDR = "Can not convert IP to in_addr.";
ERR_HOST = "Can not get host information.";
RES_UNKNOWN = "Unknown";
ERR_WSA = "Can not initialize WSA.";
WSA_TYPE = $101; //$202;
var
WSA : TWSAData;
Host : PHostEnt;
Addr : Integer;
Err : Integer;
begin
Result := RES_UNKNOWN;
Err := WSAStartup(WSA_TYPE, WSA);
if Err <> 0 then
begin
MessageDlg(ERR_WSA, mtError, [mbOK], 0);
Exit;
end;
Addr := inet_addr(PChar(IP));
if Addr = INADDR_NONE then
begin
MessageDlg(ERR_INADDR, mtError, [mbOK], 0);
WSACleanup;
Exit;
end;
Host := gethostbyaddr(@Addr, SizeOf(Addr), PF_INET);
if Assigned(Host) then
Result := Host.h_name
else
MessageDlg(ERR_HOST, mtError, [mbOK], 0);
WSACleanup;
end;
Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GetNameFromIP("192.168.24.1");
end;
==============================================================================
Вопрос:
Как получить IP по имени DNS-хоста (компьютера)?
Ответ:
Воспользуемся функцией GetHostByName
Пример:
uses ..., WinSock
function GetIPFromName(DNS: string): string;
const
ERR_HOST = "Can not get host information.";
RES_UNKNOWN = "Unknown";
ERR_WSA = "Can not initialize WSA.";
WSA_TYPE = $101; //$202;
var
WSA : TWSAData;
Host : PHostEnt;
Err : Integer;
begin
Result := RES_UNKNOWN;
Err := WSAStartup(WSA_TYPE, WSA);
if Err <> 0 then
begin
MessageDlg(ERR_WSA, mtError, [mbOK], 0);
Exit;
end;
Host := GetHostByName(PChar(DNS));
if Assigned(Host.h_addr_list) then
Result :=
inet_ntoa(PInAddr(Host.h_addr_list^)^)
else
MessageDlg(ERR_HOST, mtError, [mbOK], 0);
WSACleanup;
end;
Пример вызова:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GetIPFromName("Rouse");
end;
==============================================================================
Вопрос:
Где взять proxies.pas
Ответ:
Данный модуль необходим только для DesignTime. Его требует DesignEditors.
Суррогатный способ обойти данное препятствие заключается в его "урезаном" аналоге:
unit Proxies;
interface
function IsProxyClass(ComponentClass: TClass): Boolean;
implementation
function IsProxyClass(ComponentClass: TClass): Boolean;
begin
Result := True;
end;
end.
А также существует правильный способ:
Просто реорганизуйте ваш проект на использование RunTime пакетов и добавьте "DesignIDE.dcp" к вашему списку RunTime пакетов. Proxies.pas находится именно здесь, и вам не нужен исходный текст вообще.
Почему это сделано? Просто доля уверенности, что вы не сможете распространять Design Time части (Property Editors, Component Editors), это запрещено по лицензии. DesignIDE.bpl не является свободно распространяемым, вы имеете право использовать его только на машине на которой установлена Delphi, подобно Component Libraries.
← →
Игорь Шевченко © (2004-03-30 17:02) [187]
> А также существует правильный способ:
> Просто реорганизуйте ваш проект на использование RunTime
> пакетов и добавьте "DesignIDE.dcp" к вашему списку RunTime
> пакетов. Proxies.pas находится именно здесь, и вам не нужен
> исходный текст вообще.
И нафига, спрашивается, приложению использовать в run-time пакет, который нужен только в Design-time ?
← →
Игорь Шевченко © (2004-03-30 17:02) [187]
> А также существует правильный способ:
> Просто реорганизуйте ваш проект на использование RunTime
> пакетов и добавьте "DesignIDE.dcp" к вашему списку RunTime
> пакетов. Proxies.pas находится именно здесь, и вам не нужен
> исходный текст вообще.
И нафига, спрашивается, приложению использовать в run-time пакет, который нужен только в Design-time ?
← →
Юрий Зотов © (2004-03-30 17:12) [188]Еще одна суперпуперпроблема:
http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1080637822&n=0
Рекомендую ответ [19] из той же ветки.
← →
Юрий Зотов © (2004-03-30 17:12) [188]Еще одна суперпуперпроблема:
http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1080637822&n=0
Рекомендую ответ [19] из той же ветки.
← →
Rouse_ © (2004-03-30 17:17) [189]> [187] Игорь Шевченко © (30.03.04 17:02)
Вопрос не ко мне :)
Данный текст был взят из текущего FAQ и ответ, если не ошибаюсь был Анатолия Подгорецкого ...
Просто реорганизуйте ваш проект - действительно стоит изменить...
← →
Rouse_ © (2004-03-30 17:17) [189]> [187] Игорь Шевченко © (30.03.04 17:02)
Вопрос не ко мне :)
Данный текст был взят из текущего FAQ и ответ, если не ошибаюсь был Анатолия Подгорецкого ...
Просто реорганизуйте ваш проект - действительно стоит изменить...
← →
Игорь Шевченко © (2004-03-30 17:21) [190]Rouse_ © (30.03.04 17:17)
Ссылочку на FAQ ?
← →
Игорь Шевченко © (2004-03-30 17:21) [190]Rouse_ © (30.03.04 17:17)
Ссылочку на FAQ ?
← →
Rouse_ © (2004-03-30 17:29) [191]http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N144
← →
Rouse_ © (2004-03-30 17:29) [191]http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N144
← →
Rouse_ © (2004-03-30 17:29) [192]Про текущее FAQ я действительно напутал...
← →
Rouse_ © (2004-03-30 17:29) [192]Про текущее FAQ я действительно напутал...
← →
Rouse_ © (2004-03-30 17:40) [193]До кучи, также просмотрите, может допустил какую ошибку:
Вопрос:
Как получить МАС адрес по IP
Ответ: Воспользоваться функцией GetIpNetTable из IpHlpApi
Пример:interface
IPHLPAPI = "IPHLPAPI.DLL";
MAX_ADAPTER_ADDRESS_LENGTH = 7; .
type
// Так будет выглядеть МАС
TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
// Это структура для единичного запроса
TMibIPNetRow = packed record
dwIndex : DWORD;
dwPhysAddrLen : DWORD;
bPhysAddr : TMACAddress; // Вот здесь и лежит МАС!!!
dwAddr : DWORD;
dwType : DWORD;
end;
TMibIPNetRowArray = array [0..512] of TMibIPNetRow;
// запрашиваемая структура
PTMibIPNetTable = ^TMibIPNetTable;
TMibIPNetTable = packed record
dwNumEntries : DWORD;
Table: TMibIPNetRowArray;
end;
{$EXTERNALSYM GetIpNetTable}
function GetIpNetTable(pIpNetTable: PTMibIPNetTable;
pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall;
function GetIpNetTable; external IPHLPAPI name "GetIpNetTable";
implementation
function GetMacFromIP(const IP: String): String;
function GetMAC(Value: TMacAddress; Length: DWORD): String;
var
I: Integer;
begin
if Length = 0 then Result := "00-00-00-00-00-00" else
begin
Result := "";
for i:= 0 to Length -2 do
Result := Result + IntToHex(Value[i], 2) + "-";
Result := Result + IntToHex(Value[Length-1], 2);
end;
end;
// Получаем IP адрес, в отличии от работы с классом WC_IPADDRESS
// здесь преобразование идет в обратном порядке!
function GetDottedIPFromInAddr(const InAddr: Integer): String;
begin
Result := "";
Result := IntToStr(FOURTH_IPADDRESS(InAddr));
Result := Result + "." + IntToStr(THIRD_IPADDRESS(InAddr));
Result := Result + "." + IntToStr(SECOND_IPADDRESS(InAddr));
Result := Result + "." + IntToStr(FIRST_IPADDRESS(InAddr));
end;
const
ERR_MAC = "Can not get ARP table.";
RES_UNKNOWN = "Unknown";
var
Table: TMibIPNetTable;
Size: Integer;
CatchIP: String;
Err, I: Integer;
begin
Result := RES_UNKNOWN;
Size := SizeOf(Table);
Err := GetIpNetTable(@Table, @Size, False);
if Err <> NO_ERROR then
begin
MessageDlg(ERR_MAC, mtError, [mbOK], 0);
Exit;
end;
// Теперь мы имеем таблицу из IP адресов и соответсвующих им MAC адресов
for I := 0 to Table.dwNumEntries - 1 do // Ищем нужный IP ...
begin
CatchIP := GetDottedIPFromInAddr(Table.Table[I].dwAddr);
if CatchIP = IP then // И выводим его МАС ...
begin
Result := GetMAC(Table.Table[I].bPhysAddr, Table.Table[I].dwPhysAddrLen);
Break;
end;
end;
end;
Пример вызова:procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GetMacFromIP("192.168.24.1");
end;
← →
Rouse_ © (2004-03-30 17:40) [193]До кучи, также просмотрите, может допустил какую ошибку:
Вопрос:
Как получить МАС адрес по IP
Ответ: Воспользоваться функцией GetIpNetTable из IpHlpApi
Пример:interface
IPHLPAPI = "IPHLPAPI.DLL";
MAX_ADAPTER_ADDRESS_LENGTH = 7; .
type
// Так будет выглядеть МАС
TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
// Это структура для единичного запроса
TMibIPNetRow = packed record
dwIndex : DWORD;
dwPhysAddrLen : DWORD;
bPhysAddr : TMACAddress; // Вот здесь и лежит МАС!!!
dwAddr : DWORD;
dwType : DWORD;
end;
TMibIPNetRowArray = array [0..512] of TMibIPNetRow;
// запрашиваемая структура
PTMibIPNetTable = ^TMibIPNetTable;
TMibIPNetTable = packed record
dwNumEntries : DWORD;
Table: TMibIPNetRowArray;
end;
{$EXTERNALSYM GetIpNetTable}
function GetIpNetTable(pIpNetTable: PTMibIPNetTable;
pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall;
function GetIpNetTable; external IPHLPAPI name "GetIpNetTable";
implementation
function GetMacFromIP(const IP: String): String;
function GetMAC(Value: TMacAddress; Length: DWORD): String;
var
I: Integer;
begin
if Length = 0 then Result := "00-00-00-00-00-00" else
begin
Result := "";
for i:= 0 to Length -2 do
Result := Result + IntToHex(Value[i], 2) + "-";
Result := Result + IntToHex(Value[Length-1], 2);
end;
end;
// Получаем IP адрес, в отличии от работы с классом WC_IPADDRESS
// здесь преобразование идет в обратном порядке!
function GetDottedIPFromInAddr(const InAddr: Integer): String;
begin
Result := "";
Result := IntToStr(FOURTH_IPADDRESS(InAddr));
Result := Result + "." + IntToStr(THIRD_IPADDRESS(InAddr));
Result := Result + "." + IntToStr(SECOND_IPADDRESS(InAddr));
Result := Result + "." + IntToStr(FIRST_IPADDRESS(InAddr));
end;
const
ERR_MAC = "Can not get ARP table.";
RES_UNKNOWN = "Unknown";
var
Table: TMibIPNetTable;
Size: Integer;
CatchIP: String;
Err, I: Integer;
begin
Result := RES_UNKNOWN;
Size := SizeOf(Table);
Err := GetIpNetTable(@Table, @Size, False);
if Err <> NO_ERROR then
begin
MessageDlg(ERR_MAC, mtError, [mbOK], 0);
Exit;
end;
// Теперь мы имеем таблицу из IP адресов и соответсвующих им MAC адресов
for I := 0 to Table.dwNumEntries - 1 do // Ищем нужный IP ...
begin
CatchIP := GetDottedIPFromInAddr(Table.Table[I].dwAddr);
if CatchIP = IP then // И выводим его МАС ...
begin
Result := GetMAC(Table.Table[I].bPhysAddr, Table.Table[I].dwPhysAddrLen);
Break;
end;
end;
end;
Пример вызова:procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GetMacFromIP("192.168.24.1");
end;
← →
Юрий Зотов © (2004-03-30 17:56) [194]Предлагаю такую редакцию:
Но способ с "урезанным" Proxies все же опасен, поэтому лучше использовать следующий способ, рекомендованный Borland.
Если ошибка возникает при компиляции пакета, то просто добавьте в его секцию requires файл DesignIDE.dcp.
Если же ошибка возникает при компиляции приложения или DLL, то это означает, что проект или один из используемых им пакетов неверно структурирован и подтягивает в свой run-time код специфичный design-time модуль. Реструктурируйте его так, чтобы run-time код нигде бы не ссылался на design-time модули.
Чтобы было понятнее - вот пример НЕВЕРНОЙ структуризации.
unit MyComp;
...
type
TMyComponent = class(...)
...
end;
TMyComponentEditor = class(...)
...
end;
...
end;
Поскольку модуль содержит не только сам компонент TMyComponent, но и его редактор TMyComponentEditor, то в uses будет необходимо указать DesignEditors - что и потащит за собой design-time код вместе с Proxies. Указав в requires пакета DesignIDE.dcp, проблему мы решим - но что произойдет при компиляции приложения, которое использует компонент TMyComponent?
Произойдет то, в его uses надо будет включить MyComp - а далее потащится весь тот же самый код. Но у проекта нет никакой секции requires и возникнет неразрешимая проблема. А чтобы она не возникла, нужно разбить модуль MyComp на два. В первом оставить только сам компонент и включить этот модуль в run-time пакет. А во второй вынести класс TMyComponentEditor, процедуру Register и ресурс с иконкой компонента (если она есть) - и вот этот второй модуль нужно включить в design-time пакет, а к нему в requires надо подключить тот самый DesignIDE.dcp.
Естественно, второй модуль будет ссылаться на первый - и это вполне нормально. Главное как раз в том, что первый не будет ссылаться на второй и, таким образом, design-time код окажется полностью отделен от run-time кода.
← →
Юрий Зотов © (2004-03-30 17:56) [194]Предлагаю такую редакцию:
Но способ с "урезанным" Proxies все же опасен, поэтому лучше использовать следующий способ, рекомендованный Borland.
Если ошибка возникает при компиляции пакета, то просто добавьте в его секцию requires файл DesignIDE.dcp.
Если же ошибка возникает при компиляции приложения или DLL, то это означает, что проект или один из используемых им пакетов неверно структурирован и подтягивает в свой run-time код специфичный design-time модуль. Реструктурируйте его так, чтобы run-time код нигде бы не ссылался на design-time модули.
Чтобы было понятнее - вот пример НЕВЕРНОЙ структуризации.
unit MyComp;
...
type
TMyComponent = class(...)
...
end;
TMyComponentEditor = class(...)
...
end;
...
end;
Поскольку модуль содержит не только сам компонент TMyComponent, но и его редактор TMyComponentEditor, то в uses будет необходимо указать DesignEditors - что и потащит за собой design-time код вместе с Proxies. Указав в requires пакета DesignIDE.dcp, проблему мы решим - но что произойдет при компиляции приложения, которое использует компонент TMyComponent?
Произойдет то, в его uses надо будет включить MyComp - а далее потащится весь тот же самый код. Но у проекта нет никакой секции requires и возникнет неразрешимая проблема. А чтобы она не возникла, нужно разбить модуль MyComp на два. В первом оставить только сам компонент и включить этот модуль в run-time пакет. А во второй вынести класс TMyComponentEditor, процедуру Register и ресурс с иконкой компонента (если она есть) - и вот этот второй модуль нужно включить в design-time пакет, а к нему в requires надо подключить тот самый DesignIDE.dcp.
Естественно, второй модуль будет ссылаться на первый - и это вполне нормально. Главное как раз в том, что первый не будет ссылаться на второй и, таким образом, design-time код окажется полностью отделен от run-time кода.
← →
Piter © (2004-03-30 18:24) [195]Игорь Шевченко (30.03.04 10:34) [181]
Кроме Windows NT.
Ок. Надо изменить фразу
она реализована как в NT системах, так и в 9x.
на
она реализована в windows 95, 98, ME, 2000, XP и, вероятно, останется в следующих версиях.
← →
Piter © (2004-03-30 18:24) [195]Игорь Шевченко (30.03.04 10:34) [181]
Кроме Windows NT.
Ок. Надо изменить фразу
она реализована как в NT системах, так и в 9x.
на
она реализована в windows 95, 98, ME, 2000, XP и, вероятно, останется в следующих версиях.
← →
Rouse_ © (2004-03-30 18:56) [196]> [195] Piter © (30.03.04 18:24)
Если быть точным, то
Requirements
Client: Included in Windows XP, Windows 2000 Professional, Windows Me, Windows 98, and Windows 95.
Server: Included in Windows Server 2003 and Windows 2000 Server.
← →
Rouse_ © (2004-03-30 18:56) [196]> [195] Piter © (30.03.04 18:24)
Если быть точным, то
Requirements
Client: Included in Windows XP, Windows 2000 Professional, Windows Me, Windows 98, and Windows 95.
Server: Included in Windows Server 2003 and Windows 2000 Server.
← →
Piter © (2004-03-30 20:25) [197]Кстати, к данному ответу могу приплести тоже достаточно задаваемый вопрос про "убиение процесса", то есть про TerminateProccess.
Хотя лучше отдельным пунктом FAQ"а отметить я думаю... так что вот предлагаю еще один вопрос в FAQ "как убить чужой процесс"
← →
Piter © (2004-03-30 20:25) [197]Кстати, к данному ответу могу приплести тоже достаточно задаваемый вопрос про "убиение процесса", то есть про TerminateProccess.
Хотя лучше отдельным пунктом FAQ"а отметить я думаю... так что вот предлагаю еще один вопрос в FAQ "как убить чужой процесс"
← →
Игорь Шевченко © (2004-03-30 21:26) [198]Piter © (30.03.04 20:25)
Есть предложение не вносить вопрос про убийство чужого процесса в FAQ, потому как MS пишет, что использовать его надо очень осторожно и при крайней нужде. А горе-хацкеров нефиг плодить :)
← →
Игорь Шевченко © (2004-03-30 21:26) [198]Piter © (30.03.04 20:25)
Есть предложение не вносить вопрос про убийство чужого процесса в FAQ, потому как MS пишет, что использовать его надо очень осторожно и при крайней нужде. А горе-хацкеров нефиг плодить :)
← →
Rouse_ © (2004-03-30 21:38) [199]Ну тогда уж думаю стоит и это вычеркнуть:
Как перехватить Ctrl+Alt+Del
Как скрыть программу от Ctrl+Alt+Del
Как не дать снять мою программу из Task Manager
Как отправить письмо с вложением
Как установить - разорвать соединение DialUp
Как закрыть чужое приложение из моего
А вот вопросов по базам нинка не наблюдается... Что, разве в "Базах" никто не сидит?
← →
Rouse_ © (2004-03-30 21:38) [199]Ну тогда уж думаю стоит и это вычеркнуть:
Как перехватить Ctrl+Alt+Del
Как скрыть программу от Ctrl+Alt+Del
Как не дать снять мою программу из Task Manager
Как отправить письмо с вложением
Как установить - разорвать соединение DialUp
Как закрыть чужое приложение из моего
А вот вопросов по базам нинка не наблюдается... Что, разве в "Базах" никто не сидит?
← →
Юрий Зотов © (2004-03-30 22:29) [200]> Rouse_ © (30.03.04 21:38) [199]
Саш, для твоей же коллекции:
> А вот вопросов по базам нинка не наблюдается...
А казалось бы - ведь такое распространенное имя.
> Что, разве в "Базах" никто не сидит?
Нет, только в "Крестах".
← →
Юрий Зотов © (2004-03-30 22:29) [200]> Rouse_ © (30.03.04 21:38) [199]
Саш, для твоей же коллекции:
> А вот вопросов по базам нинка не наблюдается...
А казалось бы - ведь такое распространенное имя.
> Что, разве в "Базах" никто не сидит?
Нет, только в "Крестах".
Страницы: 1 2 3 4 5 6 7 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 1.27 MB
Время: 0.156 c