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

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

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

ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

Maks150988



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

Код:
STRINGTABLE
LANGUAGE LANG_RUSSIAN, 0x1
{
1653,     "1653,     "Исполняемый файл (*.exe)|*.exe|Динамическая библиотека (*.dll)|*.dll||"
}

Выполнил замену строк:

Код:
.....
function CharReplace(const Source: string; oldChar, newChar: Char): string;
var
  i: Integer;
begin
  Result := Source;
  for i := 1 to Length(Result) do
    if Result[i] = oldChar then
      Result[i] := newChar
.....
lpstrFilter  := PChar(CharReplace(Номер строки, '|', #0))
.....

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 15:41 20-08-2007 | Исправлено: Maks150988, 00:57 21-08-2007
skinash



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988
А посмотри как в VCL в модуле Dialogs сделали. Но там такОго наворочено, без стакана не разберёшься

Всего записей: 145 | Зарегистр. 21-09-2006 | Отправлено: 10:42 21-08-2007
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я видел примеры центрирования диалога. Там вычисляют разрешение экрана и делят какую-то пропорцию на 2. Врезультате диалог по центру. Но я не знаю как они там хэндл этого окна откуда берут. Примеры не полные. Обрубками все...
А в этих юнитах внатуре без бутылки не разберешься...

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 11:47 21-08-2007
GreatOne



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А есть альтернатива команды Sleep(); только чтобы прога не зависала на заданное время???

Всего записей: 85 | Зарегистр. 15-03-2007 | Отправлено: 12:10 21-08-2007
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
GreatOne
Если не трогать winapi, думаю, цикл с Application.ProcessMessages может подойти

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 12:21 21-08-2007
GreatOne



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

Цитата:
 
Если не трогать winapi, думаю, цикл с Application.ProcessMessages может подойти  

 
То есть если я напишу так:
 
For i:=1 to 2000 do Application.ProcessMessages;
 
то прога сделает паузу на 2 секунды??? Или все зависит от скорости железа?
 
И еще вопрос - если в процедуре я вызываю ее саму, то она выполниться до конца или прерветься и начнет выполняться с новыми параметрами??

Всего записей: 85 | Зарегистр. 15-03-2007 | Отправлено: 12:29 21-08-2007
skinash



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GreatOne
Нет, Application.ProcessMessages нужет чтобы программа не зависала от каких-нибудь длительных процедур:

Код:
for I:=0 to Count do
begin
  DoSomething(I);
  Application.ProcessMessages;
end;

Попробуй через таймер.

Всего записей: 145 | Зарегистр. 21-09-2006 | Отправлено: 13:11 21-08-2007
Arvur



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

Цитата:
все зависит от скорости железа

Именно так.
Простейший вариант:
 - взять переменную Start: TDateTime
 - записать в нее значение функции Now
 - запустить цикл, сравнивающий разницу (Now - Start) с необходимым периодом
 - в теле цикла -> ProcessMessages
Если нужна точность - используй функцию GetTickCount, остальной принцип тот же.  
 

Цитата:
И еще вопрос - если в процедуре я вызываю ее саму, то она выполниться до конца или прерветься и начнет выполняться с новыми параметрами??

Эээ.. Переключится на второй вызов, а потом продолжится.
А лучше погугли по слову "рекурсия"
 
Добавлено:
GreatOne
Примерно так:
 
procedure Delay(DelayPeriod : Cardinal);
var
  TimeStarted : Cardinal;
begin
  TimeStarted := GetTickCount;
  while ((GetTickCount - TimeStarted) < DelayPeriod) do  
    Application.ProcessMessages;
end;

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 13:11 21-08-2007
SERGE_BLIZNUK

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

Цитата:
То есть если я напишу так:  
for i:=1 to 2000 do Application.ProcessMessages;  
то прога сделает паузу на 2 секунды??? Или все зависит от скорости железа?  

да. Гарантированно менее 2 секунд.... (ну если только не win95 на pentium 133 ;-))
 
можно так:
Код:
 
var CountTicks : DWORD;
begin
  CountTicks := GetTickCount();
  repeat
    Application.ProcessMessages()
  until GetTickCount()>= (CountTicks+2000);
 

 
а чем Вам sleep() не угодил? он именно это и делает...
 
 
 
Добавлено:
я не успел. Arvur опередил... ;-))) причём готов ПКС

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 13:18 21-08-2007
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
SERGE_BLIZNUK
Хехе.. Я просто из старого кода куски повыдирал
ПКС=? (первый раз слышу)

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 13:35 21-08-2007
Glukodel



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, ни у кого случайно не завалялись исходники к книге: Род Стивенс "Delphi:Готовые алгоритмы"? С благодарностью приму в дар
 
Добавлено:
GreatOne

Цитата:
А есть альтернатива команды Sleep(); только чтобы прога не зависала на заданное время???

То что ты хочеш, реализуется через потоки (TThread в делфях) - какая-то операция запускается отдельным потоком, а приложение (интерфейс в том числе) продолжают реагировать на действия пользователя. Шикарная статья про твой вопрос, многопоточность и про устройство винды: http://www.dtf.ru/articles/read.php?id=39888

Всего записей: 97 | Зарегистр. 16-08-2004 | Отправлено: 13:38 21-08-2007
GreatOne



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

Цитата:
Нет, Application.ProcessMessages нужет чтобы программа не зависала от каких-нибудь длительных процедур:  

 
То есть если я напишу:
 
Sleep(60000);
Application.ProcessMessages;
 
То прога не зависнет

Всего записей: 85 | Зарегистр. 15-03-2007 | Отправлено: 13:54 21-08-2007
Arvur



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

Цитата:
Шикарная статья про твой вопрос

Сам-то читал? В прикладных задачах вся эта красота с архитектурами процессоров и распараллеливанием алгоритмов - как рыбке зонтик

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 14:20 21-08-2007
Glukodel



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

Цитата:
То есть если я напишу:
 
Sleep(60000);
Application.ProcessMessages;
 
То прога не зависнет

нет, тока потупит минуту
 
Добавлено:
Arvur

Цитата:
Сам-то читал?

не только читал, но и плотно работал с потоками...

Цитата:
В прикладных задачах вся эта красота с архитектурами процессоров и распараллеливанием алгоритмов - как рыбке зонтик  

Эх, молодежжж это пока не попадется задача, где будут операции длительностью в минуты, часы, дни... (не поверишь, такие бывают ) ну и работа с сетью у всех нормальных людей на потоках (стандартный делфевый Indy весь на потоках).
 

Всего записей: 97 | Зарегистр. 16-08-2004 | Отправлено: 14:26 21-08-2007
GreatOne



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

Всего записей: 85 | Зарегистр. 15-03-2007 | Отправлено: 14:39 21-08-2007
Arvur



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

Цитата:
Эх, молодежжж  это пока не попадется задача, где будут операции длительностью в минуты, часы, дни... (не поверишь, такие бывают  ) ну и работа с сетью у всех нормальных людей на потоках (стандартный делфевый Indy весь на потоках).  

Да я все больше утилитки на коленке пописываю
Может быть уважаемый гуру продемонстрирует, где в перечисленных задачах могут быть использованы рекомендации из данной статьи?
 
.. Абстрактную агитацию в пользу потоков не предлагать - я сам так умею
 
Добавлено:
Нет блин.. Сорри за офтоп, но спасибо огромнейшее за позитифф
Представил себе распаралелливание сетевых операций на разные процы с учетом их архитектуры.. И "ржунимагу" (с)

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 15:07 21-08-2007
Glukodel



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

Цитата:
где в перечисленных задачах могут быть использованы рекомендации из данной статьи?  

Какие мы прямые Объясняю - судя по вопросу GreatOne ему нужно было что бы интерфес реагировал на пользователя во время какой-то операции... для этого есть Application.ProcessMessages, но для того, что бы точно понимать, как это работает, нужно знать механизмы работы винды... а в более сложных случаях кроме Application.ProcessMessages будут нужны потоки... как раз эти механизмы описаны в статье...

Всего записей: 97 | Зарегистр. 16-08-2004 | Отправлено: 15:25 21-08-2007
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arvur
ппкс
Подпишусь Под Каждым Словом.

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 15:28 21-08-2007
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Glukodel
В статье описаны особенности распределения процессорного времени между задачами в ОС Windows.
Подсовывать такое человеку в качестве вводной в потоки - это издевательство.
 
Тем более, что в 90% случаев ему это и не понадобится..  
(Для пишущих игры да и просто интересующихся системами реального времени эта статья тоже не нужна - и так знают)
 
Имхо - внимательнее читай вопросы, человек в рекурсии путается, а тут ты с affinity mask
 
SERGE_BLIZNUK
О как... Пасибки, запомню

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 15:34 21-08-2007
Glukodel



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

Цитата:
Подсовывать такое человеку в качестве вводной в потоки - это издевательство

почти согласен НО в жизни не видел более корректного описания происходящего... из 10 известных мне делфи программеров только 3 (считая меня ) могут успешно использовать потоки, и то без этой статьи кое-что выпадало из поля зрения...  

Цитата:
Имхо - внимательнее читай вопросы,

Человеку ответ был дан, а статью добавил в продолжение для повышения образованности, если кому будет интересно...
 
P.S. предлогаю завязать с флеймом...
P.P.S. начну с себя

Всего записей: 97 | Зарегистр. 16-08-2004 | Отправлено: 16:19 21-08-2007
   

Страницы: 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 (все версии) - часть 3
ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru