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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    V1s1ter



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

    Цитата:
    я по разобрался

    Если бы "по разбирался" такого вопроса

    Цитата:
    Мне нужен компонент для открытия и просмотра 3ds max файлов

    не возникло бы. Таже GLScene эти файлы читает и даже готовая демка есть...
     

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 21:44 07-10-2009
    VandB



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V1s1ter
    glscene Delphi 2009 не поддерживается...... есть альтернатива или сам glscene для  Delphi 2009?

    Всего записей: 164 | Зарегистр. 05-05-2009 | Отправлено: 00:24 08-10-2009
    V1s1ter



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

    Цитата:
    glscene Delphi 2009 не поддерживается...

    Странно я об этом не знал, но файлы dpk для D2009 и D2010 видел.
    Если серьезно, то я немогу гарантировать правильность сборки под 2009 или 2010 ибо пользую 2007. Но если у Вас проблемы с получением кода через механизм CVS (Concurrent Versions System), то могу выложить последнее обновление.

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 01:39 08-10-2009
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
    Да, именно так. Требуется перезапускать DHCP клиент. Sleep, конечно можно, но есть такой вопрос. Вот если из командной строки останавливать эту службу под вистой/семеркой, там предлагают остановить еще и WinHTTP службу. С этим проблем не будет? Просто раньше я через WinExec выполнял "net stop" для службы и все стопорилось на этих системах, потому как скрывал окошко интерпретатора и пользователь не видел что там оказывается вручную надо подтвердить еще перезапуск. Да и Sleep большой неохото делать, просто код выполнять не в отдельном потоке, он последовательно сам выполнится и все когда надо, а тут кот в мешке.
    Сейчас да, останавливаю через Service API, но я честно не знаю как в самом потоке зацикливать выполнение задачи что-то наподобие repeat untill или чего там надо для него. Что-нибудь типа repeat нужно где проверять состояние службы и если она не готова, делать Sleep ну или как-то так.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 06:35 08-10-2009
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VandB
    Вот последняя GLScene с поддержкой D4-D2010
    http://rapidshare.com/files/290131228/SC2.rar.html

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 09:18 08-10-2009
    greenpc

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

    Цитата:
    зацикливать выполнение задачи  

    я обычно делаю так если измение значения Terminated идет со стороны (например из потока)
    while not(Terminated) do begin  
      ...
     Application.processmessage;
    end;
    и в догонку
    проверка на состояние службы телнет

    Код:
    var ssStatus: SERVICE_STATUS;
        schSCManager: SC_HANDLE;
        schService: SC_HANDLE;
    begin
      schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
      if schSCManager=0 then RaiseLastOSError;
      schService:=OpenService(schSCManager,'tlntsvr'#0,SERVICE_ALL_ACCESS);
      if schService=0 then RaiseLastOSError;
      if(QueryServiceStatus(schService,ssStatus)) then begin
        case ssStatus.dwCurrentState of
          SERVICE_STOPPED: Label1.Caption := 'Остановлен';
          SERVICE_RUNNING: Label1.Caption := 'Запущен';
        end;
      end;
     

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 11:02 08-10-2009 | Исправлено: greenpc, 11:05 08-10-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Не, пользовать "net stop" нехорошо. Если в батнике - то никуда не денешься, но в программе это не красиво и не управляемо. Плюс - запуск отдельного процесса интерпретатора, пусть даже и скрытого, а это лично мне вообще не нравится.
    Небольшое уточнение: зачем ты это делаешь в отдельном потоке? В это время основной поток что-то делает или просто чтобы интерфейс программы "дышал"?  
    В любом случае, Sleep, на мой взгляд, некрасивое решение (особенно в основном потоке - пока Sleep не вернется, интерфейс не "дышит", поскольку не происходит выборка сообщений из очереди).  
    Лучше сделать, как сказал greenpc: организовать ожидание останова службы в цикле проверкой ее статуса. Вот пример для использования в основном потоке (при необходимости, добавляем первым условием в while проверку not Terminated, как в примере greenpc):

    Код:
     
    // ...код остановки службы из примера greenpc...
    while (QueryServiceStatus(schService, ssStatus)) and (ssStatus.dwCurrentState = SERVICE_RUNNING) do  
    begin  
    {проверяем статус и если служба еще выполняется, то обрабатываем сообщения в очереди и заново проверяем}
      Application.processmessage;  
    end;
    // вот тут служба уже остановлена, можно ее заново запускать
     

    Этот код годится и в основном потоке (не требуется выносить в отдельный поток только для того чтобы интерфейс дышал), поскольку вызовом Application.processmessage организуется локальная петля сообщений и программа продолжает реагировать на внешние раздражители Можно организовать счетчик и скажем, вызывать Application.processmessage на каждом 50-м шаге, или вызывать тот же Sleep c малюсеньким временем, скажем 500 мс перед Application.processmessage, но это уже "бантики"  
    А если уж хочешь использовать Sleep, можно ориентироваться на величину таймаута значение параметра WaitToKillServiceTimeout (плюс какая-то небольшая дельта) в ветке: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control] - Это величина таймаута для всех служб в системе по-умолчанию (если сама служба не заказала себе иное значение), в течение которого, если служба не вернула системе свой статус, она считается зависшей. Т.е. опять же делать проверку статуса в цикле, со значением Слипа, равным WaitToKillServiceTimeout...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 12:03 08-10-2009 | Исправлено: psa1974, 12:22 08-10-2009
    d0m1nat0r321

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    хм интересно ктото на мой вопрос ответит ?

    Всего записей: 8 | Зарегистр. 07-10-2009 | Отправлено: 12:18 08-10-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    d0m1nat0r321
    Я так понял, необходимо манипулировать данными только программно? т.е. где-то есть кнопка, нажатие на которую приводит,скажем, к вставке записи, и она должна отобразиться в DBGrid, но непосредственно в DBGrid вводить новые записи или редактировать существующие не надо?  
    Если так, то я делал так: DBGrid - readonly, связанный TClientDataSet - readonly.
    На сервере приложения реализуется метод для изменения данных (например вставка записи). Пусть это будет метод InsNewRec.  
    На клиенте делаю:

    Код:
     
      ClientDataSet.DisableControls;
      ClientDataSet.Close;
      try
        //вызываем реализованный на сервере метод изменения данных (сами данные передаем ему в качестве параметров метода сервера):
        ConnectionBroker.Connection.AppServer.InsNewRec(......);
      finally
        ClientDataSet.EnableControls;
        ClientDataSet.Open;
        { если надо, выполняем переход на последнюю запись ('ID_REC' - ключевое поле, IDRec - его значение, в случае Firebird я его получаю вызовом на сервере приложения генератора перед вставкой):}
        Locate('ID_REC', IDRec, []);
      end;
     

    То есть, DBGrid служит только для индикации данных. Может это и кривое решение, но работает
    P.S. У меня очень плохо с остальными языками кроме русского

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 12:51 08-10-2009 | Исправлено: psa1974, 13:26 08-10-2009
    greenpc

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

    Код:
    procedure TNewForm.dbgrd1KeyPress(Sender: TObject; var Key: Char);
    begin
      if (Key = Chr(VK_DOWN)) and (dbgrd1.DataSource.DataSet.Eof)    then Key = #0;
    end;
     

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 12:56 08-10-2009
    d0m1nat0r321

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

    Цитата:
    Если так, то я делал так: DBGrid - readonly, связанный TClientDataSet - readonly.

    я так тож сначала думал забрать поставить not edit но едит нужно
    Цитата:
    procedure TNewForm.dbgrd1KeyPress(Sender: TObject; var Key: Char);  
    begin  
      if (Key = Chr(VK_DOWN)) and (dbgrid1.DataSource.DataSet.Eof)    then Key:=Chr(VK_UP);  
    end;
    - так я тож уже делал всеравно он добавляет скорее чем происходит действие
     

    Всего записей: 8 | Зарегистр. 07-10-2009 | Отправлено: 13:44 08-10-2009 | Исправлено: d0m1nat0r321, 13:54 08-10-2009
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    d0m1nat0r321
    Развивая предложеное выше
    В свойствах формы выставляем KeyPreview = True;
    Код:
     
    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
       if (ActiveControl = dbgrd1) and  
          (Key = Chr(VK_DOWN)) and  
          (dbgrd1.DataSource.DataSet.Eof)    
       then Key = #0;  
    end;
     

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 14:14 08-10-2009 | Исправлено: V1s1ter, 14:14 08-10-2009
    d0m1nat0r321

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

    Цитата:
    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);  
    begin  
       if (ActiveControl = dbgrid1) and  
          (Key = Chr(VK_DOWN)) and  
          (dbgrid1.DataSource.DataSet.Eof)      
       then Key:= #0;  
    end;
    - тоже самое, он не реагирует

    Всего записей: 8 | Зарегистр. 07-10-2009 | Отправлено: 14:35 08-10-2009
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    d0m1nat0r321
    а если на DataSet BeforeInsert(DataSet: TDataSet)
    DataSet.Cancel если dbgrid1.DataSource.DataSet.Eof

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 14:43 08-10-2009 | Исправлено: greenpc, 14:45 08-10-2009
    d0m1nat0r321

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

    Цитата:
    Data

    Цитата:
    а если на DataSet BeforeInsert(DataSet: TDataSet)  
    DataSet.Cancel если dbgrid1.DataSource.DataSet.Eof
    - тогда невозможно будет добавлять даные (если виделить последнюю запись и добавить с помощь кнопок tdbnavigator'а он тож не пустит), надо именно на клавишу, или чтото с хорошой умовой
     
     
     
    Добавлено:

    Цитата:
    а если на DataSet BeforeInsert(DataSet: TDataSet)  
    DataSet.Cancel если dbgrid1.DataSource.DataSet.Eof
    есть придумал, я поставил ево в обработчик afterinsert и изменил позыцыю ето дало возможность добавлять с навигатора и убрать добавление с клавиатуры).
     
    БОЛЬШОЕ спосибо наконецто доделаю )))

    Всего записей: 8 | Зарегистр. 07-10-2009 | Отправлено: 14:59 08-10-2009
    V1s1ter



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

    Цитата:
    тоже самое, он не реагирует  

    Прости не проверил мысль, теперь проверил - работает:

    Код:
     
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
       if (ActiveControl = DBGrid1) and (Key = VK_DOWN) then
         if dbgrid1.DataSource.DataSet.Eof then Key:= 0
         else begin
           dbgrid1.DataSource.DataSet.Next;
           if dbgrid1.DataSource.DataSet.Eof then Key:= 0
           else dbgrid1.DataSource.DataSet.Prior;
         end;
    end;
     

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 15:16 08-10-2009
    d0m1nat0r321

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    я уже зделал по другому с помощю afterinsert  

    Цитата:
    if dbgrid1.DataSource.DataSet.Eof then clientDataSet1.Cancel else begin
    dbgrid1.Columns[0].ReadOnly:=false;
    ClientDataSet1.Fields[0].AsString:=inttostr(clientdataset1.RecordCount+1);
    dbgrid1.Columns[0].ReadOnly:=true end;
    ну и до етого сменил позыцыю

    Всего записей: 8 | Зарегистр. 07-10-2009 | Отправлено: 15:21 08-10-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    d0m1nat0r321
    Продолжаю развитие темы, предложенной greenpc
    Во-первых. Событие OnKeyPress возникает не для каждой нажатой клавиши, а только для тех, которые соответствуют какому -то символу, т.е. для клавиши Down это событие не возникнет. (OnKeyPress возникает при получении сообщения WM_CHAR, а вот это сообщение вставляется в очередь сообщений ф-цией TranslateMessage при получении сообщения от системы WM_KEYDOWN).  
    А вот событие OnKeyDown генерируется для ЛЮБОЙ нажатой клавиши (возникает при получении от системы WM_KEYDOWN), поэтому следует попробовать написать обработчик именно этого события.  
    Т.е. OnKeyDown возникает всегда, а OnKeyPress - только для символьных клавиш!
    Если не поможет, есть на уме еще одна идея...
     
     
    Добавлено:
    А ну, пока писал, V1s1ter уже это на примере показал

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 15:28 08-10-2009
    d0m1nat0r321

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    я уже зделал )) но по другому с кейдовн ещо не пробувал...  
     
    Добавлено:
    )))

    Всего записей: 8 | Зарегистр. 07-10-2009 | Отправлено: 15:36 08-10-2009
    VandB



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V1s1ter
    Большое вам спасибо из этой версии установилось все

    Всего записей: 164 | Зарегистр. 05-05-2009 | Отправлено: 16:05 08-10-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