Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Вниз

Составление нового FAQ для этого сайта   Найти похожие ветки 

 
Piter ©   (2004-11-01 22:53) [0]

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

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

В частности, сейчас нужны ответы на вопросы:

Как запустить процесс от имени другого пользователя
Как создать таймер средствами Win32Api
Как эмулировать нажатие клавиши или кнопки мыши.
Как прочитать заголовок или Edit из чужого окна
Как передать строку (длинные данные) из одной программы в другую


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

Ну а в случае ошибки - мастера, думаю, всегда исправят!

Заранее спасибо!


 
Piter ©   (2004-11-01 22:54) [1]

Как мне кажется пример грамотного ответа:

Вопрос: как запустить другую программу и дождаться ее окончания.

Ответ: для запуска внешнего процесса будем использовать богатую на возможности функцию CreateProcess.
При успешном создании нового процесса эта функция заполняет передаваемую структуру PROCESS_INFORMATION, в частности поле hProcess, которое является указателем на новый процесс.
В случае надобности мы передаем полученный указатель на новый процесс в функцию WaitForSingleObject вместе со значением infinite.
В результате, WaitForSingleObject прервет выполнение потока нашей программы до тех пор, пока нужный нам процесс не завершится. В случае со значением infinite функция будет ждать бесконечно долго, поэтому вы должны быть уверены, что нужный процесс когда-нибудь завершится, иначе ваш поток никогда не получит управление обратно (в случае, если данный код исполняется для основного потока как в примере - это приведет к зависанию программы).

Пример:

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
  CloseHandle(pi.hThread);
  if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );  
  CloseHandle(pi.hProcess);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ExecCmd(ExtractFilePath(ParamStr(0))+"pkzip test.zip",True,False);
end;

end.


 
Rouse_ ©   (2004-11-01 22:58) [2]

Миш, ИМХО нужно Сашу Панова трясти, потомучто специально для того еще разо много наработок было, но вот что-то результаты :(


 
panov ©   (2004-11-01 22:58) [3]

>Piter
Почту получил?


 
panov ©   (2004-11-01 22:59) [4]

>Rouse_ ©   (01.11.04 22:58) [2]

Если Михаил завтра напомнит, перешлю твои наработки - нашел...


 
Rouse_ ©   (2004-11-01 23:00) [5]

> [4] panov ©   (01.11.04 22:59)
Тогда завтра еще вышлю, у меня их много. Чай почти месяц над ними сидел :)


 
Verg ©   (2004-11-01 23:01) [6]


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


Тема уже философская. "Должны быть", "надо", "изящнее".....
Если уж ты хотел бы подянть такую загадочную тему, то уж объясни мне, плиzzz (как принято спрашивать) почему, зачем и для чего?

Только....
>  примеры
> должны быть как можно изящнее, демонстрирующие нужную функциональность,
> но без лишнего кода

Так и вот, простой вопрос - мотивация...


 
panov ©   (2004-11-01 23:02) [7]

>Rouse_ ©   (01.11.04 23:00) [5]

А у меня, увы, так и не доходят руки. Сегодня Михаилу целый день выбирал время, чтобы некоторые материалы скомпоновать и отослать.


 
Rouse_ ©   (2004-11-01 23:03) [8]

> Так и вот, простой вопрос - мотивация...
Ну тут все очень просто...
Ты же не спрашиваешь у врача, почему он тебя лечит, так и тут... Все сугубо добровольно...
Зы: Кстати твои наработки (которые ты мне присылал) тоже в FAQ ;)
И за них отдельное спасибо...


 
VID ©   (2004-11-01 23:05) [9]

Verg ©   (01.11.04 23:01) [6]
Если бы все рассуждали так как ты, то в мире не было бы халявы. Но она есть, значит не все такие как ты.


 
Verg ©   (2004-11-01 23:26) [10]


> Если бы все рассуждали так как ты, то в мире не было бы
> халявы.


Если бы все рассуждали как я, то в мире бы вообще никого не было, кроме меня. И даже халявы :))))))


> Но она есть, значит не все такие как ты.


Вот так... Через "халяву" человек приходит к мудрости. Становятся очевидными такие сложные выкладки ума...


 
Piter ©   (2004-11-01 23:44) [11]

Verg ©   (01.11.04 23:01) [6]
Если уж ты хотел бы подянть такую загадочную тему, то уж объясни мне, плиzzz (как принято спрашивать) почему, зачем и для чего?


то есть, ты меня отговариваешь составлять FAQ, так?

А вообще, рекомендую тебе написать на adm@delphimaster.ru и спросить у Максима какого собственно хрена он горбатился над этим сайтом ночами, причем абсолютно бесплатно?
А в ответ получал зачастую - "почему не работает, почему сайт такой лажовый?"


 
Piter ©   (2004-11-01 23:45) [12]

Verg ©   (01.11.04 23:26) [10]

да и вообще. Если бы кто говорил - не удивился, но ты? ЗАЧЕМ ты отвечаешь на вопросы?


 
Rouse_ ©   (2004-11-01 23:50) [13]

> [12] Piter ©   (01.11.04 23:45)
Так, стоп, Миш ты не прав...
Если у Verg-а и бывают признаки хандры, то это не значит что нужно на него наезжать...
И тем более я лично могу принести ему респект за его ответы в конференции сети и вообще всем можно задать вопрос "а какого вы вообще сидите на форуме и еще отвечатете"... ;)


 
Verg ©   (2004-11-01 23:52) [14]


> А вообще, рекомендую тебе написать на adm@delphimaster.ru
> и спросить у Максима какого собственно хрена он горбатился
> над этим сайтом ночами, причем абсолютно бесплатно?


Хм... Я как-то не привык для своих вопросов пользоваться посредниками. Да и для ответов, между прочим, тоже. И тебе не советую привыкать...


> то есть, ты меня отговариваешь составлять FAQ, так?


Ох, уж эти капризы...


 
Mihey_temporary ©   (2004-11-01 23:53) [15]


> Как создать таймер средствами Win32Api
> Как эмулировать нажатие клавиши или кнопки мыши.


ИМХО на эти вопросы есть исчерпывающие ответы в других источниках или нужно обязательно с нуля своё?


 
jack128 ©   (2004-11-01 23:54) [16]

Piter ©   (01.11.04 22:53)
Как эмулировать нажатие клавиши или кнопки мыши.


Для мыши.

 procedure MouseClick(Pt: TPoint; BackCursor: boolean = True);

   // Переводим экранные координаты к принятым в mouse_event
   function ScreenToAbsolute(const Pt: TPoint): TPoint;
   begin
     Result.x := Round(Pt.x * 65535 / Screen.Width);
     Result.y := Round(Pt.y * 65535 / Screen.Height);
   end;

 var
  OldPt: TPoint;
 begin
   if BackCursor then
     OldPt := ScreenToAbsolute(Mouse.CursorPos);
   Pt := ScreenToAbsolute(Pt);
   {Переместим курсор мыши}
   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 0, 0);
   {Нажамаем левую кнопку мыши}
   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
   {Отпускаем левую кнопки мыши}
   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
   if BackCursor then
     {Перемещаем кнопку мыши обратно}
     Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, OldPt.x, OldPt.y, 0, 0);
 end;


Например поместим на форму две кнопки Button1 и Button2 и в их обработчиках напишем следующее

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage("Test");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 MouseClick(Button1.ClientToScreen(Point(2, 2)), True); // Кликаем по первой кнопке..
end;


 
Rouse_ ©   (2004-11-01 23:57) [17]

> ИМХО на эти вопросы есть исчерпывающие ответы в других источниках
> или нужно обязательно с нуля своё?

К примеру огромное кол-во вопросов пережевываемых в конференции Сети давно должны быть удостоены FAQ...


 
Verg ©   (2004-11-02 00:09) [18]


> ЗАЧЕМ ты отвечаешь на вопросы?


Ты и в самом деле думаешь, что я задал риторический вопрос?


 
Gero ©   (2004-11-02 00:22) [19]


> Как передать строку (длинные данные) из одной программы
> в другую

Чтобы передать другому приложению строку(или другие длинные данные) нужно послать ему сообщение WM_COPYDATA с соответствующими параметрами.

Например:

procedure SendStringToWindow(S: string; Wnd: HWND);
var
 SendData: TCopyDataStruct;
begin
 if Wnd > 0 then
   begin
     with Send do
       begin
         dwData := 0;
         cbData := Length(S) + 1;
         lpData := PChar(S);
       end;
     SendMessage(Wnd, WM_COPYDATA, 0, Longint(@Send));
   end;
end

Если нам понадобится отправить какую-либо строку другому нашему приложению, мы пишем:

var
 Wnd: HWND;
...
Wnd := FindWindow("TForm2", "Form2");
if Wnd > 0 then
 SendStringToWindow("Hello!", Wnd);

Вот пример обработки такого сообщения в другой программе:

TForm2 = class(TForm)
private
 procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
...
end;
...
procedure TDMCMainForm.WMCopyData(var Msg: TWMCopyData);
var
 Text: string;
begin
 if Msg.CopyDataStruct <> nil then
   begin
     Text := string(Msg.CopyDataStruct^.lpData);
     ShowMessage("Получен текст: " + Text);
   end;
end;


 
Gero ©   (2004-11-02 00:29) [20]


> 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}

А этот мусор еще зачем?


 
Verg ©   (2004-11-02 00:31) [21]


> Gero ©   (02.11.04 00:22)


> var
>  SendData: TCopyDataStruct;
> begin
>  if Wnd > 0 then
>    begin
>      with Send do


А Send - это что?


 
Gero ©   (2004-11-02 00:33) [22]


> Verg ©   (02.11.04 00:31)

Да, описка, там и еще далее в одном месте не Send, а SendData.


 
GuAV ©   (2004-11-02 00:46) [23]

Piter ©   (01.11.04 22:53)
Как запустить процесс от имени другого пользователя

http://delphimaster.net/view/4-1099137400/

Игорь Шевченко там ответил.

Кстати тему поднятую там тоже можно добавит в FAQ


 
GuAV ©   (2004-11-02 00:47) [24]

Piter ©   (01.11.04 22:53)
Как создать таймер средствами Win32Api


Добавлю к этому вопросу:
Если я не привязываю таймер к окну а использую
procedure TimerProc(hWnd: HWND; uMsg: Cardinal;
 idEvent: PCardinal; dwTime: DWORD); stdcall;

должен ли быть код в TimerProc потокобезопасным ?


 
panov ©   (2004-11-02 09:55) [25]

>Gero ©   (02.11.04 0:33) [22]

Да, описка, там и еще далее в одном месте не Send, а SendData.

Все ответы должны быть проверены на синтаксис и исполнимость.


 
Gero ©   (2004-11-02 18:03) [26]


> panov ©   (02.11.04 09:55)

Да, сорри, писал прямо тут, а код взял из проекта, над которым сейчас работаю.


 
Gero ©   (2004-11-02 18:14) [27]

Как передать строку (длинные данные) из одной программы в другую

Чтобы передать другому приложению строку(или другие длинные данные) нужно послать ему сообщение WM_COPYDATA с соответствующими параметрами.

Например:

procedure SendStringToWindow(S: string; Wnd: HWND);
var
SendData: TCopyDataStruct;
begin
if Wnd > 0 then
  begin
    with SendData do
      begin
        dwData := 0;
        cbData := Length(S) + 1;
        lpData := PChar(S);
      end;
    SendMessage(Wnd, WM_COPYDATA, 0, Longint(@SendData));
  end;
end;

Если нам понадобится отправить какую-либо строку другому нашему приложению, мы пишем:

var
Wnd: HWND;
...
Wnd := FindWindow("TForm2", "Form2");
if Wnd > 0 then
SendStringToWindow("Hello!", Wnd);


Вот пример обработки такого сообщения в другой программе:

TForm2 = class(TForm)
private
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
...
end;
...
procedure TForm2.WMCopyData(var Msg: TWMCopyData);
var
Text: string;
begin
if Msg.CopyDataStruct <> nil then
  begin
    Text := string(Msg.CopyDataStruct^.lpData);
    ShowMessage("Получен текст: " + Text);
  end;
end;


 
Игорь Шевченко ©   (2004-11-02 18:34) [28]


> Как запустить процесс от имени другого пользователя



unit main;

interface

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

type
 TfMain = class(TForm)
   Button: TButton;
   procedure ButtonClick(Sender: TObject);
 end;

var
 fMain: TfMain;

implementation
uses
 HSAdvApi;

{$R *.dfm}

procedure TfMain.ButtonClick(Sender: TObject);
begin
 MyCreateProcess();
end;

procedure TfMain.MyCreateProcess;
const
 UserName : WideString = "TESTUSER";
 Password : WideString = "testuser";
 ConstCommandLine : String = "CMD.EXE";
 Title : WideString = "Test process";
 Domain : WideString = "WORKGROUP";
var
 MyStartupInfo : STARTUPINFO;
 ProcessInfo : PROCESS_INFORMATION;
 CommandLine : array[0..512] of WideChar;
begin
 FillChar(MyStartupInfo, SizeOf(MyStartupInfo), 0);
 MyStartupInfo.cb := SizeOf(MyStartupInfo);
 StringToWideChar(ConstCommandLine, CommandLine,
    Sizeof(CommandLine) div SizeOf(WideChar));
 MyStartupInfo.lpTitle := PWideChar(Title);
 if not CreateProcessWithLogonW (PWideChar(UserName), PWideChar(Domain),
     PWideChar(Password), LOGON_WITH_PROFILE, nil,
     CommandLine, 0, nil, nil, @MyStartupInfo, @ProcessInfo) then
   RaiseLastWin32Error()
 else begin
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
 end;
end;

end.


unit HSAdvApi;

interface
uses
 Windows;

function CreateProcessWithLogonW (const lpUsername : PWideChar;
 const lpDomain : PWideChar; const lpPassword : PWideChar;
 dwLogonFlags : DWORD; const lpApplicationName : PWideChar;
 lpCommandLine : PWideChar; dwCreationFlags : DWORD;
 lpEnvironment : Pointer; const lpCurrentDirectory : PWideChar;
 lpStartupInfo : PStartupInfo;
 lpProcessInfo : PProcessInformation) : Boolean; stdcall;

const
 LOGON_WITH_PROFILE = $00000001;
 LOGON_NETCREDENTIALS_ONLY = $00000002;
 LOGON_ZERO_PASSWORD_BUFFER = $80000000;

implementation
uses
 SysUtils;

{ ADVAPI32.DLL functions }
type
 TCreateProcessWithLogonW =
   function (const lpUsername : PWideChar;
 const lpDomain : PWideChar; const lpPassword : PWideChar;
 dwLogonFlags : DWORD; const lpApplicationName : PWideChar;
 lpCommandLine : PWideChar; dwCreationFlags : DWORD;
 lpEnvironment : Pointer; const lpCurrentDirectory : PWideChar;
 lpStartupInfo : PStartupInfo;
 lpProcessInfo : PProcessInformation) : Boolean; stdcall;

const
 DllName = "advapi32.dll";

var
 DllHandle : THandle;
 _CreateProcessWithLogonW : TCreateProcessWithLogonW;

function InitLib : Boolean;
begin
 if DllHandle = 0 then
   if Win32Platform = VER_PLATFORM_WIN32_NT then begin
     DllHandle := LoadLibrary(DllName);
     if DllHandle <> 0 then begin
       @_CreateProcessWithLogonW := GetProcAddress(DllHandle,
         "CreateProcessWithLogonW");
     end;
   end;
 Result := (DllHandle <> 0);
end;

function NotImplementedBool : Boolean;
begin
 SetLastError (ERROR_CALL_NOT_IMPLEMENTED);
 Result := false;
end;

function CreateProcessWithLogonW (const lpUsername : PWideChar;
 const lpDomain : PWideChar; const lpPassword : PWideChar;
 dwLogonFlags : DWORD; const lpApplicationName : PWideChar;
 lpCommandLine : PWideChar; dwCreationFlags : DWORD;
 lpEnvironment : Pointer; const lpCurrentDirectory : PWideChar;
 lpStartupInfo : PStartupInfo;
 lpProcessInfo : PProcessInformation) : Boolean; stdcall;
begin
 if InitLib and Assigned(_CreateProcessWithLogonW) then
   Result := _CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword,
     dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags,
     lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInfo)
 else
   Result := NotImplementedBool;
end;

initialization
finalization
 if DllHandle <> 0 then
   FreeLibrary(DllHandle);
end.


 
Piter ©   (2004-11-02 21:22) [29]

ну ответы-то перед включением в FAQ я все равно буду проверять по любому, если есть возможность. Такие описки я исправлю :)

Cпасибо тем, кто ответил!


 
Piter ©   (2004-11-05 18:21) [30]

Народ! А как насчет эмуляции нажатии клавиши?


 
Поручик ©   (2004-11-05 18:29) [31]

Piter ©   (05.11.04 18:21) [30]
Пихни в faq модуль SendKeys, могу выслать.


 
Piter ©   (2004-11-05 21:45) [32]

Форум сегодня сверхдинамичный - ветка уже уплыла :)


 
Piter ©   (2004-11-05 21:45) [33]

Поручик ©   (05.11.04 18:29) [31]

целый модуль пихать не буду. Нужен короткий пример


 
Piter ©   (2004-11-06 13:02) [34]

Люди! Активнее...


 
Piter ©   (2004-11-06 15:48) [35]

Требуются ответы на следующие вопросы:

Как перенести/установить/настроить алиасы BDE на другой компьютер
Как нормализовать вид ScrollBar (90% ответ - Fetchall :))
Вопрос про точное хранение денежных сумм и т.п.
Как в выпадающий список DBComboBox вывести все значения поля из таблицы?
Как вставить TCheckBox в поле DBGrid ?
Как раскрасить отдельные строки в TDBGgrid


А также вот, я даже не знаю о чем это:

Где взять proxies.pas

Плюс еще от Розыча, Digitman"а, Verg"а или других обитателей сетей надеюсь получить грамотные ответы на вопрос (ну народ, очент желательно с пояснениями, подводными камнями, которые могут встретиться и прочее):

Определение IP по DNS-имени хоста и наоборот
Как узнать локальный МАС (IP) локального и удаленного компьютера
Как отправить файл по сети на другой компьютер
Как разговаривать посети
Как отправить письмо с вложением
Как установить - разорвать соединение DialUp
Как запретить доступ к моему компу, но чтоб остались общие ресурсы
Как получить доступ к общим ресурсам удаленного компьютера, зная пароль
Как самому написать Sniffer
Как самому написать Proxy
Как самому написать FireWall
Как получить в локальной сети список:
- имен пользователей
- ресурсов
- доменов
- рабочих групп,
Как работать с низкоуровневыми сокетами WinSock


 
YurikGL ©   (2004-11-06 15:57) [36]


> Как вставить TCheckBox в поле DBGrid ?

Использовать TDBGridEH из EHLib...


 
VMcL ©   (2004-11-06 16:06) [37]

>>Piter ©  (06.11.04 15:48) [35]

>Как самому написать FireWall

Да что уж мелочиться? "Как самому написать операционную систему?" :-)

>Как самому написать Sniffer
Как самому написать Proxy
Как самому написать FireWall


Кстати, слово "самому" явно лишнее. Раз человек использовал код из FAQ, то какое тут "самому"? Он же не сел, сам прочитал документацию, разобрался и написал?

>Как работать с низкоуровневыми сокетами WinSock

Хм. Первый раз слышу, чтобы гнезда WinSock по уровням делились. Может имеется в виду "Как работать с сокетами WinSock на чистом WinAPI?"
?


 
KSergey ©   (2004-11-06 16:38) [38]

> Вопрос про точное хранение денежных сумм и т.п.

А Currency - это не точно?

> Как в выпадающий список DBComboBox вывести все значения
> поля из таблицы?


А в чем тут подвох? Вроде оно и так всегда все выводит... Если специально не предпринимать доп. усилий... Да и это по хорошему любая книга. (кроме "Граф Монте-Кристо")

> Как вставить TCheckBox в поле DBGrid ?
> Как раскрасить отдельные строки в TDBGgrid


Может здесь правильнее будет дать ссылку на соответствующие статьи с "Королевства"? По-молему, их прочтение принесет много больше пользы, нежели просто "Вставить в OnDrawCell...". Да и по объему они не велики.


 
Gero ©   (2004-11-06 16:39) [39]


> Где взять proxies.pas

Это было в предыдущей ветке, которую я тебе на мыло на мыло отсылал.


 
KSergey ©   (2004-11-06 16:40) [40]

Не знаю на сколько такой вопрос F, но есть решение подсветки строки TMemo... Если причесать... (всей, не отдельных элементов!)


 
Gero ©   (2004-11-06 16:41) [41]


> Как самому написать Sniffer
> Как самому написать Proxy
> Как самому написать FireWall

Если вы задаете подобные вопросы, то вам пока еще рано этим заниматься.


 
Игорь Шевченко ©   (2004-11-06 16:45) [42]

Piter ©   (06.11.04 15:48) [35]


> Как вставить TCheckBox в поле DBGrid ?
> Как раскрасить отдельные строки в TDBGgrid


На королевстве Delphi масса статей по этому компоненту, в том числе и наша с Еленой Филипповой. Почему бы не посмотреть там ?


 
Gero ©   (2004-11-06 16:46) [43]


> [35] Piter ©   (06.11.04 15:48)

И неужели это все вопросы?
Других нет?


 
wnew ©   (2004-11-06 17:29) [44]

Здесь Easy Helper по Delphi. Останется только сделать тоже самое, но на русском:)
http://www.delphi-treff.de/inc/url.php4?tab=files_download&id=41&dl=1

А здесь банк данных к Easy Helper http://www.delphi-treff.de/inc/url.php4?tab=files_download&id=42&dl=1

Здесь online версия http://www.delphi-treff.de/eh/index.php


 
Piter ©   (2004-11-06 18:20) [45]

Ну есть, конечно. Некоторые отработаны, некоторые ждут своего часа.

Gero ©   (06.11.04 16:46) [43]
И неужели это все вопросы?


тебе, наверное, кажется мало. А между прочим ни на один приведенный мной вопрос из [35] никто ГРАМОТНО не ответил. Так, чтобы это в FAQ можно было включить. Придется как всегда лопатить самому :)


 
Vit@ly ©   (2004-11-06 18:32) [46]

>Piter ©
Gero ©   (06.11.04 16:41) [41]
> Как самому написать Sniffer
> Как самому написать Proxy
> Как самому написать FireWall
Если вы задаете подобные вопросы, то вам пока еще рано этим заниматься.

Грамотный ответ!

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


 
Piter ©   (2004-11-06 18:36) [47]

Vit@ly ©   (06.11.04 18:32) [46]
А, в принципе, читать нужно больше. Ну и не влезать не в свою область (не прыгать выше себя).
Хотя задумка, конечно, стоящая


ты про что и кому?


 
Vit@ly ©   (2004-11-06 18:39) [48]

Вроде бы в первой строке поста, указано кому?
Хотя и не выделено.


 
Piter ©   (2004-11-06 18:44) [49]

Vit@ly ©   (06.11.04 18:39) [48]

если я правильно понял - ты отговариваешь меня писать FAQ?


 
Игорь Шевченко ©   (2004-11-06 18:45) [50]

Piter ©   (06.11.04 18:36) [47]

Можно мне высказаться ? Я считаю, что темы

> > Как самому написать Sniffer
> > Как самому написать Proxy
> > Как самому написать FireWall


не стоит включать в FAQ, а если включать, то туда же включать, как написать свой Shell для Windows, как написать свою ОС, и т.д.


 
Piter ©   (2004-11-06 19:36) [51]

Игорь Шевченко ©   (06.11.04 18:45) [50]
Можно мне высказаться ?


нужно! :)

не стоит включать в FAQ, а если включать, то туда же включать, как написать свой Shell для Windows, как написать свою ОС, и т.д.

понимаю. Но просто вопросы эти слишком часто возникают. А ведь FAQ это и есть часто задаваемые вопросы. Естественно, полного ответа там не может быть, кода там тоже не будет. Просто объяснить людям, что это весьма сложно, но в тоже время дать направление для поисков - вдруг что и получится у него. Насчет firewall я в свое время нашел статью и всегда всех отправлял туда: http://www.ntkernel.com/articles/firewall.shtml

Но это пожалуй все, что у меня есть. Можно там еще на MSDN поконкретнее куда-нибудь отправить. Конечно, у человека вряд ли что получится - но это его проблемы. Чем смогли - помогли.

Насчет сниффера - может на статью какую-нибудь, на примеры с использованием WinPCap (не так уж и сложно).
Это далеко не "написать свою ОС", что является полной утопией.


 
YurikGL ©   (2004-11-06 20:15) [52]


> Игорь Шевченко ©   (06.11.04 18:45) [50]


> Piter ©   (06.11.04 19:36) [51]

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


 
Игорь Шевченко ©   (2004-11-06 21:01) [53]

Piter ©   (06.11.04 19:36) [51]

Видишь ли, в FAQ обычно дается полное решение, отослать к статье, тем более, на Ntkernel, это не есть полный ответ на вопрос, тем более, статья по этому адресу довольно нетривиальная.
И я сильно сомневаюсь, что методику, описанную в этой статье можно реализовать на Delphi :) Если быть точнее, то реализовать ее просто нельзя.
Все-таки эти три вопроса связаны с низкоуровнем программированием сети, решение на Delphi обычно или весьма трудоемкое или его нету.


> Конечно, у человека вряд ли что получится - но это его проблемы.
> Чем смогли - помогли.


"- Да-да! - решительно сказал Фарфуркис. Я тоже не удовлетворен.
Это не работа, знаете ли. Коменданту простительно, но вы, товарищ Выбегалло, меня удивляете.
- Чем? Чем же это я вас удивляю, товарищ Фарфуркис? -
осведомился он.
- Неубедительно составленным описанием, товарищ Выбегалло, вот
чем! - сказал Фарфуркис.
- Отписка, а не описание получилась у вас, - добавил
Хлебовводов. - Такое описание и я могу составить."
(с) Сказка о тройке.

А что касается того, что часто задают, так вопрос о том, как "скрыть процесс от Ctrl+Alt+Del" задают еще чаще, поверь мне, как комоду WinAPI :)


 
kaZaNoVa ©   (2004-11-06 21:07) [54]


> вопрос о том, как "скрыть процесс от Ctrl+Alt+Del"

а я знаю ответ на него :)))

у меня 3 варианта :))))))

но никому не скажу %)))


 
Игорь Шевченко ©   (2004-11-06 21:30) [55]

kaZaNoVa ©   (06.11.04 21:07) [54]

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

И кроме того, я знаю 4 способа найти скрытый процесс ;)


 
kaZaNoVa ©   (2004-11-06 21:32) [56]

Игорь Шевченко ©   (06.11.04 21:30) [55]
ок %)


 
kaZaNoVa ©   (2004-11-06 21:33) [57]

но именно эта тема как раз в "Потрепаться"  ;)))))


 
Sanek_Metaller ©   (2004-11-06 21:44) [58]

К факу надо добавить еще 2 вопроса:
1)Что такое Автосхема и где ее скачать?
2)Что это за конференция http://www.delphimaster.ru/cgi-bin/forum.pl
:)


 
Piter ©   (2004-11-06 22:12) [59]

Игорь Шевченко ©   (06.11.04 21:01) [53]
А что касается того, что часто задают, так вопрос о том, как "скрыть процесс от Ctrl+Alt+Del" задают еще чаще


Я уже ответил на него:

------------------------------------------------
Вопрос: как перехватить/скрыть/защитить программу от Ctrl+Alt+Del

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

Чтобы вашу программу не смог выгрузить обычный пользователь, вам нужно просто сделать ее в виде сервиса в Windows NT.

Отвечал: Piter


 
kaZaNoVa ©   (2004-11-06 22:13) [60]

Piter ©   (06.11.04 22:12) [59]
здорово !


 
YurikGL ©   (2004-11-06 22:14) [61]


> Вопрос: как перехватить/скрыть/защитить программу от Ctrl+Alt+Del
>
> Ответ: а зачем?

Например, если это - сервер системы удаленного управления.


 
kaZaNoVa ©   (2004-11-06 22:16) [62]

YurikGL ©   (06.11.04 22:14) [61]
<trojan off> ;)))))


 
YurikGL ©   (2004-11-06 22:17) [63]


> kaZaNoVa ©   (06.11.04 22:16) [62]

RAdmin тоже off?


 
kaZaNoVa ©   (2004-11-06 22:19) [64]

YurikGL ©   (06.11.04 22:17) [63]
ага ;))))


 
Piter ©   (2004-11-06 22:25) [65]

YurikGL ©   (06.11.04 22:17) [63]
RAdmin тоже off?


Читать умеем?


> Чтобы вашу программу не смог выгрузить обычный
> пользователь, вам нужно просто сделать ее в виде
> сервиса в Windows NT.


 
kaZaNoVa ©   (2004-11-06 23:08) [66]

ещё:
как Имитировать САД:

из внедренной в Winlogon DLL:
PostMessage(HWND_BROADCAST,WM_HOTKEY,0, MAKELONG(MOD_CONTROL or MOD_ALT, VK_DELETE ) );


 
kaZaNoVa ©   (2004-11-06 23:09) [67]

http://irazin.ru/Samples/SASHook.htm


 
Игорь Шевченко ©   (2004-11-06 23:12) [68]

Piter ©   (06.11.04 22:12) [59]

Очень хороший ответ - подписываюсь.


 
Игорь Шевченко ©   (2004-11-06 23:16) [69]

kaZaNoVa ©   (06.11.04 23:09) [67]

Умерь ты свой восторг, ради бога. То, что ты пишешь, любой мало-мальски неглупый человек в состоянии сам найти в сети. Ты же почему-то считаешь, что плодить мелких паскостников - задача этого сайта и твоя в том числе. Ты здорово ошибаешься насчет сайта, а свои старания ты можешь приложить, открыв СВОЙ сайт и приглашая желающих напакостить к себе.

Вот тоже, развелось Wannabee


 
kaZaNoVa ©   (2004-11-06 23:17) [70]

Игорь Шевченко ©   (06.11.04 23:12) [68]
как вариант дописать:
если ответ не устраивает => ya.ru ;)


 
kaZaNoVa ©   (2004-11-06 23:27) [71]

Игорь Шевченко ©   (06.11.04 23:16) [69]
найти ...  ага ..
я когда первый раз что-то искал по этой теме .. то попадалось всякая ерунда, либо на асме,си и т.д. ..

"спрятать от кад" я искал пару месяцев, так и не нашёл (на делфе без асма) ..

я раньше думал, вот научусь и всем буду помогать ..

но видно ..  многим не хочется "просвещать новичков" в этом ..  :(


> Умерь ты свой восторг, ради бога.

ок ..


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


>  открыв СВОЙ сайт и приглашая желающих напакостить к
> себе

у меня есть много сайтов, но не на одном из них нет ничего о Делфи, так как у них низкая посещаемость, а на одном - большая, но тема кодинга там неактуальна ..

//если я Вам "надоел" то я могу более тут не появляться ...


 
Игорь Шевченко ©   (2004-11-06 23:33) [72]

kaZaNoVa ©   (06.11.04 23:27) [71]


> "спрятать от кад" я искал пару месяцев, так и не нашёл (на
> делфе без асма) ..


Да нефиг делать. Только зачем ?

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


> но видно ..  многим не хочется "просвещать новичков" в этом
> ..  :(


А зачем ? Ты можешь привести реальный пример, когда скрытие процесса нужно не в целях напакостить ?


> я думал надо помогать ..  всем ..


Например, на стреме стоять, когда квартиру обчищают - а что, тоже помощь своего рода.


 
YurikGL ©   (2004-11-06 23:33) [73]


> > Чтобы вашу программу не смог выгрузить обычный
> > пользователь, вам нужно просто сделать ее в виде
> > сервиса в Windows NT.


Стандартная ситуация...

Есть предприятие, где нужно удаленное управление. В нем работают в том числе программисты. А начальству и системному администратору нужно ими иногда управлять. А программистам иногда нужно снимать сервисы.


 
kaZaNoVa ©   (2004-11-06 23:41) [74]

Игорь Шевченко ©   (06.11.04 23:33) [72]
Вы 100% правы ...

> А зачем ? Ты можешь привести реальный пример, когда
> скрытие процесса нужно не в целях напакостить ?

только 1:
написать программу, которая не видна нигде "для чуства превосходства над пользователями" - не пакостить ..  а просто ..  чуствовать превосходство .. но я согласен, это в некоторой мере "пакость" ..


 
kaZaNoVa ©   (2004-11-06 23:43) [75]

Игорь Шевченко ©   (06.11.04 23:33) [72]
я сперва, даже написал подробный пример , по всем способам "hide", потом подумал, а что если каждый школьник, тока начавший изучать программирование, будет его юзать .. начнётся хаос, который невозможно будет остановить ....
и бросил эту затею ..


 
Gero ©   (2004-11-06 23:44) [76]


> Piter ©   (06.11.04 22:12)


> Ответ: а зачем?

"а зачем" - лишнее.
Дурной тон, однако.


 
kaZaNoVa ©   (2004-11-06 23:47) [77]

Gero ©   (06.11.04 23:44) [76]
чтобы "потравить" вирусо/троянописателей :)


 
Gero ©   (2004-11-06 23:49) [78]


> чтобы "потравить" вирусо/троянописателей

Это ты о чем?


 
kaZaNoVa ©   (2004-11-06 23:50) [79]

Gero ©   (06.11.04 23:49) [78]
о слове "а зачем" - лишнее.
- чтоб неповадно им было спрашивать


 
Gero ©   (2004-11-06 23:53) [80]


> kaZaNoVa ©   (06.11.04 23:50)

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


 
kaZaNoVa ©   (2004-11-06 23:54) [81]

Gero ©   (06.11.04 23:53) [80]
ок ..  ухожу из этой ветки ..


 
Gero ©   (2004-11-06 23:56) [82]


> Piter ©   (06.11.04 19:36)

Чем тебе не понравился мой вариант ответа на вопросы про Firewall и пр.?


 
Игорь Шевченко ©   (2004-11-06 23:56) [83]

kaZaNoVa ©   (06.11.04 23:41) [74]

Совершенно разумные слова :) Но обычно чувство собственного превосходства достигается результатом самостоятельного поиска решения, а не готовым ответом из форума, не так ли ? :)


 
wisekaa ©   (2004-11-07 00:11) [84]

>> Как самому написать Sniffer
>> Как самому написать Proxy
>> Как самому написать FireWall

Может просто перчислить области знаний, которые нужно приобрести, что-бы создать подобные вещт


 
Piter ©   (2004-11-07 02:06) [85]

YurikGL ©   (06.11.04 23:33) [73]
Есть предприятие, где нужно удаленное управление. В нем работают в том числе программисты. А начальству и системному администратору нужно ими иногда управлять. А программистам иногда нужно снимать сервисы


все это решается ГРАМОТНОЙ раздачей прав

Gero ©   (06.11.04 23:44) [76]
"а зачем" - лишнее.
Дурной тон, однако


учту

Gero ©   (06.11.04 23:56) [82]
Чем тебе не понравился мой вариант ответа на вопросы про Firewall и пр.?


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


 
Gero ©   (2004-11-07 08:56) [86]


> Piter ©   (07.11.04 02:06)

В [35] ты дал вопросы только по сетям и базам.
А по VCL, COM, графике и пр. вопросов нет?


 
Anatoly Podgoretsky ©   (2004-11-07 09:13) [87]

Piter ©   (07.11.04 02:06) [85]
Просто есть такой момент, скажешь человек "у тебя не получится" - он только обидется.

А ты так не говори, а скажи, что данные вопросы не для FAQ и требуют сильной подготовки. В FAQ заносятся часто задаваемые вопрос и что важно, полученные на них ответы, по русски ЧАВО
А то что ты делаешь называется не ЧАВО, а Tips and Tricks - трюки и советы, то есть сборник советов, но никак не ЧАВО.


 
Гарри Поттер ©   (2004-11-07 12:07) [88]

К FAQ больше относятся вопросы: "Поскажите бесплатный хостинг со всеми наворотами", "Почему не работает кладовка?" и т.п.


 
Piter ©   (2004-11-07 12:14) [89]

Anatoly Podgoretsky ©   (07.11.04 9:13) [87]
А то что ты делаешь называется не ЧАВО, а Tips and Tricks - трюки и советы, то есть сборник советов, но никак не ЧАВО.


ну пусть будет так. Имхо, намного полезей. А как называть - дело десятое

Gero ©   (07.11.04 8:56) [86]
В [35] ты дал вопросы только по сетям и базам.
А по VCL, COM, графике и пр. вопросов нет?


Блин, ты думаешь я сам вопросы придумываю? Я беру вопросы из той ветки.
Кстати, на текущие вопросы ответов пока никто и не дал. Вот так то. А нафлудили уже на три страницы...

Итак, список вопросов на которые было бы неплохо получить ответы:

Как эмулировать нажатие клавиши

Как перенести/установить/настроить алиасы BDE на другой компьютер
Как нормализовать вид ScrollBar (90% ответ - Fetchall :))
Вопрос про точное хранение денежных сумм и т.п.
Как в выпадающий список DBComboBox вывести все значения поля из таблицы?
Как вставить TCheckBox в поле DBGrid ?
Как раскрасить отдельные строки в TDBGgrid


Где взять proxies.pas


 
kaZaNoVa ©   (2004-11-07 12:27) [90]

Piter ©   (07.11.04 12:14) [89]
О Proxies.dcu (Proxies.pas) один раз и на всегда...

Выдержка из ru.delphi.faq, к которой нечего больше добавить:

"Просто реорганизуйте ваш проект на использование runtime пакетов и добавьте "DesignIDE" к вашему списку runtime пакетов. Proxies находится здесь, и вам не нужен исходный текст вообще."

Почему это сделано? Просто для уверенности, что вы не сможете распространять design time части (property editors, component editors), это запрещено по лицензии. DesignIDE.bpl не является свободно распространяемым, вы имеете право использовать его только на машине на которой установлена Delphi, подобно Component libraries.

http://blog.gregor.ru/2004/10/13/1/index.html


 
kaZaNoVa ©   (2004-11-07 12:47) [91]

Удалено модератором
Примечание: Не надо ссылок на этот сайт


 
Piter ©   (2004-11-07 21:05) [92]

Не понимаю, откуда у меня такая страсть к большим текстам... ужас какой-то. Вот в общем, написал про RAS - разбирался блин целый день, область совсем не знакомая была. Прошу проконтролировать уважаемую общественность. А также прошу эту самую общественность активнее помогать отвечать на другие вопросы :)
Итак, вот что получилось

Вопрос: как установить - разорвать соединение DialUp

Ответ: нужно воспользоваться функциями RAS - Remote Access Service. Но проблема в том, что хотя в WIN32SDK.HLP есть описание функций из этого набора в главе "Remote Access Service Functions", но файлов импорта в поставке Delphi нету. Поэтому вы можете вручную экспортировать нужные функции из "rasapi32.dll" пользуясь справкой Delphi и MSDN, но гораздо эффективнее и умнее будет взять переведенные файлы импорта с проекта http://www.delphi-jedi.org/, в данное время точный URL для загрузки файлов импорта RAS - ftp://delphi-jedi.org/api/RAS.zip

В набор входит несколько юнитов: Ras.pas, RasAuth.pas, RasDlg.pas, RasError.pas, RasSapi.pas, RasShost.pas, и дополнительные юниты: RasUtils.pas, RasHelperClasses.pas, а также файлы из папки DEMOS с нужными константами: Lmcons.pas, LmErr.pas.

Можно эти юниты переписать по какому-нибудь пути, известному Delphi, например записать все перечисленные файлы в каталог {Каталог_Delphi}/lib и дальше просто подключать к любым программам эти модули, например:

uses
 ..., Ras, RasUtils, RasHelperClasses;


В RasHelperClasses.pas реализованы очень полезные классы, например TRasDialer, TRasPhonebook, TRasConnectionsList, с применением которых и построен демонстрационный пример RasDemo.dpr.

TRasDialer - инкапсулирует в себе соединение, после настройки можно устанавливать, разъединять соединение, следить за процессом установления соединения

TRasPhonebook - служит для управление существующими соединениями, позволяет создавать новые, удалять существующие соединения, переименовывать, настраивать параметры соединений

TRasConnectionsList - служит для управления текущими установленными соединениями.

У меня только одно замечание по исходному коду RasDemo.dpr. Там в обработчике события TMainForm.PBDialBtnClick идет настройка TRasDialer по записи из TRasPhonebook методом

RasDialer.Assign(RasPhonebook[Selected.Index]);

Но реализация метода Assign такова, что имени соединения присваивается пустая строка:

procedure TRasDialer.Assign(Source: TPersistent);
...
 FParams.szEntryName := "";
...


С точки зрения RAS установка соединения с такими параметрами будет идти как независимое соединение. То есть, фактически от выбранного соединения копируются номер дозвона, номер обратного вызова, имя пользователя, пароль и домен. И устанавливается новое соединение с такими параметрами, которое к выбранному соединению никакого отношения не имеет. Но у выбранного соединения могут быть установлены необходимые для дозвона свойства, типа "Сценарий" или "Ручной набор номера".
Поэтому чтобы перенять и эти параметры, надо присвоить устанавливаемому соединению имя, аналогичное имени нужного существующего соединения. Например, переделать пример RasDemo.dpr таким образом:

procedure TMainForm.PBDialBtnClick(Sender: TObject);
var
 NewDialParam: TRasDialParams;
begin
 with PhonebookListView do
   if (Selected <> nil) then
   begin
     RasDialer.Assign(RasPhonebook[Selected.Index]);

     NewDialParam := RasDialer.Params ;
     StrPCopy(NewDialParam.szEntryName, RasPhonebook[Selected.Index].Name);
     RasDialer.Params := NewDialParam ;


     UserNameEdit.Text := RasDialer.UserName;
     PasswordEdit.Text := RasDialer.Password;
     PhoneNumberEdit.Text := RasDialer.PhoneNumber;
     PageControl1.ActivePage := TabSheet3;
   end;
end;


И в конце хочу сделать пару замечаний:

1) скорее всего, в NT системах вы не узнаете пароля от соединения. В поле пароля будут просто зведочки. Чтобы установить соединение с паролем по умолчанию (если он сохраняется) нужно оставить пароль пустым

2) если вы хотите набрать номер в импульсном наборе, а у вас набирается в тоновом - то нужно просто поставить символ "p" (от слова "pulse") перед номером, например "p1055555". Символ "w" обозначает ожидание гудка в линии, например, при наборе через АТС "9w1055555".

Отвечал: Piter


 
P.N.P. ©   (2004-11-07 23:25) [93]

Как отправить письмо с вложением

вот, выдрал из своего проекта - кто автор не знаю к сожалению


uses MAPI
..
function SendMail(const From, Dest, Subject, Text, FileName: PChar;
Outlook: boolean):Integer;
var
 Message: TMapiMessage;
 Recipient, Sender: TMapiRecipDesc;
 File_Attachment: TMapiFileDesc;

 function MakeMessage: TMapiMessage;
 begin
   FillChar(Sender, SizeOf(Sender), 0);
   Sender.ulRecipClass := MAPI_ORIG;
   Sender.lpszAddress := From;

   FillChar(Recipient, SizeOf(Recipient), 0);
   Recipient.ulRecipClass := MAPI_TO;
   Recipient.lpszAddress := Dest;

   FillChar(File_Attachment, SizeOf(File_Attachment), 0);
   File_Attachment.nPosition := Cardinal(-1);
   File_Attachment.lpszPathName := FileName;

   FillChar(Result, SizeOf(Result), 0);
   with Message do begin
     lpszSubject := Subject;
     lpszNoteText := Text;
     lpOriginator := @Sender;
     nRecipCount := 1;
     lpRecips := @Recipient;
     nFileCount := 1;
     lpFiles := @File_Attachment;
   end;
 end;

var
 SM: TFNMapiSendMail;
 MAPIModule: HModule;
 MAPI_FLAG: Cardinal;
begin
 if Outlook then
  MAPI_FLAG:=MAPI_DIALOG
 else
  MAPI_FLAG:=0;
 MAPIModule := LoadLibrary(PChar(MAPIDLL));
 if MAPIModule = 0 then
   Result := -1
 else
   try
     @SM := GetProcAddress(MAPIModule, "MAPISendMail");
     if @SM <> nil then begin
       MakeMessage;
       Result := SM(0, Application.Handle, Message, MAPI_FLAG, 0);
     end else Result := 1;
   finally
     FreeLibrary(MAPIModule);
   end;
end;



 
P.N.P. ©   (2004-11-07 23:31) [94]

Забыл пример использования :)
SendMail("from_mail@server.com","to_mail@server.com","Subject","Body","c:\MyFile.txt",true);


 
Piter ©   (2004-11-08 12:18) [95]

P.N.P. ©   (07.11.04 23:25) [93]

спасибо


 
Piter ©   (2004-11-09 18:45) [96]

Ответы, кстати, до сих пор принимаются...


 
Gero ©   (2004-11-09 19:02) [97]


> Piter ©   (09.11.04 18:45)

Обязательно писать свое или можно взять чужое с копирайтом?


 
Piter ©   (2004-11-09 19:57) [98]

Я даже не знаю. Смотря откуда копирайт :)


 
Piter ©   (2004-11-09 19:58) [99]

Ну ты приведи ответ - а я подумаю


 
jack128 ©   (2004-11-09 20:47) [100]

Piter ©   (07.11.04 21:05) [92]
я не думаю, что использование сторонних классов в FAQ - это есть good. Только хедер апи функций, но не классы. ИМХО, конечно ;-)

Piter ©   (07.11.04 12:14) [89]
Как раскрасить отдельные строки в TDBGgrid


DBGrid1.DefaultDrawing := False;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
 Grid: TDbGrid;
begin
 Grid := Sender as TDBGrid;
 if (Grid.DataSource.DataSet.RecNo mod 2) = 0 then
   Grid.Canvas.Brush.Color := clRed;
 Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


 
Piter ©   (2004-11-09 22:54) [101]

jack128 ©   (09.11.04 20:47) [100]
я не думаю, что использование сторонних классов в FAQ - это есть good. Только хедер апи функций


ну в чем то я с тобой согласен, но... Ты видел те классы? Они ОЧЕНЬ логичные и правильные, мне по крайней мере жутко понравились, все написано очень понятно и достойно (правда, данной проблеме я посвятил день, что много для меня, но мало, чтобы кардинально разобраться в этом вопросе) - так что не так уж и страшно. Там все очень прозрачно.

jack128 ©   (09.11.04 20:47) [100]

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


 
Piter ©   (2004-11-10 00:35) [102]

jack128 ©   (09.11.04 20:47) [100]
DBGrid1.DefaultDrawing := False;


а зачем? У меня и при True все нормально раскрашивается...

P.N.P. ©   (07.11.04 23:25) [93]

у меня этот код не работает


 
P.N.P. ©   (2004-11-10 00:56) [103]

Piter ©   (10.11.04 00:35) [102]
Этот код будет работать при почтовой программе по умолчанию - Outlook express


 
jack128 ©   (2004-11-10 01:04) [104]

Piter ©   (10.11.04 0:35) [102]
У меня и при True все нормально раскрашивается...

Ага - два раза подряд ;-)  Один раз - рисует сам грид, а потом вызывается OnDrawColumnCell, в котором закраска по новой делается..


 
jack128 ©   (2004-11-10 01:13) [105]

Piter ©   (09.11.04 22:54) [101]
примером эмуляции клавиш


В общем то даже проще, чем с мышой..
procedure PressKey(Key: byte); //Key - virtual-key code
begin
 keybd_event(Key, 0, 0, 0);
 keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;


 
Piter ©   (2004-11-10 19:05) [106]

P.N.P. ©   (10.11.04 0:56) [103]
Этот код будет работать при почтовой программе по умолчанию - Outlook express


нифига подобного. Не при мыше, не при аутлуке не работает...


 
kaZaNoVa ©   (2004-11-12 20:03) [107]

Удалено модератором
Примечание: На хакерские сайты


 
Piter ©   (2004-11-15 21:13) [108]

Есть пример от Rouse как определить MAC адрес по IP. Теперь интересует вопрос:
как определить IP адрес по MAC адресу?

Плюс интересно как определить MAC адрес локального компьютера


 
kaZaNoVa ©   (2004-11-15 21:28) [109]

Piter ©   (15.11.04 21:13) [108]
а когда  примерно будет готов FAQ  и где он будет доступен ?


 
Игорь Шевченко ©   (2004-11-15 21:41) [110]


> и где он будет доступен ?


Наверху есть ссылочки - Новости, Поиск, FAQ... Вот там и будет :)


 
Piter ©   (2004-11-15 23:22) [111]

kaZaNoVa ©   (15.11.04 21:28) [109]
а когда  примерно будет готов FAQ  и где он будет доступен ?


я не понимаю определения "готов FAQ". Это такая вещь, которая не может быть готова, она по определению постоянно дополняема. Я пока обработал 24 вопроса.

Но мне уже смешно - я не могу разместить FAQ на этом сайте. Мне самому приходится долбиться в аськи, на мыло McSimm"у, Panov"у чтобы хоть узнать как оно там. Меня перекидывают от одного к другому, на письма не отвечают, в аське в инвизибле сидят.

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


 
Piter ©   (2004-11-15 23:23) [112]

Игорь Шевченко ©   (15.11.04 21:41) [110]
Наверху есть ссылочки - Новости, Поиск, FAQ


у кого есть - а у кого и нету :)


 
miwa ©   (2004-11-15 23:37) [113]


> у кого есть - а у кого и нету :)

Э, это уже... блин, как же это по-русски... неочевидная реклама... нет, не то... "прихована реклама", короче :о))


 
jack128 ©   (2004-11-15 23:53) [114]

miwa ©   (15.11.04 23:37) [113]
блин, как же это по-русски... неочевидная реклама...

"Скрытая" реклама??  Ну этот "тонкий" намек толшиной с приличное бревно врядли так можно назвать. ;-)

Думаю Питер может не только в программисты, но в рекламщики теперь пойти :-))


 
miwa ©   (2004-11-15 23:59) [115]


> "Скрытая" реклама??  

Точно, спасибо. Теперь засну спокойно :о))


> Думаю Питер может не только в программисты, но в рекламщики
> теперь пойти :-))

Незаменимый человек, короче. А еще пережывает, что работу найти не может. Да брось ты, Миша - тебя в любой рекламный отдел с руками оторвут ;о))


 
Anatoly Podgoretsky ©   (2004-11-16 00:36) [116]

Piter ©   (15.11.04 23:22) [111]
У меня полное ощущение, что я пытаюсь долг в $1000 с них взять,

А пытался?

Не может у сайта быть будущего при таком раскладе и такой нехватки времени.

Нельзя жить в обществе без цветовой дифернциации штанов.


 
hjhjhj   (2004-11-16 01:49) [117]

Мне кажется, что традиционно факи привязаны
к какой-нибудь отдельно  взятой  конференции.
В эпоху  USENET"а модераторы конференций периодически выпускали
факи, чтобы каждый мог быстро найти ответ,
не подписываясь на данную конференцию (это экономило и траффик,
и время людей, которые там тусовались),
и чтобы он быстро мог получить представление
о предмете конфы и об ее уровне.
Они (факи) так и назывались - "фак конференции такой-то".
Так что ответы там давались в такой же манере и в том же объеме, как и на конференции.
(То есть, нет ничего дурного в том, что-бы за вопросы
типа "как написать сниффер/логгер/...",
посылать куда подальше (ведь на форуме за это тоже посылают),
либо послать искать самому нужную инфу.)
Вобщем, то что делает Piter
- это не
собственно фак, а скорее сборник рецептов, knowledge base типа.
Не будучи лицом отдельно взятого сайта,
то есть не имея вышеназванных функций, фак становится
либо никому не нужным, либо настолько трудоемким проектом
(ведь у базы знаний есть претензия на выверенность и всеобъемлемость),
что на нем не грех косить бабло.
(Всё IMHO)
:)


 
Piter ©   (2004-11-16 22:37) [118]

Итак, люди! Давайте активнее:

1) Как перенести/установить/настроить алиасы BDE на другой компьютер

2) Как вставить TCheckBox в поле DBGrid ?

3) Где взять proxies.pas - я не знаю что это такое даже, поэтому пожалуйста если можно сформулируйте точный и грамотный ответ. Знаю, что можно подсунуть какой-то левый модуль... интересует верный ответ и этот модуль, какие недостатки его использования.

4) Как узнать локальный МАС локального компьютера

5) Как отправить письмо с вложением


 
Gero ©   (2004-11-16 22:43) [119]


> 3) Где взять proxies.pas

Прочитай [39] пост.


 
Piter ©   (2004-11-16 22:48) [120]

Там было обсуждение... а мне нужен четкий, грамотный ответ


 
Gero ©   (2004-11-16 22:53) [121]


> Piter ©   (16.11.04 22:48)

Вопрос:
Где взять 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.

(c) Rouse_

(из той ветки)


 
Verg ©   (2004-11-16 22:55) [122]


> 4) Как узнать локальный МАС локального компьютера


МАС адрес - не есть принадлежность компьютера. Это есть физический адрес (канальный) сетевой карты (физического сетевого интерфейса). Он так же динамически назначается для PPP адаптеров (RAS, будь он неладен) после их успешного подключения к DialUP серверу.

Надо говорить словами, сколько сетевых интерфесов может быть у компа?

В статьях есть Rouse_: "Мониторинг сетей" - там есть это все и уже ОЧЕНЬ давно! Посмотри по ключевому слову "GetIfTable".


 
jack128 ©   (2004-11-16 23:59) [123]

Piter ©   (16.11.04 22:37) [118]
2) Как вставить TCheckBox в поле DBGrid ?

Вот как ОТОБРАЖАТЬ колонку c типом поля BOOLEAN в гриде

DBGrid1.DefualtDrawing := False;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
 Flags: Integer;
begin
 if Column.Field.FieldName = "SEX" then
 begin
   Flags := DFCS_BUTTONCHECK;
   if UpperCase(Column.Field.Value) = "МУЖСКОЙ" then
     Flags := Flags or DFCS_CHECKED;
   with TDBGrid(Sender).Canvas do
   begin
     Brush.Color := TDBGrid(Sender).Color;
     FillRect(Rect);
     DrawFrameControl(Handle, Rect, DFC_BUTTON, Flags)
   end
 end
 else
   TDbGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
а вот для редактирования необходимо внедрять TCheckBox в грид. Как? Это (и не только это) расписано вот в этой статье http://www.delphikingdom.com/asp/viewitem.asp?catalogid=806#02


 
Piter ©   (2004-11-17 00:35) [124]

Gero ©   (16.11.04 22:53) [121]

да, я читал... там Юрий Зотов дал хорошее объяснение, имхо. Но он написал:

>Но способ с "урезанным" Proxies все же опасен

а все таки - почему данный способ опасен?

И вообще - расскажите, что за модуль такой? Зачем он нужен? Этот вопрос вообще куда сувать - в сети или основные? Или базы? :)

Verg ©   (16.11.04 22:55) [122]
МАС адрес - не есть принадлежность компьютера


ну понятно. Я естественно хотел сказать - как узнать MAC адрес сетевой карты, установленной на компьютере...


 
jack128 ©   (2004-11-17 01:22) [125]

Piter ©   (17.11.04 0:35) [124]
Этот вопрос вообще куда сувать - в сети или основные? Или базы? :)

В компоненты, очевидно.



Страницы: 1 2 3 4 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.86 MB
Время: 0.038 c
8-1094316563
Sfinks
2004-09-04 20:49
2004.12.05
Анимированый *.jif


3-1099831137
Apophis
2004-11-07 15:38
2004.12.05
Отчет через MSWord


1-1100852111
Torin
2004-11-19 11:15
2004.12.05
Чтение/запись строк в поток


14-1100607738
][ackTool
2004-11-16 15:22
2004.12.05
Графика


1-1101207665
Руслана
2004-11-23 14:01
2004.12.05
Подскажите как в компоненте TListView проверить состояние





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский