Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 233
от 09.09.2005, 21:00

Администратор:Калашников О.А.
В рассылке:Подписчиков: 239, Экспертов: 51
В номере:Вопросов: 6, Ответов: 25


Вопрос № 25776: Помогите плиз. Использую юнит из приложения для поиска файлов по маске и диску. Область поиска целый диск. Происходит торомжение системы. Хотелось бы код с подобным принципом работы. Буду признателен за любую помощь....
Вопрос № 25777: У меня есть gif анимация человечка.И я её должен использовать в программе,но когда я включаю эту анимацию,то остаётся след от прошлого кадра.я использую компонент RxGifAnimator...
Вопрос № 25812: Как мне сделать так чтобы моя форма показавалась только 25.09.2005 начиная с 10 утра и с периодом в 1 час?...
Вопрос № 25824: Подскажите, как правильно оформить процедуру при создании в ней программно массива MapTail: array of array of TImage. В ней также встречаются такие объекты как Панель, Кнопки и дт. из-за этого я упамянул Form1: TForm1. Компилятор ругается насчет слов...
Вопрос № 25828: Почему не работает FindComponent из другой формы ? TEdit(FindComponent(Form1.Irc_PageControl.ActivePage.Name+'_Edit')).Text:=TEdit(FindComponent(Form1.Irc_PageControl.ActivePage.Name+'_Edit')).Text+'0'; // Это команда не работает :(...
Вопрос № 25829: Как сделать, чтобы при показе Form2 фокус сразу переходил на Form1 ...

Вопрос № 25.776
Помогите плиз. Использую юнит из приложения для поиска файлов по маске и диску. Область поиска целый диск. Происходит торомжение системы. Хотелось бы код с подобным принципом работы. Буду признателен за любую помощь.

Приложение:

Отправлен: 03.09.2005, 21:03
Вопрос задал: CJ (статус: Студент)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: John Freeman
Здравствуйте, CJ!
Всё у тебя правильно, только ЗАЧЕМ ты всё это выводишь в лист , да ещё в процессе?!?!?! В этом и дело.
Выполни этот же код без визуализации - поймёшь
а так делай 2 вещи с визуализацией:
1) не используй списки с добавлением по одному, при большом количестве они ОЧЕНЬ тормозят везде
2) добавляй всё когда поиск уже закончен если возможно
---------
Ik bin ulien spiegel!
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 03.09.2005, 21:19
Оценка за ответ: 5
Комментарий оценки:
Тоесть сначала например в TStringList, а птом уже в лист? Ответь просто мылом, плиз.

Отвечает: sir henry
Здравствуйте, CJ!
Попробуйте задать поиск файлов в отдельном потоке.
Если Вы запускали виндовый поиск, то могли заметить, что там поиск по всем дискам тоже идет не очень быстро. :)
Про организацию потока можно почитать здесь:
delphiworld.narod.ru
www.delphimaster.ru
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 04.09.2005, 04:51


Вопрос № 25.777
У меня есть gif анимация человечка.И я её должен использовать в программе,но когда я включаю эту анимацию,то остаётся след от прошлого кадра.я использую компонент RxGifAnimator
Отправлен: 03.09.2005, 21:09
Вопрос задал: Sassoft (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Romodos
Здравствуйте, Sassoft!
Возможно, надо запускать RePaint или Clear после каждого кадра, если есть такая возможность в компоненте, у меня лично его нет, можно попробовать
Application.ProcessMessages
---------
FAQ me off!
Ответ отправил: Romodos (статус: 5-ый класс)
Отправлен: 04.09.2005, 09:55

Отвечает: Силантьев Евгений Александрович
Здравствуйте, Sassoft!
Я не уверен, но похоже что у Вас свойство Transparent стоит в значение True (по-умолчанию) попробуйте поставить его в значение False возможно это поможет. Это свойство определяет, будет ли изображение GIF рисоваться прозрачным, используя свойство TransparentColor класса TGIFImage; или же будет использован фоновый цвет, указанный в изображении формата GIF.
---------
The world is mine! :)
Ответ отправил: Силантьев Евгений Александрович (статус: 5-ый класс)
Отправлен: 04.09.2005, 13:21

Отвечает: Anefedov
Здравствуйте, Sassoft!
Типичная проблема, когда изображение содержит прозрачные места :-)

Нужно перед тем как отобразить gif, закрасить все белым (или другим подходящим) цветом.

Желаю удачи :-)
Ответ отправил: Anefedov (статус: 3-ий класс)
Отправлен: 04.09.2005, 15:56


Вопрос № 25.812
Как мне сделать так чтобы моя форма показавалась только 25.09.2005 начиная с 10 утра и с периодом в 1 час?
Отправлен: 04.09.2005, 12:54
Вопрос задал: Малярчук Андрей (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: CJ
Здравствуйте, Малярчук Андрей!
Используй функции GetTime и GetDate. И условный оператор if then else. Если нужно подробное описание, пиши.
Ответ отправил: CJ (статус: Студент)
Отправлен: 04.09.2005, 13:55

Отвечает: mvp
Здравствуйте, Малярчук Андрей!
Не совсем понятно, что имеется ввиду под периодом в 1 час. Ниже приведено приложение, которое сразу после запуска прячет форму (использован для этого таймер, т. к. в событии onshow или oncreate формы этого сделать нельзя). Потом работает таймер раз в минуту. Если мы попали на требуемую дату и время, то показывается форма (там вы что-то делаете). Следующее срабатывание таймера через час и если всё-ещё требуемая дата, то снова покажется форма.
(Можно ещё оптимизировать с таймером: вычислить время, оставшееся до требуемого часа и записать это в интервал, чтобы таймер каждую минуту не срабатывал. Если разница не помещается, то ставим максимальное значение для таймера, а при его срабатывании опять корректируем. Но я не стал заморачиваться).

Приложение:

---------
Моя совесть чиста - не бывшая в употреблении

Ответ отправил: mvp (статус: 4-ый класс)
Отправлен: 04.09.2005, 14:25

Отвечает: Denisss
Здравствуйте, Малярчук Андрей!
Делаем так (приблизительно), как указано в приложении

Удачи!

Приложение:

Ответ отправил: Denisss (статус: Студент)
Отправлен: 04.09.2005, 14:53

Отвечает: Jadd
Здравствуйте, Малярчук Андрей!
Оч просто. В dpr файле после строки
begin
Application.Initialize;
пишешь условие
if DateToStr(Date) = '25.09.2005' then
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
Application.Terminate;

А дальше, после старта формы, инициализируешь таймер, который раз в час делает форме шоу :). Т.е. показывает форму через Form1.Show или Form1.ShowModal, что будет от тебя зависеть.

---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 04.09.2005, 15:54

Отвечает: Anefedov
Здравствуйте, Малярчук Андрей!
Используйте таймер (на закладке System). Реализуйте событие OnTimer. Когда наступит время ч, покажите форму.
Ответ отправил: Anefedov (статус: 3-ий класс)
Отправлен: 04.09.2005, 15:55

Отвечает: sir henry
Здравствуйте, Малярчук Андрей!
Есть два пути решения этой задачи:
1. Ваша программа запущена постоянно, однако форма невидна и показывается только тогда, когда Вы написали.
2. В указаное время дату запускается именно программа.
Первое решение.
Вы размещаете на форме таймер, задаете ему период в 1 час. Этот таймер будет руководить показом формы. В событие OnTimer помещаете Form1.Show.
Второй таймер будет периодически проверять дату и время запуска. Если дата совпала с нужной, то запустит первый таймер.
Третий таймер будет отсчитывать время, когда нужно будет прятать форму Form1.Hide. Запускается первым таймером.
Если нужно делать что-то еще, то сообщите дополнительную инфу, а то так не совсем понятно.
Второе решение.
Закинте Вашу программу в "Назначеные задания". Задайте дату и времязапуска, и укажите период в 1 час. Там же можно указать макс время выполнения, по истечении которого прога выгружается из памяти.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 04.09.2005, 19:32


