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

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


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

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

Выпуск № 503
от 15.06.2006, 08:05

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


Вопрос № 45704: Здравствуйте уважаемые эксперты. В моей проге происходит много передвижений окон и панелей (выезжают, заезжают, растягиваются... и все через таймер). На моем компьютере они движутся плавно, а на других рывками и медленнее, хотя тех. характеристики у ...
Вопрос № 45733: Здравствуйте уважаемые эксперты. Ситуация такая: написана небольшая прога печати накладных. Реализована через ADO и Fast Report 3.0 т.е. инфа содержиться в 2 базах *.DBF и только потом тянется в Report. Количество копий в свойствах Fr...
Вопрос № 45779: Здравствуйте, уважаемые эксперты. procedure ... (...); var i:integer; begin ... for i:=0 to 7 do begin ... end; ... end; Когда прохожу эту процедуру троссировкой, то переменная i принимает значения...
Вопрос № 45780: Подскажите как можно менять цвет части текста (например одна часть зелёная другая красная) в компоненте ListBox или подскажите аналогичный компонент в котором это можно делать. Зарание благодарен...

Вопрос № 45.704
Здравствуйте уважаемые эксперты. В моей проге происходит много передвижений окон и панелей (выезжают, заезжают, растягиваются... и все через таймер). На моем компьютере они движутся плавно, а на других рывками и медленнее, хотя тех. характеристики у них выше и ОС та же. Почему так? Что тут можно сделать? Заранее спасибо.
Отправлен: 09.06.2006, 08:44
Вопрос задал: Виталий Зелинский (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Маренич Владимир
Здравствуйте, Виталий Зелинский!
По таймеру - это не очень красиво... Вот и работает так.
Дело в том, что по таймеру возникает с соотв. переодичностью системное сообщение приложению, которое вставляется в очередь на обработку приложением. OnTimer в классе TTimer вызывается как раз при обработке таких сообщений. Нет никакой гарантии того, что такое сообщение будет обрабатываться скажем каждых 10 мс. Для Ваших целей я бы рекомендовал использовать отдельный поток (thread), используя класс TThread, который умеет "правильно" работать с VCL. Как работать с TThread - это отдельная тема и в рамках ответа на вопрос не может быть освещена. Попробуйте для начала почитать об этом в HELPе Delphi. Переделать будет не трудно, а эффект будет очень наглядным. Желаю удачи.
Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 09.06.2006, 12:56
Оценка за ответ: 4
Комментарий оценки:
Будем учиться работать с TThread. Большое спасибо за совет.

Отвечает: Полховский Александр Владимирович
Здравствуйте, Виталий Зелинский!
Вот примерчик к предыдущему ответу (может не очень красивый, но основу уловите): (2 кнопки, клацать на вторую)

unit Unit20;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TThread1 = class(TThread)
procedure Execute; override;
procedure UpDate;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Thread1: TThread1;
Step:integer;

implementation

{$R *.dfm}

procedure TThread1.Execute;
var
k1:integer;
begin
for k1:=1 to 100 do
begin
Step:=k1;
Sleep(10);
Thread1.Synchronize(UpDate);
end;
Thread1.Terminate;
end;

procedure TThread1.UpDate;
begin
Form1.Button1.Width:=(Step*Step)div(20)+1;
form1.Caption:=inttostr(step);
form1.Button1.Repaint;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Thread1:=TThread1.Create(false);
Thread1.FreeOnTerminate:=true;
end;

end.
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Практикант)
Ответ отправлен: 10.06.2006, 00:07
Оценка за ответ: 5
Комментарий оценки:
По примерам учиться легче. Большое спасибо за ответ!


Вопрос № 45.733
Здравствуйте уважаемые эксперты.
Ситуация такая: написана небольшая прога печати накладных.
Реализована через ADO и Fast Report 3.0
т.е. инфа содержиться в 2 базах *.DBF и только потом тянется в Report.
Количество копий в свойствах FrxReport забито по умолчанию 5.....
но печатается реально - только 1.
Не могу понять в чем причина, подскажите плиз.
И еще, возможно ли сразу поставить курсор на количество копий
при нажатии на кнопку Print???
Заранее благодарен.

Отправлен: 09.06.2006, 12:15
Вопрос задал: Дмитрий Николаевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Shcherbakov Anton
Здравствуйте, Дмитрий Николаевич!
проверьте в расположены ли элементы которые вы печатаете на MasterBand. возможно поэтому и печатает ваша программа только одну запись.
Ответ отправил: Shcherbakov Anton (статус: 2-ой класс)
Ответ отправлен: 09.06.2006, 13:12


Вопрос № 45.779
Здравствуйте, уважаемые эксперты.

procedure ... (...);
var i:integer;
begin
...
for i:=0 to 7 do
begin
...
end;
...
end;
Когда прохожу эту процедуру троссировкой, то переменная i принимает значения от 8 к 1!!!! поскольку внутри цикла идет обращение к массиву размерностью [0..7] программа перестает выполняться с критической ошибкой, потому что элемента с индексом 8 нет.
глобальной переменной i нет, она только локальная.
Я вообще не понимаю, каким образом подобное может происходить.
В чем может быть проблема?
Спасибо за ответы.

Отправлен: 09.06.2006, 22:29
Вопрос задал: Lichkaty Alexander (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 10)

Отвечает: Jadd
Здравствуйте, Lichkaty Alexander!
Не совсем понятно что надо. Судя по коду, Вы создали массив из 8 элементов. Все массивы (все без исключения) 0-based, что означает, что первый элемент находится под индексом 0(!!!!!), а не 1. Если принципиально, чтобы возможно было взять элемент под индексом 8, тогда надо создавать массив размерностью 9 (!!!!!) элементов. Т.е. создаем массив N элементов, а последний элемент массива будет с индексом N-1. Все понятно?

Успехов.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал)
Адрес: Санкт-Петербург
WWW: http://www.sport-diary.ru
ICQ: 28260749
----
Ответ отправлен: 09.06.2006, 22:37

Отвечает: Решетник Д
Здравствуйте, Lichkaty Alexander!
У меня такая ситуация была. к сожелению причины я не узнал. в моем случае ЭТО исчезло после перезагрузки системы.
Если ничего не выйдет, прибегните к крайнему способу - используйте индекс i-1 )))
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 8-ой класс)
Ответ отправлен: 09.06.2006, 22:41

Отвечает: Zubex
Здравствуйте, Lichkaty Alexander!
Дело в том, что цикл for в делфи иногда действительно не правильно показывает значение i, при этом цикл отрабатывает правильно. Отключите оптимизацию в свойствах проекта на вкладке "Compile" и еще раз пройдите под отладкой ваш цикл.
Возможно это поможет обнаружить обращение к несуществующему индексу массива или другую ошибку.
Удачи!
---------
Если не знаешь что сказать - лучше промолчи...
Ответ отправил: Zubex (статус: 6-ой класс)
Ответ отправлен: 12.06.2006, 10:53
Оценка за ответ: 5


Вопрос № 45.780
Подскажите как можно менять цвет части текста (например одна часть зелёная другая красная) в компоненте ListBox или подскажите аналогичный компонент в котором это можно делать. Зарание благодарен
Отправлен: 09.06.2006, 22:47
Вопрос задал: Sysanin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Полховский Александр Владимирович
Здравствуйте, Sysanin!
Для этого нужно вручную перерисовывать элементы списка. Поставьте свойство Style в lbOwnerDrawFixed, напишите обработчик события OnDrawItem. Там можете хоть разными цветами, хоть рисовать.

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
listbox1.Canvas.Font.Color:=clred;
listbox1.Canvas.TextOut(rect.Left, rect.Top, copy(listbox1.Items[index], 1, 4));
listbox1.Canvas.Font.Color:=clblue;
listbox1.Canvas.TextOut(rect.Left+20, rect.Top, copy(listbox1.Items[index], 5, 3));
end;

Только почитайте об этой прорисовке в руководстве, там ещё придётся прорисовывать и рамку, и всё остальное. В параметре State будет передаваться текущая стадия прорисовки, и Ваш обработчик должен будет адекватнореагировать на него.
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Практикант)
Ответ отправлен: 09.06.2006, 23:46
Оценка за ответ: 5

Отвечает: Gh0stik
Здравствуйте, Sysanin!

Смотрите мой ответ на вопрос № 40163. А так же Вы увидите и другие варианты решения Вашей проблеммы....

Удачи!!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаються события на земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Студент)
Ответ отправлен: 12.06.2006, 11:40


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.34 от 01.06.2006
Яндекс Rambler's Top100

В избранное