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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



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

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


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


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    delover

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

    Код:
    procedure TRegistry.WriteDateTime(const Name: string; Value: TDateTime);
    begin
      PutData(Name, @Value, SizeOf(TDateTime), rdBinary);
    end;
    ?
    В реестр пишутся бинарные данные длинной 8 байт. У программы RegEdit имеется свой хекс редактор для таких полей. Смысл конвертирования объясните, что вы хотите увидеть реально?
     
    Зы: Да и юзать
    reg.RootKey:=HKEY_LOCAL_MACHINE;
    reg.OpenKey('SYSTEM\CurrentControlSet\Data', false);
    Не особо хороший тон. Во первых это что дата лицензии на всю машину и всех пользователей? Опять не понимаю.

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 15:56 03-02-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sergey_Demchuk
    Возможно и можно покрасивее, но нужно знать формат данных в реестре.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:07 03-02-2011
    JohnSilver182



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Написал код для получения данных от консольных приложений
     
    ВНЕЗАПНО :  под Win 7 x64 висне цикл
     

    Код:
    repeat
          WaitReason:= WaitForSingleObject( ProcessInfo.hProcess,100);
          //Application.ProcessMessages;
          //WriteLn( WaitReason);
         until(WaitReason <> WAIT_TIMEOUT);

     

    Код:
    function ipconfig(v_cmd:string):string;
    const BUFSIZE = 2000;
    var SecAttr: TSecurityAttributes;
        hReadPipe, hWritePipe: THandle;
        StartupInfo: TStartUpInfo;
        ProcessInfo: TProcessInformation;
        Buffer: Pchar;
        WaitReason,BytesRead: DWord;
        l_str:string;
        i:integer;
    begin
     with SecAttr do
      begin
       nlength:= SizeOf(TSecurityAttributes);
       binherithandle:= true;
       lpsecuritydescriptor:= nil;
      end;
     if Createpipe(hReadPipe, hWritePipe, @SecAttr, 0) then
      begin
       Buffer:= AllocMem(BUFSIZE + 1);
       FillChar(StartupInfo, Sizeof(StartupInfo), #0);
       StartupInfo.cb:= SizeOf(StartupInfo);
       StartupInfo.hStdOutput:= hWritePipe;
       StartupInfo.hStdInput:= hReadPipe;
       StartupInfo.dwFlags:= STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
       StartupInfo.wShowWindow:= SW_HIDE;
       if CreateProcess(nil, PChar('ipconfig '), @SecAttr, @SecAttr, true, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
        begin
         repeat
          WaitReason:= WaitForSingleObject( ProcessInfo.hProcess,100);
          //Application.ProcessMessages;
          //WriteLn( WaitReason);
         until(WaitReason <> WAIT_TIMEOUT);
         repeat
          BytesRead := 0;
          ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
          Buffer[BytesRead]:= #0;
          OemToAnsi(Buffer,Buffer);
          //Копим
          l_str := l_str + String(buffer);
         until(BytesRead < BUFSIZE);
        end;
       result:=l_str;
       FreeMem(Buffer);
       CloseHandle(ProcessInfo.hProcess);
       CloseHandle(ProcessInfo.hThread);
       CloseHandle(hReadPipe);
       CloseHandle(hWritePipe);
      end;
    end;
     

    Всего записей: 829 | Зарегистр. 03-06-2009 | Отправлено: 21:41 03-02-2011
    Sergey_Demchuk



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

    Цитата:
    reg.RootKey:=HKEY_LOCAL_MACHINE;  
    reg.OpenKey('SYSTEM\CurrentControlSet\Data', false);  
    Не особо хороший тон. Во первых это что дата лицензии на всю машину и всех пользователей? Опять не понимаю.

    Ну это я так, не всю ветку написал, там еще подключи есть.
     
    Суть программы в двухсловах
    В реестре в некоей ветке есть значение REG_BINARY типа ...00,d3,b6,95,15,20,00,0a,00,11....
    В этом месте b6,95,15 записаны Дата,Месяц и Год.
    Мне надо их изменить на дату, отстоящую от сегодняшнего дня на 50 дней вперед.
    Для этого я получаю Дату и перевожу ее в текстовый формат

    Код:
    DateSeparator := '.';
      Temp:=DateToStr(Date+55);
    AktDay:= Copy (Temp, 1, Pos('.',Temp)-1);

     
    Далее перевожу дату в бинарный вид  

    Код:
      IntDay:=IntToBin(StrToInt(AktDay),8);
      Maska:=IntToBin(250,8);

     
    Далее идет функция, которая делает то же что и 11111010 XOR 00010111,  пришлось делать написание функции, ибо 11111010 и 00010111 (IntDay и Mask) находятся в переменных текстового типа.
    Уверен все можно и попроще намного сделать, но пока вот так получилось.
    Ну а далее то что получилось надо из двоичного вернуть в HEX и вернуть в реестр вместо b6.

    Код:
     
    HexDataDay:= BinToHex (IntDay);  
    FillChar(Buf, SizeOf(Buf), 0);  
      reg:=TRegistry.Create;  
      reg.RootKey:=HKEY_LOCAL_MACHINE;  
      reg.OpenKey('SYSTEM\CurrentControlSet\Data', false);  
      REG.ReadBinaryData('Data', Buf, SizeOf(Buf));  
      ii:=1;  
      for ii:=1 to 255 do begin  
      if ((Buf[ii]=#$00) and (Buf[ii+1]=#$d3)) then Buf[ii+3]:=HexDataDay;  
      //buf[7]:=#$E9;  
      end;

    Вот так в двух словах
     
     
     
     

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 21:54 03-02-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sergey_Demchuk
    Без конвертации в строки можно обойтись.
    К примеру так, или так.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 23:59 03-02-2011 | Исправлено: Frodo_Torbins, 12:34 04-02-2011
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Мне нужно чтоб после 23:00 комп выключался...
    Как сделать?

    Всего записей: 466 | Зарегистр. 31-10-2006 | Отправлено: 03:18 05-02-2011
    emo

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GRom V
    смотри функцию ExitWindowsEx

    Всего записей: 373 | Зарегистр. 19-11-2003 | Отправлено: 07:50 05-02-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GRom V
    Настроить стандартный планировщик.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 11:55 05-02-2011
    GRom V

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

    Цитата:
    GRom V  
    Настроить стандартный планировщик.

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

    Всего записей: 466 | Зарегистр. 31-10-2006 | Отправлено: 13:05 05-02-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GRom V
    Стандартный планировщик уже встроен в винду. Причем в висте и семерке всегда гарантированно включен. Зачем вам еще отдельная прога, у юзера слишком много оперативки?
    Но если уж очень нужно, то используйте обычный таймер. При запуске расчитываете сколько осталось времени до одинадцати и выставляете нужный интервал.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 13:35 05-02-2011 | Исправлено: Frodo_Torbins, 13:40 05-02-2011
    JohnSilver182



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JohnSilver182
    Меня  никто не любит

    Всего записей: 829 | Зарегистр. 03-06-2009 | Отправлено: 23:05 05-02-2011
    emo

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

    Цитата:
    Нужна именно прога...

    Если нужна отдельная прога, причем тогда эта тема?  
    Или вы сами хотите написать?
    Используйте таймер, проверяйте время, вызывайте ExitWindowsEx.  
    Всего несколько строчек кода.

    Всего записей: 373 | Зарегистр. 19-11-2003 | Отправлено: 23:22 05-02-2011 | Исправлено: emo, 01:12 06-02-2011
    ShIvADeSt



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

    Цитата:
    Но если уж очень нужно, то используйте обычный таймер. При запуске расчитываете сколько осталось времени до одинадцати и выставляете нужный интервал.

    интервал можно сделать на каждые 10 секунд или минуту и проверять в событии сколько сейчас времени. Если время пришло, то ExitWindowsEx.

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:27 07-02-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt
    Владельцы ноутбуков скажут вам "спасибо" за разряженную батарею. Просыпание процессора каждые n секунд является довольно большой нагрузкой на нее.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 10:36 07-02-2011 | Исправлено: Frodo_Torbins, 10:38 07-02-2011
    JohnSilver182



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ а  PAnsichar  в D7 и D2010  по разному работают    8 vs  16 бит ???

    Всего записей: 829 | Зарегистр. 03-06-2009 | Отправлено: 12:08 07-02-2011
    psa1974



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

    Цитата:
    Народ а  PAnsichar  в D7 и D2010  по разному работают    8 vs  16 бит ???

    PСhar - по разному. А PAnsichar - одинаково. В обоих случаях PAnsichar - это указатель на строку однобайтных символов. Сам указатель по сути - это Integer и его размерность не менялась.

    ----------
    У программёра есть два состояния: "Втупляю" и "Попёрло"...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 12:26 07-02-2011
    ShIvADeSt



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

    Цитата:
    Владельцы ноутбуков скажут вам "спасибо" за разряженную батарею. Просыпание процессора каждые n секунд является довольно большой нагрузкой на нее.

    Про них я не думал, почти весь мой софт работает на стационарах

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 13:21 07-02-2011
    Sergey_Demchuk



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

    Код:
    Buf: array[0..255] of Byte;  
    ...  
      FillMemory(@Buf, SizeOf(Buf), 0);  
      if ((Buf[ii]=$00) and (Buf[ii+1]=$d3)) then ...  

     
    Как тут поправить несоответствие типов?

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 08:45 08-02-2011
    JohnSilver182



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
    Просто странно ,  Exe которое скомпилированно на D7+winXp  ,  работает ОЧЕНЬ  странно под Win 7 x64 ( см мой вопрос: Написал код для получения данных от консольных приложений )
     
    А точнее,  где есть указатели + вызов API функций.
     

    Всего записей: 829 | Зарегистр. 03-06-2009 | Отправлено: 09:08 08-02-2011
    greenpc

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

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 10:34 08-02-2011 | Исправлено: greenpc, 10:39 08-02-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru