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

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

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

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 101

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    NOwlar



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

    Цитата:
    Хм. А в статье было написано - или пишем обработчики OnStart/OnStop или обработчик OnExecute. Т.е. я правильно понял, что надо в OnExecute и прописывать те действия, которые мне надо выполнить по таймеру, а таймер убрать совсем и код будет примерно такой:

    Ну как-то так. Таймер тоже будет работать если в OnExecute будет просто пустой цикл с  ProcessRequests( True );  

    Цитата:
    А как его запустить? Можно примерчик?

    Кстати, если обработчик OnExecute вообще не определять - то тогда сервис тоже будет работать должным образом, но как раз в этом случае нужно в OnStart запускать свой поток. То есть надо создать экземпляр класса, например TMyServiceThread, наследника TThread с переопределённым методом Execute, в котором совершать нужные действия.

    Всего записей: 170 | Зарегистр. 25-01-2006 | Отправлено: 12:03 14-09-2009
    SerBUser

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NOwlar
    Все, спасибо всем - выкрутился. Просто создал новое приложение (не сервис), в котором кинул таймер и делаю все, что мне нужно и отлаживаю как приложение - очень удобно. А в службе просто подрубил его и код выглядит теперь проще не бывает:

    Код:
     
    uses
      SvcMgr,
      Unit1 in 'Unit1.pas' {Service1: TService},
      Unit2 in 'Unit2.pas' {pas-файл приложения};
     

     

    Код:
     
    type
      TService1 = class(TService)
        procedure ServiceStart(Sender: TService; var Started: Boolean);
        procedure ServiceStop(Sender: TService; var Stopped: Boolean);
      private
        { Private declarations }
      public
        function GetServiceController: TServiceController; override;
        { Public declarations }
      end;
     
    var
      Service1: TService1;
     
    implementation
     
    uses
      Unit2;
     
    {$R *.DFM}
     
    procedure ServiceController(CtrlCode: DWord); stdcall;
    begin
      Service1.Controller(CtrlCode);
    end;
     
    function TService1.GetServiceController: TServiceController;
    begin
      Result := ServiceController;
    end;
     
    procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
    begin
      Form2.Timer1.Enabled := True;
      Started := True;
    end;
     
    procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
    begin
      Form2.Timer1.Enabled := false;
      Stopped:=true;
    end;
     
    end.
     

    Всего записей: 123 | Зарегистр. 31-08-2009 | Отправлено: 03:29 15-09-2009
    mdid

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

    Код:
     
    form:TForm;
    form:=tform.create(self);
     

    и вот как скопировать допустим form4 в form...
    ПС
    перебором списка компонентов четвертой формы и создание онных на form лень...тоесть может есть способ как то попроще?
     

    Всего записей: 1298 | Зарегистр. 13-02-2006 | Отправлено: 21:18 15-09-2009
    Hiken



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mdid
    Если я вас правильно понял: вот здесь видел похожий вопрос, там же есть и ответ на него. Вкратце: либо создавайте еще один экземпляр этой же формы, либо используйте Frames.

    Всего записей: 1343 | Зарегистр. 14-01-2006 | Отправлено: 21:35 15-09-2009
    mdid

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hiken
    понял...пасиб...за все время что программлю в делфи на Frames даже внимания не обращал

    Всего записей: 1298 | Зарегистр. 13-02-2006 | Отправлено: 21:57 15-09-2009
    Grande



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемые знатоки, столкнулся вот с такой проблемой:
     
    Передающее приложение

    Код:
     
    type
      TParams = Record
        IniString1  : ShortString;
        IniString2  : ShortString;
        Answer1     : ShortString;
        Answer2     : ShortString;
        IP_Port     : Integer;
        Job         : Integer;
      end;
     
    procedure Sender;
    var
      SendRecord: TParams;
      aCopyData: TCopyDataStruct;
      hReceiver: Cardinal;
      MsgToSend: ShortString;
    begin
      SendRecord.IniString1 := 'IniString1';
      SendRecord.IniString2 := 'IniString2';
      SendRecord.Answer1 := 'Answer1';
      SendRecord.Answer2 := 'Answer2';
      MsgToSend := 'Message';
      with aCopyData do
      begin
        dwData := 0;
        cbData := StrLen(MsgToSend) + 1;
        lpData := @SendRecord;
      end;
      SendMessage(hReceiver, WM_COPYDATA, LongInt(hMyApp), LongInt(@aCopyData));
    end;
     

     
    Принимающее приложение:

    Код:
     
    ...
    procedure TReceiver.WMCopyData(var Msg: TWMCopyData);
    var
      Params: ^TParams;
    begin
      Params := Msg.CopyDataStruct.lpData;
      ShowMessage(Params.IniString1 + ', ' + Params.IniString2) + ', ' + Params.Answer1 +
      ', ' + Params.Answer2);
    end;
     

     
    На принимающей стороне ShowMessage отображает погоду за окном
    Не подскажете ли - почему?
    Спасибо.
     

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 09:03 16-09-2009
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Grande
    1) cbData - Specifies the size, in bytes, of the data pointed to by the lpData member.  
    а у тебя там какая то ерунда написана. По идее должно быть так

    Цитата:
    with aCopyData do
      begin
        dwData := 0;
        cbData := SizeOf(TParams);
        lpData := @SendRecord;
      end;  

    я проверил у меня все нормально ушло.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:11 16-09-2009
    GPSGURU



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Хочу спросить совета.
    Делаю небольшой софт для компании. Все данные храню в record - переменной, которая в свою очередь состоят из record-переменных, динамич. массивов и др. Т.е. обратиться к любому параметру можно: Prog.{1-й раздел}.{2-й раздел}... и так далее, с произвольной глубиной вложений.
    Теперь сам вопрос: если данные будут изменяться различными потоками, нужно ли мне делать это через criticalsection. Если да, то из-за того что все в куче не получится ли так, что возникнут разные коллизии?

    Всего записей: 84 | Зарегистр. 06-05-2008 | Отправлено: 09:25 16-09-2009
    Grande



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt
     
    Ну, что сказать... Лохонулся по полной - такая досадная ошибка
    Спасибо огромное, заработало.

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 09:30 16-09-2009
    Hiken



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GPSGURU
    Да, например синхронизировать можно через критические секции. Если данных много, и обращение к ним из разных потоков будет происходить часто-часто, то одной критической секции на весь массив будет недостаточно: нужно делить данные на страницы. И очевидный момент: находиться в критической секции следует как можно меньше: считали запись во временную переменную - вышли, обрабатываете, когда надо записывать, и только тогда - заходите снова.

    Всего записей: 1343 | Зарегистр. 14-01-2006 | Отправлено: 10:10 16-09-2009
    GPSGURU



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо огромное.  Так и сделаю. А если одна критическая секция "забирает" один кусок record-переменной, в это же время другая сможет "забрать" другой кусок? Или она ждет пока не закончит свои дела первая? Т.е. если одна критическая секция заберет маленький параметр на самой верхушке всего дерева, остальные будут в это время доступны или блокируется вся record-переменная?

    Всего записей: 84 | Зарегистр. 06-05-2008 | Отправлено: 11:28 16-09-2009
    Hiken



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ну что значит кусок? Если вы хотите, чтобы можно было одновременно в двух потоках обрабатывать две половины одной записи, и при этом не было порчи данных, то нужно использовать две критические секции, на каждую половину этой записи. Выходит по два объекта синхронизации на каждую запись - надо бы упростить, уменьшить их число. Или довольствоваться единственным на весь массив, или порезать на страницы и ассоциировать с каждой из них один объект: мьютекс, семафор, или же критическую секцию.

    Всего записей: 1343 | Зарегистр. 14-01-2006 | Отправлено: 11:38 16-09-2009 | Исправлено: Hiken, 11:41 16-09-2009
    nkurrich



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    могите с перехватом клавиш, то есть например при запуске программы, при нажатии Enter должна работать процедура, и сочетания клавиш тоже если можн опишите=)заранее спс

    Всего записей: 20 | Зарегистр. 16-09-2009 | Отправлено: 12:45 16-09-2009
    Hiken



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nkurrich
    Используйте WinAPI функцию GetKeyState, например:
     

    Код:
      if GetKeyState(VK_ENTER) < 1 then  
        // ENTER нажата
      else
        ; // НЕ нажата

     

    Цитата:
    и сочетания клавиш тоже если можн опишите

    Чего-чего?

    Всего записей: 1343 | Зарегистр. 14-01-2006 | Отправлено: 12:55 16-09-2009
    nkurrich



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Цитата:
    и сочетания клавиш тоже если можн опишите
     
    Чего-чего?  
     
     
    ну например мне надо, чтобы при нажатии СtrL+Enter происходило определенное действие

    Всего записей: 20 | Зарегистр. 16-09-2009 | Отправлено: 13:11 16-09-2009
    Hiken



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nkurrich
    Раз задача стоит именно так: что мешает два раза вызвать GetKeyState? Чтобы узнать Virtual-Key-коды всех клавиш, смотрите одноменный топик "Virtual-Key Codes" в Platform SDK.

    Всего записей: 1343 | Зарегистр. 14-01-2006 | Отправлено: 13:31 16-09-2009
    ShIvADeSt



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

    Цитата:
    Чтобы узнать Virtual-Key-коды всех клавиш

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

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 15:22 16-09-2009
    Hiken



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt
    А как же цифро-буквенные клавиши? Для них не определены константы, вот и приходится соответствующий им число-код вводить.

    Всего записей: 1343 | Зарегистр. 14-01-2006 | Отправлено: 15:27 16-09-2009
    ShIvADeSt



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

    Цитата:
    А как же цифро-буквенные клавиши? Для них не определены константы, вот и приходится соответствующий им число-код вводить.

    Константы не определены, но значения там описаны. Если память не изменяет Ord от символа (я просто не сравнивал значения и результат орда).

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 15:39 16-09-2009
    andrewtishkin



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

    Цитата:
    А как же цифро-буквенные клавиши?

    Английские буковки, циферки и прочие виртуальные клавиши в MSDN описаны...
    http://msdn.microsoft.com/en-us/library/dd375731(VS.85,loband).aspx
    Или я не о том?
     
    Добавлено:

    Цитата:
    но значения там описаны.

    +1

    Код:
    { VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
    { VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }


    Всего записей: 781 | Зарегистр. 28-08-2008 | Отправлено: 16:34 17-09-2009 | Исправлено: andrewtishkin, 16:35 17-09-2009
       

    Страницы: 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 101

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru