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

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


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

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

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

Выпуск № 280
от 30.10.2005, 17:03

Администратор:Калашников О.А.
В рассылке:Подписчиков: 256, Экспертов: 45
В номере:Вопросов: 4, Ответов: 18


Вопрос № 28238: Здравствуйте. Попробовал паузу sleep - не подошло. Я хочу, чтобы progressbar постепенно заполнился за определенное время. попробовал следующим образом: for i:=0 to 99 do begin sleep (20); ProgressBar1.StepIt; end; Про...
Вопрос № 28245: Здравствуйте, ув. экспреты ! Делаю программу, которая разбивает пока простые предложения по словам. Но каким-то образом вместо некоторых букв в словах и даже целых слов выводятся иероглифы. Где моя недоработка ??? Текстовый файл с...
Вопрос № 28270: Здравствуйте, эксперты! Подскажите, как менять размеры frame1.image1 во время работы программы. У меня при изменении не прорисовывается часть изображения. ...
Вопрос № 28285: Здравствуйте уважаемые эксперты. Я хотел бы узнать как можно сохранить в памяти кусок canvas формы, чтобы потом опять отрисовывать этот кусок на форме (редактор я пишу. векторный так сказать :)....

Вопрос № 28.238
Здравствуйте.
Попробовал паузу sleep - не подошло. Я хочу, чтобы progressbar постепенно заполнился за определенное время. попробовал следующим образом:
for i:=0 to 99 do
begin
sleep (20);
ProgressBar1.StepIt;
end;
Просто тормоз. Форма появляется с 2-х секундной задержкой с заполненным progressbar. как можно это сделать иначе?
Спасибо за помощь.
Отправлен: 24.10.2005, 18:22
Вопрос задал: Lichkaty Alexander (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denis Hakimov
Здравствуйте, Lichkaty Alexander!
простейший вариант - создайте на форме таймер и в обработчике события таймера OnTimer увеличивайте значение свойства ProgressBar'a - Position;
т.е. примерно следующее должно получится:

procedure TForm1.Timer1Timer(Sender: TObject);
var s: String;//создаем строковую переменную
tm: TTime;//создаем переменную для даты
begin
tm:=GetTime;//получаем время
s:=copy(TimeToStr(tm),7,2);//копируем секунды из tm
ProgressBar1.Position:=StrToInt(s);//{преобразуем их к целому и присваиваем прогрессбару}
end;

вышеприведенный код будет зависеть от текущего времени. У прогрессбара нужно выставить максимальное значение равным 60.(ProgressBar1.Max:=60);
Удачи!
Ответ отправил: Denis Hakimov (статус: 4-ый класс)
Отправлен: 24.10.2005, 19:14
Оценка за ответ: 5

Отвечает: Ерёмин Андрей
Здравствуйте, Lichkaty Alexander!
Оп-па. Я ответил на предыдущий вопрос, не прочитав этого... Отвечаю вдогонку: в цикле делайте Application.ProcessMessages. В этом случае всё будет отлично.
---------
Бог создал мир за семь дней и до сих пор система работает, не требуя перезагрузки, потому что у него не было необходимости поддерживать совместимость с предыдущими версиями...
Ответ отправил: Ерёмин Андрей (статус: Специалист)
Отправлен: 24.10.2005, 19:18

Отвечает: sir henry
Здравствуйте, Lichkaty Alexander!
К сожалению, не совсем понятна задача. Так-же непонятно, где конкретно размещен Ваш код, который Вы привели. Возможно в Form.Create? Тогда понятно, почему у Вас форма появляется с уже заполненым прогресбаром после 2-х секундной задержки. 100 х 20 = 2000 - как раз две секунды. Форма появляется после того, как отработает метод Create. :)
Если Вы разъясните более подробно, что Вы хотите сделать, то возможно удасться посоветовать что-то конкретное. :)

Приложение:

Ответ отправил: sir henry (статус: Профессор)
Отправлен: 24.10.2005, 19:19

Отвечает: Маренич Владимир
Здравствуйте, Lichkaty Alexander!
Вствьте после
ProgressBar1.StepIt;
Application.ProcessMessages;
//выполняется обработка всех накопившихся сообщений

или по крайней мере
ProgressBar1.Update;
//обработка событий прорисовки
Ответ отправил: Маренич Владимир (статус: 3-ий класс)
Отправлен: 24.10.2005, 22:47

Отвечает: Schmak
Здравствуйте, Lichkaty Alexander!
Для этих целей лучше использовать таймер:
Киньте на форму таймер, в свойство Interval введите время, через которое ProgressBar будет обновляться, а в Ontimer пропишите

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ProgressBar1.StepIt;
if progressbar1.position>=100 then timer1.Enabled:=false;//Проверка на заполнение
end;

Ответ отправил: Schmak (статус: 4-ый класс)
Отправлен: 25.10.2005, 06:03

Отвечает: Ballon
Здравствуйте, Lichkaty Alexander!

Поставте на таймер.
---------
Хочу все знать...
Ответ отправил: Ballon (статус: 6-ой класс)
Отправлен: 26.10.2005, 06:31


Вопрос № 28.245
Здравствуйте, ув. экспреты !
Делаю программу, которая разбивает пока простые
предложения по словам. Но каким-то образом
вместо некоторых букв в словах и даже целых слов
выводятся иероглифы. Где моя недоработка ???
Текстовый файл создается обычным Блокнотом !!!
Заранее большое спасибо.

Приложение:

Отправлен: 24.10.2005, 20:20
Вопрос задал: Гусев Сергей (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denis Hakimov
Здравствуйте, Гусев Сергей!

Ошибка достаточно проста, Вы не обнуляете переменную I. В итоге у вас с каждой новой строкой счетчик символов в строке растет.

Var Str1, Str2 : String;
I, J : Byte;
begin
Str2:='';
Str1:='';
I:=0;
J:=0;

Memo2.Lines.LoadFromFile('File.txt');
Repeat
Str1:=Memo2.Lines[J];
Repeat
Inc(I);
If (Str1[I] <> ' ') Then Str2:=Str2 + Str1[I]
Else
Begin
Memo1.Lines.Add(Str2);
Str2:='';
End;
Until I = Length(Str1);

{это добавленный код}

i:=0;//обнуляем счетчик символов
Memo1.Lines.Add(Str2); //добавляем имеющуюся строку к мемо1
Str2:='';

{/это добавленный код}

Inc(J);
Until J >= Memo2.Lines.Count;
end;

Вроде все должно работать :). Удачи!
Ответ отправил: Denis Hakimov (статус: 4-ый класс)
Отправлен: 24.10.2005, 21:56

Отвечает: Маренич Владимир
Здравствуйте, Гусев Сергей!
Возможно в Memo1.Font.CharSet нужно указать RUSSIAN_CHARSET
Ответ отправил: Маренич Владимир (статус: 3-ий класс)
Отправлен: 24.10.2005, 22:50

Отвечает: Schmak
Здравствуйте, Гусев Сергей!
Вы не обнуляли переменную i в конце каждой строки.

Вот немного переработанная процедура, но хочу посоветовать Вам читать из файл не при помощи Memo, а при помощи стандартного Read.

И кстати эта программа не учитывает знаки препинания, лучше всего искать не пробелы. а проверять является данный символ буквой слова или знаком препинания (пробелом).

Приложение:

Ответ отправил: Schmak (статус: 4-ый класс)
Отправлен: 25.10.2005, 06:03

Отвечает: sir henry
Здравствуйте, Гусев Сергей!
Сразу вопрос - а зачем Вы применяете Repeat, ведь это цикл с неопределенным количеством повторений, а у Вас количество повторений заданы жестко - Memo2.Lines.Count.
Тоже самое и с чтением строки, там количество повторений жестко задано - Length(Str1).
Иероглифы у Вас случайно не самыми последними словами выводятся? Посмотрите, если строки в Мемо начинаются с нуля, то заканчиваются они числом Memo2.Lines.Count - 1, а у Вас условие окончания >=Memo2.Lines.Count.
Скажите, может такое случиться, что строк у Вас окажеться больше чем 255 (размер Byte)? Точно неизвестно, но лучше подстраховаться и заменить типы переменных I и J на Integer.
Цикл Repeat может давать один неприятный эффект. Если файл начинается со строки нулевой длины, т.е. перевод строки, там даже пробела не будет, то Вы до полусмерти перепугаете свою программу настойчивым желанием прочитать эту строку, а при Repeat как раз так и будет, потому что у него условие окончания цикла проверяется ПОСЛЕ чтения, а не ДО, как надо бы по логике дела. :)
С учетом вышеизложенного переделаный код смотрите в примложении.

Приложение:

Ответ отправил: sir henry (статус: Профессор)
Отправлен: 25.10.2005, 06:41

Отвечает: Werewolf
Здравствуйте, Гусев Сергей!
Можно сделать все гараздо проще:
procedure TForm1.Button1Click(Sender: TObject);
var st:TStrings;
i:byte;
begin
st:=TStringList.Create;
try
st.LoadFromFile('c:sometext.txt');
for i:=1 to 10 do
st.text:=StringReplace(st.Text,' ',' ',[rfReplaceAll]);
st.text:=StringReplace(st.Text,' ',#13#10,[rfReplaceAll]);
for i:=1 to 10 do
st.text:=StringReplace(st.Text,#13#10#13#10,#13#10,[rfReplaceAll]);
if st[0]='' then st.Delete(0);
if st[st.Count-1]='' then st.Delete(st.Count-1);
Memo1.Lines.Assign(st);
finally
st.Free;
end;
end;
Ответ отправил: Werewolf (статус: Студент)
Отправлен: 25.10.2005, 09:35

Отвечает: Romodos
Здравствуйте, Гусев Сергей!
Всё довольно банально.
Вы не обнуляете счётчик i
После строки str1:=memo2.lines[j];
и до строки repeat
надо написать i:=0;

---------
FAQ me off!
Ответ отправил: Romodos (статус: Студент)
Отправлен: 25.10.2005, 13:24


Вопрос № 28.270
Здравствуйте, эксперты!
Подскажите, как менять размеры frame1.image1 во время работы программы. У меня при изменении не прорисовывается часть изображения.
Отправлен: 25.10.2005, 11:42
Вопрос задал: Ramil (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Werewolf
Здравствуйте, Ramil!
Form1.frame11.Image1.Width:= Form1.frame11.Image1.Width+20;
Form1.frame11.Image1.height:= Form1.frame11.Image1.height+20;
где frame11 - объект типа TFrame1 на вашей форме Form1 ('Form1.' можно опустить)
если рисунок не отображается целиком, а появляются полосы прокрутки поставть свойство фрейма AutoSize в true
Ответ отправил: Werewolf (статус: Студент)
Отправлен: 25.10.2005, 12:10

Отвечает: Ерёмин Андрей
Здравствуйте, Ramil!

Frame1.Image1.AutoSize:=False;
Frame1.Image1.Proportional:=True;
Frame1.Image1.Stretch:=False;
Frame1.Image1.Width:=640; //ширина
Frame1.Image1.Height:=480; //Высота
---------
Бог создал мир за семь дней и до сих пор система работает, не требуя перезагрузки, потому что у него не было необходимости поддерживать совместимость с предыдущими версиями...
Ответ отправил: Ерёмин Андрей (статус: Специалист)
Отправлен: 25.10.2005, 14:13


Вопрос № 28.285
Здравствуйте уважаемые эксперты.
Я хотел бы узнать как можно сохранить в памяти кусок canvas формы, чтобы потом опять отрисовывать этот кусок на форме (редактор я пишу. векторный так сказать :).

Приложение:

Отправлен: 25.10.2005, 16:32
Вопрос задал: Rev01ver (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Jadd
Здравствуйте, Rev01ver!
Брррр. А типа в массиве запомнить объекты? Или вам нужно произвольный кусок с обрезанием? Тогда проще на битмапе нарисовать....Не совсем все ясно с вопросом.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 25.10.2005, 16:41

Отвечает: sir henry
Здравствуйте, Rev01ver!
Создайте объект типа TBitMap и, с помощью CopyRect(), вставляйте кусок из Canvas'а. Потом можно обратно CopyRect'ом вставить из BitMap'а в Canvas.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 25.10.2005, 16:59

Отвечает: Werewolf
Здравствуйте, Rev01ver!
Объяви битмап и работай с ним.

Приложение:

Ответ отправил: Werewolf (статус: Студент)
Отправлен: 25.10.2005, 17:03
Оценка за ответ: 5
Комментарий оценки:
Спасиба!!!!!!!!!!!!

Отвечает: Schmak
Здравствуйте, Rev01ver!
Создайте TBitmap и при помощи bitmap1.canvas.CopyRect() копируйте в него нужный кусок канвы, потом же при помощи CopyRect() нужного вам image вставляйте обратно;
PS copyrect(dest,canvas,source);
dest:Trect В какой участок копируем
Canvas:TCanvas Из какой канвы копируем
Source:Trect Какой участок канвы копируем

Ответ отправил: Schmak (статус: 4-ый класс)
Отправлен: 26.10.2005, 05:41


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

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

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

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

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


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


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

Rambler's Top100 Яндекс


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

В избранное