Вопрос № 25.824
Подскажите, как правильно оформить процедуру при создании в ней программно массива MapTail: array of array of TImage. В ней также встречаются такие объекты как Панель, Кнопки и дт. из-за этого я упамянул Form1: TForm1. Компилятор ругается насчет слова Self. Вот сама процедура:

Procedure GeneraciyaMAP (Form1: TForm1);
Begin
. . . . .
MapTail[csh_i,csh_j]:= TImage.Create(Self);
. . . . . //Всё остальное, где нет ошибок!

end;
Отправлен: 04.09.2005, 16:28
Вопрос задал: Puld (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Samum
Здравствуйте, Puld!
Напишите вместо TImage.Create(Self);
TImage.Create(Form1);
Т.к. ваша процедура не является методом класса TForm1, то и Self в ней никакой не определен.
---------
Если бы программистам за их ошибки отрывали части тела, то в конце концов им пришлось бы использовать голову!
Ответ отправил: Samum (статус: Специалист)
Отправлен: 04.09.2005, 16:38

Отвечает: Delphin
Здравствуйте, Puld!
Self - Это дескриптор на форму. А ты делаеш это в не формы.
Можеш попробовать nil или Form1...

---------
Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 9-ый класс)
Отправлен: 04.09.2005, 18:51

Отвечает: sir henry
Здравствуйте, Puld!
А само ругательство Вы не хотите обнародовать? :)
Я полагаю, что ругается он оттого, что Ваша процедура не является методом объекта. Self - это синоним текущего объекта. Думаю, компилятор просто теряется в догадках, какой объект считать текущим. :)
Попробуйте вместо Self, указать полное имя объекта-хозяна Вашего TImage (например Form1).
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 04.09.2005, 20:05

Отвечает: Силантьев Евгений Александрович
Здравствуйте, Puld!
Вместо Self укажите Form1. Должно сработать.
---------
The world is mine! :)
Ответ отправил: Силантьев Евгений Александрович (статус: 5-ый класс)
Отправлен: 04.09.2005, 20:55

Отвечает: Козлов Николай Николаевич
Здравствуйте, Puld!
У тебя метод глобальный.
Попробуй вместо self напиши form1.
Ответ отправил: Козлов Николай Николаевич (статус: 1-ый класс)
Отправлен: 04.09.2005, 22:44


Вопрос № 25.828
Почему не работает FindComponent из другой формы ?

TEdit(FindComponent(Form1.Irc_PageControl.ActivePage.Name+'_Edit')).Text:=TEdit(FindComponent(Form1.Irc_PageControl.ActivePage.Name+'_Edit')).Text+'0'; // Это команда не работает :(
Отправлен: 04.09.2005, 18:05
Вопрос задал: source (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: John Freeman
Здравствуйте, source!
:):):) учи модель объектов!
Tform.FindComponent полный вызов, а просто FindComponent вызывается у текущей формы.
---------
Ik bin ulien spiegel!
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 04.09.2005, 19:17
Оценка за ответ: 4
Комментарий оценки:
не помогло
Уже стока вариантов перепробовал - пофиг
теперь еще и ругается :(
This form of method call only allowed for class methods
TFlatEdit(TForm.FindComponent(Form1.Irc_PageControl.ActivePage.Name+'_FlatEdit')).Text:='';

Отвечает: Ерёмин Андрей
Добрый вечер, source!
Ну здесь по идее всё правильно. Значит проблема в другом. Проверьте, что получается в параметре функции FindComponent(). Возможно, там какая-то ошибка в строке или какой-то символ забыли. Другой вариант - попробуйте сделать тоже самое, но из формы Form1. А вообще, я с такой проблемой кажется встречался. Попробуйте не обращаться к компонентам формы Form1, а установить с формой связь. Возможно, вот так будет работать:

With Form1 Do
TEdit(FindComponent(Irc_PageControl.ActivePage.Name+'_Edit')).Text:=TEdit(FindComponent(Irc_PageControl.ActivePage.Name+'_Edit')).Text+'0';

---------
Мышка побежала, xвостиком махнула - cервер упал...
Ответ отправил: Ерёмин Андрей (статус: Практикант)
Отправлен: 04.09.2005, 19:56
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое - ваш вариант подошел

Отвечает: sir henry
Здравствуйте, source!
Наверное потому, что Вы в строке USES забыли указать эту самую форму, где должен происходить поиск. :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 04.09.2005, 20:08
Оценка за ответ: 3
Комментарий оценки:
Да все я вписал

Отвечает: Силантьев Евгений Александрович
Здравствуйте, source!
Просто надо указывать форму, на которой ты производишь поиск! Т.е. надо писать так:
TEdit(ИмяФормы.FindComponent(Form1.Irc_PageControl.ActivePage.Name+'_Edit')).Text:=TEdit(ИмяФормы.FindComponent(Form1.Irc_PageControl.ActivePage.Name+'_Edit')).Text+'0';
---------
The world is mine! :)
Ответ отправил: Силантьев Евгений Александрович (статус: 5-ый класс)
Отправлен: 04.09.2005, 20:49

Отвечает: Rusland
Здравствуйте, source!
Если у вас "другая" форма имеет имя Form1, а форма на которой вы собираетесь найти компонент называется Form2, то в коде нужно будет исправить FindComponent на Form2.FindComponent
Удачи.
---------
Тише едешь, дальше будешь... от того места куда едешь
Ответ отправил: Rusland (статус: Студент)
Отправлен: 05.09.2005, 10:15


Вопрос № 25.829
Как сделать, чтобы при показе Form2 фокус сразу переходил на Form1
Отправлен: 04.09.2005, 18:09
Вопрос задал: source (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: mvp
Здравствуйте, source!
С помощью таймера, например, как в приложении (только таймер не обязательно создавать каждый раз при показе формы, а можно его создать лишь раз при её создании, а потом только включать при показе, а при срабатывании выключать).

Приложение:

---------
Моя совесть чиста - не бывшая в употреблении

Ответ отправил: mvp (статус: 4-ый класс)
Отправлен: 04.09.2005, 19:19
Оценка за ответ: 4
Комментарий оценки:
Спасибо за SetFocus - я без таймера обошолся

// Передаем форус на главную форму
procedure TIrcColorForm.FormPaint(Sender: TObject);
begin
Form1.SetFocus;
end;

Отвечает: Ерёмин Андрей
Добрый вечер, source!
Я добился требуемого результата просто экспериментируя, и вот готов предоставить решение :) Вот код, который показывает Form2, но возвращает фокус форме Form1 и Form1 становится активным окном:

Form2.Visible:=True;
Form1.SetFocus;


При использовании метода Show для Form2 уже не получится. Удачи!
---------
Мышка побежала, xвостиком махнула - cервер упал...
Ответ отправил: Ерёмин Андрей (статус: Практикант)
Отправлен: 04.09.2005, 19:56

Отвечает: sir henry
Здравствуйте, source!
В событии OnShow формы Form2 указать:
Form1.SetFocus;
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 04.09.2005, 20:13
Оценка за ответ: 3
Комментарий оценки:
В onShow не сработает - только в onPoint

Отвечает: Rusland
Здравствуйте, source!
Есть вариант такой - на onactive поставить
SetForegroundWindow(Form1.Handle);
---------
Тише едешь, дальше будешь... от того места куда едешь
Ответ отправил: Rusland (статус: Студент)
Отправлен: 05.09.2005, 10:18


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное