Faq управление питанием из программы на delphi


Содержание

FAQ по Delphi

Вопрос: Как использовать свои курсоры в программе?

const
crZoomIn = 1;
crZoomOut = 2;

Screen.Cursors[crZoomIn] := LoadCursor(hInstance, ‘CURSOR_ZOOMIN’);
Screen.Cursors[crZoomOut] := LoadCursor(hInstance, ‘CURSOR_ZOOMOUT’);

Вопрос: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки?

Ответ: Hачнем с создания.

Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil.

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

Пример кода, обрабатывающего события от свежесозданных компонентов:
type
TForm1 = class(TForm)
< . >
private
< эта процедура будет вызываться при нажатии на кнопку >
procedure ButtonClicked(Sender : TObject);

Вопрос: Как ограничить перемещение курсора мыши какой-либо областью экрана?

Вопрос: Как отловить события создания или удаления файлов другими программами?

Ответ: (Win32:) FindFirstChangeNotification/FindNextChangeNotification/
FindCloseChangeNotification

(Win16:) FileCDR, но она плохо документирована.

Вопрос: Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение?

Ответ: Обрабатывать OnCloseQuery.

Вопрос: При работе программ на D1 под Win95 в hicolor-режимах иконки на TBitBtn’ах обнаруживаются странные коричневые артефакты. Как от них избавиться?

Ответ: (AB): Залить фон битмапа синим цветом.

Вопрос: Как работать с registry?

Вопрос: Как получить короткий путь файла если имеется длинный? («c:\Program Files» ==> «c:\progra

Вопрос: Как напрямую работать с портами/памятью из-под Win95/NT?

Под Win95 можно обращаться к портам из ассемблерных вставок. Под NT этот номер не пройдет — скорее всего, придется писать драйвер устройства. RTFM WindowsNT Device Driver Kit.

Вопрос: Как переключать раскладку клавиатуры из своей программы?

Вопрос: Как просматривать HTML в программе?

Ответ: Можно воспользоваться Netscape Navigator или Internet Explorer — они умеют быть OLE-серверами.

(AL): Еще на www.pbear.com лежат THTMLViewer и TFrameViewer.

Вопрос: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам?

Ответ: (AP): SetWindowsHookEx(). Пример использования лежит на www.i-connect.ru/

Вопрос: Как вывести диалог выбора директории?

Ответ: (DS): SelectDirectory, rxLib: TDirectoryEdit.

Вопрос: Hе работает передача данных по OLE в русский Excel.

Ответ: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel’у в русском контексте (не знаю как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку

if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount,
LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then

и заменить ее на

if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount,
((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ),
DispIDs) <> 0 then

После этого у меня Excel стал понимать нормальные английские команды :)).
Hеобходимая комбинация для установки английского языка взята из C-шных хедеров.

Вопрос: Можно ли скомпилировать на Delphi 2/3 программу, работающую под Windows 3.1?

Ответ: (NP): Hет, но на компактах с Delphi 2/3 поставляется Delphi 1 специально для этой цели.

Вопрос: Как вызывать из 32-битной программы 16-битные DLL?

Ответ: (EM): Hадо применять так называемы Thunks. Смотри статью на http://www.itecuk.com/delmag/thunk95.htm

Вопрос: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести?

Ответ: RTFM packed, $A.

Вопрос: Где взять подробную документацию по работе с RTF, TRichEdit?

Ответ: (MC): www.microsoft.com/msdn, зарегистрироваться и искать.

Вопрос: Как можно перетаскивать форму не только за заголовок?

Вопрос: Как мне упаковать Paradox или DBF таблицу?

Ответ: (AY): Самый простой метод — воспользоваться функцией PackTable из rxLib.
В версии 2.32 и, наверное, раньше, есть ошибка в процедуре PackTable:
измените кусок:

(JB): Для перегенерации индексов:
Table1.Exclusive := True;
Table1.Open;
Check(dbiRegenIndexes(Table1.Handle);

Вопрос: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset?

Ответ: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в хелпе при поиске по «live result sets»

Вопрос: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать?

Ответ: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties]

Если файла не существует, то его надо создать, если секции не существует, то ее надо создать.

(AY): Для DBD 7.0 нужно испpавить pеестp: ключ
HKCU\Software\Borland\DBD\7.0\Preferences\Properties\SystemFont=»Arial Cyr»

NB: Работает не у всех и не всегда. Разбираться ломы. Я лично использую rxDatabaseExplorer.

Вопрос: Почему не работает сортировка и функция UPPER() в Interbase’овской базе данных?

Ответ: Смотри в F.A.Q. по Borland Interbase от демо-центра вопрос 1.1.

Вопрос: Hе получается вставить в таблицу записи со строками на русском языке — некоторые буквы меняются на другие — что делать?

Ответ: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr.

Вопрос: Я переписал готовую программу на машину заказчика, а она там не запускается — говорит «Error initializing database engine». Что делать?

Ответ: Прочитать X:\DELPHI\DOC\deploy.txt.

Вопрос: Помню еще один хороший частый вопрос про коннект к Personal Oracle, но не помню ответа на него. Hапомните?

Ответ: (IS): user/password@2:
Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для коннекта к сетевому серверу, (протокол TNS, имя юзера, кодировку, интерфейсную DLL) только вместо имени сервера написать «2:». Сие годится и для случая когда на одной машине и сетевой сервер и приложение.

Вопрос: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что «WIN1251 undefined».

Ответ: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям (8:3).

Вопрос: У меня в программе происходит очень большой запрос — в районе нескольких тысяч или десятков тысяч записей. Соответственно большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все?

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

Вопрос: Подскажите хорошую литературу по базам данных.

Ответ: 1) Мартин Грубер «Понимание SQL» (highly recommended)
2) Мартин Грубер «SQL: справочное руководство» (recommended)

Вопрос: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает «EExternalError 0xC0000008». Что делать?

Ответ: (IA): (SK): Снести Oracle Trace Collection Services.

Вопрос: После работы программы не сохраняются изменения в базе Paradox. Что делать?

Ответ: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода:

(SB, AS): Для Delphi 3: Table.FlushBuffers при открытой таблице.

Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close;

(BP): Чтобы сбросить кэш, можно еще в после этого сделать
asm
mov ah, $0D
int $21
end;

Вопрос: А как включить окошко CPU Window?

Ответ: (AP): Вставьте в registry строковый ключ
HKCU\Software\Borland\Delphi\2.0\Debugging\EnableCPU=1
соответственно для Delphi 3 — Delphi\3.0.

Вопрос: А как печатать на матричном принтере в текстовом режиме для скорости?

var
f : textfile;
begin
AssignFile ( f, ‘prn’ );
Rewrite ( f );
WriteLn ( f, ‘some data’ );
CloseFile ( f );
end.

NB: Hе забудьте, что слать данные надо в 866 кодовой странице. См. ниже.

Вопрос: Посоветуйте хорошую книгу по Delphi.

Ответ:

  1. Кен Хендриксон «Руководство разработчика баз данных»
  2. Рэй Конопка «Hаписание оригинальных компонент в среде Delphi»
  3. Рэй Лишнер «Секреты Delphi 2»
  4. Том Сван «Програмирование в Delphi для Windows95»
  5. Tом Сван «Секреты 32 разрядного программирования в Delphi»
  6. Джеффри Рихтер «Windows для профессионалов» (highly recommended!)
  7. Т. Миллер, «Использование Delphi 3»

Вопрос: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice’95?

Ответ: Hадо ловить сообщение WM_NCPAINT. Существует также компонент CustomNC by Alex Prilipko 2:5045/29, которые позволяет самому рисовать всю неклиентскую часть окна.

(AP): Тот компонент — плохой. Совсем. Правильный компонент, by Акжан Абдулин и еще кто-то был в фэхе(не WDEVDELPHI). Ищите cap*.zip.

NB: cap030.zip и cap031p.zip были в файлэхе FED32SRC.

Вопрос: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот?

Ответ: CharToOEM/OEMToChar, CharToOEMBuff/OEMToCharBuff.

Вопрос: Как работать с архивными файлами, хотя бы с самыми распространенными, типа .ZIP?

Ответ: (AS): Воспользуйтесь библиотекой ExceedZip 3.0 (www.exceedsoft.com)

(VS): Hа CDROM с Delphi3 есть каталог INFO\EXTRAS\ZLIB. Подробности на http://quest.jpl.nasa.gov/zlib/

Вопрос: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется?

Ответ: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм =caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть.

Вопрос: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого?

Вопрос: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi2?

Ответ: (AP): Решаются так.

RegEdit — убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что
равно «. \help».

Поправьте это, чтобы был _ваши_ пути.
————————— HelpPath.REG
REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\
delphi32.exe] @=»C:\\DELPHI2\\BIN\\delphi32.exe» «Path»=»C:\\DELPHI2\\HELP»
—————————
. и скажите «START HelpPath.REG»:

Вопрос: Что такое rxLib?

Ответ: Одна из самых, если не самая лучшая библиотека общего назначения для Delphi. Огромное количество компонентов и полезных функций. Полные исходные тексты. Совместима со всеми Delphi (1, 2 и 3), а также с C++-Builder. Великолепные примеры использования. Исчерпывающие файлы помощи на русском языке. Текущая версия — 2.40.

IMHO — a must have для любого дельфиста. Прежде чем огорчаться отсутствием чего-либо или пытаться написать свое — посмотрите, нет ли этого в rxLib. Скажем так — без rxLib мое программирование на Delphi будет гораздо более утомительным.

Авторы:
Fedor Koshevnikov (kosh@masterbank.msk.ru)
Igor Pavluk (pavluk@masterbank.msk.ru)
Serge Korolev (korolev@masterbank.msk.ru)

Вопрос: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита?

Ответ: (ArAs): SetWindowRgn(); (только Win32).

(AV): Есть компонент TFormShaper, free for noncommercial use:
http://www.wirtschaft.tu-ilmenau.de/

(AM:) (Win32) Пример кода, создающий эллиптическую форму, которую к тому же можно двигать за любую точку, что демонстрирует обработку сообщения WM_NCHITTEST:

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

type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
< Private declarations >
rgn : HRGN;
procedure WMNCHitTest(var Message : TWMNCHitTest); message WM_NCHITTEST;
protected

var
Form1: TForm1;

procedure TForm1.FormCreate(Sender: TObject);
begin
rgn := CreateEllipticRgn(0, 0, Width, Height);
SetWindowRgn(Handle, rgn, True);
end;

procedure TForm1.WMNCHitTest(var Message : TWMNCHitTest);
begin
if PtInRegion(rgn, Message.XPos, Message.YPos) then
Message.Result := HTCAPTION
else
Message.Result := HTNOWHERE;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(rgn);
end;

(DK:) Hадо задать форме стиль окна WS_EX_TRANSPARENT. Тогда будут рисоваться только лежащие на ней контролы.
Вот пример кода:

type
TForm1 = class(TForm)
< . >
protected
procedure CreateParams(var Params : TCreateParams); override;
end;

procedure TForm1.CreateParams(var Params : TCreateParams);
begin
inherited CreateParams(Params);
< форма становится прозрачной >
Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
end;

Вопрос: Delphi 2 & 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3.

Ответ: (AlPe): Попробуй сделать
[HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper]
DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default):-) получше маленько будет.

Вопрос: Как установить компонент от Delphi 2 под Delphi 3? Delphi требуют .PAS-файл.

Ответ: Hикак. Ищите исходник или .DCU, скомпилированный для Delphi 3.

Вопрос: Как получить от программы сообщения на русском языке?

Ответ: (EL):

  1. В X:\Delphi\Sources\vcl — отредактировать все файлы текстовых ресурсов Delphi (или наиболее часто возникающие Exception’ы и надписи на кнопках).
  2. В Delphi\bin есть компилятор текстовых ресурсов (brcc32.exe — точно не помню).Откомпилировать все изменненные *.rc.
  3. Получившиеся res-файлы кинуть в Delphi\Lib

(SB): Для Delphi 3:

  1. Delphi3\Doc\Consts.int переименовать в Delphi3\Doc\Consts.pas;
  2. внутри Consts.pas в конце дописать: «end.»;
  3. внутри Consts.pas исправить все «Yes», «No», «Cancel» и т. д. на русский вариант;
  4. откомпилировать consts.pas с помощью dcc32, получится Consts.dcu.
  5. Consts.dcu скопировать в Delphi 3\Lib вместо имеющегося там.

NB: Русские ресурсы для D1 и D2 проходили в свое время по WDEVDELPHI в файле .

Вопрос: Как работать с разными графическими форматами, кроме BMP, хотя бы самыми распространенными: GIF, JPG, TIFF?

Ответ: Воспользуйтесь библиотекой ImageLib. Лежит на www.imagelib.com.
Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture.

(AA): Опять-таки, есть LightLib Images (url не помню, но по altavista находится с полпинка, поставляется с книжкой Чарлза Калверта).

Вопрос: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl?

Ответ: Они лежат в X:\DELPHI3\LIB\DELPHI2\.

Вопрос: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать?

(AA): Win32: Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. Win16: Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield().

Вопрос: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится?

Ответ: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr.

Удобно использовать функцию ShowSplashWindow из rxLib.

Вопрос: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу?

Ответ: WinExec() или ShellExecute. У второй больше возможностей.

(AY, VB): CreateProcess().

(SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE);

(AA): Win16: Delay можно взять из rxLib.

Вопрос: Как мне работать с файлами MS Word или таблицами Excel?

Ответ: Воспользоваться функцией CreateOLEObject и работать с VBA или WordBasic.

NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic’а, например, FileOpen(Name := ‘myname.doc’);

Пример проверен только на Word 7.0 (рус) . Вот, может поможет.

unit InWord;
interface
uses
. ComCtrls; // Delphi3
. OLEAuto; // Delphi2
[skip]
procedure TPrintForm.MPrintClick(Sender: TObject);
var W: Variant;
S: String;
begin
S:=VarToStr(Table1[‘Num’]); //В D3 без промежуточной записи
// в var у меня не пошло :(
try // А вдруг где ошибка :)
W:=CreateOleObject(‘Word.Basic’);
// Создаем документ по шаблону MyWordDot
// с указанием пути если он не в папке шаблонов Word
W.FileNew(Template:=’C:\MyPath\DB\MyWordDot’,NewTemplate:=0);
// Отключение фоновой печати (на LJ5L без этого был пустой лист)
W.ToolsOptionsPrint(Background:=0);

// Переходим к закладке Word’a ‘Num’
W.EditGoto(‘Num’); W.Insert(S);
//Сохранение
W.FileSaveAs(‘C:\MayPath\Reports\MyReport’)
W.FilePrint(NumCopies:=’2′); // Печать 2-х копий
finally
W.ToolsOptionsPrint(Background:=1);
W:=UnAssigned;
end;
end;
.

Вопрос: Как сделать так, чтобы запущенная программа не была видна на панели задач?

NB: Предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать ее из минимизированного состояния.

type
TForm1 = class(TForm)
Label1: TLabel;
RxTrayIcon1: TRxTrayIcon;
procedure FormCreate(Sender : TObject);
procedure RxTrayIcon1DblClick(Sender: TObject);
private
< Private declarations >
procedure ApplicationMinimize(Sender : TObject);
procedure ApplicationRestore(Sender : TObject);
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize := ApplicationMinimize;
Application.OnRestore := ApplicationRestore;
ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.ApplicationMinimize(Sender : TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.ApplicationRestore(Sender : TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.RxTrayIcon1DblClick(Sender: TObject);
begin
Application.Restore;
Application.BringToFront;
end;

(AK): Только сpазу пpедупpеждаю пpо гpабли, на котоpые я наступал:
Будь готов к тому, что если пpи попытке закpытия пpиложения в OnCloseQuery или OnClose выводится вопpос о подтвеpждении, то могут быть пpоблемы с автоматическим завеpшением пpогpаммы пpи shutdown — под Win95 пpосто зависает, под WinNT не завеpшается. Очевидно, что сообщение выводится, но его не видно (пpичем SW_RESTORE не сpабатывает). Решение — ловить WM_QueryEndSession и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt.

Вопрос: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры?

Ответ: В библиотеке rxLib есть компонент TrxTrayIcon.

Вопрос: Как сделать так, чтобы в моей форме курсор перемещался по полям ввода по Enter, как по Tab?

Если вы хотите обрабатывать событие на уровне формы (а не в каждом отдельном компоненте), уберите обработчики события у всех компонент и создайте FormKeyPress — обработчик OnKeyPress для формы:

procedure Form1.OnKeyPress(Sender : TObject; var Key : char);
begin
if Key = #13 then begin
SelectNext(Sender as TWinControl, true, true);
Key := #0;
end;
end;

(AnSa): Давно хотелось высказаться по поводy этого способа. Во-пеpвых, нyжно выставлять y фоpмы KeyPreview = True. Во-втоpых, если на фоpмy поместить default-кнопкy, то никакого пеpемещения фокyса не бyдет.

Вопрос: А где взять нормальный хелп для Delphi 3? И для вторых, собственно, тоже — часть ссылок ведет в никуда, часть ведет не туда, некоторые компоненты без хелпа.

Ответ: Hадо поставить нормальные Delphi 3, а не Confidentional/Field beta.

Для Delphi 2 — или найдите где-нибудь обновленные файлы .HLP, например, на
www.borland.com или на Delphi Super Page, или на каком-нибудь компакте, или
поставьте себе версию 2.01. Моя имеет истинную версию (Help|About.
наберите Alt-VERSION) 2.0.76.0. Узнать ее можно также по странице Internet в
панели компонентов.

Вопрос: Посоветуйте что-нибудь для работы с модемом и/или COM-портом из Delphi.

Ответ: AsyncPro. Он покроет 95% ваших нужд.

Вопрос: Как сделать так, чтобы программу можно было запустить только в одном экземпляре?

Ответ: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для
завершения второго экземпляра, попытавшегося запуститься, используйте
Application.Terminate;

(AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция
IsMonitorRunning().

Прочие существующие F.A.Q. по Delphi:

  • от Akzhan Abdulin, 2:5040/55; это, скорее, набор Tips&Tricks, достаточно продвинутых, с большим количеством исходников;
  • FAQ по фичам для Delphi by Mikhail Chernyshev, 2:4615/26; это список библиотек и компонентов для Delphi с кратким описанием и указанием методов доставания;
  • The Unofficial Delphi Component Writing F.A.Q.; достаточно продвинутый F.A.Q. для писателей компонентов, очень полезно описание TDataLink;
Илон Маск рекомендует:  Что такое код mcal_popen

Эхи по Delphi

Эхи Краткое описание
RU.DELPHI общие вопросы программирования на Delphi, не связанные с базами данных
RU.DELPHI.INFO эта эха — только для чтения. Писать в нее разрешено немногим и, скорее всего, это не вы. Туда помещаются F.A.Q. и списки интернетовских и фидошных ресурсов Delphi
RU.DELPHI.DB вопросы программирования баз данных в среде Delphi
RU.DELPHI.UUE категорически не рекомендованная к получению эха — для публикации файлов лучше пользоваться файлэхами.

Файлэхи по Delphi

Файлэха Краткое описание
WDEVDELPHI официальная файлэха иерархии RU.DELPHI
FEDELAPP Delphi and DBMS related applications, utilities and other goodies
FEDELINF Delphi related technical information, documentation
FEDELSRC Delphi related both 16 and 32bit Components and Libraries Sources
FEDELGEN Delphi related General
FED32SRC Delphi related 32bit Sources
FED32GEN Delphi related 32bit General

Дружественные эхи

Эхи Краткое описание
RU.CBUILDER Borland C++Builder
SU.WINDOWS.PROG общие вопросы программирования под MS Windows
SU.WIN32.PROG вопросы программирования для Win32 API
SU.WIN95.PROG вопросы программирования под MS Windows 95
SU.DBMS базы данных
SU.DBMS.SQL SQL-базы данных
SU.DBMS.BORLAND базы данных фирмы Borland
SU.DBMS.INTERBASE «родная» для Delphi база данных
SU.SOFTW общие вопросы разработки программ
RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT
SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки

Вопрос: Что такое Bold?

Ответ: Bold является модельно-управляемой платформой для разработки архитектуры приложений, для разработки инфраструктуры приложения, управляемой схемой приложения.
С технической стороны это n-уровневая структура, включающая встроенную среду разработки.

Вопрос: Кто нуждается в Bold?

Ответ: Каждый, кто хочет использовать UML, кто хочет получить качественное приложение «как задумано», кто нуждается в быстрой разработке надёжных профессиональных приложений.

Вопрос: Что обеспечивает n-уровневое средство Bold?

Ответ: n-уровневое средство структурирует приложение в несколько уровней. В 2-х уровневом приложении (например, приложение со стандартными компонентами Delphi или C++Builder для работы с БД) GUI-компоненты связываются непосредственно с таблицами БД.
В n-уровневом приложении есть уровень бизнес-объектов, содержащий бизнес-правила.

Вопрос: Какие инструментальные средства моделирования поддерживаются Bold for Delphi?

Ответ: Bold for Delphi/ Bold for C++ поддерживает двунаправленную интеграцию с Rational Rose (Rose 98 и выше). Поддержка других инструментальных средств, таких, например, как ObjectDomain, доступна по требованию. Остальные средства моделирования поддерживаются через обмен метаданными XMI и XML формата.

Вопрос: Генерирует ли код Bold for Delphi?

Ответ: Нет. Bold for Delphi/Bold for C++ является модельно-поддерживающей платформой, которая тесно интегрирована в Delphi/C++Builder, используя стандартную компонентную модель Delphi (VCL).
Bold for Delphi/Bold for C++ генерирует код для бизнес-классов. Код, первоначально содержавший элементы для добавления методов и бизнес-правил, генерируется в бизнес-объекты.

Вопрос: Как Bold for Delphi сохраняет информацию о модели?

Ответ: Информация модели хранится в приложении в компоненте BoldModel. Кроме того, Bold for Delphi/Bold for C++ позволяет сохранять модель в файле. В дальнейшем планируется включить поддержку хранилища объектов.

Вопрос: Может ли Bold for Delphi автоматически создавать БД?

Ответ: Да, Bold for Delphi/Bold for C++ обеспечивает автоматическую генерацию таблиц, а также изменение структуры с сохранением данных тогда, когда это требуется (что обычно случается при развитии модели!).

Вопрос: Доступен ли Bold из других систем разработки, кроме Delphi?

Ответ: Bold for Delphi включает в себя Bold for C++, предназначенный для Borland C++Builder.

Вопрос: Какие базы данных поддерживаются Bold for Delphi?

Ответ: Bold for Delphi поддерживает все SQL-БД, доступ к которым осуществляется через Borland Database Engine, ADO или драйверы InterBase. Через Borland SQL Links BDE так же возможен доступ к Oracle, Sybase, Informix, MS SQL Server, DB2 и InterBase.

За дополнительной информацией обращайтесь в компанию Interface Ltd.

Отладка программ в среде Delphi

Читайте также:

  1. COM программы.
  2. XI. Системное программное обеспечение ЭВМ
  3. XIII. Инструментальное программное обеспечение ЭВМ
  4. Алгоритм, записанный на языке программирования называется программой.
  5. АЛГОРИТМЫ ВЫПОЛНЕНИЯ МИКРООПЕРАЦИЙ.МИКРОПРОГРАММЫ.
  6. АЛГОРИТМЫ, АЛГОРИТМИЗАЦИЯ, ПРОГРАММИРОВАНИЕ
  7. Алфавит языка, лексика, структура программы.
  8. Анализ программы.
  9. Анализ. Первый программный пример строка за строкой
  10. Антивирусные программы
  11. Антивирусные программы
  12. Антивирусные программы

(для программирующих в Delphi)

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

(1)Точки контрольного останова

Точка контрольного остановаопределяет оператор в программе, перед выполнением которого программа прервет свою работу, и управление будет передано среде Delphi. Точка останова задается с помощью опции View|Debug windows|Breakponts.

Окно точек остановасодержит список всех установленных в проекте точек, перед выполнением которых происходит прекращение работы программы и управление получает среда Delphi.

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

FileName – определяет имя файла;

Line number – номер строки от начала файла (в момент появления окна оно содержит файл и строку с текстовым курсором);

Condition – можно указать условие останова в виде логического выражения (например, MyValue = МахValue-12);

Pass count – количество проходов программы через контрольную точку без прерывания вычислений.

Окно точек останова (слева) и окно добавления новой точки (справа)

(2)Окно наблюдения

Наблюдать за состоянием переменной или выражения можно с помощью специального окна, вызываемого опцией View|Debug windows|Watches.

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

Для добавления нового выражения следует щелкнуть по окну правой кнопкой мыши и выбрать опцию New Watch. В строке Expression ввести выражение. Окно Repeat count определяет количество показываемых элементов массивов данных; окно Digits указывает количество значащих цифр для отображения вещественных данных; переключатель Enabled разрешает или запрещает вычисление выражения. Остальные элементы определяют вид представления значения.

Значения переменных можно также посмотреть во время останова программы, наведя курсор мыши на переменную в тексте кода.

Окно наблюдения и окно добавления в него нового выражения

(3)Принудительное прерывание работы программы

Если программа запущена из среды Delphi, ее работу можно прервать в любой момент с помощью клавиш Ctrl+F2, кнопки ESC, опцией Run|Program Pause или, наконец, установив точку контрольного останова в той части программы, которая выполняется в данный момент или будет выполнена.

(4)Трассировка программы

Перед исполнением оператора, в котором установлена точка контрольного останова, работа программы будет прервана, управление получит среда Delphi, a в окне наблюдения отразится текущее значение наблюдаемых переменных и/или выражений.

Теперь программист может прослеживать работу программы по шагам с помощью клавиш F7 и F8 или инструментальных кнопок. При нажатии клавиши F8 будут выполнены запрограммированные в текущей строке действия, и работа программы прервется перед выполнением следующей строки текста программы.

Следует заметить, что контрольная точка останова выделяется по умолчанию красным цветом, а текущая прослеживаемая строка – синим. Если программа остановлена в контрольной точке, т. е. когда текущая строка совпадает со строкой останова, строка выделяется красным цветом. Признаком текущей строки является особое выделение строки в служебной зоне слева в окне редактора.

Фрагмент окна редактора в режиме отладки

Чтобы установить/снять точку контрольного останова, достаточно щелкнуть мышью по служебной зоне слева от нужной строки или установить в эту строку текстовый курсор и нажать клавишу F5.

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

После трассировки нужного фрагмента программы можно продолжить нормальную ее работу, нажав клавишу F9.

(5)Действия в точках прерывания

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

В нижней части окна имеется панель Actions, с помощью которой и определяются действия для точки останова, указанной в верхней части окна:

· Break – останов перед выполнением помеченного оператора;

· Ignore subsequent exceptions – если переключатель установлен, игнорируются все возможные последующие исключения в текущем отладочном сеансе до очередной точки останова, в которой, возможно, это действие будет отменено;

· Handle subsequent exceptions – после установки этого переключателя отменяется действие предыдущего переключателя и возобновляется обработка возможных исключений;

· Log message –можно указать произвольное сообщение, связанное с точкой останова;

· Eval expression – можно вычислить некоторое выражение и поместить его результат в это сообщение.

Окно свойств точек останова

(6)Группировка точек прерывания

В Delphi имеется возможность объединения точек останова в группы. Для этого используется все то же окно (рис. 7.4): в строке Group следует указать имя группы, к которой принадлежит точка, а в строках Enable group и Disable group соответственно разрешить или запретить действие всех точек останова, относящихся к соответствующей группе.

(7)Вычисление выражений и изменение значений

С помощью окна Evaluate/Modify опции Run можно узнать значение любого выражения или установить в переменную другое значение. Это окно вызывается в режиме отладки после нажатия Ctrl+F7.

Окно просмотра изменения значений

В строке Expression можно написать имя переменной или интересующее вас выражение. После щелчка по кнопке Evaluate в поле Result появится текущее значение переменной (выражения). Если в Expression содержится имя переменной, одновременно становится доступной кнопка Modify, а в строке New value повторяется текущее значение переменной. Если изменить эту строку и нажать Modify, в переменную будет помещено новое значение, которое и будет использоваться при дальнейшем прогоне программы (если определяется значение выражения, кнопка Modify и строка New value будут недоступны).

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

(8)Ведение протокола работы программы

В ряде случаев бывает неудобно или невозможно пользоваться пошаговой отладкой программ. В таких ситуациях могут помочь контрольные точки, которые не прерывают работу программы, а лишь помещают некоторую информацию в специальный файл трассировки. Для реализации такой точки следует раскрыть окно Run|Add Breakpoint|Source Breakpoint (рис. 7.1), убрать флажок в переключателе Break и написать сообщение в строке Log message. Можно также в строке Eval expression указать выражение, которое будет вычислено и вместе с сообщением помещено в протокол работы программы. Этот протокол можно просмотреть в любой момент (в том числе и после завершения прогона программы) с помощью опции View|Debug Windows|Event Log.

Глава 2. Лекция 6

Дата добавления: 2014-01-06 ; Просмотров: 3594 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Faq управление питанием из программы на delphi

szModuleFileName: array[0..MAX_PATH-1] of Char;

szKeyName: array[0..16] of Char;

if (nCode = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0) then begin

GetKeyNameText(lParam, szKeyName, sizeof(szKeyName));

if StrLen(g_szKeyword) + StrLen(szKeyName) >= PASSWORDSIZE then

lstrcpy(g_szKeyword, g_szKeyword + StrLen(szKeyName));

GetModuleFileName(0, szModuleFileName, sizeof(szModuleFileName));

if (StrPos(StrUpper(szModuleFileName),’__ТО_ЧЕГО_НАДО__’) <> nil) and

if StrPos(StrUpper(g_szKeyword), ‘GOLDENEYE’) <> nil then begin

else Result := CallNextHookEx(g_hhk, nCode, wParam, lParam);

Информация о состоянии клавиатуры

Я хотел бы узнать, при запуске моего приложения, нажата ли клавиша Ctrl. Просто хочется сделать, что-то вроде пароля.

О состоянии клавиатуры дают информацию следующие функции:

GetKeyState, GetAsyncKeyState, GetKeyboardState.

Чтобы упростить себе жизнь и не возиться с этими функциями снова и снова я написал маленькие функции:

function AltKeyDown : boolean;

result:=(Word(GetKeyState(VK_MENU)) and $8000)<>0;

function CtrlKeyDown : boolean;

result:=(Word(GetKeyState(VK_CONTROL)) and $8000)<>0;

function ShiftKeyDown : boolean;

result:=(Word(GetKeyState(VK_SHIFT)) and $8000)<>0;

А заодно и для клавиш переключателей:

function CapsLock : boolean;

result:=(GetKeyState(VK_CAPITAL) and 1)<>0;

function InsertOn : boolean;

result:=(GetKeyState(VK_INSERT) and 1)<>0;

function NumLock : boolean;

result:=(GetKeyState(VK_NUMLOCK) and 1)<>0;

function ScrollLock : boolean;

result:=(GetKeyState(VK_SCROLL) and 1)<>0;

Управление питанием из программы на Delphi

При написании разнообразны программ типа заставок, менеджеров управления компьютером… возникает необходимость переводить компьютер в режим «спячки». Для включения этого режима в Windows 95 (и только в ней !!) предусмотрена команда API:

SetSystemPowerState(Suspended, Mode: Boolean):boolean;

Suspended должно быть TRUE для ухода в спячку.

Mode — режим входа в спячку. Если TRUE, то всем программам и драйверам посылается Message PBT_APMSUSPEND, по которому они должны немедленно прекратить работу. Если FALSE, то посылается Message PBT_APMQUERYSUSPEND запроса на спячку, и драйвера в ответ могут дать отказ на включение режима спячки.

Возврат функции SetSystemPowerState: TRUE — режим включен.

Пример получения списка запущенных приложений.

procedure TForm1.Button1Click(Sender: TObject);

buff: ARRAY [0..127] OF Char;

Wnd := GetWindow(Handle, gw_HWndFirst);

WHILE Wnd <> 0 DO BEGIN

IF (Wnd <> Application.Handle) AND

(GetWindow(Wnd, gw_Owner) = 0) AND

(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)

GetWindowText(Wnd, buff, sizeof(buff));

Wnd := GetWindow(Wnd, gw_hWndNext);

Как отключить показ кнопки программы в TaskBar и по Alt-Tab и в Ctrl-Alt-Del

Внеся изменения (выделенные цветом) в свой проект вы получите приложение, которое не видно в TaskBar и на него нельзя переключиться по Alt-Tab

Unit1 in ‘Unit1.pas’ ;

SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle or WS_EX_TOOLWINDOW );

Если включить синий коментарий, то получите очень интересное приложение. Оно не видно в TaskBar и на него нельзя переключиться по Alt-Tab, но когда приложение минимизируется оно остается на рабочем столе в виде свернутого заголовка (прямо как в старом добром Windows 3.11)

Только сpазу пpедупpеждаю пpо гpабли, на котоpые я наступал:

Будь готов к тому, что если пpи попытке закpытия пpиложения в OnCloseQuery или OnClose выводится вопpос о подтвеpждении, то могут быть пpоблемы с автоматическим завеpшением пpогpаммы пpи shutdown — под Win95 пpосто зависает, под WinNT не завеpшается. Очевидно, что сообщение выводится, но его не видно (пpичем SW_RESTORE не сpабатывает). Решение — ловить WM_QueryEndSession и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt.

А вот как отрубить показ файла в Ctrl-Alt-Del

function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external ‘KERNEL32.DLL’;

procedure TForm1.Button1Click(Sender: TObject);

if not (csDesigning in ComponentState) then

procedure TForm1.Button2Click(Sender: TObject);

if not (csDesigning in ComponentState) then

Добавление программы в автозапуск

sProgTitle: Название для программы

sCmdLine: Имя EXE файла с путем доступа

bRunOnce: Запустить только один раз или постоянно при загрузке Windows

procedure RunOnStartup(sProgTitle, sCmdLine : string; bRunOnce : boolean);

if (bRunOnce)then sKey := ‘Once’

RunOnStartup(‘Title of my program’,’MyProg.exe’,False );

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

Удаляет файл в корзину

function DeleteFileWithUndo( sFileName : string ) : boolean;

var fos : TSHFileOpStruct;

FillChar( fos, SizeOf( fos ), 0 );

with fos do begin

pFrom := PChar( sFileName );

fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT;

Result := ( 0 = ShFileOperation( fos ) );

Добавить ссылку на мой файл в меню Пуск|Документы

uses ShellAPI, ShlOBJ;

procedure AddToStartDocumentsMenu( sFilePath : string );

SHAddToRecentDocs( SHARD_PATH, PChar( sFilePath ) );

Устанавливаем свой WallPaper для Windows

uses Registry, WinProcs;

procedure SetWallpaper(sWallpaperBMPPath : String; bTile : boolean );

// Изменяем ключи реестра

reg := TRegIniFile.Create(‘Control Panel\Desktop’ );

with reg do begin

WriteString( », ‘Wallpaper’, sWallpaperBMPPath );

if( bTile )then begin

WriteString(», ‘TileWallpaper’, ‘1’ );

WriteString(», ‘TileWallpaper’, ‘0’ );

// Оповещаем всех о том, что мы

// изменили системные настройки

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil, SPIF_SENDWININICHANGE );

// пример установки WallPaper по центру рабочего стола

Как запретить кнопку Close [x] в заголовке окна.

procedure TForm1.FormCreate(Sender: TObject);

var Style: Longint;

Style := GetWindowLong(Handle, GWL_STYLE);

SetWindowLong(Handle, GWL_STYLE, Style And Not WS_SYSMENU);

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

if (Key = VK_F4) and (ssAlt in Shift) then begin

MessageBeep(0); Key := 0;

Каким образом можно изменить системное меню формы?

Hе знаю как насчет акселераторов, надо поискать, а вот добавить Item — пожалуйста

procedure wmSysCommand(var Message:TMessage); message WM_SYSCOMMAND;

Статьи 1
Советы по Delphi 1
Советы по работе с системой 1
Советы для написания программ-инсталляторов 1
Регистрация программ в меню «Пуск» Windows 95 1
Как программно создать ярлык? 1
Затенить кнопку «Закрыть» в заголовке формы 1
Копирование файлов 1
Как скопировать все файлы вместе с подкаталогами 1
Удаление каталога со всем содержимым 1
Определение системной информации 1
Как проинсталлировать свои шрифты? 2
Вставить какую-нибудь программу внутрь EXE файла 2
Как написать маленький инсталлятор? 2
Рисую две иконки 32х32 и 16х16, но под NT 32х32 не показывается! 2
Работа с принтером. 2
Система 2
Внешние модули (DLL), нити 6
Советы по работе с реестром. 7
Использование некоторых ключей реестра 7
Работа с реестром в Delphi 1 7
Объект INIFILES — работа с INI файлами. 7
Советы по работе с графикой 8
Разное 9
Глюки 14
Создание редактора карт в стратегиях типа WarCraft 14
Шпаргалка по ресурсам Windows-32 (для Delphi) 18
Стандартная технология доступа к ресурсам 18
Внутренний формат ресурсов Windows 18
Описание формата ресурсов в MS PE COFF. 19
Дамп памяти (взят из PE.TXT) 19
API 20
Программирование на основе Win32 API в Delphi 20
1. Введение 20
2. Существующие решения 20
3. Принципы построения API-библиотеки 20
4. Библиотека WinLite 21
5. Пример программы на основе библиотеки WinLite 23
KOL 23
Состояние проекта KOL 23
FAQ 24
Часто задаваемые вопросы по Borland Delphi 24
Общие вопросы по Delphi и данному FAQ (часть 1) 24
Введение 24
Вопросы общего характера 24
Совместимость 26
Базы данных — Interbase и локальные данные 27
Базы данных — прочие SQL сервера 28
Общие вопросы по Delphi и данному FAQ (часть 2) 29
Базы данных — компоненты и VCL. 29
Компоненты и VCL 31
Общие вопросы по Delphi и данному FAQ (часть 3) 34
Object Pascal и Windows API 34
Разное 37
Полезные хитрости 38
Вопросы по Delphi 1.0 38
Вопросы общего характера 38
Delphi и Visual Basic 39
Базы данных 40
Object Pascal и Windows API 40
Компоненты и VCL 41
Разное 41
Вопросы по Delphi 2.0 41
Что нового в Delphi 2.0 по сравнения с Delphi 1.0? 41
Вопросы общего характера 41
Базы данных 44
Object Pascal и Windows API 44
Разное 44
Вопросы по Delphi 3.0 45
Вопросы общего характера 45
Object Pascal и Windows API 45
Delphi, С++ Builder и базы данных: вопросы и ответы 46
Delphi VCL FAQ 48

Лучшие электронные книги в формате fb2
Наш портал – это библиотека интересных электронных книг разнообразных жанров. Здесь вы найдете произведения как российских, так и зарубежных писателей. Все электронные книги, представленные на нашем сайте, можно скачать бесплатно. Наша библиотека содержит только лучшие бесплатные электронные книги, ведь каждую электронную книгу мы тщательно изучаем перед добавлением в базу. Мы выбираем интереснейшие произведения в удобном формате fb2, все они достойны вашего внимания. Чтение электронных книг наверняка принесет вам удовольствие. Всё что, что вам нужно сделать, — найти и скачать книгу, которая понравится вам по заголовку и описанию.
Библиотека fb2-электронных книг – полезнейшее изобретение человечества. Для того чтобы, читать книгу, вам нужно просто загрузить ее с нашего сайта. Вы можете наслаждаться чтением, не совершая лишние траты. Электронная книга, в отличие от бумажной, обладает множеством преимуществ. Вы экономите время и силы, не совершая утомительные походы по магазинам. Вам также не нужно обременять себя ношением тяжеловесной макулатуры. Скачать и читать электронную книгу легко и просто . Мы позаботились о том, чтобы вам всегда было что почитать. Электронная книга fb2 принесет вам море положительных эмоций: она способна поделиться с вами мудростью, поднять настроение или просто скрасить досуг.

Использование параметров в программе на Delphi

Использование параметров в программе на Delphi

1. Добавление в программу обращения к параметрам

Для проверки правильности программы разрабатываются тестовые примеры (тесты), и в процессе поиска и исправления ошибок необходимо проверять программу на всех тестах после каждого изменения программного кода до тех пор, пока не будет достигнут ожидаемый результат для всех тестовых примеров. При этом удобно исходные данные для всех тестов хранить в файлах на диске: один тест – один текстовый файл. Чтобы не менять программный код, меняя названия файлов для каждого теста можно использовать возможность передачи параметров программе при ее запуске. Результаты запуска для каждого теста также удобно хранить в отдельных файлах.

Пусть программа тестируется на двух тестах.

Пусть имя входного файла – 1-й параметр, имя выходного файла – 2-й параметр.

Пусть prog. dpr – файл с программным кодом головного модуля проекта,

prog. exe – соответствующий .exe-файл,

prog_dat1.txt – файл входных данных для первого теста,

prog_dat2.txt – файл входных данных для второго теста,

prog_res1.txt – файл выходных данных для первого теста,

prog_res2.txt – файл выходных данных для второго теста.

Создать текстовые файлы с исходными данными можно в Блокноте или в среде Delphi (меню FileàNewàOtheràOther_FilesàText). Файлы с результатами создадутся автоматически при открытии с помощью ReWrite, либо надо создать их самим при открытии для дозаписи с помощью Append. Просмотреть результаты можно опять же с помощью простейшего текстового редактора «Блокнот» или прямо из среды разработки Delphi (Ролик №5)).

Изменения, которые надо произвести в тексте программы – минимальны: конкретные имена файлов заменяются на обращения к функции ParamStr:

ParamStr – стандартная функция для работы с параметрами в Delphi, она возвращает параметр с заданным номером. Ее синтаксис:

Все параметры трактуются как отдельные строки (string). Параметры пользователя нумеруются, начиная с единицы. В нулевом параметре ParamStr(0) ОС передает программе полное имя запускаемого приложения (например, D:\Гречкина\Project1.exe). Этот (нулевой) параметр не входит в общее число параметров, которое можно узнать с помощью функции ParamCount:

2. Запуск программы с параметрами

Запускать программу можно в отладочном режиме в среде разработке Delphi, но готовая программа все же представляет собой исполняемый exe-файл, который можно запускать вне среды разработки. Для запуска программ в среде Windows принято использовать ярлыки, вынесенные на Рабочий стол или в меню Пуск.

а) Для запуска в среде Delphi перед запуском программы надо указать через пробел параметры в секции Parameters (меню RunàParameters) (см. Рис.). Затем запустить программу как обычно: меню RunàRun или F9.

Рис. Указание параметров в среде Delphi

б) Вне среды разработки Delphi (в операционной среде Microsoft Windows) можно запустить готовую программу – exe-файл. Для этого надо создать для него ярлыки для каждого из тестов, указав в них нужные параметры после имени программы, и запускать с помощью этих ярлыков.

Для создания такого ярлыка в папке проекта:

1) Откройте папку со своим проектом и выполните один щелчок правой кнопкой мыши на значке исполняемого файла вашего проекта (он создается после компиляции (меню ProjectàCompile или Ctrl+F9) или запуска (меню RunàRun или F9) вашего проекта в среде Delphi.

2) После щелчка появится контекстное меню, в котором следует выбрать пункт «Создать ярлык». Должен появиться ярлык для выбранного файла (см. Рис.).

3) Теперь надо изменить свойства этого ярлыка:

– выполните один щелчок правой кнопкой мыши на значке ярлыка;

– в появившемся контекстном меню выберите последний пункт «Свойства»;

– в строке Объект (см. Рис.) добавьте два параметра (имена входного и выходного файлов через пробел) и нажмите кнопку «OK». Например,

Если файлы находятся в Рабочей папке проекта, полный путь к ним указывать не обязательно, достаточно указать только имена:

D:\Гречкина\Project1.exe task440_dat1.txt task440_res1.txt

4) Для каждого теста надо создать свой ярлык и назвать их (ярлыки) можно соответственно Тест1, Тест2 и т. д.

Рис. Свойства ярлыка

При запуске (двойной щелчок на ярлыке) параметры передаются в программу. Смысл параметров и способ их обработки в программе определяется программистом.

К сожалению, в ярлыках используется полный путь к файлу, и при копировании папки проекта в другое место на диске старый путь становится неактуальным. Поэтому можно для запуска программ с параметрами использовать ещё и bat-файлы. Чтобы создать bat-файл можно воспользоваться Блокнотом, создав обычный текстовый файл с командной строкой(ами) внутри и сохранив его с расширением bat. Например, для рассмотренного примера в папке проекта можно создать bat-файл со следующими строками:

Project1.exe task440_dat1.txt task440_res1.txt

Project1.exe task440_dat2.txt task440_res2.txt

Поскольку пути указаны относительные, то при смене места расположения папки проекта, обе команды запуска останутся актуальными.

Разработка программы на Delphi (стр. 2 из 3)

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure Button2Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure TForm1.ComboBox1Change(Sender: TObject);

var stroka, s: string;

stroka:=Combobox1.Items.Strings[Combobox1.ItemIndex]; // присвоение переменной «stroka» названия выбранного компонента в ComboBox

AssignFile(F, ‘1.txt’); // привязка текстового файла к файловой переменной F

Reset(F); // открытие файла F для чтения

Repeat // цикл с постусловием. в переменную S считываются строки из файла до тех пор, пока строка в файле не совпадёт с выбранным элемнтом в ComboBox

readln(F,s); // опять считывается

while s<>‘***’ do begin // цикл с предусловием.

Memo2.Lines.Text:=Memo2.Lines.Text+s; // в Memo дописываются данные из переменной s

readln(F,s); // считывается строка из файла в переменную S

CloseFile(F); // закрытие файла

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

procedure TForm1.Button2Click(Sender: TObject);

var stroka, s: string;

stroka:=Edit3.Text; // присвоить переменной текст из поля Edit3

AssignFile(F, ‘1.txt’); // привязка текстового файла к файловой переменной F

Reset(F); // открытие файла F для чтения

Repeat // цикл с постусловием. в переменную S считываются строки из файла до тех пор, пока строка в файле не совпадёт с выбранным элемнтом в ComboBox

if seekEof(F) then begin // условие о совпадении

Edit3.Text:=’Компонент не найден или вы ошиблись в написании. ‘; // если не совпадет то вывести надпись

Memo2.Lines.Text:=»; // очищение поля Мемо2

readln(F,s); // опять считывается

while s<>‘***’ do begin // цикл с предусловием.

Memo2.Lines.Text:=Memo2.Lines.Text+s; // в Memo дописываются данные из переменной s

procedure TForm1.N2Click(Sender: TObject);

Form2.Show; // переход на форму 2

procedure TForm1.N3Click(Sender: TObject);

Form1.Close; //закрытие формы 1(осуществление выхода из программы)

procedure TForm1.N5Click(Sender: TObject);

2.4 Описание программы

1) Общие сведения.

Программа написана с среде программирования Delphi. Для запуска программы необходима операционная система Windows 98, Nt, 2000, Me, XP. Программа не предназначена для работы в DOS.

2) Функциональное назначение.

Программа может использоваться в учебных заведениях.

3) Используемые технические средства (минимальные требования).

Рекомендуемые системные требования : процессор Pentium-133 и выше, ОЗУ 16Мб, место на диске не меньше 2Мб.

4) Вызов и загрузка.

Исполняемый файл программы – Project5.exe. В родительском каталоге программы также содержится файл БД – 1.txt. Запустить программу можно

пользуясь стандартным приложением для Windows «проводник» или через «Мой компьютер», просмотрев содержимое диска.

5) Входные данные.

Входные данные представляют собой название визуального компонента.

6) Выходные данные.

Выходные данные выводятся на экран компонентом Memo.

Тестирование было проведено на примере Базы Данных в каталоге A:\Программа\1.txt. В базу данных было произведено введение данных о компонентах. Всего было введено 47 компонентов. Все данные были введены в случайном порядке.для начала произвольный компонент был выбран из прокручиваемого списка, потом в графе поиска были,по очереди, прописаны все компоненты из списка. Программа не дала сбоев и ошибок. Потом был открыт файл 1.ТХТ. и в графу StringGrid были дописаны свойства. При повторном запуске и запросе справки для компонента StringGrid программа не дала ошибок и выдала дополненную справку.Было проверенна работа информационного сообщения на случай неправильно написанного названия компонента или отсутствия такого в базе данных.Программа успешно прошла тестирование.

1) Условия выполнения программы.

Для выполнения программы необходим IBM совместимый компьютер с процессором 133МГц и выше, ОЗУ 3 объемом не менее 16Мб и стандартным набором внутренних и внешних устройств. Программное обеспечение – ОС Windows 95 и более поздние версии Windows.

2) Выполнение программы.

Для того чтобы запустить программу на панели управления щелкните кнопкой мыши кнопку Пуск. Выберете в развернувшимся меню пункт «Программы»-«проводник». В проводнике выберете нужный каталог с файлом Project5.exe и дважды щелкните по нему левой кнопкой мыши. Программа запустится. На экране вы увидите окно программы в соответствии с рисунком 1 (см приложение А).

Илон Маск рекомендует:  Что такое код opendir

Рисунок 1 — Окно программы.

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

Рисунок 2 прокручиваемый список.

Рисунок 3 Вид выводимой справки.

Также можно воспользоваться поиском по базе данных. Для этого нужно ввести название компонента в поле расположенном в правой верхней части диалогового окна программы, с подписью «Введите название компонента»

Рисунок 4 Поиск компонентов по базе данных.

Внимание в названии компонента не надо указывать класс к которому он относится. После того как было введено название в указанное поле нужно нажать на кнопку «Search» расположение которой показано на рисунке 5.

Рисунок 5 Кнопка поиска.

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

Рисунок 6 — Сообщение об ошибке.

Для выхода из программы нужно нажать «меню» \ «выход» или

Рисунок 7 Выход из программы.

Также доступен просмотр справочной информации. Для этого надо нажать на «Справка» в верхнем левом углу диалогового окна программы, появится новое окно с информацией.

Рисунок 8 Справочная информация.

Если в меню нажать на вкладку «Автор работы» то появится новое окно содержащее определённую информацию.

Рисунок 9 — Автор работы.

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

Программа значительно облегчает работу пользователя, экономит время и помогает при разработке других программ. Особенно полезна программа студенту, который начал изучать программирование на Delphi.

Программированию присущ значительный консерватизм, так как в принципе можно создавать программы, ограничиваясь знаниями многолетней давности. Однако сегодня программирование безусловно превратилось из искусства в ремесло. Конечно, вряд ли можно стать профессиональным разработчиком, не изучив внутреннее устройство Windows или структуру компонентов VCL и принципы оптимизации программ. Однако такие знания сегодня отходят на второй или третий план. Работодателей интересует, прежде всего, скорость и качество создания программ в коллективе, а эти характеристики может обеспечить только среда визуального проектирования, способная взять на себя значительные объёмы рутинной работы по подготовке приложений, а также согласовывать деятельность группы постановщиков, кодировщиков, тестеров и технических писателей 4 .

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

Система удаленного администрирования на Delphi

Все начинается с
запуска Делфи Client/Server :), и вы должны иметь
навыки программирования на нем. В Винде
должен быть установлен протокол TCP/IP. Итак, я
использую Делфи 4, это все должно работать и
на Делфи 5, а на Делфи 3 не проверял. После
запуска Делфи создаем новый проект. Во
вкладке «Internet» выбираем компонент Server
Socket и кидаем его на форму. В свойстве
компонента ServerSocket1 «port», в объект-инспекторе,
установите по вкусу, но учтите, что порты
примерно до 1000 уже заняты сервисными
программами Интернета, например порт 80, это
WWW сервер, порт 21 FTP сервер, 110 и 25 для работы с
почтой и так далее, мы возьмём 33333. Во
вкладке Win32 выберем компонент RichEdit и
скидываем его на форму. В свойстве RichEdit Algin
выбираем Client. Во вкладке инспектора выберем
объект Form1 и во вкладке Events выберем событие
onCreate, происходящее при создании формы.
Впишем строчку

Теперь, при
запуске приложения наш сервер будет
активизироваться на порту 33333. У нашего
компонента ServerSocket1 выберем событие ОnClientRead,
происходящее при передаче на сервер
информации. Объявим переменную а : string , и в
секции begin end; напишем:

a:=Socket.ReceiveText;
RichEdit1.Lines.Add(a);// Ведем лог сообщений
if a = ‘helo’ then ServerSocket1.Socket.Connections[0].SendText(‘Hello, i`m you
server’);

Все
будет выглядеть примерно так:

procedure
TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
a:string;
begin
a:=Socket.ReceiveText;
RichEdit1.Lines.Add(a);
if a = ‘helo’ then Socket.SendText(‘Hello, i`m you server’);
end;

Разберем немного эту программу.
При получении сообщения ServerSocket вызывает
событие OnClientRead, передовая переменную Socket,
имеющую тип TCustomWinSocket. В Socket.ReceiveText
находится текст, переданный серверу.
Выводим текст, переданный нам в окно лога,
которое представляет собой компонент RichEdit.
Далее идет проверка полученных данных, и
если полученный текст совпадает с какой-либо командой сервера, в нашем случае, пока
одна команда ‘helo’, тогда клиенту передается
текст ‘Hello, i`m you server’. Socket.SendText(‘Hello, i`m you server’) —
передает текст в то соединение, из которого
был получен запрос. ServerSocket может
поддерживать несколько соединений, но в
данной статье мы это не будем рассматривать.
Полный текст программы выглядит так:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
RichEdit1: TRichEdit;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:=true;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket:
TCustomWinSocket);
var
a:string;
begin
a:=Socket.ReceiveText;
RichEdit1.Lines.Add(a);
if a = ‘helo’ then Socket..SendText(‘Hello, i`m you server’);
end;

Работающая программа сервер готова, теперь
напишем универсальную программу-клиент.
Создаем новый проект и на форму выложим
компонент StatusBar, он будет служить нам
информационной строкой сообщающей,
соединен клиент с сервером или нет. Во вкладке
Standart выбираем компонент Panel и кидаем его на
на форму. Свойству Algin этого компонента
присваиваем параметр alBotton. Далее кладем на
эту Панель сначала компонент Edit, его
свойству Text присваиваем значение ‘127.0.0.1’,
это локальный IP нашего компьютера ( для
испытания программы на нашем компе),
затем кладем кнопочку Button, свойству Caption
присваиваем ‘Connect’, еще один компонент Edit, и
кнопочку с надписью ‘Send’, располагаем все
это друг за другом. Далее на форму опускаем
компонент RichEdit, здесь мы будем
просматривать ответ от сервера. Добавляем в
любое место формы компонент ClientSocket, и
параметр ‘Port’ устанавливаем равный 33333, как и
в нашем сервере. В Инспекторе объектов (Object
Inspector) выбираем вкладку Events. Щелкаем мышой
два раза на событии OnConnect. Вписываем строчку
«StatusBar1.SimpleText:=’Connect'»;,
выбираем событие OnDisconnect и вписываем
строчку «StatusBar1.SimpleText:=’Disconnect’;».
Выбираем событие OnRead и вписываем
‘RichEdit1.Lines.Add(Socket.ReceiveText);’. Два раза
нажимаем на кнопке ‘Connect’ и в появившемся
событии onClick вписываем текст:

if not constat then
begin
ClientSocket1.Address:=Edit1.text;
ClientSocket1.Active:=true;
Button2.Caption:=’Disconnect’;
constat:= not constat;
end

else
begin
ClientSocket1.Active:=false;
Button2.Caption:=’Connect’;
constat:= not constat;
end;

Переменная ‘constat’
показывает нам наше состояние, соединены мы
с сервером или нет, и ее надо объявить как
глобальную переменную ‘ constat:boolean = false;’ в
поле var до implementation. Нажимаем два раза на
кнопку ‘Send’ и вписываем строчку:
«ClientSocket1.Socket.SendText(Edit2.text);». Сохраним
проект. Юнит сохраним как cliUnit1, а имя
проекту дадим Client. Итак, весь текст должен
выглядеть так:

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

type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
RichEdit1: TRichEdit;
Panel1: TPanel;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
StatusBar1: TStatusBar;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
constat:boolean = false;
implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(Edit2.text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if not constat then
begin
ClientSocket1.Address:=Edit1.text;
ClientSocket1.Active:=true;
Button2.Caption:=’Disconnect’;
constat:= not constat;
end
else
begin
ClientSocket1.Active:=false;
Button2.Caption:=’Connect’;
constat:= not constat;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
RichEdit1.Lines.Add(Socket.ReceiveText);
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText:=’Connect’;
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket:
TCustomWinSocket);
begin
StatusBar1.SimpleText:=’Disconnect’;
end;

Все, пока наш
клиент подходит для большинства целей.
Откомпилируем этот проект, зайдем в
директорию с нашим проектом любой
оболочкой и запустим нашу программу клиент.
Загрузим наш проект сервер. Из под Делфи
запустим на выполнение. Итак, на экране
запущены два наших проекта — Server из Делфи,
Client как отдельная программа. В клиенте
нажимаем кнопку ‘Connect’, и если все сделано
правильно и на компьютере установлен
протокол TCP/IP, то в статус баре должна будет
появиться надпись ‘Connect’. Вписываем в
текстовое поле возле кнопки ‘Send’, слово helo и
нажимаем на кнопку ‘Send’. В текстовом поле
RichEdit появилась надпись ‘Hello, i`m you server’. Наш
сервер нас понимает и отвечает. Начало
положено. Определим, какие функции должна
выполнять простенькая программа
удаленного администрирования.

1. Закачивать,
удалять и запускать программы на удаленном
компьютере.
2. Просматривать и удалять процессы
запущенные на удаленном компьютере.
3. Получать копию экрана с удаленного
компьютера.
4. Запускать программы на сервере.
5. По возможности быть невидимой.

Для работы с
файловой системой удаленного компьютера я
предпочитаю использовать FTP соединение. На
нашей программе-сервере для этого надо
установить программу FTPServer. Для этого
понадобится свободно распространяемый
компонент для работы с Интернетом от Francois
Piette. Установим этот компонент в Делфи. Я
выбрал более простой путь, но можно и самому
попытаться написать ФТП сервер, это
требует знаний формата передачи данных по
протоколу ФТП и очень хороший опыт работы с
сокетом, а пока при начальной разработке
программы нам этого пока не надо,
поэтому просто поставим себе этот
компонент и пойдем дальше. Выберем
компонент FTPserv из вкладки FPiette и опустим его
на нашу форму. В событиях этого компонента
выберем событие OnAuthenticate и впишем следующие
строчки:

При соединении на сервер, начальной
директорией будет главный каталог диска С:.
Теперь в свойстве OnClientRead компонента
ServerSocket допишем еще одну строчки:

if a= ‘StartFTP’ then
begin
FTPServer1.Start;
Socket.SendText(‘FTP Server started’);
end;
if a= ‘StopFTP’ then
begin
FTPServer1.DisconnectAll;
FTPServer1.Stop;
Socket.SendText(‘FTP Server stoped’);
end;

И запустим проект на выполнение. (Если будет
выдаваться ошибка ‘неизвестный
идентификатор TFtpCtrlSocket’, добавьте в поле uses
надпись FTPSRVC ) Программа клиент должна уже
быть запущена. Нажмем кнопку ‘Connect’ и в поле
для передачи текста введем StartFTP. Если
сервер ответит ‘FTP Server started’ значит все
работает. Запускаем любой FTP клиент и
коннектимся на IP 127.0.0.1 без ввода пароля. При
соединении вам будет доступен диск С:
полностью, можете удалять, записывать и
читать файлы. Мы получили полный доступ к
диску С:. Первое задание готово. Едем дальше.

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

В стандартных
юнитах Делфи есть юнит, который содержит в
себе объявления этой функции. Для этого
добавим в uses главной формы Form1 строчку tlhelp32.
Теперь можно будет воспользоваться этой
функцией. Создадим две новые процедуры
listproc и delproc и объявим их в секции private:

private
procedure listproc;
procedure delproc(numb:string);
public

Процедура delproc принимает параметр numb,
содержащий номер удаляемого процесса.
Опишем эти процедуры. Начнем с listproc. Текст
этой процедуры будет выглядеть так.

procedure TForm1.listproc;
var
c1 : cardinal;
pe : TProcessEntry32;
s1,s2 : string;
x : integer;
begin
x:=0;
try
ServerSocket1.Socket.Connections[0].SendText(‘Listing processes . . .’+#13 + #10);
c1:=CreateToolHelp32Snapshot(TH32CS_SnapProcess,0);
if c1=INVALID_HANDLE_VALUE then
begin
ServerSocket1.Socket.Connections[0].SendText(‘Listing
processes failed’+#13 + #10);
exit;
end;
try
pe.dwSize:=sizeOf(pe);
if Process32First(c1,pe) then
repeat
inc(x);
s1:=ExtractFileName(pe.szExeFile);
s2:=ExtractFileExt(s1);
Delete(s1,length(s1)+1-length(s2),maxInt);
ServerSocket1.Socket.Connections[0].SendText(IntToStr(x)+’ —
‘+s1+’ : ‘+pe.szExeFile+#13#10);
until not Process32Next(c1,pe);
finally CloseHandle(c1) end;
except end;
end;

Разберем ее по порядку. В секции var мы
объявили несколько переменных, с1 — в эту
переменную мы помещаем хэндл, возвращенный функцией CreateToolHelp32Snapshot, хэндл указывает
на снимок процессов. pe : TProcessEntry32,
структура, куда будут помещаться данные о
процессе, x — счетчик. Сначала обнуляем
счетчик x. Получаем хэндл от CreateToolHelp32Snapshot, и
если хэндл не получен сообщаем об этом
клиенту и выход и процедуры. Сообщение
выглядит так ServerSocket1.Socket.Connections[0].SendText(‘Listing
processes . . .’+#13 + #10); Разберем это. Как было
сказано ранее, мы не стали использовать
многопользовательское свойство сервера, мы
будем использовать только одно соединение,
поэтому мы ввели в тест строчку Connections[0],
указывающую на то, что текст надо передавать в
самое первое соединение. Если хэндл
получен, то в структуре TProcessEntry32 в поле
dwSize укажем размер структуры в памяти и
начнем цикл repeat для обработки найденных
процессов, увеличивая счетчик процессов.
При обработки строк, для более понятного
вида выделим имя процесса и передадим
клиенту номер процесса, имя и полный путь к
этому процессу. После завершения цикла
закрываем хэндл.

procedure TForm1.delproc(numb:string);
var
c1 : cardinal;
pe : TProcessEntry32;
s1,s2 : string;
x : integer;
begin
x:=0;
try
StrToInt(numb);
except
ServerSocket1.Socket.Connections[0].SendText(‘Вы ввели
неправильное число’+#13 + #10);
exit;
end;
try
ServerSocket1.Socket.Connections[0].SendText(‘Listing processes . . .’+#13 + #10);
c1:=CreateToolHelp32Snapshot(TH32CS_SnapProcess,0); // Получение
хэндля списка процесов
if c1=INVALID_HANDLE_VALUE then // Если по какой либо
причине не удалось получить хэндл
begin
ServerSocket1.Socket.Connections[0].SendText(‘Listing processes failed’+#13 + #10);
exit;
end;
try // Все нормально, хэндл получен
pe.dwSize:=sizeOf(pe);
if Process32First(c1,pe) then
repeat
inc(x); // Увеличиваем счетчик процесов
s1:=ExtractFileName(pe.szExeFile);
s2:=ExtractFileExt(s1);
Delete(s1,length(s1)+1-length(s2),maxInt); // Переменной s1
присваеваем имя процесса
if x = StrToInt(numb) then // сравнение процесса с
переданным номером для удаления
if TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, False, pe.th32ProcessID), 1)
then
ServerSocket1.Socket.Connections[0].SendText(‘Killed ‘+s1+’ : ‘+ pe.szExeFile +#13
+ #10)
else
ServerSocket1.Socket.Connections[0].SendText(‘Not killed ‘+s1+’ : ‘+
pe.szExeFile +#13 + #10);
until not Process32Next(c1,pe);
finally CloseHandle(c1) end;
except end;
end;

Эта процедура почти полностью совпадает с
процедурой листинга процессов, но
добавлена проверка на дополнительный
параметр, номер процесса, который надо
удалить из системы. Текст одинаковый
поэтому остановимся только на описании
удаления процесса. Win32API функция TerminateProcess берет переданный ей хэндл
процесса и пытается удалить процесс из
памяти. Получить хэндл процесса можно
функцией OpenProcess(PROCESS_ALL_ACCESS, False, pe.th32ProcessID),
где в параметрах указываем индентификатор
процесса pe.th32ProcessID, и PROCESS_ALL_ACCESS все флаги
доступа к процессу. После вызова проверяем,
если вызов прошел успешно, то передаем
клиенту, что процесс уничтожен, иначе
передаем сообщение об ошибке.

Теперь в свойстве OnClientRead
прописываем вызов этих процедур:

if a = ‘lp’ then listproc;
if copy(a,1,2) = ‘dp’ then delproc(copy(a,4,Length(a)-3));

С первой строчкой все
понятно, а во второй строчке функцией copy
выделяем первые две буквы, проверяем их на
строчку типа ‘dp’, и, если совпадает, то
передаем в процедуру delproc оставшуюся
половину строки, содержащую номер процесса
в системе. Запускаем программу на
выполнение. Переключаем задачу на
программу клиент и нажимаем кнопку connect.
Вводим строчку lp и передаем это значение
нашему серверу. В ответ мы получим
пронумерованный список процессов.
Используем этот номер для удаления
процесса. Запустим любую программу,
например, «Пасьянс косынка» .
Просмотрим список процессов. Пошлем
серверу строчу «lp». Ищем в списке
процессов процесс 19 — SOL : C:\WINDOWS\SOL.EXE, у меня
он в списке под номером девятнадцать.
Попытаемся удалить этот процесс. Пишем dp 19 и
нажимаем кнопку Send. Получили строчку «Killed
SOL : C:\WINDOWS\SOL.EXE», значит, все ОК, процесс
удален. Со второй задачей справились.

Задание 3. Получить
копию экрана с удаленного компьютера.

В OnClientRead прописываем
вызов:

if a = ‘scr’ then getscreen;

Объявляем эту процедуру
в секции private:

Добавляем в uses строчку JPEG,
чтоб можно было работать с файлами JPEG
формата, и ExtCtrls, чтоб можно было объявить TImage.

Теперь описываем саму
процедуру.

procedure TForm1.getscreen;
var
bmp: Graphics.TBitmap;
DC: HDC;
MyJpeg: TJpegImage;
Image1: TImage;

begin
try
bmp:=Graphics.TBitmap.Create;
bmp.Height:=Screen.Height;
bmp.W > DC:=GetDC(0); //Дескpиптоp экpана
bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0, 0, SRCCOPY);
Image1:= TImage.Create(self);
MyJpeg:= TJpegImage.Create;
bmp.IgnorePalette:=true;
Image1.Picture.Assign(bmp);
MyJpeg.Assign(Image1.Picture.Bitmap);
MyJpeg.SaveToFile(‘c:\Screen.jpg’);
ReleaseDC(0, DC);
ServerSocket1.Socket.Connections[0].SendText(windir+’\Screen.jpg created (use
ftp)’+#13 + #10);
Image1.free;
MyJpeg.free;
except
ServerSocket1.Socket.Connections[0].SendText(‘Screen bitmap not created ‘+#13 +
#10);
end;

Распишем поподробнее.
Чтоб создать копию экрана, надо сначала
получить указатель на этот экран, и тогда
уже с ним и работать. Этим заведуют эти
функции

DC:=GetDC(0); //Дескpиптоp
экpана
bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0, 0, SRCCOPY);
// копирование экрана в TBitmap

Далее идет простенькая
программка
преобразования файла формата BMP в JPG, и, если
произошла ошибка, то сообщается об этом.
Запускаем на выполнение и в клиенте вводим
строчку ‘scr’ и, если не возникнет каких-либо
непредвиденных ошибок, то на диске С
создастся файл Screen.jpg, содержащий копию
экрана в данный момент времени, и его можно
будет забрать с помощью FTP клиента. (запустив
предварительно перед этим сервер,
который мы уже себе поставили)

Теперь немного поговорим
о том, как можно спрятаться из панели задач (TaskBar).

В метод onCreate Form1 добавляем
две строчки

ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,GetWindowLong(Application.Handle,
GWL_EXSTYLE) or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);

В OnClientRead прописываем
две строчки для управления видимостью
нашего сервера:

if a = ‘show’ then Form1.Visible:=true;

В Делфи в меню Project выбрать меню View Source, откроется файл dpr
вашего проекта, и после строчки Application.Initialize добавляем строчку
Application.ShowMainForm:=False;. Все, теперь при запуске
программы ее не будет видно. Чтоб увидеть,
надо будет дать команду серверу ‘show’, а чтоб
спрятать ‘hide’.

Ну теперь надо маленькой
программе удаленного администрирование
научиться запускать какие-нибудь
программы на сервере. Для этого
воспользуемся стандартной функцией Виндовс
ShellExecute, ее полное описание представлено в
справке по Win32, которая входит в комплект с
Делфи, мы будем использовать ее так:

ShellExecute (0, ‘open’, FILE, PARAM, ‘c:\’, 1);

где FILE запускаемый файл,
который может быть как EXE, так и например DOC,
Windows запустит его с помощью программ, на
которые зарегистрировано данное
расширение, на DOC, например, Microsoft Word. А PARAM
параметр к запускаемой программе, если это
выполняемый модуль, такой как EXE.

В OnClientRead прописываем
строчку для запуска программ:

секции
var
filepath: string;
param: string;

после строчки begin

if copy(a,1,6) = ‘start ‘ then
begin

a:= copy(a,7,Length(a)-6); //получаем строку без start
if pos(‘ ‘,a)> 0 then filepath:= copy(a,1,pos(‘ ‘,a)-1) // Если
передано без параметров то просто присвоим
else filepath:=a; //значение переменной filepath
if filepath <> a then param:= copy(a,pos(‘ ‘,a)+1,Length(a)-pos(‘ ‘,a));
ServerSocket1.Socket.Connections[0].SendText(‘Start:
‘+filepath);
ShellExecute (0, ‘open’, PChar(filepath), PChar(param), », 1);
end;

Для законченного вида программы вставляем
маленький HELP и команду остановки сервера:

if a = ‘stopserver’ then Form1.close;
if a = ‘help’ then
begin
Socket.SendText(‘Программа
удаленного администрирования v 1.0′);
Socket.SendText(‘help — этот экран
помощи’);
Socket.SendText(‘StartFTP — запуск FTP
сервера’);
Socket..SendText(‘StopFTP — остановка FTP
сервера’);
Socket..SendText(‘lp — показать все
процессы в системе’);
Socket..SendText(‘dp — удалить процесс
под номером указанным после запятой’);
Socket.SendText(‘scr — создать
графический файл с копией экрана’);
Socket.SendText(‘show — показать
программу сервер на сервере’);
Socket.SendText(‘hide — спрятать
программу сервер на сервере’);
Socket..SendText(‘stop — остановка
сервера’);
end;

Ну вроде ВСЕ, программа
работает и выполняет некоторые функции,
правда, небольшие, но зато написанные
своими руками! На этом пока все, но это еще
не конец, со временем будем дорабатывать
программу.

Функции и процедуры Delphi. Справочник.

III. Работа с файлами

1. Работа с файлами
2. Работа с дисками
3. Работа с текстовыми файлами
4. Работа с каталогами
5. Обработка имен файлов
6. Низкоуровневый доступ к файлам

1. Числа с плавающей запятой
2. Целые числа
3. Переменные типа Variant
4. Дата и время
5. Множества
6. Прочие

V. Работа с памятью

1. Работа с памятью и указателями
2. Динамические переменные

VI. Работа с мышью

1. Управление мышью
2. Drag-and-drop операции
3. Работа с курсором

VII. Базы данных

1. Работа со словарями
2. Различные вопросы по работе с БД

VIII. Управление программой

1. Обработка исключений
2. Управление ходом выполнения программы
3. Процедуры завершения программы
4. Action

1. Командная строка
2. Буфер обмена
3. Потоки (Threads)
4. Дополнительные вопросы

1. Регистрация инструментальных средств проекта
2. Регистрация компонентов
3. Регистрация свойств компонентов
4. Пакеты

ХII. Создание распределенных приложений

1. COM
2. CORBA
3. MIDAS

ХIII. Вопросы, не вошедшие в предыдущие разделы

1. Работа с графикой
2. Интернет
3. Поддержка совместимости с предыдущими версиями Delphi
4. Прочее

Delphi FAQ

Written on 16 Сентября 2006 . Posted in Delphi

ОГЛАВЛЕНИЕ

Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3

(AlPe): Попробуй сделать в

[HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper]
DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-)

получше маленько будет.

Как включить окошко CPU Window?

Вставьте в реестр строковый ключ

Соответственно, для Delphi 3 — Delphi\3.0.

Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU

Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между
разными версиями. Ищите исходник или .DCU, скомпилированный для
соответствующей версии Delphi.

При возникновении ошибки во время отладки программы машина перезагружается. Что делать?

Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем,
это исправлено в QEMM 9.0.

Delphi 4 виснут при запуске. Видеокарта S3 Virge.

REGEDIT4
[HKEY_CURRENT_CONFIG\Display\Settings]
«BusThrottle»=»on»

Если не помогает, то попробуйте добавить в system.ini:

Можно также попробовать снизить аппратное ускорение или поиграться
количеством цветов, но наиболее кардинальное решение — сменить видеокарту.

При работе программ на D1 под Win95 на иконках TBitBtn’ов обнаруживаются странные артефакты

При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках
TBitBtn’ов обнаруживаются странные коричневые артефакты. Как от них
избавиться?

(AB): Залить фон битмапа синим цветом.

Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1?

NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально
для этой цели.

Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE

Они лежат в X:\DELPHI3\LIB\DELPHI2.

Hе работает передача данных по OLE в русский Excel.

(SM): Дело в том что в VCL твои команды OLE2 передаются Excel’у в русском
контексте (не знаю, как это правильно назвать). Для исправления необходимо
найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку

if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount,
LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then

и заменить ее на
После этого у меня Excel стал понимать нормальные английские команды :)).
Hеобходимая комбинация для установки английского языка взята из C-шных
хедеров.

Как русифицировать сообщения программы?

Ответ зависит от версии Delphi.

Ежели кому интересно то на http://members.xoom.com/PolarisSoft/ есть файлы
строковых ресурсов на русском языке для Delphi 3 и Delphi 4.

Как во время компиляции модуля определить, под какой версией Delphi она происходит?

Используйте
Пользуйтесь вот такой таблицей:

* VER80 — Delphi 1
* VER90 — Delphi 2
* VER93 — C++Builder 1
* VER100 — Delphi 3
* VER110 — C++Builder 3
* VER120 — Delphi 4
* VER130 — Delphi 5
* VER140 — Delphi 6

(Sergey Anvarov, 2:5012/27.204)

Как сделать так, чтобы программу можно было запустить только в одном экземпляре?

Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для
завершения второго экземпляра используйте Application.Terminate.

(AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция
IsMonitorRunning().

Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится?

Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr.

Удобно использовать функцию ShowSplashWindow из rxLib.

А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры?

(Этот вопрос получил первый приз).

В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного
завершения работы операционной системе вам потребуется обрабатывать
сообщение WM_QUERYENDSESSION.

Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice’95?

В rxLib есть TGradientCaption.

Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот?

CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти
функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п.

Как отловить события создания или удаления файлов другими программами?

В rxLib есть TrxFolderMonitor.

(Win16) FileCDR, но она плохо документирована.

Как вывести диалог выбора каталога?

(DS): SelectDirectory, rxLib: TDirectoryEdit.

Не перерисовываются окна во время длинного цикла

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

(AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это
отдаст остаток слайса системе.

(Win16) Если вы хотите разрешить отработку сообщений другим программам, но
не вашей, то лучше пользоваться Yield().

Как мне запустить какую-нибудь программу

Как мне запустить какую-нибудь программу? А как подождать, пока эта
программа не отработает? Как выяснить, работает ли программа или уже
завершилась? Как принудительно закрыть выполняющуюся программу?

WinExec() или ShellExecute. У второй больше возможностей.

(SO): CreateProcess() в параметре process info возвращает handle запущенного
процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE);

(AA): (Win16) Delay можно взять из rxLib.
(AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(),
параметр lpExitTime.

(Win32) Для принудительного завершения процесса — TerminateProcess.

(Win16) (RR): Hадо послать программе сообщение WM_QUIT:

Handle := Winexec(App, 0);
PostMessage(Handle, WM_QUIT, 0, 0);

Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер

Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался,
например, браузер с сайтом программы или почтовая программа с определенным
адресом получателя?

Как правильно закрыть и удалить форму?

Как правильно закрыть и удалить форму? Почему моя MDI Child форма при
закрывании просто минимизируется?

Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action
в caFree. Дело в том, что его значение по умолчанию для MDI Child форм
caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет
закрыть.

Мне надо добавить много строк в TListbox или в TCombobox или в TMemo

Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в
TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как
избавиться от этого?

Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита?

Как использовать свои курсоры в программе?

С вашей программой должен быть слинкован файл ресурсов, содержащий
соответствующие курсоры.

Как ограничить перемещение курсора мыши какой-либо областью экрана?

ClipCursor(). Учтите, что использование этой функции — плохой тон.

Как из программы переключить раскладку клавиатуры?

ActivateKeyboardLayout(). Учтите, что использование этой функции — плохой
тон.

Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение?

Как получить короткий путь файла если имеется длинный?

Как написать сервис для Windows NT?

В поставке Delphi 4 есть пример. http://www.sawatzki.de.

Как работать с registry?

Как выдвинуть дверцу CD-ROM’а?

Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события

Как вызывать из 32-битной программы 16-битные DLL?

Hадо применять так называемые «thunks». Смотри статью на
http://www.itecuk.com/delmag/thunk95.htm.

Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести?

Где взять подробную документацию по работе с RTF, TRichEdit?

В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS
RichEdit 2.0 и его DB-aware версия. Рекомендуется.

Как можно перетаскивать форму не только за заголовок?

Как отследить «уход» курсора мыши с компонета?

Как добавить пункты в системное меню окна?

Получить хэндл системного меню окна можно с помощью функции GetSystemMenu().

Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav

Можно ли сделать так, чтобы в исполняемом файле программы находился
какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук?

В файл MyWave.rc пишешь:

MyWave RCDATA LOADONCALL MyWave.wav

brcc32.exe MyWave.rc, получаешь MyWave.res.

В своей программе пишешь:

Предупреждая следующий твой вопрос «а как прочитать wave-файл из
исполняемого файла?»
Anatoly Podgoretsky

Как узнать и поменять разрешение экрана?

Поменять:
Узнать можно также с помощью объекта Screen

Как во время выполнения программы создать так называемый «array of const»

В библиотеке Technical Information на сайте Inprise есть документ за нумером
TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const
можно использовать массив типа TVarRec.

Как обратиться к определенному адресу физической памяти?

Как обратиться к определенному адресу физической памяти? А как прочитать
значение из порта? Где мой любимый массив Port[]?

Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце —
забудьте про все эти глупости.

Я создал объект TStrings, но при попытке обращения к нему выдается ошибка. В чем проблема?

TStrings — это абстрактный класс. Вам нужен TStringList.

Как использовать в качестве обработчика сообщения обычную процедуру, а не метод объекта?

У этой процедуры должен быть еще один дополнительный параметр.
В метод класса кpоме паpаметpов, обьявленных в заголовке, пеpедаётся ещё
паpаметp Self
Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Илон Маск рекомендует:  Онлайн-интенсив «Базовый HTML и CSS» с личным наставником

Как работать с графическими форматами, хотя бы самыми известными?

Hа [32]http://www.imagelib.com лежит библиотека ImageLib.

Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать
в модуле uses jpeg; то можно работать с .jpg как с TPicture.

Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE,
TGA, PCX. http://einstein.ae.eng.ua.edu/nishita/index.htm.

Как работать с файлами архивов, хотя бы самыми распространенными?

Воспользуйтесь библиотекой ExceedZip 3.0 (http://www.exceedsoft.com).

Как использовать DirectX в своей программе?

hori/index-e.html — DelphiX by Hiroyuki Hori
PA> — лучший набор инструментов для работы с DirectX

Учтите существование эхи RU.DIRECTX.

Pavel Anufrikov Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >
AP: Обидно за Хироюки, вроде как первый был.

Как использовать OpenGL в своей программе?

Модули для работы с OpenGL можно взять на
http://www.signsoft.com/opengl. Информацию — на http://www.opengl.org.
Также есть книга Ю. Тихомирова «OpenGL: программирование трехмерной
графики».
Еще загляните на http://reality.sgi.com/mjk за примерами и
http://www.scitechsoft.com за библиотекой MesaGL.

Учтите существование эхи RU.OPENGL.

Как встроить просмотр HTML в свою программу?

В Delphi 4+ имеется пример Web-браузера на Delphi.

MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет
поместить его на форму.

Netscape Navigator умеет делать то же самое, подробности на
http://www.chami.com/tips/delphi/103096D.html

Еще на http://www.pbear.com лежат THTMLViewer и TFrameViewer.

Где достать процедуру типа «сумма прописью»?

vg. Здесь лежит
библиотека vgLib, содержащая еще массу полезных вещей.

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

CVS. http://www.cyclic.com. С его помощью разрабатывается весьма львиная
доля программного обеспечения в Internet. Интеграция с Delphi — нулевая ;)
Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю
себе более разработки без этого средства.

Microsoft Visual Source Safe. Проигрывает в функциональности, может
выигрывать в «привычности».

Как можно обнаружить утечки памяти и ресурсов в программе?

MSDebug Макса Русова. Hаходится на http://www.dic.ru/users/rusov/.
Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это
хорошо.

Hа http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет
также и утечки ресурсов.

Рекламировался также «MemProof», информацию о котором можно получить на
http://www.listsoft.ru/programs/pr1520.htm.

Мне нужно заниматься разбором математических выражений

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

В rxLib есть компонент TrxMathParser, достаточно мощный для большого
количества применений.

Как уменьшить размер исполняемого файла программы?

Писать на WinAPI без использования VCL. Это пригодно для и без того
крохотных программ.
Существуют freeware библиотеки, упрощающие программирование без VCL,
например:

KOL http://xcl.cjb.net
ACL http://a-press.parad.ru/pc/bokovikov/delphi

Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда
исполняемых файлов больше одного.

Воспользоваться компрессорами исполняемых файлов, например:
Shrinker http://www.blinkinc.com,
WWPack32 http://kolos.uni.lodz.pl/warezak,
NeoLite
ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip
,
Petite, http://www.icl.ndirect.co.uk/petite/.

Компрессировать или нет исполняемые файлы, должен решить каждый, так как
возможны и негативные моменты от использования сжатия. Дискуссия по этому
поводу никогда не прекращается.

Где достать всяких иконок, картинок для кнопок, etc. для своей программы?

Как сделать ping из своей программы?

И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым
Internet-компонентам.

Зайди на [53]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с
исходниками. Там и ping есть.

Как правильно создавать компоненты в run-time?

Как правильно создавать компоненты в run-time? Что задавать в
качестве параметра Owner при создании компоненты? Как обрабатывать
события от созданных компонент, типа нажатий на кнопки?

Hачнем с создания.

Сущность свойства Owner в том, что владелец перед смертью уничтожает (через
Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы
хотите доверить уничтожение созданных форм/компонентов. В частности, если вы
сами будете этим заниматься, то AOwner может быть, например, nil.

Для того, чтобы созданный компонент появился на экране, надо указать его
родителя, заполнив свойство Parent, например, NewButton.Parent := Form1;

Пример кода, обрабатывающего события от свежесозданных компонентов:

Как мне работать с файлами MS Word или таблицами MS Excel?

Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for
Applications) или WordBasic.

NB: Обратите внимание на то, как устанавливаются именованные параметры у
процедур WordBasic’а, например, FileOpen(Name := ‘myname.doc’);

Пример проверен только на русском Word 7.0! Может, поможет.
Sergey Arkhipov 2:5054/88.10

Второй путь, более правильный.

Нужно импортировать TLB библиотеку соответствующего COM-сервера (MS Word, MS
Excel, AutoCAD, и т.п.) или воспользоваться готовыми компонентами из палитры
Servers поставляемыми с Delphi 5 и

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

Пример использования TLB.
Andrew V. Fionik Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Как сделать так, чтобы запущенная программа не была видна на панели задач?

Во-первых, можно по примеру Back Orifice воспользоваться функцией
RegisterServiceProcess.

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

(AK):
Только сpазу предупреждаю про грабли, на которые я наступал — будь готов к
тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose
выводится вопрос о подтверждении, то могут быть проблемы с автоматическим
завершением пpогpаммы пpи shutdown — под Win95 просто зависает, под WinNT
не завершается. Очевидно, что сообщение выводится, но его не видно (причем
SW_RESTORE не сpабатывает). Решение — ловить WM_QUERYENDSESSION и после
всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt.

Delphi 5.0 and Win2K

узнает, что в сопроводиловке от Борланд указывается на проблему неправильной
работы инсталлятора, если используются кнопки Browse для смены каталогов
установки. При этом рекомендуется набрать/подредактировать пути вручную. (Не
проверял, просто действовал
как рекомендовано, хотя пути по умолчанию никогда не использую).

2. При установке с жесткого диска, весь дистрибутив вместе с папками
Runimage и Install надо либо поместить в корень логического диска (что
обычно неудобно), либо используя subst (или в сети — use net), сотворить
букву для этого пути. Чтобы инсталлятор решил, что установка идет из корня
диска. Иначе — облом-с.

3. При установке на машину, на которой предполагается наличие нескольких
программеров, работающих посменно, сначала придется поставить из-под
админа — для всех. А потом — из-под каждого аккаунта (хотя бы в режиме
Registry + Custom). Иначе не будет компонентов на палитре.

4. Проверить переменные среды %TEMP% и %TMP%, рекомендуется короткий путь —
C:\TEMP

5. Первичная установка под административным аккаунтом с АНГЛИЙСКИМ именем,
например admin

Vladimir Kladov Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >
Можно экспоpтиpовать y админа HKEY_CURRENT_USER/Software/Borland и пpосто
импоpтиpовать для каждого потом. Так несколько быстpее, чем инсталиpовать и
уменьшается количество ошибок.

Ruslan Fedoseev Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Почему в консольных приложениях неправильно отображаются русские буквы?

Потому что кодировка шрифтов, используемых в редакторе Delphi — 1251 (ANSI),
а в консольных приложениях — 866 (OEM). Чтобы добиться правильного
отображения нужно использовать функцию CharToOEM (но при этом возрастёт
размер кода), либо сразу писать проект в каком-либо консольном текстовом
редакторе (Dos Navigator, Far)

Denis Filonov Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

В чем pазличия ShellExecute и CreateProcess?

запустит Word (или другое приложение, зарегистрованное для *.doc) и откроет
файл mydoc.

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

Надо заметить, что хендл дочернего процесса может вернуть функция
ShellExecuteEx, которая занимает, скажем, промежуточное положение.

Как внедрить dll в другое приложение?

Как центрировать по форме модальный диалог?

Как издать звук через PC Speaker?

Как узнать версию Windows?

Аргумент функции — структура TOSVersionInfo, содержит
DwVersionInfoSize:DWORD — заполняется как sizeof TOSVersionInfo) перед
вызовом функции

DwMajorVersion:DWORD — старшая цифра версии Windows

DwMinorVersion: DWORD — младшая цифра версии

DwBuildNumber: DWORD
Win NT 4 — номер билда
Win 9x — старший байт — старшая и младшая цифры версии / младший — номер
билда

SzCSDVersion:DWORD
NT — содержит PСhar с инфо о установленном ServicePack
9x — доп. инфо, может и не быть

Alexander Kramarenko Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Как из dll узнать узнать полный путь к этой dll.

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Как узнать кол-во цветов цветовой палитры?

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Как заставить мигать кнопку приложения на AppBar?

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Как убрать VerticalScrollBar из TListBox навсегда?

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Как убрать из ListView горизонтальный скролбар навсегда?

Как обнаружить активность юзера?

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Как передать строку другому приложению?

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Удаление файлов из временного каталога, безопасно ли?

могут возникнуть ytrjnhst проблемы.

>> Прекрасно это выглядит, когда в качестве каталога временных файлов
назначен например C:\Windows

>:-) Я и говорю что небезопасно.

Особенно пикантно это выглядит, в свете того, что

Remarks
Windows 95/98/Me: The GetTempPath function gets the temporary file
path as follows:

The path specified by the TMP environment variable. The path specified by
the TEMP environment variable, if TMP is not defined or if TMP specifies a
directory that does not exist. The current directory, if both TMP and TEMP
are not defined or specify nonexistent directories.

Этак переименовываешь C:\TEMP — и программа чистит текущий каталог :-)

Windows NT/2000 or later: The GetTempPath function does not verify that the
directory specified by the TMP or TEMP environment variables exists. The
function gets the temporary file path as follows:

The path specified by the TMP environment variable. The path specified by
the TEMP environment variable, if TMP is not defined. The Windows
directory, if both TMP and TEMP are not defined.

Этак удаляешь переменные окружения — и программа «деинсталлирует» Windows

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

При использовании функции GetTempPath проверить если подстрока TEMP в
результате и в случае отсутствия вхождения запросить пользователя для
принятия решения, с рекомендацией создать каталог TEMP и необходимые
переменные среды, лучше посоветоваться обратиться к администратору для
принятия решения. Это простое правило позволит избежать серьезных
последствий.

Тенцер А.Л. Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >
Andrew V. Fionik Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >
Anatoly Podgoretsky Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Как сохранить всю форму в файл (как Delphi в *.dfm)?

Как отследить переход фокуса в приложении?

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Как назначить процедуру собственному пункту системного меню?

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Какое сообщение надо отлавливать в Application.OnMessage для отслеживания клавиши Alt (vk_menu)

Как поменять иконку и стpокy в заголовке консольного окна?

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

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

Такое окно существует и в IDE (запускать придется из Explorer).

Leon >Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Delphi 6 требует Proxies.pas?

Eugene Mayevski Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >

Вопрос: Файл designeditors.pas использует ‘proxies’ в uses.
Исходный текст (proxies.pas) или откомпилированный модуль (proxies.dcu)
нигде не находится ни на моем жеском диске ни на D6 Pro CD..

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

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

Как хранить настройки программ.

Нижеприведенный текст являет собой вольное изложение отдельных статей
февральского выпуска Microsoft Platform SDK. Год 2001 от рождества Христова.
При проектировании способов хранения настроек своей программы следует
задаться тремя вопросами:

Что хранить.
Где хранить.
Как хранить.

Что хранить

Поскольку первая часть вопроса нам известна по определению, т.е. хранить мы
будем настройки программы, то перейдем ко второй части вопроса. Ваша
программа устанавливается на КОМПЬЮТЕР а пользуются ей ПОЛЬЗОВАТЕЛИ.
Соответственно все настройки разделяются на две части а то и на все три —
настройки которые относятся к компьютеру в целом, настройки которые
относятся ко всем локальным пользователям, настройки которые относятся к
конкретному пользовател. В зависимости от специфики программы первая и
вторая часть могут быть совмещены или разделены.
Поэтому важно сделать логическое разделение — какие настройки вашей
программы действительно специфичны для самого ПК, какие настройки должны
прилагаться ко всем пользователям, какие должны прилагаться к конкретному
пользователю. Кроме того Мокрософт рекомендует чтобы настройки учитывали
возможную мобильность пользователя, т.е. для пользователя находящегося в
разных местах, возможно потребуется иметь разные наборы настроек.

Где хранить

Вообще в голову приходят три вещи.
Хранить настройки в системном реестре.
Хранить настройки в каталоге куда установлена программа.
Хранить настройки в системном каталоге Windows.
Хранить настройка в домашнем каталоге пользователя.

В Windows имеется три места предназначенных для хранения настроек которыми и
следует пользоваться.

Системный реестр
Домашний каталог пользователя (точнее один из его подкаталогов)
Общий каталог для пользователей

Прочие мысли о местах хранения настроек должны быть выброшены из голов как
вредные и противоестественные, Microsoft уже за вас все придумала и нефиг
извращаться. Для тех кто не понимает почему, объясняю. На нормальной ОС
(W’NT, W’2K) программа обычно запускается от имени и с правами конкретного
пользователя. Обычно, если этот пользователь не является администратором, он
имеет право изменять содержимое следующих ресурсов:

часть реестра HKEY_CURRENT_USER\*
содержимое своего домашнего каталога
содержимое временного каталога (который как правило находится внутри
домашнего)
содержимое некого каталога или каталогов специально выделенного для этого
администратором

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

Пример
Adobe Photoshop и его разработчики наивно полагают что им должны быть выданы
эксклюзивные права мусорить своими scratch-файлами в корневых каталогах
дисков, кроме того они полагают что им должна быть выдана в пользование в
режиме полный доступ часть системного реестра.. Временных каталогов,
специально выделенных для подобоного рода занятий, их не устраивает. Как
результат — Photoshop имеет серьезные проблемы с работой под Windows
NT/2000.

Системный реестр

С точки зрения хранения настроек программы системный реестр разделен на две
части. Это ветви HKEY_CURRENT_USER для хранения настроек специфичных для
пользователя, и HKEY_LOCAL_MACHINE для хранения настроек специфичных для
всего ПК и соответственно всех пользователей, работающих с этим ПК.
Рекомендуемая структура ветвей для хранения настроек программы —
HKEY_CURRENT_USER\Software\Company Name\Application Name\Version и
соответственно HKEY_LOCAL_MACHINE\Software\Company Name\Application
Name\Version. Параметры Company Name, Application Name, Version желательно
не хранить в виде hard-coded строк в коде программы а устанавливать в опциях
проекта (Project\Options\Version Info) и доставать впоследствии из ресурса с
помощью той же библиотеки RxLib. Альтернативный путь выбирать данные о
версии программы из ресурсов — использование Windows API
(GetFileVersionInfo, GetFileVersionInfoSize, VerQueryValue).
Программе следует расчитывать на то что доступ к подключам
HKEY_LOCAL_MACHINE разрешен в режиме только для чтения, а доступ к подключам
HKEY_CURRENT_USER допускает чтение, изменение и создание новых подключей и
значений.
Программе следует расчитывать на то что нужных ей ключей может не оказаться
в реестре или значения лежащие в реестре имеют неверный формат или
недопустимые значения. В таком случае, вместо несуществующих или неверных
значений настройки, программа должна использовать значения по умолчанию
которые разработчик может «железно забить в код» или получить с помощью
различных системных функций.
Не следует использовать системный реестр для хранения больших кусков данных.
Вместо этого лучше хранить объемные данные в отдельном файле, а в реестре
запомнить имя этого файла.

Домашний каталог пользователя

Для хранения настроек слишком больших для того чтобы их размещать в реестре
существуют специально выделенные каталоги внутри домашнего каталога
пользователя. Эти каталоги обычно называются «специальными каталогами» и
имеют имена Application Data и Local Settings. Полный путь к ним можно
получить с помошью функций SHGetSpecialFolderPath или SHGetFolderPath.

Общий каталог пользователей

Обычно это каталог «Documents and Settings\All users». Внутри него имеются
такие-же подкаталоги для хранения настроек и данных программ но относящихся
ко всем пользователям. Полный путь к ним можно также получить с помошью
функций SHGetSpecialFolderPath или SHGetFolderPath.

Как хранить

Системный реестр

Для работы с системным реестром можно использовать функции Registry API
общим числом около 40 штук, а можно использовать классы из Registry.pas —
TRegistry, TRegistryIniFile, TRegIniFile. Особенно следует обратить внимание
на TRegistryIniFile который предоставляет упрощенную модель доступа к
системному реестру очень схожую с моделью работы с INI-файлами.

INI-файлы
Это старый метод хранения настроек программ, но все еще применяющийся
программистами. Настройки хранятся в текстовом файле в виде:

[Section1]
Field1=Value1
Field2=Value2
.
FieldN=ValueN

[Section2]
Field1=Value1
Field2=Value2
.
FieldN=ValueN
.

[SectionN]
Field1=Value1
Field2=Value2
.
FieldN=ValueN

Для доступа к данным содержащимся в INI-файлах существуют классы из модуля
IniFiles — TIniFile, TMemIniFile.
Преимущество использования INI-файлов состоит в том что их можно легко
подредактировать с помощью текстового редактора. Они обычно легче
воспринимаются для прочтения нежели дерево ключей системного реестра.

Бинарные файлы настроек

Отдельно хочется поговорить о использовании бинарных файлов в качестве
хранилища для настроек программы. Обычные мотивы любителей использовать
бинарные файлы:

Экономится место
Настройку можно спрятать от пользователя (сделать нечитабельной)

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

Заключение

Почти вся эта информация была вычерпана из кладезя мудрости под названием
Platform SDK (Software Development Kit), поставляемого в составе сборника
документации MSDN (Microsoft Software Developer Network). Разработчикам
настоятельно рекомендуется приобрести Platform SDK, это снимает огромную
массу вопросов связанную с программированием под Windows.

Список рекомендуемой литературы

1. А. Архангельский, В. Ильин, М. Тагин
Русская справка (HELP) по Delphi 5 и Object Pascal (32 стр. с CD-ROM)
Бином, ISBN 5-7989-0168-8

2. А. Архангельский. Программирование в Delphi 5
Бином, ISBN 5-7989-0104-1

3. А. Архангельский. Программирование в Delphi 6
Бином, ISBN 5-7989-0227-7

4. П.Даpахвелидзе, Е.Маpков
Delphi 4 в подлиннике

5. П. Дарахвелидзе, Е. Марков, О. Котенок
Программирование в Delphi 5
BHV-СПб, ISBN 5-8206-0052-5

6) П.В. Шумаков, В.В. Фаронов «Delphi xx. Руководство разработчика баз
данных.»

7) М.Кэнту
Delphi 4 для пpофессионалов

8. Ч.Калвеpт
Delphi 4, Энциклопедия пользователя

9. Стив Тейксейра, Ксавье Пачеко
Delphi 5. Руководство разработчика. Том 1.
Основные методы и технологии программирования
Вильямс, ISBN 5-8459-0016-6
2000 Вильямс

10. Стив Тейксейра И Ксавье Пачеко
Delphi 5. Руководство разработчика. Том 2.
Разработка компонентов и работа с базами данных
2000 Вильямс

11. Конопка Рей
Создание оригинальных компонент в среде Delphi: Пер. с англ./Рей Конопка.
К.: НИПФ — «ДиаСофт Лтд.», 1996. — 512 с.
ISBN 5-7707-9551-4

12. Лишнер Рэй
Секреты Delphi 2: Пер. с англ./Рэй Лишнер. —
К.: НИПФ — «ДиаСофт Лтд.», 1996. — 800 с.
ISBN 966-7033-10-4

13. Том Сван «Секреты 32-разрядного программирования в Delphi»
Диалектика, Киев, 1997. 480 стр.,
ISBN 966-506-052-X (рус.)

В списке отсутствует ряд хороших книг, по причине недостаточнысти данных,
если у кого есть замечания, исправления или дополнения по данной статье, то
просьба посылать их прямо на mailto: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Кроме указанных книг существует большое количество ресурсов в Интернете
посвященных Дельфи — это статьи, электронные библиотеки и прочее. Один из
ресурсов расположен на моем сайте — это несколько проектов электронных
библиотека, в совокупности свыше 200 книг. Доступ ко всем проектам прямо с
главной страницы http://www.podgoretsky.com, существует так же доступ и по
FTP (3 анонимных сессии)

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

Функции и процедуры Delphi. Справочник.

III. Работа с файлами

1. Работа с файлами
2. Работа с дисками
3. Работа с текстовыми файлами
4. Работа с каталогами
5. Обработка имен файлов
6. Низкоуровневый доступ к файлам

1. Числа с плавающей запятой
2. Целые числа
3. Переменные типа Variant
4. Дата и время
5. Множества
6. Прочие

V. Работа с памятью

1. Работа с памятью и указателями
2. Динамические переменные

VI. Работа с мышью

1. Управление мышью
2. Drag-and-drop операции
3. Работа с курсором

VII. Базы данных

1. Работа со словарями
2. Различные вопросы по работе с БД

VIII. Управление программой

1. Обработка исключений
2. Управление ходом выполнения программы
3. Процедуры завершения программы
4. Action

1. Командная строка
2. Буфер обмена
3. Потоки (Threads)
4. Дополнительные вопросы

1. Регистрация инструментальных средств проекта
2. Регистрация компонентов
3. Регистрация свойств компонентов
4. Пакеты

ХII. Создание распределенных приложений

1. COM
2. CORBA
3. MIDAS

ХIII. Вопросы, не вошедшие в предыдущие разделы

1. Работа с графикой
2. Интернет
3. Поддержка совместимости с предыдущими версиями Delphi
4. Прочее

Faq управление питанием из программы на delphi

Относительно недавно мне пришлось выполнять один интересный проект — нужно было сделать дешифратор команд управления на USB контроллере и софт для компьютера, но на языке Delphi. До этого с Delphi я не общался, если не считать первого курса института, где нам в течение года преподавали Pascal (они имеют схожие черты). Взял первый попавшийся Web-справочник по этому языку, прикупил Borland Delphi 7.0 (ну и что что древний, зато без всяких там не нужных для начала наворотов). Поковырялся денек. Очень странный язык! — должен Вам признаться. После 4 лет программирования на Си/С++ долго не мог привыкнуть к синтаксису Имя переменной:= значение и связке Begin end. В результате моих опытов основы языка я освоил, но писать функции по обмену информацией через USB на Delphi не рискнул. Написал их на родном C++ и оформил в виде DLL. А пользователь получил только пользовательские функции — «обертки», содержащие в себе вызовы сишных функций из DLL (чем был вполне удовлетворен). Да и то пришлось повозиться, т.к. например, пытаться из Delphi передавать адреса на массивы в сишную DLL, там с ними что-либо делать и возвращать обратно — целая проблема. Вместо ожидаемого результат получалось абсолютно не предсказуемое значение. Решил проблему немного другим путем.

На основе приобретенного опыта в Delphi решил добавить статью по управлению LPT портом под Windows 2000, XP на языке Delphi. Что будем делать? Да ничего особенного — по управляем регистрами порта LPT из программы на Delphi с помощью библиотеки inpout32.dll.

Готовый проект можно скачать здесь (среда: Borland Delphi 7.0).
файлы к статье (размер: 187.5 КБ)

А теперь рассмотрим как это приложение сделать. Итак, запускаем Borland Delphi 7.0. Перед нами должна сразу появиться рабочая среда и заготовка формы будущего приложения.

Давайте прикинем, каким будет наше приложение. Наверное, нам хотелось бы иметь возможность указать адрес порта с которым будем работать, значение которое мы захотим туда (в порт) записать и две кнопки: одна предназначена для записи данных в порт, другая для чтения. Сказано — сделано. С верхней панели перетаскиваем на форму нужное количество edit-окошек, статических текстов и кнопок. При выделении нужного элемента на форме справа в окне Object Inspector можно задавать различные свойства для элемента. В итоге сформируйте форму так как на рис. ниже.

Программа управления LPT портом под Windows на Delphi с помощью inpout32.dll Программа управления LPT портом под Windows на Delphi с помощью inpout32.dll

Теперь возьмемся собственно за программирование. Для начала нам нужно как-то подсоединить inpout32.dll к нашему проекту. Для этого в Delphi есть несколько вариантов, но остановится на следующем: в папку где расположен проект программы помещаем только библиотеку inpout32.dll (lib и h файлы, как это делали ранее, здесь уже не нужны). Далее в заголовке программы в секции uses помещаем прототипы функций Out32 и Inp32 со специальной директивой компилятора external, говорящей откуда нужно эти функции брать.

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

function Inp32(PortAdr: word): byte; stdcall; external ‘inpout32.dll’;
function Out32(PortAdr: word; Data: byte): byte; stdcall; external ‘inpout32.dll’;

Ok. Теперь создадим обработчики на нажатие кнопок. Для этого дважды щелкаем на кнопке в редакторе формы. Нас автоматом переносит к коду функции-обработчика. Рассмотрим сначала функцию для записи данных в порт. Тут особенно сложно ни чего нет. В переменные Port и Data помещаем данные из соответствующих окошек ввода предварительно преобразовав их из текста в целое число. Затем вызываем функцию Out32() с этими параметрами.

procedure TForm1.Button1Click(Sender: TObject);
var
Port: word;
Data: Byte;
begin
Data:= StrToInt(Edit1.Text);
Port:= StrToInt(Edit2.Text);
Out32(Port, Data);
end;

Аналогично делаем для кнопки для чтения данных. Из нужного edit-окошка считываем введенное там значение адреса порта откуда будет проводится чтение, преобразуем его в число. Вызываем функцию Inp32() с этим параметром. Заитем выводим окно сообщения с результатом чтения.

procedure TForm1.Button2Click(Sender: TObject);
var
Port: word;
Data: Byte;
begin
Port:= StrToInt(Edit3.Text);
Data:= Inp32(Port);
MessageDlg(‘Value: ‘+ IntToStr(Data), mtInformation, [mbOK], 0);
end;

Компилируем, запускаем (можно одной кнопкой в виде зеленой стрелки на верхней панели). Протестируем приложение. Попробуем записать в регистр DATA LPT потра число 0. Для этого в качестве адреса указываем 888 (или $378, что одно и тоже), в качестве данных — 0. Нажимаем на соответствующую кнопку. Должно быть все Ok (наблюдаем это на LPT-тестере). Аналогично проводим чтение.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL