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

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


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

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

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

Выпуск № 196
от 31.07.2005, 21:10

Администратор:Калашников О.А.
В рассылке:Подписчиков: 221, Экспертов: 39
В номере:Вопросов: 3, Ответов: 7


Вопрос № 24046: Как можно изиенить скогость привода в Дельфи как например в CD Slow?...
Вопрос № 24065: Здравствуйте! Подскажите как правильно организовать поток. Модуль формы unit Unit1; // Расчет interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2;<...
Вопрос № 24067: Здраствуйте уважаемые эксперты, с помощю какова компонента можно написать IRC клиента, дайте ссылку плиз. Заранее спасибо....

Вопрос № 24.046
Как можно изиенить скогость привода в Дельфи как например в CD Slow?
Отправлен: 26.07.2005, 11:05
Вопрос задал: Малярчук Андрей (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: Ddeedd
Здравствуйте, Малярчук Андрей!

Скорость привода изменяется с помощью выдачи устройству соответствующих SCSI/ATAPI команд.
Чтобы сделать это надо знать эти команды - в обычных доках по ATAPI столь экзотичесие не описаны обычно. Затем эти команды можно выдать либо через интерфейс ASPI (Win9x), либо для WinNT - через DeviceIoControl. Поищите в инете список ATAPI команд, скачайте NTDDK (Device Driver Development Kit). Можно проще поступить - хакните ваш CD Slow - и все дела.
Ответ отправил: Ddeedd (статус: 3-ий класс)
Отправлен: 26.07.2005, 14:50
Оценка за ответ: 4


Вопрос № 24.065
Здравствуйте!
Подскажите как правильно организовать поток.
Модуль формы
unit Unit1; // Расчет

interface

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

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
co: hest;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// Запуск цикла из потока
procedure TForm1.Button1Click(Sender: TObject);
begin
co:= hest.Create(true);
co.Resume;// запустили
co.Priority:= tpNormal; // Нормальный поток
end;

// Стоп
procedure TForm1.Button2Click(Sender: TObject);
begin
co.Terminate;// Стоп
end;

// Пауза
procedure TForm1.Button3Click(Sender: TObject);
begin
co.Suspend;// Приостановили
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9': ; // цифра
',','.' : // точка или запятая
begin
if Key = '.' then Key := ','; // подменим точку запятой
// проверим, есть ли в поле Edit1 запятая
if Pos(',',Edit1.Text) <> 0 // запятая уже есть
then Key:=Char(0); // вторую запятую не отображать
end;
#8 : ; // <Backspace>
#13 : Edit2.SetFocus; // <Enter>
// остальные символы - запрещены
else Key :=Chr(0); // символ не отображать
end;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9': ; // цифра
',','.' : // точка или запятая
begin
if Key = '.' then Key := ','; // подменим точку запятой
// проверим, есть ли в поле Edit2 запятая
if Pos(',',Edit2.Text) <> 0 // запятая уже есть
then Key:=Char(0); // вторую запятую не отображать
end;
#8 : ; // <Backspace>
#13 : Edit3.SetFocus; // <Enter>
#32 : Edit1.SetFocus; // <Space Bar>
// остальные символы - запрещены
else Key :=Chr(0); // символ не отображать
end;
end;

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9': ; // цифра
',','.' : // точка или запятая
begin
if Key = '.' then Key := ','; // подменим точку запятой
// проверим, есть ли в поле Edit3 запятая
if Pos(',',Edit3.Text) <> 0 // запятая уже есть
then Key:=Char(0); // вторую запятую не отображать
end;
#8 : ; // <Backspace>
#32 : Edit2.SetFocus; // <Space Bar>
// остальные символы - запрещены
else Key :=Chr(0); // символ не отображать
end;
end;

end.

Приложение:

Отправлен: 26.07.2005, 18:14
Вопрос задал: Serhik_z (статус: Посетитель)
Всего ответов отправлено: 4

Отвечает: X
Здравствуйте, Serhik_z!
Ну вобще-то в Unit2 в коментариях, вставленных Delphi, написано как надо делать:
Все действия с визуальными компонентами должны происходить в процедуре, которая должна вызываться с помощью Synchronize()

Приложение:

Ответ отправил: X (статус: 7-ой класс)
Отправлен: 26.07.2005, 19:54

Отвечает: Ddeedd
Здравствуйте, Serhik_z!

Могу дать некоторые рекомендации:

В потоке лучше не делать ввода - т.е. спрашивать что-то у юзера - а если все-таки надо - то заключите код запроса у пользователя в процедуру без параметров ("procedure AskUser;") и добавте в свой класс TThread - а из Execute вызывайте ее через Synchronize ("Synchronize(AskUser);")
Также через Synchronize надо вызывать тот код, который общается с VCL классами, используемыми в других потоках, такими как Form1, Form2, Screen и проч. - конечно можно на это забить, но чем чаще в других потоках используется объект - тем выше будет возможность неправильного совместного доступа и глюка соответственно.

Приложение:

Ответ отправил: Ddeedd (статус: 3-ий класс)
Отправлен: 26.07.2005, 19:57

Отвечает: sir henry
Здравствуйте, Serhik_z!
А в чем конкретно сложность?
Ввод, формирование и проверку на корректность данных делайте отдельной процедурой (это в главной форме), а расчет результата - отдельной (назовем ее для примера hest.raschet), занесите ее в hest.execute:
procedure hest.Execute;
begin
{Пока процесс не прервали, выполняем Raschet}
while not Terminated do
Synchronize(Raschet);
end;
Synchronize нужен нам для того, чтобы избежать взаимного мордобоя между потоком главной программы и потоком hest.
Вывод результатов, естественно, тоже должен быть работой главной программы (формы), а не отдельного потока.
А вообще, отдельный поток тут нужен или так, для прикола? :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 26.07.2005, 20:10

Отвечает: Werewolf
Здравствуйте, Serhik_z!
Все немного можно усложнить/упростить чтобы получить максимальную производительность
unit Unit2; // Поток для расчета 'hest'

interface

uses
Classes,dialogs,sysutils,forms,Controls, windows;

type
hest = class(TThread)
procedure SetFocus;
procedure AddToMemo;
procedure ClearMemo;
private
{ Private declarations }
Edit:byte; Msg:string;
protected
procedure Execute; override;
end;

implementation

uses Unit1, Math;

procedure hest.clearmemo;
begin
form1.Memo1.Clear;
end;

procedure hest.SetFocus;
begin
case edit of
1:Form1.Edit1.SetFocus;
2:Form1.Edit2.SetFocus;
3:Form1.Edit3.SetFocus;
end;
end;
procedure hest.AddToMemo;
begin
Form1.Memo1.Lines.Add(Msg);
end;

procedure hest.Execute;
var
m: real; // Модуль, как дробное число
k: real; // Градусы Угол шестерни
i: real; // Минуты
c: integer; // челое число
d: integer; // дробное число
v: real; // вычисления
aa,bb,cc,dd: integer;
lasttime:cardinal;
begin
try
m:= StrToFloat(trim(Form1.Edit1.Text));
except
on e:EConvertError do begin
Synchronize(ClearMemo);
Msg:='Уважаемый!'#13#10'Введите Модуль';
Synchronize(AddToMemo);
Edit:=1;
Synchronize(SetFocus); // курсор в поле ввода
Exit;// завершить обработку события
end;
end;
try
k:= StrToFloat(trim(Form1.Edit2.Text));
except
on e:EConvertError do begin
Synchronize(ClearMemo);
Msg:='Уважаемый!'#13#10'Введите угол шестерни'#13#10'в градусах';
Synchronize(AddToMemo);
Edit:=2;
Synchronize(SetFocus); // курсор в поле ввода
Exit;// завершить обработку события
end;
end;
try
i:= StrToFloat(trim(Form1.Edit3.Text));
except
on e:EConvertError do begin
Synchronize(ClearMemo);
Msg:='Уважаемый!'#13#10'Введите угол шестерни'#13#10'в Минутах'#13#10'от 0 до 60';
Synchronize(AddToMemo);
Edit:=3;
Synchronize(SetFocus); // курсор в поле ввода
Exit;// завершить обработку события
end;
end;
// предварительные преобразования
c:= Trunc(m); // это целая часть числа t
d:= Trunc(m/2) mod 10000; // это дробная часть числа t
// вычисление
v:=sin(((k+i/60)*pi)/180)*5.96831/m;
// вывод результата
Synchronize(ClearMemo);
Msg:=' Станок F-06, J=5,96831';
Synchronize(AddToMemo);
Msg:=(' Модуль: ' + FloatToStr(m))+(' Градусы: ' + FloatToStr(k))+(' Минуты: ' + FloatToStr(i))+ ('');
Synchronize(AddToMemo);
Msg:=' Дифференциал: ' + FloatToStrF(v,ffFixed,6,5) + '';
Synchronize(AddToMemo);
Msg:=' -------------------------------------------------';
Synchronize(AddToMemo);
Msg:=' -------- Выбор шестерен --------';
Synchronize(AddToMemo);
//( 6-вывод 6 ми цифр. 5 после запятой

Screen.Cursor := crHourGlass;
lasttime:=GetTickCount;
for aa:=20 to 100 do
for bb:=aa+1 to 100 do //если не надо зеркально повторяющихся шестернь
for cc:=20 to 100 do // если надо - напиши как было у тебя
for dd:=cc+1 to 100 do
if (aa<>bb) and(cc<>dd)and //сравнение над целыми происходит быстрее сравнения строк
(round(aa*bb/cc/dd*100000) = round(v*100000))
then begin
Msg:=Format(' Гитара шестерен: %d x %d / %d x %d',[aa,bb,cc,dd]);
Synchronize(AddToMemo);
end;
Screen.Cursor := crDefault;
// Стоп
if terminated then exit;
Msg:=' -------------------------------------------------';
Synchronize(AddToMemo);
Msg:='На расчет затрачено '+inttostr(GetTickCount-lasttime)+'мс';
Synchronize(AddToMemo);
Screen.Cursor := crDefault;
end;

end.
Ответ отправил: Werewolf (статус: 4-ый класс)
Отправлен: 27.07.2005, 01:00


Вопрос № 24.067
Здраствуйте уважаемые эксперты, с помощю какова компонента можно написать IRC клиента, дайте ссылку плиз.
Заранее спасибо.
Отправлен: 26.07.2005, 20:47
Вопрос задал: Станислав (статус: 1-ый класс)
Всего ответов отправлено: 2

Отвечает: Werewolf
Здравствуйте, Станислав!
TIDIRCClient входит в состав библиотеки Indy (которая включена в поставку с Delphi)
Ищи на закладке Indy Clients c рисунком похожим на наручники (хотя скорее всего это два Ballontip'a =)
Со свойствами и методами компонента все просто.
Через свойства Users и Channels, например, можно получить список пользователей и каналов соответственно.
Если будут ещё вопросы пиши. Удачи... =)
Ответ отправил: Werewolf (статус: 4-ый класс)
Отправлен: 26.07.2005, 23:29
Оценка за ответ: 5

Отвечает: And1
Здравствуйте, Станислав!
Хороший компонент для IRC лежит на сайте http://www.vr-online.ru/ в разделе комоненты=>delphi=>что-то связанное с интернетом/сетью (точный линк не помню...). Так же можете помотреть на www.torry.net - там ОГРОМНОЕ количество компонентов, в том числе и для IRC - на любой вкус! :)
Удачи!
Ответ отправил: And1 (статус: 3-ий класс)
Отправлен: 28.07.2005, 15:09
Оценка за ответ: 5


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

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

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

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

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


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


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

Яндекс


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

В избранное