Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Result := True;
end;
end;
functionEncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
begin
if notDoEncodeTime(Hour, Min, Sec, MSec, Result) thenConvertError(LoadStr(STimeEncodeError));
end;
Как вы можете видеть, проверка Time24Hour присутствует. Я думал в Browser все будет также. Ничего подобного! Я уж грешным делом подумал, что Time24Hour объявили устаревшим, исключили из поддержки, выбросили частично из кода, но забыли почистить файл помощи. Вы так не думаете?
Переменная времени
Delphi 1
Используйте переменную типа TDateTime.
procedureTForm1.XXXXXXXClick(Sender: TObject);
varStartTime, EndTime, ElapsedTime :TDateTime;
begin
StartTime := Now;
{Здесь поместите свой код}
EndTime := Now;
ElapsedTime := EndTime - StartTime;
Label1.Caption := TimeToStr(ElapsedTime);
end;
{теперь все это в памяти, но в нашем случае это хорошее место. }
var
before,after,elapsed : TDateTime;
Ehour, Emin, Esec, Emsec : WORD;
…
before := now;
some_process();
after := now;
elapsed := after - before;
decodetime(elapsed, Ehour, Emin, Esec, Emsec);
теперь Ehour:Emin:Esec.Emsec будет содержать истекшее время.
Это то, что я хотел. fStartWhen содержит дату/время начала процесса. (fStartWhen := NOW). OneSecond — константа, определенная как 1/24/3600. (Да, эта программа может выполняться для нескольких дней. Но даже самый быстрый P5 может не справиться с большим количеством данных!)
PROCEDURE TformDBLoad.UpdateTime;
VAR Delta: TDateTime
BEGIN
fLastUpdate := NOW
IFABS(fStartWhen - fLastUpdate ) < OneSecond THEN EXIT
Delta := fLastUpdate - fStartWhendoElapsedTime.Caption := FORMAT('%1. дней из %s', [INT(Delta),FORMATDATETIME('hh:nn:ss', FRAC(Delta))])
END;
Математика
Как научить Delphi делать правильное округление дробных чисел?
Nomadicсоветует:
Целая коллекция способов -
Для решения этой проблемы мною написана функция, которую можно модифицировать для всех случаев. Смысл заключается в том, что рассматривается строка. После этого все проблемы с округлением снялись.
FunctionRoundStr(Zn:Real;kol_zn:Integer):Real;
{Zn-значение; Kol_Zn-Кол-во знаков после запятой}
Var
snl,s,s0,s1,s2: String;
n,n1:Real;
nn,i:Integer;
begin
s:=FloatToStr(Zn);
if(Pos(',',s)>0) and(Zn>0) and(Length(Copy(s,Pos(',',s)+1,length(s)))>kol_zn) then begin
s0 := Copy(s,1,Pos(',',s)+kol_zn-1);
s1 := Copy(s,1,Pos(',',s)+kol_zn+2);
s2 := Copy(s1,Pos(',',s1)+kol_zn,Length(s1));
n := StrToInt(s2)/100;nn := Round(n);
ifnn >= 10 then begin
snl := '0,';
Fori := 1 tokol_zn - 1 dosnl := snl + '0';
snl := snl+'1';
n1 := StrToFloat(Copy(s,1,Pos(',',s)+kol_zn))+StrToFloat(snl);
s := FloatToStr(n1);
ifPos(',',s) > 0 thens1 := Copy(s,1,Pos(',',s)+kol_zn);
end elses1 := s0 + IntToStr(nn);
ifs1[Length(s1)]=',' thens1 := s1 + '0';
Result := StrToFloat(s1);
end elseResult := Zn;
end;
Все-таки работа со строками здесь излишество -
functionRoundEx( X: Double; Precision : Integer ): Double;
{Precision : 1 - до целых, 10 - до десятых, 100 - до сотых...}
var
ScaledFractPart, Temp : Double;
begin
ScaledFractPart := Frac(X)*Precision;
Temp := Frac(ScaledFractPart);
ScaledFractPart := Int(ScaledFractPart);
ifTemp >= 0.5 thenScaledFractPart := ScaledFractPart + 1;
ifTemp <= -0.5 thenScaledFractPart := ScaledFractPart - 1;
RoundEx := Int(X) + ScaledFractPart/Precision;
end;
Разное
Генерация еженедельных списков задач
Мне необходима программа, которая генерировала бы еженедельные списки задач. Программа должна просто показывать количество недель в списке задач и организовывать мероприятия, не совпадающие по времени. В моем текущем планировщике у меня имеется 12 групп и планы на 11 недель.
Мне нужен простой алгоритм, чтобы решить эту проблему. Какие идеи?
Вот рабочий код (но вы должны просто понять алгоритм работы):
unitUnit1;
interface
usesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
typeTForm1 = class(TForm)
ListBox1: TListBox;
Edit1: TEdit;
Button1: TButton;
procedureButton1Click(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
varForm1: TForm1;
implementation
{$R *.DFM}
constmaxTeams = 100;
var
Teams: Array[1..maxTeams] ofinteger;
nTeams, ix, week, savix: integer;
functionWriteBox(week: integer): string;
var
str: string;
ix: integer;
begin
Result := Format('Неделя=%d ',[week]);
forix := 1 tonTeams do begin
ifodd(ix) thenResult := Result+' '
elseResult := Result+'v';
Result := Result+IntToStr(Teams[ix]);
end;
end;
procedureTForm1.Button1Click(Sender: TObject);
begin
nTeams := StrToInt(Edit1.Text);
ifOdd(nTeams) theninc(nTeams); {должны иметь номера каждой группы}
ListBox1.Clear;
forix := 1 tonTeams doTeams[ix] := ix;
ListBox1.Items.Add(WriteBox(1));
forweek := 2 tonTeams-1 do begin
Teams[1] := Teams[nTeams-1]; {используем Teams[1] в качестве временного хранилища}
forix := nTeams downto2 do if notOdd(ix) then begin
savix := Teams[ix];
Teams[ix] := Teams[1];
Teams[1] := savix;
end;
forix := 3 tonTeams-1 do ifOdd(ix) then begin
savix := Teams[ix];
Teams[ix] := Teams[1];
Teams[1] := savix;
end;
Teams[1] := 1; {восстанавливаем известное значение}
ListBox1.Items.Add(WriteBox(week));
end;
end;
end.
Генерация случайного пароля
The_Sprite советует:
Вам понадобилось, чтобы Ваше приложение само создавало пароли ? Возможно данный способ Вам пригодится. Всё очень просто: пароль создаётся из символов, выбираемых случайным образом из таблицы.
Совместимость: Delphi 5.x (или выше)
Собственно сам исходничек: Пароль создаётся из символов, содержащихся в таблице.
Внимание: Длина пароля должна быть меньше, чем длина таблицы!
// запускаем генератор случайных чисел (только при старте приложения).
procedureTForm1.FormCreate(Sender: TObject);
begin
Randomize;
end;
functionRandomPwd(PWLen: integer): string;
// таблица символов, используемых в пароле
Интервал:
Закладка: