← Октябрь 2001 → | ||||||
1
|
2
|
3
|
4
|
6
|
7
|
|
---|---|---|---|---|---|---|
8
|
9
|
11
|
12
|
13
|
14
|
|
15
|
16
|
17
|
19
|
20
|
21
|
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
За последние 60 дней 2 выпусков (1-2 раза в 2 месяца)
Сайт рассылки:
http://www.interface.ru, www.itshop.ru
Открыта:
16-01-2001
Адрес
автора: comp.soft.win.mydelphi-owner@subscribe.ru
Статистика
-3 за неделю
Проблемы и решения в Delphi #29
Проблемы и решения в Delphi - выпуск 32 от 10.10.2001.
Что такое секс на работе, по настоящему
узнаешь только в понедельник.
ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС
Доброго Вам времени суток уважаемый читатель.
Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
2. Отвеченные вопросы.
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
---------------------
Вопрос 508:
От: Mickle
Дано: есть компонент типа TTreeView TreeView1
Цель: возможность нарисовать около каждой ветви рисунок TBitMap. Я рисую
через канвас т.е.
Решение: Ставим приведённую ниже процедуру на событие
TreeView1AdvancedCustomDrawItem, (вызывается при перерисовке ветвей)
таким образом:
procedure TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
 Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
 var PaintImages, DefaultDraw: Boolean);
var BitMap:TBitMap;
  NodeRect:TRect;
begin
with Node do
begin
 // Определяем координаты куда рисовать
 NodeRect:=DisplayRect(True);  // на строке данной ветки, но: True -
сразу слева от ветки, False - справа от границы компонента
 BitMap:=TBitMap.Create;
 try
  ImageList1.GetBitMap(1,BitMap);  // загружаем в битовую карту
изображение из компонента TImageList
  TreeView.Canvas.Draw(NodeRect.Left,NodeRect.Top,BitMap);  //
Собственно рисуем
 finally
  BitMap.Free;   // освобождаем память уже от ненужного компонента
 end;
end;
end;
Проблема: Всё работает отлично, но!!! при рисование канвой изображения,
ШРИФТ ВЕТКИ МЕНЯЕТСЯ на уродливый System, не знаю чего с ним делать.
Если есть идеи, напишите.
P.S. Canvas.Font не помогает. Помогает только
Canvas.Font.Assign(TreeView1.Font) но только для текущей ветки, когда с
неё переключаеь на другую, "старая" снова меняется на System :(((
Ответить.
Ответ 1:
Вопрос 509:
От: Овечкин Денис
Не подскажет ли кто ни будь, возможно ли программно переключить какой
ни будь параметр в BIOS и желательно из Delphi. Если возможно то
хотелось бы кусочек кода с примером.
Ответить.
Ответ 1:
Вопрос 510:
От: MyPortal Inc.
Каким образом можно из программы зарегистрировать
собственные типы файлов, (имеется ввиду по их расширению),
что бы при клике на этих файлах вызывалось мое приложение,
и соответственно к ним цеплялась "родная" иконка приложения.
Старый метод (самопальный) в 6-ом Делфи не работает:
// Процедура регистрации файлового типа программы
procedure RegisterFileType( ft, key, desc, icon, prg : string );
var
 myreg : TRegIniFile;
 ct : Integer;
begin
 ct := pos('.',ft);
 while ct > 0 do begin
    System.Delete(ft,ct,1);
    ct := pos('.',ft);
 end;
 if (ft = '') or (prg = '') then exit;
 ft := '.'+ft;
 myreg := TRegIniFile.Create('');
 try
   myreg.rootkey := hkey_classes_root;
   if key = '' then key := copy(ft,2,maxint)+'_auto_file';
   myreg.writestring(ft,'',key);
   myreg.writestring(key,'',desc);
   if icon <> '' then
    myreg.writestring(key+'\DefaultIcon','',icon);
   myreg.writestring(key+'\shell\open\command','',prg+' "%1"');
 finally
   myreg.Free;
 end;
end;
Ответить.
Ответ 1:
Вопрос 511:
От: MyPortal Inc.
Кто нибудь сможет подсказать технологию построения
самораспаковывающихся файлов, т.е., что бы я из
своего приложения мог построить exe-файл и при
запуске последнего он сам из себя доставал
какие нить файлы, пусть даже без компресии.
Например пишется готовый exe-шник, и к нему
прoстым copy (или через Fstream), цепляется
какой нить файл, а при запуске последнего,
"хвостик" отделяется в отдельный нармальный файл.
Ответить.
Ответ 1:
Вопрос 512:
От: corp
У меня к Вам просьба, помогите разобраться с проблемой!
Есть DLL написанная в то ли C++ Builder, то ли в Borland C++ 5.02
В описании сказано, что совместима со средствами разработки приложений
фирмы Borland.
У меня есть документация со списком экспортируемых функций из этой DLL.
Подключить я смогу эту библиотеку, но для меня проблема как можно
перевести (ведь нужно описать) эти функции в Delphi?
Извиняюсь за такой объем :(
Зараннее спасибо, Светлана.
          
Вот список экспортируемых функций DLL :
--
Подключиться к устройству.
BOOL CPSO_ConnectToHW();
Возвращаемое значение - FALSE, если были ошибки при открытии порта.
--
Установить параметры и подключиться к устройству.
BOOL CPSO_ConnectWithProp(LPCTSTR szPortName,
             UINT HWType,
             UINT ChCount,
             UINT OutputChCount,
             double dTiming,
             UINT nSamplesToSkip = 0);
Возвращаемое значение  FALSE, если были ошибки при открытии порта.
szPortName       Имя порта как строковая переменная
оканчивающаяся нулевым байтом (напр. "COM1", "COM2", и т.д.)
HWType         Tип протокола устройства. Целое без знака. 0 -
тип L. 1 - тип A.
ChCount         Количество входных каналов.
OutputChCount      Количество выходных каналов.
dTiming         Интервал времени между соседними выборками,
получаемыми из устройства.
nSamplesToSkip     Количество выборок, опускаемых при программном
прореживании.
--
Отключиться от устройства.
void CPSO_DisconnectFromHW();
--
Преобразовать время из внутреннего формата в строковый как абсолютное
время.
void CPSO_FormatAbsTime(double TimeInSeconds,
            LPTSTR sz);
TimeInSeconds      Время в секундах, в формате как оно передается в
пользовательские функции приема данных и алгоритма управления.
sz           Адрес буфера пользователя, куда будет помещена
строка в формате HH:MM:SS.FFFFF , где HH - часы, MM - минуты, SS -
секунды, FFFFF - дробная часть секунд. Строка оканчивается нулевым
байтом.
--
Преобразовать время из внутреннего формата в строковый как относительное
время.
void CPSO_FormatRelTime(double TimeInSeconds,
            LPTSTR sz);
TimeInSeconds      Время в секундах, в формате, как оно передается
в пользовательские функции приема данных и алгоритма управления.
sz           Адрес буфера пользователя, куда будет помещена
строка в формате HH:MM:SS.FFFFF , где HH - часы, MM - минуты, SS -
секунды, FFFFF - дробная часть секунд. Строка оканчивается нулевым
байтом.
--
Включить/отключить выдачу сообщений об ошибках на зкран (в виде
MessageBox).
void CPSO_PopupErrorMessages(BOOL bDisplay);
bDisplay - если TRUE, то при возникновении ошибки обращения к порту
показывать сообщения и возвращать значение FALSE из функций интерфейса.
Если FALSE, то только сигнализировать возвращаемым значением переменной
типа BOOL.
--
Задать данные для вывода.
void CPSO_PutDataForWriting(signed short *WSampleBuffer);
WSampleBuffer      Указатель на буфер, из которого будут
скопированы данные для вывода. Хотя в данный момент число каналов на
вывод ограничено 8-ю, воизбежание проблем совместимости с будущими
версиями следует выделять буфер размером 64 шестнадцатиразрядных слов.
--
Задать функцию алгоритма автоматического управления
void CPSO_SetUpACLoopProc(LPVOID pACLoopProc);
pACLoopProc       Указатель на функцию пользователя, в которой
выходное воздействие определяется как результат операции над входными
данными.
Функция пользователя должна быть определена как:
BOOL ACLoopProc(double dInputTime,
        unsigned short * InputCodeSample,
        signed short * OutputCodeSample);
где:
Возвращаемое значение  Следует устанавливать TRUE. Устанавливайте
FALSE, если хотите сэкономить процессорное время, в случаях когда данные
реально не изменились с момента последнего обращения.
dInputTime       Время на момент приема текущей выборки.
InputCodeSample     Адрес массива, из которого могут быть прочитаны
последние принятые данные.
OutputCodeSample    Адрес массива, в который необходимо поместить
данные для вывода.
Примечание:       Длина обоих массивов равна 64
шестнадцатиразрядных слов. Решение о том, с какими элементами следует
работать, принимается иходя из заданного числа каналов. См.
CPSO_SetHWProp и CPSO_ConnectWithProp . (Внимание!! Не следует хранить
адреса этих массивов и ссылаться на них после завершения функции!)
--
Установить параметры.
void CPSO_SetHWProp(LPCTSTR szPortName,
          UINT HWType,
          UINT ChCount,
          UINT OutputChCount,
          double dTiming,
          UINT nSamplesToSkip = 0);
szPortName       Имя порта как строковая переменная
оканчивающаяся нулевым байтом (напр. "COM1", "COM2", и т.д.)
HWType         Tип протокола устройства. Целое без знака. 0 -
тип L. 1 - тип A.
ChCount         Количество входных каналов.
OutputChCount      Количество выходных каналов.
dTiming         Интервал времени между соседними выборками,
получаемыми из устройства.
nSamplesToSkip     Количество выборок, опускаемых при программном
прореживании.
--
Задать функцию, принимающую данные.
void CPSO_SetUpReceiverProc(LPVOID pReceiverProc);
pReceiverProc      Указатель на функцию пользователя, в которой
принятые данные будут передаваться для последующей обработки.
Функция пользователя должна быть определена как:
BOOL ReceiverProc(double dInputTime, unsigned short * InputCodeSample);
где:
Возвращаемое значение  Обычно следует возвращать TRUE. Устанавливайте
FALSE, если пользовательская программа занята и не успевает обработать
текущую выборку. Передача этой выборки будет повторена.
dInputTime       Время на момент приема текущей выборки.
InputCodeSample     Адрес массива, из которого пользователь может
прочитать последние принятые данные. Длина массива равна 64
шестнадцатиразрядных слов. Однако действительны только первые его
элементы, столько, чему равно количество входных каналов.
--
Установить прореживание.
void CPSO_SetSkipping(UINT nSamplesToSkip);
nSamplesToSkip     Количество выборок, опускаемых при программном
прореживании. Если 0, принимается каждая выборка (максимально подробный
режим сбора).
--
Установить текущий момент вренени как начальный.
void CPSO_SetStartTimeToCurrent();
Примечание:       Начальный момент времени это начало отсчета
шкалы времени, относительно которого определяется момент прихода
очередной выборки. Данные этой выборки и информация о времени ее прихода
передаются в соответствующие пользовательские функции.
Ответить.
Ответ 1:
Вопрос 513:
От: nErv
Может наглая просьба, но ни у кого нет исходника игры
"крестики-нолики" на Делфи? Мне просто хочется разобраться на примере
с некоторыми функциями...
Ответить.
Ответ 1:
Вопрос 514:
От: ILYA
Как сделать так, что бы картинка, которая отображается в
Image уменьшалась до нужного размера ?
Please с примером.
Ответить.
Ответ 1:
Вопрос 515:
От: MyPortal Inc.
Очень нужна помощь. Не работает следующая процедура:
function GetInetFile(const fileURL, FileName : String) : boolean;
const BufferSize = 1024;
var hSession, hURL : hInternet;
Buffer : array[1..BufferSize] of Byte;
BufferLen : DWORD;
f : file;
sAppName : string;
begin
    Result:=False;
    sAppName:=ExtractFileName(Application.ExeName);
hSession:=InternetOpen(PChar(sAppName),INTERNET_OPEN_TYPE_PRECONFIG,
    nil,nil,0);
    try
      hURL:=InternetOpenURL(hSession,
      Pchar(fileURL),nil,0,0,0);
      try
       AssignFile(f,FileName);
       Rewrite(f,1);
       repeat
         InternetReadFile(hURL, @Buffer,
SizeOf(Buffer),BufferLen);
         BlockWrite(f,Buffer,BufferLen)
       until BufferLen = 0;
       CloseFile(f);
       Result:=True;
      finally
      InternetCloseHandle(hURL)
      end
    finally
    InternetCloseHandle(hSession)
    end
end;
Ответить.
Ответ 1:
Вопрос 516:
От: Danil
Вопрос:
Куда в проект можно запихнуть иконки, чтобы можно
было обратиться ним, например,
так "icon=delphi_project.exe,2"
пример: explorer.exe - и прога (не просто dll с иконками),
и иконки
содержит (я, конечно, понимаю, что explorer - не на Delphi)
Ответить.
Ответ 1:
Вопрос 517:
От: Danil
как передать сообщение WinAMP"у?
Понятно, что через sendmessage, а как получить handle окна
и какие там
параметры? (например, клавишу V aka стоп).
Ответить.
Ответ 1:
Вопрос 518:
От: Andrey
Привет, у меня вопрос не совсем по Delphi он по Turbo Pascal. У меня
проблема надо запустить несколько процедур как отдельные процессы. Т.е.
каждая процедура должна выполнятся как отдельный процесс независимо от
других частей программы. Я думаю, что для этого необходимо перехватить
прерывание от таймера (int 8h). Как это сделать не знаю. Если кто знает
как
это сделать то подскажите нужно позарез.
Ответить.
Ответ 1:
Вопрос 519:
От: Тарасов Дмитрий Владимирович
Подскажите как в DBGrid, используя список PickList поля для
выборки заготовленных значений, запретить пользователю
вводить значения вручную(т.е. чтобы можно было только из
заготовленного списка)? Если это возможно.
Или, может другой Grid какой это умеет?
Ответить.
Ответ 1:
Вопрос 520:
От: Sergey Smirnow
Мне надо чтобы при нажатии на Button1 на моей форме, в консольном
приложении(сеанс "мс-дос") зная его handle был нажат enter(то есть
осуществлен переход на следующую строку). Знаю что это делается через
виртуальные коды, но не знаю как. икто исходник не подкинет?
Ответить.
Ответ 1:
2. Отвеченные вопросы.
----------------------
Вопрос 411:
От: Ефремов Александр
У меня есть один существенный вопрос. Наверняка
каждый из Вас рано или поздно загорался желанием убрать Вашу прогу из
Alt+Ctrl+Del. Делается это просто:
if not (csDesigning in ComponentState) then
 RegisterServiceProcess(GetCurrentProcessID, 1);
Но при всем при этом программа все же остается работающим ПРОЦЕССОМ в
системе, т.е. любой программкой отображением процессов ее можно
обнаружить, а значит и снять. А в WinNT/2000 вообще можно снимать не
только Задачи, но и останавливать Процессы простым нажатиет
Alt+Ctrl+Del. И вот вопрос: "Нельзя ли как нибудь мою программу
запускать не как самостоятельный процесс, а ПРИКРЕПЛЕННОЙ к какому
нибудь процессу, уже работающему в системе, т.е. запускать два процесса
как один ?" В ОС в любом случае есть процессы, которые запускаются
всегда при ее загрузке, и если к ним прикрепить прогу, то обнаружить ее
уже действительно будет проблематично, а для некоторых пользователей
даже невозможно. Помогите, пожалуйста, справиться с этой нелегкой
задачей. К сожалению там, где я живу (г. Петропавловск-Камчатский) очень
трудно купить хорошую книгу, а книг по WinAPI я сдесь вообще никогда не
встречал, поэтому очень часто приходится бить в бубен. Заранее спасибо.
Ответить.
Ответ 1:
Вопрос 412:
От: Глубокий Александр
Как в StringGriud засунуть картинки.
Так чтобы при изминение в какойто ячейке значение,
картинка менялась. Если можно поподробней.
Ответить.
Ответ 1:
Действовать, по-моему, надо так:
Установить свойство DefaultDrawing = False. При этом, прорисовка ВСЕХ ЯЧЕЕК (и текстовых, и содержащих графику) ложится на обработчик события
OnDrawCell, которое должно в нашем случае выглядеть примерно так (при следующих допущениях для нашего примера - в ячейке [1,1] - некоторое целое
число, в ячейке [2,1] - картинка, которая будет загружаться из файла на диске в текущем каталоге, а само имя файла зависит от значения в [1,1]):
procedure TForm1.OnDrawCell(Sender: TObject; ACol, ARow: Longint; Rect: TRect; State: TGridDrawState);
var
   Pic :TPicture;
begin
   Pic := TPicture.Create;
   case ARow of
      1: case ACol of
         1: // Прорисовываем число
           StringGrid.Canvas.TextOut(Rect.Left+3, Rect.Top+3, StringGrid.Cell[1,1]);
         2: // Теперь картинку
           begin 
              case StrToInt(StringGrid.Cell[1,1]) of
                 1: Pic.LoadFromFile('1.bmp');
                 2: Pic.LoadFromFile('abba.jpg');
                 ........................................................
              end;
              StringGrid.Canvas.Draw(Rect.Left+1, Rect.Top+5, TGraphic(Pic));
              // или так
              // StringGrid.Canvas.StretchDraw(Rect, TGraphic(Pic));
           end;
        end;
      ........................................
   end;
   Pic.Free;
end;
Вопрос 413:
От: Константин Ольта
Стоит Delphi 5 под Windows 2000. При открытии баз DBASE 4 в Desktop
русские буквы представлены иероглифами (в программах все в порядке). Под
Windows 95/98 вношу изменение в Win.ini и все в порядке. Подскажите, что
делать под Windows 2000 и NT?
Ответить.
Ответ 1:
Попробуй в реестре по адресу
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\FontSubstitutes
Ответ 2:
Запусти этот файлик, DBD должен быть выгружен. Помогает и в 9х. :)
REGEDIT4
[HKEY_CURRENT_USER\Software\Borland\DBD\7.0\Preferences\Properties]
"BlankIsZero"="TRUE"
"SystemFont"="Arial Cyr"
Ответ 3:
а можно еще в BDE Administrator
попытаться настроить драйвер DBASE
:'
Вкладка Configuration
Drivers\Native\DBASE
установить там LangDriver "dBASE RUS cp866"
Вопрос 414:
От: otdel21
  При передаче байта через последовательный порт (например, СОМ1)
нужно
определить момент времени, когда через сдвиговый регистр порта был
передан
последний бит данных. Сразу после этого я должен установить сигнал
RTS:=1,
чтобы переключить на прием внешний мультиплексор.
  Функция WinAPI - WaitCommEvent(Form.hCov, EV_TXEMPTY, nil) меня не
устраивает, ибо она формирует событие в момент, когда освободился
регистр
данных, в который можно помещать следующий передаваемый байт.
  Я написал вставку на ассемблере, которая напрямую читает регистр LSR
порта (по адресу $3FD для СОМ1) и в цикле опрашиваю его "6" бит (считая
"0" - младшим, а "7" - старшим) этого регистра, ожидая, когда он
установится
в "1".
  Такой вариант, в принципе, работает под Windows/95/98/Me, но не
выполняется под Windows/NT/2000, ибо эти системы запрещают прикладным
программам не только записывать, но и читать регистры портов напрямую, а
только через WinAPI.
  Подскажите, пожалуйста, как мне решить эту проблему без
ассемблерного
опроса порта, может я не совсем разобрался (по Help-ам) в этом
необъятном
WinAPI ?
Ответить.
Ответ 1:
могу тебе посоветовать попытаться под свою задачу исплользовать библиотеку Async Pro 3.0
Это конечно не панацея от всех бед, но лучшего я пока еще невидел. .(
Вопрос 415:
От: Okulov
: У меня вот такая проблема!! Пишу под OpenGL!!!
Не могу написать коридор состоящий из n-ого колличества полигонов ( а
терерь самое главное)
с правильно наложеной текстурой и светяшими в пол тремя лампами Народ
ПОМОГИТЕ!!!!!! Помогите хоть коридором с текстурой!!!!!!!!
Ответить.
Ответ 1:
Вопрос 416:
От: Mishenka
Где можно скачать компоненты для Delphi?
Ответить.
Ответ 1:
www.torry.net
Вопрос 417:
От: Dr.IMP
Есть два вопроса, на которые хотелось бы получить ответ:
1. Имеется Win2000Server. Подключается уо мне пользователь через модем.
Так
вот, как программно определить, кто это ко мне подключился и как, в
случае
необходимости разорвать это соединение (для исходящих звонков нашел, а
вот
для входящих не получается).
2. Имеется окно какого-нибудь приложения. Как получить хэндл этого окна
я
знаю, а вот как получить хэндл элементов расположенных на этом окне?
конкретно интересуют Edit и Memo (вариант: эдитов и мемо может быть
несколько штук)
Ответить.
Ответ 1:
Вопрос 418:
От: Ефремов Александр
Не подскажет ли кто, существуют ли в Delphi зарезервированные имена
(псевдонимы) для таких папок как Windows, program files и т. п. Если
такие константы есть, подскажите, пожалуйста, в каком файле они
объявлены. Может быть существуют функции для получения псевдонимов или
их можно найти где-нибудь в реестре ?
Ответить.
Ответ 1:
Вопрос 419:
От: В.А.Крашенинников
У меня два вопроса :
  1. Подскажите пожайлуста, можно-ли убрать программу (заголовок) из
панели задач ? ( Я использую ShellApi.TrayIcon, но в панели задач
заголовок
остается, а так никакого смысла вешать прогу в трей {OS - WinME} ).
  2. Пришлите пожайлуста пример ( минимальный, но полностью :-)
программы
без использования VCL.
Ответить.
Ответ 1:
1. Попробуй ShowWindow(Application.Handle, SW_HIDE)
чтобы убрать и ShowWindow(Application.Handle, SW_RESTORE)
чтобы восстановить
2. Вот пример:
program WinMin;
{* М.И.Н.И.М.А.Л.Ь.Н.А.Я. П.Р.О.Г.Р.А.М.М.А. *}
{* Среда Windows управляет программой посредством посылки сообщений.  *}
{* Прикладная программа, обрабатывая посылаемые ей сообщения, выполняет *}
{* необходимые действия, заложенные её функциональным назначением.   *}
{* Windows - программа состоит из трёх частей:             *}
{* Инициализация - регистрация класса окна, создание и отображение окна.*}
{* Выполнение - цикл обработки сообщений.                *}
{* Завершение - закрытие окна и возврат в среду Windows.        *}
{**}
uses
  Windows,Messages;
const
 AppName = 'WinMin';
var
 Window : HWnd; { ссылка на окно, позволяет однозначно определить каждое окно. HWND = type LongWord }
 Message : TMsg; { сообщение - реакция ядра Windows на какое-либо событие }
 WindowClass : TWndClass; { структура класса окна, включает адрес "оконной" функции, обрабатывающей
               поступающие от Windows сообщения, атрибуты всех окон, принадлежащих
               этому классу, т.е. задаются основные свойства класса }
// Специальная "оконная" функция, обрабатывающая сообщения, посылаемые окну.
// Вызывается непосредственно ядром Windows (косвенно-вызываемая - callback function).
// Параметры эквивалентны полям структуры типа TMsg.
function WindowProc (Window : HWnd; Message, WParam : Word;
     LParam : LongInt) : LongInt; stdcall;
 var
  dc : HDC; { ссылка на контекст, должна использоваться для работы с окном }
 begin
 WindowProc := 0;
// Здесь указывается реакция оконной функции на сообщения Windows.
 case Message of
    wm_Destroy : begin { ядро Windows пытается закрыть окно - обработку этого сообщения нельзя опускать }
          PostQuitMessage (0);  { посылает прикладной программе сообщение wm_Quit код 0 - успешное завершение }
          Exit;          { выход из текущей процедуры}
          end;
    wm_Create:  begin { ядро Windows пытается создать окно } (* если контекст окна больше не используется, это сообщение можно не обрабатывать *)
          dc := GetDC (Window);  { GetDC возвращает контекст рабочей области окна }
          ReleaseDC (Window, dc); { освобождает контекст }
          end;
 end; // case
// Все сообщения, не обрабатываемые оконной функцией, передаются функции ядра Windows DefWindowProc.
 WindowProc := DefWindowProc (Window, Message, WParam, LParam); { DefWindowProc обеспечивает обработку тех сообщений окна, которые не обрабатывает прикладная
программа }
 end;
// Процедура WinMain создает и регистрирует класс окна,
// затем создаёт и отображает окно на экране и активизирует цикл
// работы с сообщениями.
procedure WinMain;
begin
// Всем полям структуры присваиваются определённые значения
// (определяются атрибуты окна).
    with WindowClass do
    begin
    Style := cs_HRedraw or cs_VRedraw; { стиль окна класса: окно будет перерисовываться при изменении его горизонтальных и вертикальных размеров }
    lpfnWndProc := @WindowProc;    { указатель на оконную функцию, которая будет обрабатывать все сообщения, посылаемые окну }
    cbClsExtra := 0;          { выделенная память, используемая программой по своему усмотрению }
    cbWndExtra := 0;          { выделенная память, используемая программой по своему усмотрению }
    hInstance := 0;          { ссылка на экземпляр программы, используется ядром Windows для однозначного определения сегмента данных экземпляра программы }
    hIcon := LoadIcon (0, idi_Application); { ссылка на иконку для окна, для отображения минимизированного окна, сейчас - иконка, соответствующая приложению }
    hCursor := LoadCursor (0, idc_Arrow);  { ссылка на курсор, сейчас - в виде стрелки }
    hbrBackground := GetStockObject (White_Brush); { ссылка на шаблон заполнения фона для окна }
    lpszMenuName := '';         { ссылка на строку имени меню }
    lpszClassName := AppName;      { имя класса }
    end;
// Регистрация окна с заданными атрибутами.
// Параметр функции - структура типа TWndClass, содержащая атрибуты окон данного класса.
    if RegisterClass (WindowClass) = 0 then
     Halt (255); { регистрация невозможна, завершение работы программы }
    Window := CreateWindow    { создает окно и возвращает ссылку на окно типа HWnd }
    (AppName,           { имя класса, к которому принадлежит создаваемое окно }
    'Win_Min',          { заголовок окна }
    ws_OverlappedWindow,     { стиль окна, сейчас - комбинация стилей }
    cw_UseDefault,        { X - начальная позиция верхнего левого угла, сейчас - значение по умолчанию }
    cw_UseDefault,        { Y - начальная позиция верхнего левого угла, сейчас - значение по умолчанию }
    cw_UseDefault,        { Width - начальная ширина окна, сейчас - значение по умолчанию }
    cw_UseDefault,        { Height - начальная ширина окна, сейчас - значение по умолчанию }
    0,              { WndParent - родительское окно данного окна }
    0,              { Menu - меню, используемое данным окном }
    HInstance,          { Instance - указывает на экземпляр программы. этот параметр указывается, чтобы оконная функция имела доступ к сегменту данных программы }
    nil);            { Param - определяет дополнительную информацию, посылаемую через сообщение wm_Create }
// Окно создано, его необходимо отбразить на экране.
    ShowWindow (Window, CmdShow); { отображает или делает невидимым указанное окно }
    UpdateWindow (Window);    { указывает прикладной программе, что часть окна нуждается в перерисовке }
// После того, как окно отбражено на экране, управление передаётся циклу обработки сообщений.
// GetMessage извлекает сообщения из очереди и помещается в структуру типа TMsg.
// Для всех сообщений, отличных от wm_Quit (завершение работы программы), эта
// функция возвращает ненулевое значение и цикл продолжает обработку сообщений.
    while GetMessage (Message, 0, 0, 0) do { GetMessage возвращает сообщение из очереди GetMessagePos }
    begin
// TranslateMessage передает структуру типа TMsg ядру Windows для преобразования сообщений о введенных символах
     TranslateMessage (Message); { переводит сообщение виртуальных клавиш в символьное сообщение }
     DispatchMessage (Message);  { передает сообщение оконной функции указанного окна }
                   { после того, как оконная функция обработала сообщение, управление возвращается }
                   { в цикл обработки сообщений }
    end;// конец цикла обработки сообщений
   Halt (Message.wParam); { программа завершается }
end;
// Процедура WinMain - точка входа в программу, которая получает
// управление от ядра Windows.
begin
 WinMain;
end.
Вопрос 420:
От: Ефремов Александр
Обращаюсь я к Вам уже не первый
раз, поэтому вполне могу и претензию предъявить. Неужели во всей России
не найдется человека, который ответил бы на мой вполне простой вопрос. И
куда же делись все российские хакеры, которых "боятся" во всем мире. Где
же они ? Или форумы посещают только user-ы и game-еры. Не знаю... У меня
нет документации по WinAPI, да и купить ее там где я живу трудно, а
набор функций, который можно получить из библиотеки windows ни о чем не
говорит. Помогите кто может, как же мне присоединить свою прогу к уже
запущенному ПРОЦЕССУ, так, чтобы ее не было видно "нигде". Если убрать
ее из из Alt+Ctrl+Del функцией RegisterServiceProcess, то она остается
работающим процессом, любой прогой обнаружения процессов ее можно
обнаружить, а значит и снять. А если при запуске прикреплять программу к
какому-нибудь стандартному процессу ОС, например Explorer.exe, то
обнаружить ее будет уже очень проблематично. ТАК МОЖНО ЛИ ЗАПУСКАТЬ
РАЗНЫЕ ПРИЛОЖЕНИЯ КАК ОДИН ПРОЦЕСС ИЛИ НЕТ ?
И еще вопрос: где можно найти (в инете) электронную документацию по
WinAPI на РУССКОМ языке ? Заодно спрошу еще вот что: МОЖНО ЛИ СОЗДАВАТЬ
ФОРМУ НЕСТАНДАРТНОГО РАЗМЕРА ПО БИТОВОЙ МАСКЕ, загруженой из
какого-нибудь графического файла ?
Ну и раз такое дело вот Вам еще вопрос: Известно, что большинство
Web-серверов построены на платформе Unix, поэтому Web-модули для них
пишутся в основном на Perl. Как известно, Delphi позволяет создавать
Web-модули. БУДУТ ЛИ ОНИ ФУНКЦИОНИРОВАТЬ ПОД UNIX ИЛИ ТОЛЬКО ПОД WIN32 ?
Если только под Unix, то существуют ли какие-нибудь конвертеры,
преобразователи или что-то в этом роде. Вобщем как сделать, чтобы
Web-модель написанный на Delphi работал на Unix-е ?
И на последок вот еще что (ответте хоть НА ЭТО): После того, как
рассылка FAQ приходит мне на мыло, я могу отвечать на вопросы через
e-mail. Значит они (мои ответы на Ваши вопросы или Ваши ответы на мои
вопросы) приходят на сервер. А дальше ? Они отправляются прямиком на
мыло того, кто спросил или остаются на сервере. Если так, то ГДЕ ЖЕ
МОЖНО НА СЕРВЕРЕ ПОСМОТРЕТЬ НА НИХ ОТВЕТ ? Заранее спасибо. ГОСПОДА, НЕ
ДАДИМ УПАСТЬ В ГРЯЗЬ РЕПУТАЦИИ РУССКОГО ХАКЕРА !!!
Ответить.
Ответ 1:
даааа...
безусловно интересную задачу ты себе поставил...
могу только предположения высказать...
Могу ПРЕДПОЛОЖИТЬ как выполнить твои действия от имени какого либо
приложения.
Поидее для этого тебе нужно вычислить какое-либо оконное приложение,
вычислить его идентификатор главного окна и достать оконную функцию.
Далее ты переписываешь эту функцию (дописываешь свои обработчики
событий) и замещаешь его оконную функцию своей уже измененной.
WinДа ничего не должна заметить.
Это все только теоретически и вроде бы вполне реально, но я еще не
пробовал сам. Как нить выберу время и попробую (так как весьма
интересный вопросец).
По поводу WinAPI.
Советую почитать литературу (что-нить вроде древних книжец -
Программирование под Windows 3.1(95) на C++). C++ потому что там упор
идет именно на WinAPI(причем прекрасные примеры)
Ответ 2:
"где можно найти (в инете) электронную документацию по WinAPI на РУССКОМ
языке ?"
В YANDEX.RU набери "WINAPI русский" (или что-то подобное) появится куча
ссылок. Там полно описаний функций на русском языке.
"МОЖНО ЛИ СОЗДАВАТЬ ФОРМУ НЕСТАНДАРТНОГО РАЗМЕРА ПО БИТОВОЙ МАСКЕ,
загруженой из
какого-нибудь графического файла ?"
Сам не пробовал, но думаю, что да, если проанализировать то, что записано в
графическом файле, а потом определить регион окна ...
Может имеет смысл использовать "скины" - есть в rxlib
"как же мне присоединить свою прогу к уже запущенному ПРОЦЕССУ, так, чтобы
ее не было видно "нигде" "
(настороженно) А ЗАЧЕМ ТЕБЕ ЭТО ???
Так чтобы нигде не было видно не получится (при желании её можно будет
найти)
Когда в одной из моих сетей поселилась такая гадость я потратил много
времени чтобы догадаться, что она делает именно ЭТО. Делать такие вещи
ПЛОХО! Опасения вызывает то, что подобные вопросы в последнее время задаются
очень часто
Ответ 3:
Если я правильно понял то, что Вам надо, тогда могу посоветовать
функцию CreateRemoveThread - по описанию - создаёт нить, исполняющуюся
в адресном пространстве другого процесса.
Если же хотите поколдовать и не жаль голову, то можно сразу писать в
память процесса функцией WriteProcessMemory, её используют в основном
отладчики.
Ответ 4:
>БУДУТ ЛИ ОНИ ФУНКЦИОНИРОВАТЬ ПОД UNIX ИЛИ ТОЛЬКО ПОД WIN32 ?
>Если только под Unix, то существуют ли какие-нибудь конвертеры,
>преобразователи или что-то в этом роде. Вобщем как сделать, чтобы
>Web-модель написанный на Delphi работал на Unix-е ?
Просто мысль пришла: попробуй скомпилировать то что есть на Delphi в
Kylix'е
А вообще-то конвертеры из паскаля в c (и др.) есть. Но вот что бы конвертер
понимал Дельфовскую VCL (которая, в принципе является удобным
интерфйсом к WinApi) это очень врядли.
Вопрос 421:
От: tmp_user@newmail.ru
Подскажите пожалуйста, как сделать всплывающую подсказку
(hint) на элемент списка (TListBox), если он полностью не
входит по длине в окошко?
Ответить.
Ответ 1:
Примерно вот так.
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 APoint: TPoint;
 index: Integer;
begin
 APoint.X := X;
 APoint.Y := Y;
 Index:=ListBox1.ItemAtPos(APoint, False);
 if Index< ListBox1.Items.Count then
  ListBox1.Hint:=ListBox1.Items.Strings[Index]
 else ListBox1.Hint:='';
end;
Вопрос 422:
От: Чернов Станислав
Можно ли при помощи компонент Делфи 5 получить вместо содержимого URL
StatusCode типа 404 - not found, 200 - OK,500-internal server error etc.
Ответить.
Ответ 1:
Вопрос 423:
От: anton
Пришлите какие-нибудь статьи по взламыванию программ или инструкции по
взламыванию.Скажите,кто знает,для чего нужен SoftICE,для чего IDA
(Interactive DisAssembler),для чего Hiew и другие программы.Хотелось
получить примерные инструкции по взламыванию программ от настоящих
взломщиков.
Ответить.
Ответ 1:
если ты не понимаешь, для чего нужны эти программы, то тебе никакие инструкции не помогут. "Я хочу стать крутым
взломщиком!" -- это еще не повод. Сначала стань крутым программистом. Учи ассемблер, работу компиляторов, Windows API и т.д.
Вообщем всё, что должен знать системный программист. И в процессе сам поймешь, для чего нужен SoftICE, IDA, HIEW и т.п.
Ответ 2:
Непонятно каким образом ВЗЛАМЫВАНИЕ ПРОГРАММ относится к программированию на Делфи. Но если тебя
интересует именно взлом, то можешь смело начинать изучать АССЕМБЛЕР. Когда ознакомишься с
ассемблером, тебе не надо будет ни у кого спрашивать 'Скажите,кто знает,для чего нужен SoftICE,для
чего IDA (Interactive DisAssembler),для чего Hiew и другие программы'. И не говори потом что тебя не
предупреждали, что АССЕМБЛЕР не такой простой как например БЕЙСИК. Есть хорошая рассылка 'Ассемблер?
Это просто! Учимся программировать'. Подпишись на неё если нет возможности приобрести литературу.
  Да и напоследок - НЕ ЗАБЫВАЙ ЧТО АССЕМБЛЕР САМЫЙ ТОНКИЙ ИНСТРУМЕНТ, ОСВОЕНИЕ КОТОРОГО ДЕЛАЕТ
ТЕБЯ ДЕЙСТВИТЕЛЬНО ПРОФЕССИОНАЛОМ В МИРЕ КОМПЬЮТЕРОВ!
Вопрос 424:
От: Dima
Как на Delphi написать программу которая по
сети запускает Dial-Up и разрывает связь на другом
компьютере.
Ответить.
Ответ 1:
Вопрос 425:
От: Абонгруппа
Подскажите, где взять генератор отчетов (типа QR) в текстовом формате.
Т.е. не в графике, как QR и остальные делают, а в виде простого
текста, чтоб можно было шустро печатать матричным принтером.
Ответить.
Ответ 1:
  Всё очень просто. Точнее говоря, в этом нет ничего сложного.
  Если подумать, то в данном случае совершенно необязательно наличие
  генератора отчёта, различных компонент и модулей - достаточно
  средств Delphi (работа с текстовыми файлами) и API (для печати
  оного).
  Технология состоит в том, что вы генерируете текстовой файл с
  вашими данными. Заодно можете перевести, если необходимо, в
  DOS-кодировку текстовые строки. Далее функциями WinAPI посылаете
  исходный документ на печать.
  Voila! Матричным принтер вас покорно благодарит...
Ответ 2:
ZReport (http://www.torry.net/reportdesigners.htm)
Вопрос 426:
От: Sir Antony
у меня есть прога - просмотрщик шрифтов. Но пока она смотрит
только шрифты, которые содержаться в системе. Кто-нть может мне
подсказать,  как сделать так, чтоб эта прога открывала шрифт,
незарегистрированный в системе и смотрела его? Может где компонента
такая есть?
Ответить.
Ответ 1:
Временно зарегистрировать шрифт. Без регистрации я не
видел компонентов...
Ответ 2:
Используй API-функции AddFontResourse и далее CreateFont.
Есть, правда, проблема "узнавания" FontFamily. Если не лень, можно
покапаться в структуре TTF файла, но это непросто, т.к. она достаточно
замороченая, использует Motorola-формат чисел, мультиплатформенная и
т.п. Если копаться не хочется, могу прислать кусок кода, который все
это делает. В ответе не привожу, т.к. он слишком длинный (куча
функций, констант), да и далек от совершенства (по уму, надо отдельный
модуль   писать). 
Вопрос 427:
От: Sidorov Dmitry
Подскажите пожалуйста как можно через Delphi осуществить дозвон до
провайдера (как через удаленный доступ), и ещё, как
можно осуществить обычный звонок (типа Виндовского телефона).
Ответить.
Ответ 1:
Дозвон до провайдера: ищи в хелпе (Win32API) процедуры начинающиеся с
RAS - RASDial, RASHangUp и т.д.
Для voice call нужно использовать TAPI (Telephone API)
Вопрос 428:
От: Утёнков Максим
Столкнулся с такой проблемой. Пишу программу, которая использует
класс TMediaPlayer. Пока программу протестировал только на 3 компьютерах
и на одном не стали играться mp3 файлы. Вообще плеер не подает
ни каких признаков жизни. Нажимаешь на play а он не реагирует. Проблемы
с mp3 файлами на этом компьютере быть не должно, т.к. другими
программами
они проигрываются, в частности, WinAmp`ом. ОС Windows 98 SE.
И еще вопрос. Как в TMediaPlayer корректно узнать о длине midi файла.
Ведь в midi длинна зависит от скорости воспроизведения.
Ответить.
Ответ 1:
  TMediaPlayer, насколько мне известно, использует форматы сжатия
  звуковых файлов, которые установлены в вашей системе. Формат mp3 в
  них не входит. В то время как специализированные проигрыватели
  mp3-музыки содержат в себе свои кодеки.
  Выход из ситуации: 1) установить необходимые обновления Windows. 2)
  написать свой _самый-самый_ кодек. 3) не использовать TMediaPlayer
  и найти компонент проигрывателя MP3.
Вопрос 429:
От: oops
Народ, скажите как мне сделать инсталяцию подключения к
интернет (соединения удаленного доступа)? Т.е., создать свое
соединение?
Ответить.
Ответ 1:
Вопрос 430:
От: Алексей Малиновский
Подскажите каким образом сделать так, чтобы программы обменивались
данными через телефонную линию (с помощью каких методов, компнент).
А именно:
1) имеется три объекта (отдалённых друг от друга на большое расстояние)
на которых установлено определённое программное обеспечение, (написанное
мною) там происходит опрос приборов и накоплений принятых данных (т.е.
БД).
2) имеется начальник, у него стоит компьютер.
Так вот как сделать так, чтобы начальник мог видеть данные на этих
объектах???
Ответить.
Ответ 1:
Существует два варианта решения проблемы ON-Line и OFF-Line.
Для решения по первому варианту можно применить систему терминалов
например продукт MetaFrame. Тогда программу переделывать вообще не
нужно. Любой удаленный клиент сможет делать на сервере все что нужно и
видеть все. Но это дорого в эксплуатации (думаю, что у вас нет своих
выделенных каналов связи).
Второй вариант более прост, но требует как раз таки разработки
программы специальным образом. Он предполагает обмен информацией между
центральным офисом и дополнительным компьютером пакетным способом.
Пакет - это файл. Какую структуру файла ты выберешь зависит от того,
что именно делает твоя программа. В этом случае твоя задача сводится к
следующему: На центральной БД сформировать файл для отправки клиенту,
обычной почтовой программой отправить, получить почту на клиенте и
разместить в его БД . Кстати если ты это делаешь путем простой замены
старых файлов на новые программу можно вообще не затачивать специально
под это (пользуйся командными файлами). При этом не забудь про
индексные файлы (их нужно или тащить вместе с информацией или обновить
после замены информационных файлов).
 Если же ты выбираешь вариант самостоятельного (программного)
пополнения БД из поступившего файла дополнений, то нужно пользоваться
обычными свойствами и методами обьекта TTable. (Append,Post).
Открываешь две таблицы, одну рабочую, другую поступившее дополнение.
Из одной читаешь - в другую добавляешь.
 Если тебя не устраивает почтовый клиент и ты будешь писать своего,
то ты начинаешь новую для себя тему разработок (это распыление сил,
много раз подумай прежде чем приступить к этому, т.к. невозможно
быть хорошим специалистом во всем)
 Извиняюсь, ответ получился не из разряда Делфи-программирования.
Но после того, как выберешь вариант работы задавай уже более конкретно
вопрос по Delphi.
Если Вы хотите как можно скорее получить ответ на свой вопрос, то
укажите в теме письма - delphiV,иначе письмо будет прочитано значительно
позже, если же у вас есть предложения то в теме письма укажите delphiP.
Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки - это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.
За сим прощаюсь - скорых Вам и качественных программ.
Автор рассылки - Дмитрий.
ICQ - 89533941.
ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу | Рейтингуется SpyLog |
В избранное | ||