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

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mantikor123
    У таймеров нету счетчиков, они просто срабатывают через определенные промежутки времени. Если приложение долго было занято работой, и за это время должно было произойти несколько срабатываний таймера, то произойдет только одно, когда приложение освободится. Остальное тут: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 21:19 19-02-2012
    Mantikor123

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

    Всего записей: 38 | Зарегистр. 19-12-2009 | Отправлено: 21:21 19-02-2012
    MrZeRo



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mantikor123
    Чтобы несколько процедур "были активными" (наверное, имеется в виду, чтобы они одновременно выполнялись), придется использовать потоки (Thread), тут таймерами не обойтись. Информации по многопоточному программированию уйма.

    ----------
    ... не это главное ...

    Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 19:39 20-02-2012
    Mantikor123

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не вышло к таймеру привязать прогрес бар, по этому пришлось вот так прогресс бар сделать.

    Код:
    procedure Pause(p:integer);
    var
      t:TTime;
    begin
      t:=EncodeTime(0,0,p,0)+Time;
        repeat
          Application.ProcessMessages;
          Sleep(1);
        until Time>=t;
    end;
     
     
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var i:Integer;
    begin
    for i:=0 to 10 do
      begin
        Application.ProcessMessages;
        Pause(1);
        progressbar1.Position:=i;
    end;
     
    end;

     
    Но проблема в том что когда оно работает изо команды Sleep(1); доступ к форме блокируется. Есть ли какйто аналог к ней?

    Всего записей: 38 | Зарегистр. 19-12-2009 | Отправлено: 09:24 21-02-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mantikor123
    Посмотрите как это сделано в демках к делфям: ..\Demos\Threads\
     
    Вам нужно создавать несколько потоков и уже в потоках имитировать работу процессоров.

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 09:28 21-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mantikor123
    Я так и не понял, что конкретно требуется. В произвольном порядке двигать прогресбары? Так и зачем вам тогда Sleep, если есть таймер?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 14:41 21-02-2012
    Mantikor123

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    salexn1, спасибо гляну.
    Frodo_Torbins, ну нужно сделать визуализацию процесса с помощью прогресс бар, ну по крайней мере я так себе это представляю.  Таймер к прогбару у меня так и не вышло толком подцепит((  
    и теперь я хочу чтоб после нажатия на кнопку, бары по определений очереди заполнялись. Я это сделал, но возник затык, когда оно выполняется(заполняются бары) то к форме изо Sleep нет доступа. Конечно пойдет и так, но хотелось бы в это время иметь возможность роботы с формой...
     
     
     
    Хм еще одна проблемка...
    Когда код в процедуре кнопки то все работает а стоит вынести ее в отдельную процедуру  

    Код:
    procedure ProgBars(Sender: TObject);
    var
    i:Integer;
    begin
    for i:=0 to 100 do
      begin
        Application.ProcessMessages;
        Pause;
        ProgressBar1.Position:=i;
      end;
     
    end;

    выдает ошибку не неизвестный тип, на тот самый проклятый прогрессбар
     
     [Error] Unit2.pas(58): Undeclared identifier: 'ProgressBar1'
     
     

    Код:
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;

     

    Код:
    type
      TForm1 = class(TForm)
        ProgressBar1: TProgressBar;

    Всего записей: 38 | Зарегистр. 19-12-2009 | Отправлено: 14:53 21-02-2012 | Исправлено: Mantikor123, 16:31 21-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mantikor123
    Я бы занес все прогресбары в массив и потом в таймере увеличивал Position какого-нибудь случайно выбранного.
      С процедурой у вас два варианта:
    • обьявить процедуру частью формы:
      Код:
      //...
      public
        procedure ProgBars(Sender: TObject);  
      end;

    • писать Form1.ProgressBar1 ...

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:48 21-02-2012 | Исправлено: Frodo_Torbins, 17:48 21-02-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mantikor123
     
    нужно посылать главной форме сообщения (напр. WM_USER+...) из рабочих потоков
    в параметрах передавать информацию о текущем состоянии обработки,
    а в обработчике сообщения уже двигать прогресс-бары. и ничего блокироваться не будет

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 18:56 21-02-2012
    Mantikor123

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ура сделал. Всем спасибо за помощь....

    Всего записей: 38 | Зарегистр. 19-12-2009 | Отправлено: 22:17 21-02-2012
    Ichigo2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем. Вопрос по StringGrid.
    Нужно сделать выделение, или правильно сказать активацию ячеек в таблице с помощью мыши, на событие onMouseMove, т.е. водишь мышкой над таблицей, и ячейки под мышкой становятся активными.  
    Эта фича у меня уже была, но удалил из-за ненадобностью а теперь вспомнить не могу...

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 08:41 22-02-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    var
      aRow, aCol: Integer;
      aRect: TGridRect;
    begin
      StringGrid1.MouseToCell(X, Y, ACol, aRow);
      aRect.Left := ACol;
      aRect.Top := aRow;
      aRect.Right := ACol;
      aRect.Bottom := aRow;
      StringGrid1.Selection  := aRect;

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 09:27 22-02-2012
    exteris

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    А в чем должна выражаться активность ячейки? Фокус?

    Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 09:38 22-02-2012
    Ichigo2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    salexn1
    Да, то что надо! Благодарю!
    exteris
    Получается так. Но мне важнее фокус всей строчи, а не одной ячейки.

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 09:57 22-02-2012
    Ichigo2



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

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 21:27 22-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    Досталась мне в наследство одна прога, в которой дробные числа хранились в стринггриде. Результат был весьма плачевный: потеря точности, не сходящиеся суммы и злые бухгалтерши.
    Даже если вы храните в компоненте отображения  данных совсем не дробные числа, все равно так делать не стоит. В конце-концов есть же всякие ClientDataSet, JvMemoryData и прочие. Если их правильно использовать, то они могут очень сильно упростить ваш код (в моем случае количество кода уменьшалось в 3-4 раза).

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 22:40 22-02-2012 | Исправлено: Frodo_Torbins, 22:42 22-02-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    Frodo_Torbins
    На самом деле ничего плохого в хранении в одной ячейки нету. Весь вопрос, как реализовать.
    У того же StringGrid есть Objects[ACol, ARow], который можно запихнуть ВСЕ, что пожелаешь.  
    А отображать можно на CustomDraw...
    А от кривизны рук и ровности извилин не спасет ни ClientDataSet, ни JvMemoryData... Это про код, который достался в наследство.

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 00:03 23-02-2012 | Исправлено: salexn1, 00:04 23-02-2012
    sammozg



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Благодарю за советы, но они мне не помогли, я поменял компонент на idTCPClient, вроде стало работать получше, но ни TCPClient, ни  idTCPClient не работают когда я запускаю сразу 2 потока(разумеется с разными IP/Port), работает только один, пробывал создавать кучу клиентов, Запускать в разных потоках(всмысле с другим именем, и вообще писал отдельный поток), в общем устал как собака..., а он не работает (первый подвисает на соединении при запуске второго потока, второй благополучно работает, при запуске третьего, виснут первый и второй, работает тока третий и тд...). Вот к чему я пришёл....

    Всего записей: 90 | Зарегистр. 30-06-2011 | Отправлено: 14:14 24-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sammozg
    Торенты на этом компьютере нормально работают? А то вдруг дело в винде.
    И на какой именно строке виснет?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 14:58 24-02-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sammozg
     
    по идее надо в каждом потоке создавать свой idTCPClient

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 17:58 24-02-2012
    Открыть новую тему     Написать ответ в эту тему

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