Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2

Модерирует : ShIvADeSt

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
ArtemiyUO

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
что ты понимаеш под "у вас нет кода хардваре монитор"? по яснее выражай плиз свои желания и вопросы.

Всего записей: 539 | Зарегистр. 12-12-2005 | Отправлено: 12:42 09-06-2006
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aladdinych
Цитата:
В основной программе есть датасеты. Мне надо:  
1. Вызвать из Dll процедуру, которая выдает на экран форму для заполнения.    
2. Пользователь ее заполняет, а по кнопке ОК    
3. обновляются данные в датасетах (добавляются, удаляются, модифицируются записи). При этом датасеты есть объекты созданные в основной программе
Насколько я тебя понял, всё оказывается проще, чем я думал. Делаешь обычную длл-ку с формой и делаешь в ней примерно такую функцию:
Код:
type
  TMyDataRec = record
    field1: Integer;
    field2: shortstring;
  end;
// Функция выводит форму на экран и не завершается, пока форма не будет закрыта
// Если была нажата кнопка ОК, то возвращается истина, а в переменной Data введенные данные
function InputData(var Data: TMyDataRec): Boolean; stdcall;
begin
  result := false;
  with TMyForm.Create(nil) do
  try
    if ShowModal = mrOk then begin
      Data.field1 := StrToInt(Edit1.Text);
      Data.field2 := Edit2.Text;
      result := true
    end
  finally
    Free
  end
end;
А в своей программе делаешь так:
Код:
type
  TMyDataRec = record
    field1: Integer;
    field2: shortstring;
  end;
 
procedure ....
var
  d: TMyDataRec;
begin
  ..
  if InputData(d) then begin
    ..
    table1.fields[0].AsInteger := d.field1;
    table1.fields[1].AsString   := d.field2;
    ..
  end
  ..
end;

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 14:10 09-06-2006 | Исправлено: FireZone, 17:59 09-06-2006
STEEL



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть формочка, borderstyle := none, systemmenu := false
на формочке панелька.. со свойством dock, automatic, необходимо чтобы рисовалась только панелька, в тот момент когда я её перетаскиваю.. у неё появляется заголовок 8( От которого далее не избавиться. Вобщем нужна плавающая по рабочему столу панелька без системного меню. Или форма без заголовка, которую можно перетаскивать
 
Добавлено:
Также интересует алгоритм, когда по вводу несколькоих символов и нажатию на TAB известная команда дописывается, например как в виндовом коммандоре или любой POSIX

Всего записей: 2293 | Зарегистр. 06-01-2002 | Отправлено: 21:58 11-06-2006 | Исправлено: STEEL, 22:00 11-06-2006
OOD

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как вписать путь к ехе и имя сервиса в функции для написания сервиса?:
 

Код:
 
 Функции для создавания и удаления NT Services.
Можно создать NT Service от текущее приложение. Параметры:
1. CreateNTService(ExecutablePath,ServiceName: String)
ExecutablePath - Полный путь к изполнимого файла от которого создавается NT Service
ServiceName - Имя сервиза которое отобразится в Service Control Manager
Результат:
true - если операциая завершена успешно
false - если есть ошибка. Можно произвести call то
GetLastError чтобы информироваться об естество ошибки
2. DeleteNTService(ServiceName: String):boolean;
ServiceName - имя сервиза подлежающии удаления
Результат:
true - если операциая завершена успешно
false - если есть ошибка. Можно произвести call то GetLastError чтобы
информироваться об естество ошибки
 
Зависимости: WinSVC, Windows
Автор:       Alex Kantchev, stoma@bitex.bg
Copyright:   Собственное написание
Дата:        19 июня 2002 г.
***************************************************** }
 
// CreateNTService(ExecutablePath,ServiceName: String)
// ExecutablePath - Полный путь к изполнимого файла от
// которого создавается NT Service
// ServiceName - Имя сервиза которое отобразится
// в Service Control Manager Результат:
//Результат:
// true - если операциая завершена успешно
// false - если есть ошибка. Можно произвести
// call то GetLastError чтобы информироваться об
// естество ошибки
 
function CreateNTService(ExecutablePath, ServiceName: string): boolean;
var
  hNewService, hSCMgr: SC_HANDLE;
  // Rights: DWORD;
  FuncRetVal: Boolean;
begin
  FuncRetVal := False;
  hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
  if (hSCMgr <> 0) then
  begin
    //Custom service access rights may be built here
    //we use GENERIC_EXECUTE which is combination of
    //STANDARD_RIGHTS_EXECUTE, SERVICE_START, SERVICE_STOP,
    //SERVICE_PAUSE_CONTINUE, and SERVICE_USER_DEFINED_CONTROL
    //You can create own rights and use them as shown in the
    //commented line below.
 
    //Rights := STANDARD_RIGHTS_REQUIRED or SERVICE_START or SERVICE_STOP
    // or SERVICE_QUERY_STATUS or SERVICE_PAUSE_CONTINUE or
    // SERVICE_INTERROGATE;
 
    hNewService := CreateService(hSCMgr, PChar(ServiceName), PChar(ServiceName),
      STANDARD_RIGHTS_REQUIRED, SERVICE_WIN32_OWN_PROCESS,
      SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
      PChar(ExecutablePath), nil, nil, nil, nil, nil);
    CloseServiceHandle(hSCMgr);
    if (hNewService <> 0) then
      FuncRetVal := true
    else
      FuncRetVal := false;
  end;
  CreateNTService := FuncRetVal;
end;
 
Запуск сервиса :
 
procedure StartService(ServiceName: string);
var
 
  schService,
    schSCManager: Dword;
  p: PChar;
begin
 
  p := nil;
  schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if schSCManager = 0 then
    RaiseLastWin32Error;
  try
    schService := OpenService(schSCManager, PChar(ServiceName),
      SERVICE_ALL_ACCESS);
    if schService = 0 then
      RaiseLastWin32Error;
    try
      if not Winsvc.startService(schService, 0, p) then
        RaiseLastWin32Error;
    finally
      CloseServiceHandle(schService);
    end;
  finally
    CloseServiceHandle(schSCManager);
  end;
end;  
 

 
 
ExecutablePath -это путь полный к файлу , который нужно зарегистрировать как сервис, но как его вписать, напримр  
C:\Windows\Notepad.exe
 
ServiceName тоже не могу понять подскажите плиз
 

Всего записей: 3379 | Зарегистр. 20-05-2006 | Отправлено: 00:58 12-06-2006
myxa0

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно заполнить канву image'а правильными шестиугольниками (со сторонами  одинаковой длины), и затем отследить над каким шестиугольником находится мышь.
Долно получиться что-то типа этого:
 
\     /\     /\     /\
  \ /    \ /    \ /    \
   |      |      |      |
   |      |      |      |
  / \    / \    / \    /
/     \/     \/     \/  
       |      |      |  
       |      |      |  
 \    / \    / \    / \  
   \/     \/     \/     \
 
 
Мне кажется здесь мне дольше будут отвечать, чем, если создать отдельную тему.
 
 
С заполнением я разобрался, но как отследить над каким шестиугольником находится мышь?
 
Вот как я заполнил канву (в edit3 находится длина ребра, edit2-кол-во шестиугольников в ширину, edit1-кол-во в высоту):
 

Код:
 
for i:=0 to strtoint(edit1.Text)-1 do
 begin
  for j:=0 to strtoint(edit2.Text)-1 do
   begin
       t:=strtoint(edit3.Text)*((j div 2));
       Image.canvas.Polygon (
       [Point(strtoint(edit3.Text) div 2+(strtoint(edit3.Text)*i)+strtoint(edit3.Text)*j div 2 -t, strtoint(edit3.Text)*j-strtoint(edit3.Text)*j div 4),
        Point(strtoint(edit3.Text)+strtoint(edit3.Text)*i+strtoint(edit3.Text)*j div 2-t,strtoint(edit3.Text) div 4+strtoint(edit3.Text)*j-strtoint(edit3.Text)*j div 4),
        Point(strtoint(edit3.Text)+strtoint(edit3.Text)*i+strtoint(edit3.Text)*j div 2-t,(strtoint(edit3.Text) div 4)*3 +strtoint(edit3.Text)*j-strtoint(edit3.Text)*j div 4),
        Point (strtoint(edit3.Text) div 2+strtoint(edit3.Text)*i+strtoint(edit3.Text)*j div 2-t,strtoint(edit3.Text)+strtoint(edit3.Text)*j-strtoint(edit3.Text)*j div 4),
        point(strtoint(edit3.Text)*i+strtoint(edit3.Text)*j div 2-t,(strtoint(edit3.Text) div 4)*3+strtoint(edit3.Text)*j-strtoint(edit3.Text)*j div 4),
        point(strtoint(edit3.Text)*i+strtoint(edit3.Text)*j div 2-t,strtoint(edit3.Text) div 4 + strtoint(edit3.Text)*j-strtoint(edit3.Text)*j div 4)]);
   end;
end;
 





предупреждение за дубль.

Всего записей: 76 | Зарегистр. 02-01-2005 | Отправлено: 07:42 12-06-2006 | Исправлено: myxa0, 11:25 13-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OOD
Выдержка из MSDN (вообще крайне полезно пользоваться первоисточниками):
SC_HANDLE CreateService(
  SC_HANDLE hSCManager,
  LPCTSTR lpServiceName,
  LPCTSTR lpDisplayName,
  DWORD dwDesiredAccess,
  DWORD dwServiceType,
  DWORD dwStartType,
  DWORD dwErrorControl,
  LPCTSTR lpBinaryPathName,
  LPCTSTR lpLoadOrderGroup,
  LPDWORD lpdwTagId,
  LPCTSTR lpDependencies,
  LPCTSTR lpServiceStartName,
  LPCTSTR lpPassword
);
lpServiceName  
[in] Pointer to a null-terminated string that specifies the name of the service to install. The maximum string length is 256 characters. The service control manager database preserves the case of the characters, but service name comparisons are always case insensitive. Forward-slash (/) and back-slash (\) are invalid service name characters.  
lpDisplayName  
[in] Pointer to a null-terminated string that contains the display name to be used by user interface programs to identify the service. This string has a maximum length of 256 characters. The name is case-preserved in the service control manager. Display name comparisons are always case-insensitive.  
 

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 10:01 12-06-2006
OOD

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
Первоисточник работает, но как указать пусь у exe файлу , который в дальнейшем будет использоваться и запускаться вот этого понять не могу
 
Добавлено:
вот пример использования:
 

Код:
 
procedure TForm1.Button1Click(Sender: TObject);
var
  tmpS: string;
begin
  tmpS := 'Delphi_Service_' + Application.Title;
  if (CreateNTService(Application.ExeName, tmpS)) then
    MessageDlg('Service ' + tmpS + ' has been successfully created!',
      mtInformation, [mbOK], 0)
  else
    MessageDlg('Unable to create service ' + tmpS + ' Win32 Error code: ' +
      IntToStr(GetLastError), mtWarning, [mbOK], 0);
end;
 

 
 
Создаётся процесс Delphi_Service_Project1 т.е. tmpS := ......
 
Но как указать путь к нужному мне exe файлу?допустим мне нужно запускать в сервисе notepad.exe, или же после создания сервиса можно через свой проект запускать как угодно и когда угодное любые exe?

Всего записей: 3379 | Зарегистр. 20-05-2006 | Отправлено: 10:14 12-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OOD
CreateService устанавливает в систему сервис, исполнимый файл которого задается параметром lpBinaryPathName, этот исполнимый файл должен уметь вести себя как сервис (в делфи в New есть спеиальный тип проекта - Service Application), lpServiceName - имя сервиса, по которому его идентифицирует система (оно же название ключа в реестре), lpDisplayName - отображаемое имя сервиса.
А вот приложение-сервис в свою очередь уже может запускать то, что ему вздумается например через CreateProcess. Задавать какое приложение должно запускаться можно, например, через конфигурационный файл.

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 12:37 12-06-2006 | Исправлено: RomanTim, 12:40 12-06-2006
Ramazan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В процессе разработки проекта, состоящего из основной программы и нескольких динамически подключаемых DLL столкнулся с исключением "Unknown software exception 0eedfade in module XXX at YYY" в момент вызова LoadLibrary. Исследование показало, что ошибка возникает при загрузке одной DLL из другой.
Проект и библиотеки компилируются с базовыми run-time пакетами, интерфейсные модули не изменялись. Ошибка проявилась внезапно, как обычно говорится - "до этого все работало"
В связи с этим вопрос: чем это может быть вызвано В ПРИНЦИПЕ?

Всего записей: 359 | Зарегистр. 13-04-2002 | Отправлено: 07:54 13-06-2006
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ramazan
сама LoadLibrary не может давать ошибку.
из нелпа
 
Return Values
 
If the function succeeds, the return value is a handle to the module.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.  
 
примерчик....
 
var
  DLLInstance : THandle;
begin
  DLLInstance := LoadLibrary(PChar('MyFirstDLL.dll'));
  if (DLLInstance = 0) then begin
    MessageDlg('Невозможно загрузить DLL', mtError, [mbOK], 0);
    Exit;
  end;
 
расшифровка кода ошибки :
 
char Buf[256];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),Buf,sizeof(Buf),NULL);
ShowMessage(Buf);
 

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 08:17 13-06-2006 | Исправлено: greenpc, 09:32 13-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ramazan
greenpc
Скорее всего GetLastError это самое
Цитата:
0eedfade
и вернет
А вообще с такими невнятными ошибками обычно программа падает когда цепляется DLL-ка, которой не хватает какой-то  статически используемой библиотеки или при ее загрузке происходит ошибка - библиотека грузятся сразу, а нормальная обработка исключений еще не началась.
Попробуй в отдельной задаче через LoadLibrary загружать библиотеки, используемые в той, которая падает - обычно в этом случае получается получить более осмысленное сообщение. Еще может помочь вынести тестирование на машину, где Delphi не установлена - у меня на рабочей машине тоже валился какой-то exception, а на не "загаженой" средами разработки сразу было сказано, что не хватает рантайм библиотек от VS2005

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 08:49 13-06-2006
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ramazan
Возможно, ошибка в процедуре входа в той dll, которую загружаешь по LoadLibrary.

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 10:30 13-06-2006
cleg

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
STEEL
для организации плавающий панелей - лучше всего пользовать Toolbar2000 (http://www.jrsoftware.org/tb2k.php)
 
а насчет дополнения по Tab - так что тут ваще сложного? обрабатываешь для Edit/MEmo событие OnKeyPress а там if Key=#8 then ...
лучше скажи что именно надо дополнять (откуда рать слова)

Всего записей: 51 | Зарегистр. 21-10-2004 | Отправлено: 11:48 13-06-2006
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мой вопрос, по-моему, больше к этому разделу...
 
Есть компонента gif (http://www.torry.net/vcl/graphics/gif/gifimage.exe). Я её благополучно установил (она реально нужна, так что сторонние компоненты можно не предлагать). В общем, теперь вот при компиляции вижу сообщение:
 
[Warning] GifImage.pas(12047): Symbol 'HeapAllocFlags' is specific to a platform
 
Мне оно не мешает, всё работает, но я хотел бы разобраться, что к чему. Корни сообщения уходят в system.pas, а в нём мне страшно пока что-либо ковырять
Будьте добры, объясните смысл ворнинга (насколько я понял, речь о выделении памяти, если не ошибаюсь), возможные причины его появления, и, если можно, методы устранения.
 
Спасибо.

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 19:40 13-06-2006
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
reenoip
При чем тут system.pas? Ясно же написано, что у тя в модуле GifImage.pas объявлено нечто по имени HeapAllocFlags. И там наверняка стоит приписка platform, чтобы компилер соответствующим образом ругался. Скорее всего, это переменная типа DWORD, которая используется при вызове функции HeapAlloc из виндового апи. И ругань эта означает, что под другой осью использование этой переменной может быть лишено смысла.

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 20:39 13-06-2006
Ramazan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenpc
RomanTim
FireZone
Проблема разрешилась. Как выяснилось, в процессе написания вызывающей DLL в нее "вкрались" () девэкспрессовские компоненты, которые также присутствовали в вызываемой DLL. Естественно, что в список run-time пакетов ничего добавлено не было. Действительно, возникала неявная ошибка при инициализации DevExpress. Добавление пакета cxGridVCLD7 спасло проект и меня, а то крыша уже реально ехала .
 
Итак, обобщая: при возникновении невнятных ошибок в динамической загрузке DLL в первую очередь стоит поиграть со списком run-time packages.
 
Всем спасибо!

Всего записей: 359 | Зарегистр. 13-04-2002 | Отправлено: 21:37 13-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
reenoip

Цитата:
[Warning] GifImage.pas(12047): Symbol 'HeapAllocFlags' is specific to a platform

В модуде GifImage.pas объявлена переменная
  HeapAllocFlags: Word platform = 2;   { Heap allocation flags, gmem_Moveable }
"platform" говорит о том, что использование этой переменной (функции, модуля и т.д.) может работать не на всех платформах, так что обращать внимание на это предупреждение нужно только если пишешь что-то кроссплатформенное. Если же нет, то можешь просто выключить предупреждения Platform Symbol и Platform Unit в настройках проекта

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 23:04 13-06-2006
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FireZone
RomanTim
Спасибо за инфу, я не знал об этом.

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 00:50 14-06-2006
Vol_2005

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Каким образом инсталировать создаваемый компонент в BDS2006?
В Delphi 7 достаточно создать скелет компонента New Component
и инсталировать его указав имя закладки. Причем,
если закладки с таким именем не существует, она будет создана.
В BDS2006 так не получается.
Где можно почитать об этом на великом и могучем?

Всего записей: 226 | Зарегистр. 05-01-2005 | Отправлено: 07:54 14-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Vol_2005
Создать для него пакет или добавить в стандартный dclusr

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 10:22 14-06-2006 | Исправлено: RomanTim, 10:36 14-06-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru