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

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


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

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

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

Выпуск № 225
от 01.09.2005, 19:23

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


Вопрос № 25372: Вопрос по DDE - полдня мучаюсь и уже ничего не соображаю. Почему следующий код: conv : TDdeClientConv; item : TDdeClientItem; procedure ese(Sender : TObject); //---------------------------------------- procedure TForm1.FormCreate(...
Вопрос № 25374: Как перемножать и делить на десятичное число вида *,* и получать результат вида ***,**???...
Вопрос № 25377: Доброго времени суток. Мне доконца не ясно, как и в каких случаях использовать TRY...EXCEPT и TRY....FINALLY, если можно объясните поподробней и небольшой примерчик вложите. Thanks............
Вопрос № 25390: Добрый день, уважаемые эксперты. Можно ли поменять caption(перевести на другой язык) кнопок у savedialog/opendialog? Спасибо....
Вопрос № 25398: Как мне можно определить что сейчас от 08:00 до 22:00 и от 22:00 до 08:00? Время я форматирую в вид 00:00:00.000 и прикрепляю к Label.Caption! Как определить что сейчас именно больше 8 но меньше 22 при таких условиях?...
Вопрос № 25404: Добрый день, Bob Johnson! Если я правельно понял, то должно быть procedure TForm1.OpenDialog1Show(Sender: TObject); begin setwindowtext(GetDlgItem(getparent(?????),IDOK),'open'); end; Что-должно быть вместо ????.. ? И...
Вопрос № 25409: Уважаемые эксперты! К примеру я получаю результат 2,8 часа(string) или 168 минут, а я хочу в итоге получить результат вида 2 часа 48 минут! Как это осуществить! Зарание спасибо....

Вопрос № 25.372
Вопрос по DDE - полдня мучаюсь и уже ничего не соображаю. Почему следующий код:
conv : TDdeClientConv;
item : TDdeClientItem;
procedure ese(Sender : TObject);
//----------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
conv := TDdeClientConv.Create(NIL);
conv.DataMode := ddeAutomatic;
if conv.SetLink('Service', 'Topic') then
begin
item := TDdeClientItem.Create(NIL);
item.DdeConv := conv;
item.DdeItem := 'Item';
item.OnChange := ese
end;
end;
procedure TForm1.ese;
begin
Label1.Caption := item.Text
end;

работает и событийная процедура ese вызывается, а в приведённом ниже в приложении событие onchange не хочет вызываться?
Думаю, что ошибку я сделал логическую, поэтому и не называю используемые Service, Topic, Item. Отмечу, что item в коде выше может быть любым из Item в коде из приложения.
Если всё же понадобятся используемые Service, Topic, Item, то напишу их в мини-форум.
Спасибо

Приложение:

Отправлен: 26.08.2005, 21:31
Вопрос задал: mvp (статус: 3-ий класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: sir henry
Здравствуйте, mvp!
Скажите, а событие OnChange у Вас к какому компоненту относится? Может быть, если Вы при присваивании укажите OnChange вместе с именем компонента полностью, оно у Вас заработает? :)
Мне кажется Вы вызываете неприсвоеный OnChange, поэтому он у Вас ничего и не делает. Просто компилятор не понял, КАКОМУ компоненту принадлежит событие OnChange. :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 28.08.2005, 17:48
Оценка за ответ: 3


Вопрос № 25.374
Как перемножать и делить на десятичное число вида *,* и получать результат вида ***,**???
Отправлен: 26.08.2005, 21:49
Вопрос задал: Малярчук Андрей (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: John Freeman
Здравствуйте, Малярчук Андрей!
Help по функции Format а из строк в число StrToFloat, например так:
var
string1:string='1,42';
string2:string='4,42';
stringresult:String;
begin
stringresult:=Format('%-3.3f',[strtofloat(string1)*strtofloat(string2)]);
end;
Но эта функция нулями не дополняет слева, так что это уже руками, что, впрочем, не сложно...


---------
Ik bin ulien spiegel!
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 26.08.2005, 22:31
Оценка за ответ: 5

Отвечает: Zubex
Здравствуйте, Малярчук Андрей!
Существует функция FormatFloat - почитайте в хелпе об ее использовании.
На случай если у клиента в системе разделитель дробной части запятая, в секции
Initialization надо установить свой разделитель DecimalSeparator, также можно использовать GetLocaleFormatSettings - читайте хелп.

Смотрите пример в приложении.

Удачи!

Приложение:

Ответ отправил: Zubex (статус: 2-ой класс)
Отправлен: 27.08.2005, 00:37
Оценка за ответ: 4

Отвечает: Ерёмин Андрей
Здравствуйте, Малярчук Андрей!
Собственно, а в чём проблема? Объявляете переменную типа Real и делаете с дробными числами всё, что угодно:

var a,b,c: real;
begin
a:=256.14;
b:=784.23;
c:=a*b;


Значение переменной c станет равным 200872,6722.
---------
Мышка побежала, xвостиком махнула - cервер упал...
Ответ отправил: Ерёмин Андрей (статус: Практикант)
Отправлен: 27.08.2005, 12:58

Отвечает: sir henry
Здравствуйте, Малярчук Андрей!
Вы имеете в виду числа с плавающей запятой? В памяти они всегда хранятся в одном и том-же виде. То о чем Вы пишете называется ПРЕДСТАВЛЕНИЕ ЧИСЛА. В этом Вам поможет следующая функция:
Format('%N.Mf', [значение]);
где
% - служебный символ форматирования;
N - общее количество знаков;
M - количество знаков после запятой;
f - служебный символ, говорящий функции о том, что значение - число с плавающей точкой.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 28.08.2005, 17:46


Вопрос № 25.377
Доброго времени суток.
Мне доконца не ясно, как и в каких случаях использовать TRY...EXCEPT и
TRY....FINALLY, если можно объясните поподробней и небольшой примерчик вложите. Thanks.........
Отправлен: 26.08.2005, 22:47
Вопрос задал: Баркин Алексей (статус: 1-ый класс)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: X
Здравствуйте, Баркин Алексей Михайлович!
Если между try и EXCEPT возникает исключение, то выполняеться то, что находиться между except и end.
См. пример 1.
То что расположено между finally и end выполняеться в любом случае, независимо от того, произошло исключение или нет. Обычно между finally и end уничтажаються объекты, освобождаеться память.
См. пример 2.

Приложение:

Ответ отправил: X (статус: 8-ой класс)
Отправлен: 26.08.2005, 23:19

Отвечает: Yадозuпп
Здравствуйте, Баркин Алексей Михайлович!

TRY...EXCEPT содержит в себе потенциально опасный участок кода (блок TRY) и способ решения ошибки (блок EXCEPT). Иногда добавляют блок ELSE - этот код выполняется в том случае, когда ошибок не было. Типичнейший пример - работа с файлом (в том случае, когда использование FileExist неприменимо почему либо)

var F:TextFile;
MyString: string;

try
Reset (f); // при отсутствии файла здесь случится ошибка
except
Rewrite (f); // исправляем ошибку
end;

WriteLn (f, MyString); // поэтому эта строка всегда будет выполняться правильно (если есть место на диске)

Важно помнить, что в блоке try управление переходит в блок except при ошибке в любой строке, поэтому и реакция должна быть всеобъемлющая. Или близкая к этому.

Блок try...finally намного проще - блок try по-прежнему содержит потенциально опасный код, а вот блок finally будет выполняться всегда и независимо от отсутствия или присутствия ошибок

var F:TextFile;
MyString: ^string;

begin
New (MyString); //по моему, так создается новая динамическая переменная :)

try
Reset (f); // при отсутствии файла здесь случится ошибка
except
Rewrite (f); // исправляем ошибку
end;

WriteLn (f, MyString^); // поэтому эта строка всегда будет выполняться правильно (если есть место на диске)

finally
Dispose (MyString) // отведенную память мы в любом случае должны вернуть в систему, даже если у нас произошла ошибка
end
---------
Жизнь прожить - это вам не в тапки гадить
Ответ отправил: Yадозuпп (статус: 4-ый класс)
Отправлен: 27.08.2005, 00:09

Отвечает: Denis Hakimov
Здравствуйте, Баркин Алексей Михайлович!
этот блок нужен для обработки ситуаций, которые могут вызвать ошибки в программе (как логические так и времени выполнения). Поместите после ключевого слова TRY операторы, в которых может пролизойти ошибка.
Затем после слова EXCEPT поместите ссылку на обработчики разных исключительных ситуаций (т.е. ошибок), для этого нужно знать классы возможных исключ. ситуаций (например: EInOutError- ошибка в работе с файлами, EDivByZero- ошибка при делении на ноль, и др.) ссылка помещается вот так:
EXCEPT <Имя класса исключительной ситуации> ON <список операторов, выпорлняемых, если такая ситуация возникла>.
Если же вы не хотите искать описание всех классов, то используйте мою любимую конструкцию

TRY
...<здесь любой код>...
EXCEPT
...<здесь ссылка на обработчик иск. ситуаций>...
ELSE
...<тут код, который выполнится в случае "неизвестной" ошибки, т.е. не имеющей своего класса>...
FINALLY
...<здесь код, который будет выполнен в любом случае - возникнет ошибка или нет>...
END;
Ответ отправил: Denis Hakimov (статус: 2-ой класс)
Отправлен: 27.08.2005, 11:58

Отвечает: Ерёмин Андрей
Здравствуйте, Баркин Алексей Михайлович!
Блок try..except следует использовать в том случае, если определённый код в процессе выполнение может вызвать ошибку, а Вам нужно эту ошибку предотвратить (т.е. не показывать). Блок try..finally позволяет выполнить определённые действия только в том случае, если предыдущий код в процессе выполнение не вызвал ошибок. Конкретные варианты (вроде деления на ноль) расписывать не буду, покажу лишь общие схемы:

try
*какие-то действия*
except
ShowMessage('Невозможно выполнить операции.');
Abort;
end;


В данном блоке будет выполнен код, заключённый между try и except. Если в процессе выполнения кода возникнет ошибка, то выполнение прервётся и появится сообщение "Невозможно выполнить операции" вместо стандартного Windows-сообщение об ошибке с характерным звуком.

try
*какие-то действия*
finally
ShowMessage('Операции выполнены.');
Abort;
end;


В данном случае появится сообщение "Операции выполнены" только в том случае, если код выполнится без ошибок.

Удачи!
---------
Мышка побежала, xвостиком махнула - cервер упал...
Ответ отправил: Ерёмин Андрей (статус: Практикант)
Отправлен: 27.08.2005, 13:04

Отвечает: Delphin
Здравствуйте, Баркин Алексей Михайлович!
try, except Использует для отлова сообщений об ошибке.
try, finally Использует для выполнения действия вслучае если нет ошибки.
Ну вот специально написанный неправильный код
Var
Str: TStringList;
Begin
Try
Str.Create( ); // Надо Str := TStringList.Create( );
except
ShowMessage( 'Ошибка создания списка строк.!' ); // Действия от ошибки.
end;

а можно так:
Var
Str: TStringList;
Begin
Try
Str := TStringList.Create( );
finally
ShowMessage( 'Спсиок строк создан успешно!' ); // Действия если нет ошибки.
end;
а ожно так:
try
try
Str := TStringList.Create( );
except
ShowMessage( 'Ошибка создания списка строк.!' ); // Действия от ошибки.
end;
finally
ShowMessage( 'Спсиок строк создан успешно!' ); // Действия если нет ошибки.
end;

Между Try.. end можно заключать любые действия. Вслучае ошибки обработка пойдет на Try если нет то на Finally.
Думаю понятно?
---------
Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 8-ой класс)
Отправлен: 27.08.2005, 15:35

Отвечает: sir henry
Здравствуйте, Баркин Алексей Михайлович!
Я думаю примерчики Вам уже привели. :)
Хочу дополнить ответы. TRY..EXCEPT..FINALLY - это обработка ошибок выполнения кода. Если нет этих конструкций, то программа просто завершает выполнение с сообщением, что выпала такая-то ошибка.
TRY..EXCEPT лучше использовать когда обрабатываются какие-либо определенные ошибки. Классов ошибок очень много и перечислить их будет затруднительно, например есть ошибка деления на ноль, ошибка преобразования типов данных и т.п.
Код, могущий привести к ошибке пишется между TRY и EXCEPT. Обработка же самой ошибки (от простого вывода сообщений типа ShowMessage('Нет, так не пойдет'), до обработки конкретной ошибки on EDivByZero do ShowMessage('Вы пытаетесь поделить на ноль. Хи-хи!')) заключается между EXCEPT и END.
У TRY..FINALLY..END несколько другое назначение. Функции и процедурц, стоящие между FINALLY и END выполняются ВСЕГДА, независимо от того, возникла ошибка или нет.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 28.08.2005, 18:08


Вопрос № 25.390
Добрый день, уважаемые эксперты.
Можно ли поменять caption(перевести на другой язык) кнопок у savedialog/opendialog?
Спасибо.
Отправлен: 27.08.2005, 11:33
Вопрос задал: Граур Василий Олегович (статус: 1-ый класс)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: X
Здравствуйте, Граур Василий Олегович!
Можно - свойство Title.

Приложение:

Ответ отправил: X (статус: 8-ой класс)
Отправлен: 27.08.2005, 11:51
Оценка за ответ: 2
Комментарий оценки:
Не то. Мне нужно переименовать названия кнопок:Открыть на Open
Отмена на Cancel и тд

Отвечает: John Freeman
Здравствуйте, Граур Василий Олегович!
Стандартными средствами - нет, тк к Delphi это вообще отношения не имеет, это системный диалог, можно поменять хаком в памяти, но это неудобно, так что лучше просто взять для этого какой-нибудь сторонний компонент.
---------
Ik bin ulien spiegel!
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 27.08.2005, 13:08

Отвечает: Ерёмин Андрей
Здравствуйте, Граур Василий Олегович!
Нет, нельзя. Эти диалоги не создаются модулями Delphi. Они берутся из Windows. Поэтому, если Windows английская, то и диалоги будут английские. Ну а если китайская, то и диалоги будут китайские :) Если очень нужно, Вы можете создать своё окно, похожее на диалог, однако это достаточно трудно (а точнее муторно). Удачи!
---------
Мышка побежала, xвостиком махнула - cервер упал...
Ответ отправил: Ерёмин Андрей (статус: Практикант)
Отправлен: 27.08.2005, 13:10

Отвечает: Bob Johnson
Здравствуйте, Граур Василий Олегович!
На самом деле можно, совсем несложно и без каких-либо хаков.
TOpenDialog - это обертка над Windows Common Dialog Box, который вызывается по GetOpenFileName. У TOpenDialog есть событие OnShow, в обработчик которого надо включить следующий код (я пишу на С++, но несложно переделать это и под дельфи):
void __fastcall TForm1::odShow(TObject *Sender)
{
TOpenDialog *od = (TOpenDialog*)Sender;
HWND hdialog = GetParent (od->Handle);
HWND hwnd = GetDlgItem (hdialog, IDOK);
SetWindowText (hwnd, "Open");
}

Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 27.08.2005, 15:34

Отвечает: Delphin
Здравствуйте, Граур Василий Олегович!
Создать вручную :-) А так это зависит от от самой Windows.
---------
Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 8-ой класс)
Отправлен: 27.08.2005, 15:36

Отвечает: Силантьев Евгений Александрович
Здравствуйте, Граур Василий Олегович!
Если сильно захотеть то все возможно! :)
Вот как это сделать:
1. Меняем имя Диалога на более "экзотическое" (этот шаг не обязателен, но желателен так как при поиске окна мы будем использовать его заголовок - чем более он оригенален тем меньше вероятность совпадения с другим заголовком)
2. Открываем Диалог
В обработке события Диалога OnShow делаем следующие:
3. Получаем хэндл Диалога (он нужен для следующего шага)
4. Получаем хэндл Кнопки
5. Посылаем кнопке сообщение WM_SETTEXT
(Пример в приложение)

Приложение:

---------
The world is mine! :)

Ответ отправил: Силантьев Евгений Александрович (статус: 3-ий класс)
Отправлен: 27.08.2005, 17:00
Оценка за ответ: 5


Вопрос № 25.398
Как мне можно определить что сейчас от 08:00 до 22:00 и от 22:00 до 08:00?
Время я форматирую в вид 00:00:00.000 и прикрепляю к Label.Caption!
Как определить что сейчас именно больше 8 но меньше 22 при таких условиях?
Отправлен: 27.08.2005, 14:10
Вопрос задал: Малярчук Андрей (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Малярчук Андрей!
Можно вот так например:

Var D: TDateTime; Hour,Min,Sec,MSec: Word;
begin
D:=Now;
DecodeTime(D,Hour,Min,Sec,MSec);
If (Hour >= 8) And (Hour <= 22) Then
ShowMessage('Текущее время - более 08:00, но менее 22:00.')
Else ShowMessage('Текущее время - более 22:00, но менее 08:00.');


Удачи!
---------
Мышка побежала, xвостиком махнула - cервер упал...
Ответ отправил: Ерёмин Андрей (статус: Практикант)
Отправлен: 27.08.2005, 14:36

Отвечает: Denisss
Здравствуйте, Малярчук Андрей!
Cмотрите приложение.
Hrs - число часа
Now - текущее время, дата

Приложение:

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

Отвечает: Граур Василий Олегович
Здравствуйте, Малярчук Андрей!
const ss=['0'..'9'];
var st:string;
i:integer;
f:boolean;
y:integer;
data:array of integer;
begin
label1.Caption:=timetostr(time);
f:=false;
st:=label1.Caption;
y:=1;
st:=st+'.';
for i:=1 to length(st) do
if not (st[i] in ss) then
begin
setlength(data,length(data)+1);
data[length(data)-1]:=strtoint(copy(st,y,i-y));
y:=i+1;
end;
if (data[0]>8) and (data[0]<22) then f:=true;
if (data[0]=8) and ((data[1]>0) or (data[2]>0) or (data[3]>0) ) then f:=true;
if f then begin
showmessage('true');
end;

end;
Ответ отправил: Граур Василий Олегович (статус: 1-ый класс)
Отправлен: 27.08.2005, 15:58

Отвечает: Zubex
Здравствуйте, Малярчук Андрей!
В модуле System TDateTime описывается следующим образом:

type TDateTime = type Double;

отсюда и ответ: преобразовываешь строку a:=StrToDateTime('08:00'), b:=StrToDateTime('22:00')
далее сравниваешь if (now>a) and (now<b) then ShowMessage('от 8:00 до 22:00')
Ответ отправил: Zubex (статус: 2-ой класс)
Отправлен: 28.08.2005, 17:13

Отвечает: sir henry
Здравствуйте, Малярчук Андрей!
1. Получаете текущее время с помощью GetTime.
2. Расшифровываете результат с помощью процедуры DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);
3. Ну а уж как дальше действовать - понятно даже и ежу. :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 28.08.2005, 19:09


Вопрос № 25.404
Добрый день, Bob Johnson!
Если я правельно понял, то должно быть
procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
setwindowtext(GetDlgItem(getparent(?????),IDOK),'open');
end;
Что-должно быть вместо ????.. ?
И если я правельно понял, то IDOk для кнопки Открыть.
Для отмены скорее всего будет IDCancel.
А где найти ID для : имя файла
тип файлов
папка
Спасибо.
Отправлен: 27.08.2005, 16:40
Вопрос задал: Граур Василий Олегович (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Bob Johnson
Здравствуйте, Граур Василий Олегович!
Вместо ???? должно стоять свойство Handle твоего OpenDialog. Если данный обработчик ты будешь использовать только совместно с одним opendialog, то можешь прямо написать вместо ???? OpenDialog1.Handle. Если же у тебя будет несколько разных opendialog, и во всех них ты захочешь поменять текст, то тогда тебе необходимо узнавать, какой из них вызвал этот обработчик с помощью параметра sender. вроде в дельфи это делается так:

var dialog : TOpenDialog;
begin
dialog = Sender as TOpenDialog.
...

Еще, я немного посмотрел доки и нашел, что если opendialog был создан с флагом OFN_EXPLORER, то менять текст его элементов можно еще проще с помощью макроса CommDlg_OpenSave_SetControlText. в дельфи вероятно такого макроса не будет, но это не страшно, т.к. он просто посылает сообщение, подробности в приложении. Там же и ID стандартных контролов.

Приложение:

Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 27.08.2005, 17:17
Оценка за ответ: 5


Вопрос № 25.409
Уважаемые эксперты! К примеру я получаю результат 2,8 часа(string) или 168 минут, а я хочу в итоге получить результат вида 2 часа 48 минут! Как это осуществить! Зарание спасибо.
Отправлен: 27.08.2005, 18:02
Вопрос задал: Малярчук Андрей (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Малярчук Андрей!
Если я правильно понял вопрос, то это можно осуществить следующим образом:

Var Res: String; Res0,Hours,Minutes: Integer;
begin
Res:='168 минут';
Res0:=StrToInt(Copy(Res,1,Pos(' ',Res)-1));
Hours:=Res0 div 60;
Minutes:=Res0 mod 60;
Res:=IntToStr(Hours)+' часа '+IntToStr(Minutes)+' минут.';
Caption:=Res;


P.S. Не забывайте оценивать ответы.
---------
Мышка побежала, xвостиком махнула - cервер упал...
Ответ отправил: Ерёмин Андрей (статус: Практикант)
Отправлен: 27.08.2005, 18:19

Отвечает: Баркин Алексей
Здравствуйте, Малярчук Андрей!
Можно решить так:

Hour:=168 div 60;
Min := 168 mod 60;

//div и mod не работает с дробными числами так что либо обрезай или иди через //секунды, тогда правый операнд буд. 3600;
Ответ отправил: Баркин Алексей (статус: 1-ый класс)
Отправлен: 27.08.2005, 20:12

Отвечает: Граур Василий Олегович
Здравствуйте, Малярчук Андрей!
Если 2.8(string) то
ss=[0..9];
for i:=1 to length(st){st-string с 2.8} do
if not (st[i] in ss) then
begin
sr:=copy(st,1,i-1);{часы strtoint для перевода в integer}
delete(st,1,i);
x:=strtoint(st);
y:=x;{y типа real}
for j:=1 to length(st) do
y:=y/10;
y:=y*60;{минуты};
break;
end;
если
168(string) то x:=strtoint(s168);
x div 60{часы}
x mod 60{минуты}
Ответ отправил: Граур Василий Олегович (статус: 1-ый класс)
Отправлен: 27.08.2005, 20:30

Отвечает: Силантьев Евгений Александрович
Здравствуйте, Малярчук Андрей!
Можно так:
Часы:= количество минут div 60;
Минуты:= количество минут mod 60;

---------
The world is mine! :)
Ответ отправил: Силантьев Евгений Александрович (статус: 3-ий класс)
Отправлен: 27.08.2005, 20:58

Отвечает: sir henry
Здравствуйте, Малярчук Андрей!
Для дробного часа:
1. Переводим string в число с плавающей точкой fl:=StrToFloat('2,8');
2. Получаем целую и дробную часть числа:
chas:=Trunc(fl);
minutes:=Frac(fl);
3. Получаем нормальные минуты minutes_int:=Round(minutes*60);
4. Caption:=IntToStr(chas)+' часа '+IntToStr(minutes_int)+' минут'.
Для преобразования из минут:
1. Сначала получаем дробный час dr_chas:=StrToInt('168')/60;
2. Далее делаем как указано выше, с пункта 2 ... :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 28.08.2005, 19:32

Отвечает: Козлов Николай Николаевич
Здравствуйте, Малярчук Андрей!
Писал я давно вот эту функцию. Работало. См. приложение
Она из числа минут переводит в строку вида ЧЧ:ММ, причем добавляет необходимые нули.

Приложение:

Ответ отправил: Козлов Николай Николаевич (статус: 1-ый класс)
Отправлен: 30.08.2005, 13:22


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

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

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

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

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


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


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

Яндекс


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

В избранное