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

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 32)


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

Программирование на DELPHI
Выпуск #32 (25 сентября 2005 г.) 

Разделы сайта:

Новости сайта
Система "Эксперт"
Вопросы и Ответы

Отправить вопрос
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Форум
Гостевая книга
F.A.Q.
Архив рассылки
Каталог сайтов
Обратная связь
Хостинг



Связь:

Администратор
Система "Эксперт"
Информация


Доброго времени суток , уважаемые читатели!

На днях у меня появилась одна идея, хочу поделиться ей с Вами. Оказалось, что немалая часть наших читателей лишена полноценного доступа в интернет и пользуется только почтой. Это не очень хорошо, и получается, что эти читатели не могут воспользоваться теми файлами, которые расположены на нашем сайте. Идея в следующем: я могу попытаться написать автоматизированную систему получения файлов по почте. Работать она будет примерно так: Вы отправляете письмо на специальный email-адрес с определённой темой. В тексте письма Вы должны указать некоторую служебную информацию, основной пункт которой - идексный номер файла на сайте (id). Если Вы заметили, конечные ссылки на все файлы отдаёт страница http://www.delphi.int.ru/download.php?id=n, где n - этот самый индексный номер файла. Думаю, всем Вам понравится эта идея и Вы меня поддержите. Как обычно, для этого создаём опрос. Обратите внимание на варианты его ответов, т.к. опрос сразу заключает в себе два вопроса.

Вопрос 1: Какой у Вас доступ в интернет (полный / только почта) ?
Вопрос 2: Хотели-ли бы Вы, чтобы на сайте существовала автоматизированная система получения файлов по почте (да / нет) ?

Варианты ответов:

[Голосовать] Полный доступ в интернет; система нужна.
[Голосовать] Только почта; система нужна.
[Голосовать] Полный доступ; система не нужна.
[Голосовать] Только почта; система не нужна.

Хочу обратить Ваше внимание на то, что даже если у Вас полный доступ в интернет, не торопитесь отвечать, что система не нужна. Подумайте о тех, у кого только почта, да и о себе - вдруг когда-нибудь воспользуетесь?..

Результаты будут подведены примерно через 2(!) недели, т.е. через 1 выпуск рассылки. Жду Ваших ответов и мнений.

Последние темы форума:

Ждём Вас на нашем форуме!

Ну и напоследок сюрприз: изменена цветовая схема сайта! До встречи!

Разделы рассылки:

Авторское слово
Новые вопросы
Ответы на вопросы
Статья по Delphi
Файловый архив
Друзья
Юмор


Количество читателей рассылки: 3313.


Подписка на рассылку:


Лидеры по количеству баллов:


Место
Имя
Баллы
Статус
1
Feniks
281
Практикант
2
Dron
237
Практикант
3
Ermakova Dasha
208
Практикант
4
Iron Monk
200
Практикант
5
Садовников Владимир
196
Практикант
6
Андрей Лучников
83
Эксперт: 9-ый класс
7
Igor Danilevych
81
Эксперт: 9-ый класс
8
Ершов Денис
73
Эксперт: 8-ой класс
9
VeroLom
71
Эксперт: 8-ой класс
10
mvp
65
Эксперт: 7-ой класс

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


Основные правила нашей рассылки:

1. Не присылайте ответов на вопросы вроде "да я не знаю" или "да/нет". Такие ответы не публикуются.
2. Вопросы, не касающиеся Delphi, не принимаются (для этого существуют другие рассылки).
3. Запрещено присылать вложенные файлы, объёмом выше установленного ограничения (ограничения указаны в правилах).
4. Не изменяйте тем присылаемых писем. Письма с "неправильными" темами не обрабатываются! Используйте текстовый (не HTML) формат писем. HTML-теги применяйте только в том случае, если Вы уже достигли статуса, где это разрешено (см. правила).
5. Запрещено задавать вопросы, содержащие два (или несколько) вопросов разной тематики. Каждый из таких вопросов должен быть оформлен отдельным письмом.


Новые вопросы.


Новых вопросов не было задано. Хочу Вас спросить, почему? :)



Вопросы, на которые нет ответов:

Вопрос #78 (автор вопроса: Hires; вопрос отправлен: 20.02.2005 16:33):

Как получить скорость работы GPU и памяти видео карты? [Ответить на вопрос]


Вопрос #88 (автор вопроса: Sergey; вопрос отправлен: 15.03.2005 19:57):

Вопрос по TChart. Как осуществить привязку указателя мыши к линии LineSeries? И еще. По оси X - время (DateTime). Как "вытащить" значение Y в любой точке LineSeries? [Ответить на вопрос]


Вопрос #90 (автор вопроса: Nanny_Jagg; вопрос отправлен: 17.03.2005 07:56):

Как в DBGrid из библиотеки Ehlib 3.6 добавить Lookup-поле, чтобы оно действительно работало? Поле вроде сделано, но ключевое поле, оставленное рядом для контрола не меняется, по какому событию обработчик писать? [Ответить на вопрос]


Вопрос #105 (автор вопроса: Crazy_Jack; вопрос отправлен: 03.04.2005 14:44):

Как прочитать под WinXP MBR? [Ответить на вопрос]


Вопрос #131 (автор вопроса: YaricZ; вопрос отправлен: 21.05.2005 15:01):

У меня такой вопрос: я использую библиотеку KOL и MCK, но компонентов в этих библиотеках немного - только стандартные. Внимание - вопрос знатокам: возможно ли использование компонентов Delphi совместно с KOL? Если добавить обычный компонент из вкладки, к примеру, "стандартные" - программа не компилируется. И второй вопрос: если совместное использование KOL со стандартными компонентами Delphi невозможно, то где можно скачать аналог компонентов DataSource, ClientDataSet, DBGrid. DBEdit, DBMemo? На официальном сайте ничего нет. Заранее выражаю благодарность всем, кто сможет мне помочь. [Ответить на вопрос]


Вопрос #144 (автор вопроса: Angen; вопрос отправлен: 03.07.2005 22:41):

Пишу программу "Редактор настроек Windows" наподобие "WinSEr". Подскажите, пожалуйста, как в свойствах "Пароли" под Win98 в закладке "Удаленное управление" программно добавить определенного пользователя или удалить его? [Ответить на вопрос]


Вопрос #149 (автор вопроса: Alexandr Prokhoda; вопрос отправлен: 04.09.2005 11:18):

Добрый день. Подскажите пожалуйста, каким образом программа (пишу в Delphi 5) может изменить параметры электропитания WindowsXP (или хоть какой-то)? Конкретно – время выключения монитора. Заранее благодарю, Александр Прохода. [Ответить на вопрос]


Вопрос #153 (автор вопроса: sun rain; вопрос отправлен: 11.09.2005 18:12):

Ситуация: есть прокся, которая блокирует доступ к форуму, но можно получить доступ к нему введя вместо него IP адрес... Я смог написать программку на Delphi, которая при помощи стандартного компонента браузера грузила страницы форума, но без картинок и тем более нельзя было войти туда под логином. Как сделать чтоб все адреса (файлы, линки..), что этот "браузер" запрашивает у сервера, менялись на нужные мне и в итоге я видел все правильно? [Ответить на вопрос]

 


Ответы на вопросы.


Вопрос #138:
Как сделать анализатор звука (спадающие пики как в Winamp) ?

1. [Отвечает: Matveyev, 20.09.2005 02:53]: См. статью http://delphiworld.narod.ru/base/decompile_wave.html. Был у меня еще примерчик как раз на эту тему, но что-то найти не могу. Если всё же найду - дам.

Оценка за ответ: 3.


Вопрос #145:
Здравстуйте, помогите, пожалуйста, с решением такого вопроса: Как мне сделать, чтобы при раскрытии одного из подпунктов моего попап-меню отображалость контекстное меню Проводника (например, как при щелчке правой кнопкой на файле)? И еще: Как сделать самому команды аналогичные Копировать, Вырезать, Отправить...? Заранее благодарю!

3.2. [Отвечает: Ершов Денис, 19.09.2005 09:51]: С опозданием, но я нашел, где видел добавление пункта в контекстное меню проводника через COM-сервер. Это один из примеров к книге Марко Кэнту "Mastering Delphi 6". В архиве два проекта. Один - программа позволяющая перетаскивать на свою форму файлы. Другой - обработчик контекстного меню, отправляющий файлы в эту программу. Скачать прикреплённый файл.

Оценка за ответ: 5.


Вопрос #150:
Доброго времени суток всем! Поможите кто может! У меня есть база в ACCESS, в Дельфях(7) написана программка по её управлению. На основе данных базы идут вычисления (вычисляемые поля). ВОПРОС: Как сделать сортировку по вычисляемому полю? Можно ли данные из вычисляемого поля записать в таблицу? Спасибо!

1. [Отвечает: Вадим Фурив, 19.09.2005 12:30]: Для того, чтобы получить вычисляемые поля лучше всего использовать SQL запросы. Например:
SELECT Price, CountOfBooks, Price*CountOfBooks as SummaOfZakaz FROM Zakaz
Таким образом в DataSet компонента ADOQuery получим записи по полям: Price (цена едмницы), CountOfBooks (количество товаров - скажем
книг) и SummaOfZakaz (произведение количества на стоимость единицу - или стоимость партии). Обращаться к этому полю можно так:
Summa:=ADOQuery1.FieldByName('SummaOfZakaz').asFloat;
Для сортировки можно добавить в конец запроса строку:
ORDER BY SummaOfZakaz
Кроме того добавлю, что в запрос позволяет еще и отбирать не все данные, а выборочно с помощью команды WHERE. Но это уже нужно учить
SQL. Хотя при работе с данными с ним работать намного проще, чем через всякие ADOTable.

Записать данные из запроса можно так же командой SQL:
SELECT INTO [имя_таблицы] Price, CountOfBooks, Price*CountOfBooks as SummaOfZakaz FROM Zakaz

Оценка за ответ: 5.


Вопрос #151:
Как сделать бегущую строку с прозрачным фоном текста поверх всех окон, когда, допустим, смотришь фильм, во весь экран?

1. [Отвечает: Matveyev, 20.09.2005 02:53]: На мой взгляд, наиболее элегантным решением будет использование оверлеев - это не так сложно как кажется на первый взгляд, а поверх, будет так поверх - прямо в буфере видеокарты. Подробнее см. http://www.delphimaster.ru/articles/directx/index.html . Если ссылка битая, обращайся, дам вместе с исходниками примера.

Оценка за ответ: 4.

2. [Отвечает: Dasha, 20.09.2005 15:12]: В свойствах формы ставишь: FormStyle - fsStayOnTop; убираешь все BorderIcons, BorderStyle - bsNone; цвет формы, например, черный. Тогда TransparentColorValue тоже черный, TransparentColor - true, на форму таймер и один ярлык для текста, у него Left = 0.
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then //чтобы форма закрывалась по нажатию Enter.
close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Left+Label1.Width>0 then
Left:=Left-5
else
Left:=Screen.Width;
end;

Оценка за ответ: 5.


Вопрос #152:
Подскажите, пожалуйста, как объявлять свои собственые типы данных и работать с ними?

1. [Отвечает: Вадим Фурив, 19.09.2005 12:42]: Для ответа на данный вопрос нужно всего-лишь прочитать в хелпе по Delphi про зарезервированное слово type. Например:
type TValue = Real;
var
X: Real;
Y: TValue;

Тут объявляется свой тип TValue. Он идентичен типу Real. Значит X и Y будут совместимые.Или например:
type TValue = String[10];
var
X: String[10];
Y: TValue;

Тоже типы совместимые. Можно еще объявлять кучу разных вещей: массивы (X: array of Integer), записи, сеты. Все это подробно можно найти в помощи по Delphi. Если проблема с переводом с английского, то советую установить программу HelpReader.

Оценка за ответ: 5.

2. [Отвечает: Геннадий Самолдин, 19.09.2005 16:28]: Сначала пишешьЖ
type <имя>= <тип>
x:integer;
и т.д.
end;

Потом объявляешь переменную x: <имя типа>; и работаешь с ним.

Оценка за ответ: 4.

3. [Отвечает: Садовников Владимир, 19.09.2005 17:41]: Самый лучший помощник в данном случае - хорошая книга. Какие типы данных тебя интересуют - множества, массивы, перечисления, записи, классы, указатели? Вообще говоря, все типы данных объявляются после ключевого слова type. Примеров, думаю, не надо приводить: достаточно открыть тот же заголовочный файл Windows.pas и посмотреть, как там объявляются все типы.

Оценка за ответ: 4.

4. [Отвечает: Dasha, 20.09.2005 15:18]: Где-нибудь перед var пишешь type и ниже описываешь тип данных. Например, так:
type
Tperson = record
Name, IP, CompName: string;
end;
MyAr = array [0..2,0..1] of integer;

Потом объявляешь переменную этого типа, например:
var
NewAr: MyAr;
//это будет соответственно, массив и работаешь, как с массивом :)

Оценка за ответ: 5.

5. [Отвечает: mvp, 20.09.2005 20:38]: Пример:
type Mytype = (a, b, c, d);
//--------
var s : Mytype;
//---
for s := a to d do
begin
if s = c then...
//
end;

Объявляем в разделе type. Это может быть перечислимый тип или запись или переименование уже существующих типов. Например,

type MyInt = Integer;

Но, следует учесть, что если есть процедура(функция): procedure F(var Ad : MyInt), и у вас будут такие объявления
var a : Integer;
b : Myint;

то вызов F(a) - выдаст ошибку несовместимости типов.

Ещё примеры:
type
a = record
x, y : integer;
name : string;
addon : pointer;
end;
//
var qq : a;
//--------
with a do
begin
x := 1;
y := 10;
name := test;
addon := nil
end;
//----------

type
varArr = array of integer;

var Ar : varArr;
//-----

SetLength(ar, 5);
Ar[0] := 1;
Ar[1] := 2;
//---------

Оценка за ответ: 5.

6. [Отвечает: Azamat Galiyev, 21.09.2005 07:44]: Ээ... вопрос конечно интересный ;) Очень советую прочитать первый том Тексеры и Пачека, ну и конечно второй на закуску. Ну а пока краткая справка. Перед объявлением пишем ключевое слово type потом одно или несколько объявлений.

type
бла-бла-бла;
бла-бла-бла;
бла-бла-бла;
бла-бла-бла;

бла-бла-бла может быть нескольких видов.

Простое переопределение:
TFileName = type string;

Что-нибуть изощрённее (указатель на начало процедуры):
TProcedure = procedure;

Массивы:
TByteArray = array[0..32767] of Byte;

Указатели:
PByteArray = ^TByteArray;

Перечисления:
TFloatValue = (fvExtended, fvCurrency);

Это поинтереснее, записи (packed - означает упакованные - байт за байтом)
TFloatRec = packed record
Exponent: Smallint;
Negative: Boolean;
Digits: array[0..20] of Char;
end;

Записи неупакованные (каждая часть записи в памяти выровнена по сетке 4-байт):
TTimeStamp = record
Time: Integer; { Number of milliseconds since midnight }
Date: Integer; { One plus number of days since 1/1/0001 }
end;

Наборы (иногда очень полезный механизм!!!):
TSysCharSet = set of Char;
TIntegerSet = set of 0..SizeOf(Integer) * 8 - 1;

Ну и конечно бесконечная мощь ООП классы например один из самых юзабельных:
TList = class(TObject)
private
/// код обявлений ///
protected
/// код обявлений ///
public
/// код обявлений ///
end;

И еще одна немаловажная вещь которой непользуются начинающие Пасквилянты - интерфейсы.
IInterfaceList = interface
['{285DEA8A-B865-11D1-AAA7-00C04FB17A72}']
/// код обявлений ///
end;

Все объявления взяты из стандартных модулей SysUtils и Classes (спасибо большое борландцам). А ваше как говорил один очень известный товарищ - Хочешь писать как Шекспир - копируй Шекспира. Глубокое изучение стандартных готовых модулей и демок позволит Вам научится писать на должном уровне. И больше пожалуйста не задавайте таких вопросов...

Оценка за ответ: 5.

7. [Отвечает: Yurchik, 23.09.2005 00:04]: http://program.rin.ru/razdel/html/1022.html.

Оценка за ответ: 3.


Вопрос #154:
Помогите начинающему. Изучаю Дельфи по рассылкам и статьям. Пытаюсь свернуть программу в трей. Все делаю по статье, но при компиляции строка "Shell_NotifyIcon(NIM_ADD,@no);" вызывает ошибку "Unsafe code only allowed in unsafe procedure" (Опасный код, только позволенный в опасной процедуре). Что это значит? И что делать? Дельфи 8-я версия.

1. [Отвечает: Dron, 19.09.2005 08:35]: Делать вручную - ну очень долгий и неудобный способ. Лучше взять готовые компоненты, с помощью которых иконка в трее делается за пару секунд. Лично я рекомендую использовать Cool TrayIcon: http://www.delphi.int.ru/download.php?id=20.

Оценка за ответ: 4.

2. [Отвечает: Ершов Денис, 19.09.2005 09:27]: Приветствую, Алексей. Не знаю насколько данная информация устарела. Работал только с D7. В ней это была не ошибка (Error), а предупреждение указывающее на ненадежность кода (Warning). При этом программа вполне компилируется и запускается, просто компилятор ставит под вопрос правильность функционирования такого кода. Можно просто игнорировать данные сообщения, можно отключить через Project -> Project options ->Compiller Messages, чтобы не доставали. Конкретно по сообщению. В D7 данное сообщение указывало на несовместимость в будущем данного кода с технологией ".NET". Еще конкретней, приводит к конфликту памяти. Если в D8 картина аналогичная - игнорируй, если сообщение перекочевало в категорию ошибок - искать альтернативный код.

Оценка за ответ: 5.

3. [Отвечает: Dasha, 20.09.2005 15:21]: Лучше возьми готовый компонент, который все удобно делает. Например, CoolTrayIcon.

Оценка за ответ: 3.


Вопрос #155:
Мне нужен компонент MNSMTP из закладки FastNet. На моей версии Delphi 7 нет такой закладки. Где его взять? Спасибо.

1. [Отвечает: Dron, 18.09.2005 16:09]: Я могу ошибаться, но в Delphi 7 эти компоненты отсутствуют. Вместо них можно использовать Indy-компоненты. В данном случае - IdSMTP.

Оценка за ответ: 4.

2. [Отвечает: #One, 18.09.2005 20:45]: В Delphi7 не входят компоненты FastNet, т. к. все их возможности с лихвой перекрываются компонентами Indy.

Оценка за ответ: 4.

3. [Отвечает: Matveyev, 20.09.2005 02:53]: В Delphi 7 Borland отказалась от продуктов Net Masters L.L.C. (производители компонентов FastNet). Итак, у вас остается выбор либо использовать Delphi 5, Delphi 6 не знаю есть ли FastNet в Delphi 4 и более ранних, либо купить компоненты у производителя. А может без исходных текстов можно найти и для D7 - посмотрите на http://www.netmastersllc.com/.

Оценка за ответ: 4.


Вопрос #156:
У меня такой вопрос. Есть на форме 6 Editor'ов. В пять из них юзер вводит числа, а в шестом, при щелчке на кнопке выводится ответ. Т.е. программа берет эти числа и выдает в шестой Editor ответ по формуле ((Edit1 * Edit2 * Edit3) - Edit4) / Edit5. Как все это осуществить? Заранее спасибо!

1. [Отвечает: Dron, 18.09.2005 14:05]: Самый простой вариант:

procedure TForm1.Button1Click(Sender: TObject);
Var A,B,C,D,E,F: Real;
begin
A:=StrToFloat(Edit1.Text);
B:=StrToFloat(Edit2.Text);
C:=StrToFloat(Edit3.Text);
D:=StrToFloat(Edit4.Text);
E:=StrToFloat(Edit5.Text);
F:=((A*B*C)-D)/E;
Edit6.Text:=FloatToStr(F);
end;

Тип Real допускает, что числа могут быть/получится дробные. Так как
присутствует деление, то лучше Real, чем Integer. Если использовать Integer,
то вместо StrToFloat() и FloatToStr() нужно использовать StrToInt() и
IntToStr().

Оценка за ответ: 5.

2. [Отвечает: #One, 18.09.2005 20:50]:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Edit6.Text := FloatToStr(((StrToFloat(Edit1.Text) *
StrToFloat(Edit2.Text) * StrToFloat(Edit3.Text)) - StrToFloat(Edit4.Text)) /
StrToFloat(Edit5.Text))
end;
Проверку не забудь сделать в свойстве Edit1-5.Text на пустую строку, отсутствие символов и корректный DecimalSeparator.

Оценка за ответ: 5.

3. [Отвечает: Matveyev, 20.09.2005 02:53]: Edit6.Text := FloatToStr( ( StrToFloat(Edit1.Text) * StrToFloat(Edit2.Text) * StrToFloat(Edit3.Text)) - StrToFloat(Edit4.Text) ) / StrToFloat(Edit5.Text);

Оценка за ответ: 5.

4. [Отвечает: SPIDER, 18.09.2005 17:58]: Здравствуйте, Eugene. Edit6.Text:=FloatToStr(((StrToFloat(Edit1.Text)*StrToFloat(Edit2.Text)*StrToFloat(Edit3.Text))-StrToFloat(Edit4.Text))/StrToFloat(Edit5.Text));

Или более удобный (а также более длинный) способ:
var
a1, a2, a3, a4, a5: real;
begin
a1:= StrToFloat(Edit1.Text);
a2:= StrToFloat(Edit2.Text);
a3:= StrToFloat(Edit3.Text);
a4:= StrToFloat(Edit4.Text);
a5:= StrToFloat(Edit5.Text);
Edit6.Text:= FloatToStr(((a1*a2*a3)-a4)/a5);
end;

Если используешь "/", то переменные должны быть дробного типа, т.е. Real. StrToFloat - текст превращает в число дробного типа. По этому, если будут введены не цифры, а что-нибудь другое, выскочит Error. Это надо использовать для расчётов в программе (строки умножать нельзя!). FloatToStr - дробное число превращает в строку. Надеюсь, помог.

Оценка за ответ: 5.

5. [Отвечает: Igor, 18.09.2005 18:39]: Расскажу самый примитивный для меня способ. Заводим 2 массива из 6 элементов, первый типа String, например, S[i], второй, допустим, LongInt A[i]. Далее, при нажатии кнопки записываем значения в матрицу S[i], которые ввёл юзер в Эдит'ы и переводим эти строки в числа процудурой Val и одновременно записываем их в массив A[i]. Далее присваиваем какой-нибудь переменной значение формулы, которое нам необходимо получить и записываем его в шестой Эдит. Всё... Вот сама программа:
interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a: array[1..6] of longint;
s: array[1..6] of string;
i:longint;
f:real;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
code :integer;
begin
s[1]:=edit1.Text;
s[2]:=edit2.Text;
s[3]:=edit3.Text;
s[4]:=edit4.Text;
s[5]:=edit5.Text;
val(s[1],a[1],code);
val(s[2],a[2],code);
val(s[3],a[3],code);
val(s[4],a[4],code);
val(s[5],a[5],code);
f:=((a[1]*a[2]*a[3])-a[4])/a[5];
str(f,s[6]);
edit6.Text:=s[6];
end;

end.

Можно округлить значение или отбросить дробную часть...

Оценка за ответ: 5.

6. [Отвечает: Вадим Фурив, 19.09.2005 10:41]: Если ответ требуется дробный:
Edit6.Text:=FloatToStr(((StrToFloat(Edit1.Text)*StrToFloat(Edit2.Text)*StrToFloat(Edit3.Text))-StrToFloat(Edit4.Text))/StrToFloat(Ed
it5.Text))

Если ответ требуется целый:
Edit6.Text:=IntToStr(Round(((StrToFloat(Edit1.Text)*StrToFloat(Edit2.Text)*StrToFloat(Edit3.Text))-StrToFloat(Edit4.Text))/StrToFloa
t(Edit5.Text)))

При этом желательно в событии OnKeyPress вставить:
if not (key in ['0'..'9', ',' #8]) then
key:=#0 ;

Это не позволит пользователю вводить ничего кроме цифр и запятой. Если цифры должны быть целыми, то и запятую убрать. Вычисление можно повесить на событие OnChange. Только тогда надо проверять, чтобы все поля компонентов Edit были не равны '' (не пустыми), иначе будет ошибка, а поле Edit5.Text не должно равняться нулю, так как тогда будет ошибка "деление на ноль".

Оценка за ответ: 5.

7. [Отвечает: SlavComp, 19.09.2005 11:16]: На процедуру OnClick твоей кнопки пишешь строку: Edit6.text:=floattostr(((strtofloat(Edit1.text) * strtofloat(Edit2.text) * strtofloat(Edit3.text)) - strtofloat(Edit4.text))/strtofloat(Edit5.text));

Или другой вариант (если тебе не нравится длина строки):
Edit6.text:=floattostr(strtofloat(Edit1.text)*strtofloat(Edit2.text));
Edit6.text:=floattostr(strtofloat(Edit6.text)-strtofloat(Edit4.text));
Edit6.text:=floattostr(strtofloat(Edit6.text)/strtofloat(Edit5.text));

Оценка за ответ: 5.

8. [Отвечает: Геннадий Самолдин, 19.09.2005 16:24]: Нужно в обработчик события OnClick кнопки написать Edit6.Text:=((Edit1.text * Edit2.text * Edit3.text) - Edit4.text) / Edit5.text;, но не забудь перед этим перевести текст из этих полей в числа функцией StrToInt или подобной.

Оценка за ответ: 5.

9. [Отвечает: Садовников Владимир, 19.09.2005 17:41]: Так используй property Text: сканируй число из него функцией StrToInt, если это целое и StrToFloat, если вещественное. Единственное, надо запихнуть в процедуру обработки try-блок, в котором ловится исключение неправильного ввода чисел (если, допустим, вместо 1234 ввели !"№;) и сообщать в нём о неправильном вводе.

Оценка за ответ: 5.

10. [Отвечает: Olga Samusevich, 20.09.2005 13:04]: А обязательно ли надо, чтобы ответ помещался в Edit? Можно вместо 6-го Edit'а поместить Label?, где и прописать это.
begin
a:= StrToInt(Edit1.Text); //StrToInt для примера
b:= StrToInt(Edit2.Text);
c:= StrToInt(Edit3.Text);
d:= StrToInt(Edit4.Text);
e:= StrToInt(Edit5.Text);
Label1.Caption:= 'Итого (или что там будет - не знаю ) ' ( IntToStr(a) * IntToStr(b) * IntToStr(c) - IntToStr(d) ) / IntToStr(e);
end;

Оценка за ответ: 4.

11. [Отвечает: Dasha, 20.09.2005 15:26]: Не знаю, какие там числа, но допустим, действительные. Тогда так:

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit6.Text:=FloatToStr(((StrToFloat(Edit1.Text)*StrToFloat(Edit2.Text)*StrToFloat(Edit3.Text))-
StrToFloat(Edit4.Text))/StrToFloat(Edit5.Text));
end;

Оценка за ответ: 5.

12. [Отвечает: alexlazer, 20.09.2005 19:17]: Необходимо использовать команды Strtoint(x) <перевод из String в Integer> и Inttostr(x) <перевод из Integer в String>.
procedure Form1.ButtonOnClick(Sender: TObject);
var i: real; x1,x2,x3,x4,x5: integer;
begin
x1:=strtoint(Edit1.Text);
x2:=strtoint(Edit2.Text);
x3:=strtoint(Edit3.Text);
x4:=strtoint(Edit4.Text);
x5:=strtoint(Edit5.Text);
i:=((x1*x2*x3)-x4)/x5;
Edit6.Text:=inttostr(round(i));
end;

или же:
Edit6.Text:=inttostr(round(((strtoint(Edit1.text)*strtoint(Edit2.text)*strtoint(Edit3.text))-strtoint(Edit4.text))/strtoint(Edit5.text)));

Оценка за ответ: 5.

13. [Отвечает: mvp, 20.09.2005 20:50]: В обработчике события onClick кнопки пишешь:
begin
try
StrToFloat(edit1.text)
except
Showmessage('В первом поле не число');
exit
end;
try
StrToFloat(edit2.text)
except
Showmessage('Во втором поле не число');
exit
end;
try
StrToFloat(edit3.text)
except
Showmessage('В третьем поле не число');
exit;
end;
try
StrToFloat(edit4.text)
except
Showmessage('В четвёртом поле не число');
exit;
end;
try
if StrToFloat(edit5.text) = 0 then
begin
showmessage('Делить на ноль нельзя');
exit
except
Showmessage('В пятом поле не число');
exit
end;
edit6.text := ((StrTOFloat(Edit1.text) * StrToFloat(Edit2.text) *
StrToFloat(Edit3.text)) - StrTOFloat(Edit4.text)) / StrTOFloat(Edit5.text);
end;

Оценка за ответ: 5.

14. [Отвечает: Yurchik, 22.09.2005 23:56]:
procedure TForm1.Button1Click(Sender: TObject);
var
ar: array [1..6] of double;
i: integer;
begin
for i:= 1 to 5 do
try
ar[i]:= StrToFloat(TEdit(Form1.FindComponent('Edit'+IntToStr(i))).Text);
except
ShowMessage('Error reading float value from Edit'+IntToStr(i));
exit;
end;
ar[6]:= ((ar[1] * ar[2] * ar[3]) - ar[4]) / ar[5];
Edit6.Text:= FloatToStr(ar[6]);
end;

Оценка за ответ: 5.


Все вопросы и ответы на них Вы можете найти на нашем сайте в разделе "Эксперт": http://www.delphi.int.ru/modules/expert/.


Статья по программированию.

Конвертирование графических форматов (часть 2)

С помощью Delphi можно полноценно конвертировать графические форматы один в другой. Для работы с изображениями существует несколько предопределённых классов. Рассмотрим некоторые варианты конвертирования.

6. Конвертирование BMP в ICO.

Вам необходимо создать два битмапа, битмап маски (назовём его "AND" bitmap) и битмап изображения (назовём его XOR bitmap). Вы можете пропустить обработчики для "AND" и "XOR" битмапов в Windows API функции CreateIconIndirect() и использовать обработчик возвращённой иконки в Вашем приложении.

procedure TForm1.Button1Click(Sender: TObject);
var
IconSizeX : integer;
IconSizeY : integer;
AndMask : TBitmap;
XOrMask : TBitmap;
IconInfo : TIconInfo;
Icon : TIcon;
begin
{Получаем размер иконки}
IconSizeX := GetSystemMetrics(SM_CXICON);
IconSizeY := GetSystemMetrics(SM_CYICON);

{Создаём маску "And"}
AndMask := TBitmap.Create;
AndMask.Monochrome := true;
AndMask.Width := IconSizeX;
AndMask.Height := IconSizeY;

{Рисуем на маске "And"}
AndMask.Canvas.Brush.Color := clWhite;
AndMask.Canvas.FillRect(Rect( 0 , 0 , IconSizeX, IconSizeY));
AndMask.Canvas.Brush.Color := clBlack;
AndMask.Canvas.Ellipse( 4 , 4 , IconSizeX - 4 , IconSizeY - 4 );

{Рисуем для теста}
Form1.Canvas.Draw(IconSizeX * 2 , IconSizeY, AndMask);

{Создаём маску "XOr"}
XOrMask := TBitmap.Create;
XOrMask.Width := IconSizeX;
XOrMask.Height := IconSizeY;

{Рисуем на маске "XOr"}
XOrMask.Canvas.Brush.Color := ClBlack;
XOrMask.Canvas.FillRect(Rect( 0 , 0 , IconSizeX, IconSizeY));
XOrMask.Canvas.Pen.Color := clRed;
XOrMask.Canvas.Brush.Color := clRed;
XOrMask.Canvas.Ellipse( 4 , 4 , IconSizeX - 4 , IconSizeY - 4 );

{Рисуем в качестве теста}
Form1.Canvas.Draw(IconSizeX * 4 , IconSizeY, XOrMask);

{Создаём иконку}
Icon := TIcon.Create;
IconInfo.fIcon := true;
IconInfo.xHotspot := 0 ;
IconInfo.yHotspot := 0 ;
IconInfo.hbmMask := AndMask.Handle;
IconInfo.hbmColor := XOrMask.Handle;
Icon.Handle := CreateIconIndirect(IconInfo);

{Уничтожаем временные битмапы}
AndMask.Free;
XOrMask.Free;

{Рисуем в качестве теста}
Form1.Canvas.Draw(IconSizeX * 6 , IconSizeY, Icon);

{Объявляем иконку в качестве иконки приложения}
Application.Icon := Icon;

{генерируем перерисовку}
InvalidateRect(Application.Handle, nil , true);

{Освобождаем иконку}
Icon.Free;
end ;

Способ преобразования изображения размером 32x32 в иконку:

unit main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls, StdCtrls;

type

TForm1 = class (TForm)
Button1: TButton;
Image1: TImage;
Image2: TImage;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end ;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
winDC, srcdc, destdc: HDC;

oldBitmap: HBitmap;
iinfo: TICONINFO;
begin

GetIconInfo(Image1.Picture.Icon.Handle, iinfo);

WinDC := getDC(handle);
srcDC := CreateCompatibleDC(WinDC);
destDC := CreateCompatibleDC(WinDC);
oldBitmap := SelectObject(destDC, iinfo.hbmColor);
oldBitmap := SelectObject(srcDC, iinfo.hbmMask);

BitBlt(destdc, 0 , 0 , Image1.picture.icon.width,
Image1.picture.icon.height,
srcdc, 0 , 0 , SRCPAINT);
Image2.picture.bitmap.handle := SelectObject(destDC, oldBitmap);
DeleteDC(destDC);
DeleteDC(srcDC);
DeleteDC(WinDC);

image2.Picture.Bitmap.savetofile(ExtractFilePath(Application.ExeName)
+ 'myfile.bmp' );
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
image1.picture.icon.loadfromfile( 'c:\myicon.ico' );
end;

end.

7. Конвертирование BMP в RTF.

Да, и такое тоже возможно. Вот так например:

function BitmapToRTF(pict: TBitmap): string ;
var
bi, bb, rtf: string ;
bis, bbs: Cardinal;
achar: ShortString;
hexpict: string ;
I: Integer;
begin
GetDIBSizes(pict.Handle, bis, bbs);
SetLength(bi, bis);
SetLength(bb, bbs);
GetDIB(pict.Handle, pict.Palette, PChar(bi)^, PChar(bb)^);
rtf := '{\rtf1 {\pict\dibitmap0 ' ;
SetLength(hexpict, (Length(bb) + Length(bi)) * 2 );
I := 2 ;
for bis := 1 to Length(bi) do
begin
achar := IntToHex(Integer(bi[bis]), 2 );
hexpict[I - 1] := achar[ 1 ];
hexpict[I] := achar[ 2 ];
Inc(I, 2 );
end ;
for bbs := 1 to Length(bb) do
begin
achar := IntToHex(Integer(bb[bbs]), 2 );
hexpict[I - 1] := achar[ 1 ];
hexpict[I] := achar[ 2 ];
Inc(I, 2);
end ;
rtf := rtf + hexpict + ' }}';
Result := rtf;
end;

8. Конвертирование CUR в BMP.

Преобразование курсора в bitmap:

procedure TForm1.Button1Click(Sender: TObject);
var
hCursor: LongInt;
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.Width := 32 ;
Bitmap.Height := 32 ;
hCursor := LoadCursorFromFile( 'test.cur' );
DrawIcon(Bitmap.Canvas.Handle, 0 , 0 , hCursor);
Bitmap.SaveToFile( 'test.bmp' );
Bitmap.Free;
end;

9. Конвертирование ICO в BMP.

Var
Icon : TIcon;
Bitmap : TBitmap;
begin
Icon := TIcon.Create;
Bitmap := TBitmap.Create;
Icon.LoadFromFile( 'c:\picture.ico' );
Bitmap.Width := Icon.Width;
Bitmap.Height := Icon.Height;
Bitmap.Canvas.Draw( 0 , 0 , Icon);
Bitmap.SaveToFile( 'c:\picture.bmp' );
Icon.Free;
Bitmap.Free;
end;

Вариант 2:

procedure TIconShow.FileListBox1Click(Sender: TObject);
var

MyIcon: TIcon;
MyBitMap: TBitmap;
begin

MyIcon := TIcon.Create;
MyBitMap := TBitmap.Create;

try
{ получаем имя файла и связанную с ним иконку}
strFileName := FileListBox1.Items[FileListBox1.ItemIndex];
StrPCopy(cStrFileName, strFileName);
MyIcon.Handle := ExtractIcon(hInstance, cStrFileName, 0 );

{ рисуем иконку на bitmap в speedbutton }
SpeedButton1.Glyph := MyBitMap;
SpeedButton1.Glyph.Width := MyIcon.Width;
SpeedButton1.Glyph.Height := MyIcon.Height;
SpeedButton1.Glyph.Canvas.Draw( 0 , 0 , MyIcon);

SpeedButton1.Hint := strFileName;

finally
MyIcon.Free;
MyBitMap.Free;
end;
end;

Чтобы преобразовать Icon в Bitmap, используйте TImageList. Для обратного преобразования замените метод AddIcon на Add, и метод GetBitmap на GetIcon.

function Icon2Bitmap(Icon: TIcon): TBitmap;
begin
with TImageList.Create ( nil ) do
begin
AddIcon (Icon);
Result := TBitmap.Create;
GetBitmap ( 0 , Result);
Free;
end;
end;

10. Конвертирование JPG в BMP.

uses
JPEG;

procedure JPEGtoBMP( const FileName: TFileName);
var
jpeg: TJPEGImage;
bmp: TBitmap;
begin
jpeg := TJPEGImage.Create;
try
jpeg.CompressionQuality := 100 ; {Default Value}
jpeg.LoadFromFile(FileName);
bmp := TBitmap.Create;
try
bmp.Assign(jpeg);
bmp.SaveTofile(ChangeFileExt(FileName, '.bmp' ));
finally
bmp.Free;
end;
finally
jpeg.Free;
end;
end;

Мы рассмотрели способы конвертирования различных графических форматов. Все они достаточно просты.

Скачать данную статью


Присылайте свои статьи по адресу info@delphi.int.ru с темой 'Articles' (без кавычек), и они будут опубликованы в ближайших выпусках рассылки и на сайте. Также вы можете заполнить вот эту форму. Большая просьба: статью оформляйте в -txt или -doc формате и используйте -zip или -rar сжатие (без самораспаковки).


Файловый архив.

Из данного раздела Вы можете скачать различные файлы: компоненты, plug-in'ы для Delphi, документацию по программированию, программы, игры, написанные на Delphi и всё остальное... Вы можете добавить свои файлы в данный раздел. Чтобы сделать это, пожалуйста, заполните форму на сайте. Новые файлы на сайте:

Название / описание файла
Категория
Объём
Ссылки
Один из примеров к книге Марко Кэнту "Mastering Delphi 6". В архиве два проекта. Один - программа позволяющая перетаскивать на свою форму файлы. Другой - обработчик контекстного меню, отправляющий файлы в эту программу.
Файлы вопросов
12.4 Кб
MxSymbolDlg - компонент, выводящий окно вставки символа. Окно похоже на соответствующее из MS Word и стандартной утилиты "Таблица символов". Очень удобный диалог.
Компоненты
306 Кб
Software Compress - программа предназначена для упаковки и одновременной защиты EXE файлов ваших программ при полном сохранении работоспособности защищенного и упакованного исполняемого файла. Степень сжатия в бесплатной Lite-версии позволяет сжать исходный файл примерно в 2 раза, в FULL-версии степень сжатия ещё выше, что делает Software Compress уникальной программой для сжатия и защиты EXE файлов на сегодняшний день. Степень защиты достаточно высока для того, чтобы предотвратить дизассемблирование и прямое пропатчивание защищенного EXE файла, что значительно снизит возможность появления crack'ов к вашей программе !
Программы
495 Кб
Статья, в которой рассматриваются способы конвертирования графических форматов.
Статьи
4.79 Кб

Чтобы перейти к разделу "Файловый архив" на сайте, нажмите на эту ссылку.


Дружественные сайты.

Здесь представлены ссылки на дружественные сайты нашего портала. Если вы тоже хотите стать нашим другом, разместите наш баннер на своём сайте. Подробнее о том, как это сделать, можно прочитать на странице данного раздела на нашем сайте. Узнать о всех наших друзьях более подробно вы сможете на той же странице...


http://infomania2004.webhost.ru/ - Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом.


http://www.visualbasic.noka.ru/ - Программирование на Visual Basic & Basic. На сайте Вы найдете множество примеров, статьи, исходники, ActiveX, а также многое другое!


http://www.sashook.nm.ru/ - Игры, коллекция флешек, обои и заставки, компьютерные приколы, картинки, тосты и алкогольные присказки, смешные истории и анекдоты.


http://www.ssgroup.fatal.ru/ - Delphi 39. Ресурс для программистов. Статьи, исходники, компоненты, учебники, справочники, FAQ, программы и многое другое.


http://www.hkdsoft.narod.ru/ - H.K.D. Soft - Программирование на Delphi, C/C++, Assembler, Pascal, Basic/VB/VBA/VBS. Компоненты, статьи, исходники, множество е-книг, форум. Бесплатный софт. Скачать программу GamesBase - базу данных по играм содержащую описания, скриншоты, коды, прохождения игр.


Дружественные рассылки:

Рассылки Subscribe.Ru :: Программирование
Интернет для Delphi-программиста
X-Program ПО, новости сайта и программирование в Delphi7
Visual Basic для новичков и профессионалов
Поиск текстов, переводов и аккордов песен
   

 


Юмор.

Умирает, значит, программист. Попадает, понятное дело, в
рай: мученик, как никак. Там ему архангел Гавриил и
говорит: "Спрашивай, - говорит, - чего хочешь, на любой вопрос
отвечу". Такая вот золотая рыбка с крыльями. Hу программист,
ясное дело, сразу просит показать небесный сервак. Приводит его
Гавриил в серверную, включает экран. Смотрит, смотрит
программист, а потом как заорет: "Да это же винда!"
-Hу да, - отвечает Гавриил, - А ты чего хотел, Hетварь, что-ли?
И пятый сиквел сервер базой данных?
-Ясное дело
-А софт на каком-нибудь бэйсике написан?
-Hе на каком-нибудь, а на вижуал!
-Так оно все, небось, глюкует страшно?
-А ты думал, вы от хорошей жизни по восемь часов в сутки дрыхнете? Это мы по ночам перегружаемся!

:))

Анекдот прислал: Костик Z. Берите пример, а то у меня уже ничего не осталось для публикации :(


Пожалуйста, присылайте свои анекдоты по этой ссылке: info@delphi.int.ru и они обязательно будут опубликованы! Желательно на компьютерную тему.

Товарищи программисты! Проявляйте свою активность. Давайте помогать друг другу!
Если вы не нашли ответа на свой вопрос, не отчаивайтесь! Количество подписчиков постоянно растёт и, наверняка, найдётся тот человек,
который поможет вам! На сегодня всё. До встречи через неделю!
Ведущий рассылки, Ерёмин Андрей.

Вы можете оказать помощь нашему проекту через систему WebMoney:
R760630419845
Z947123691104
Будем очень благодарны!

 

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

В избранное