![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
День добрый. Интересует алгоритм работы такой программулины, кто чем сможет, выручите пожалуйста, желательно уже код.
Есть файлик data.ini в ней записи вида: Василий;9:05:48;Пришел Николай;12:03:57;Пришел Василий;15:03:12;Ушел Василий;17:45:00;Пришел Николай;18:00:00;Ушел Василий;18:01:00;Ушел Как мы видим, Василий(на его примере нужно), был на работе с 9ти утра до 15 дня, и с 17,45 до 6ти вечера. Программка должна нарисовать прямую,(а-ля график суток(прямую 2 часа)), и на ней закрасить те часы, в которые Вася был на работе. Вроде как то с canvas.LineTo можно сделать, но никак не пойму как. Заранее спасибо |
|
#2
|
||||
|
||||
|
canvas.rectangle
|
|
#3
|
||||
|
||||
|
|
|
#4
|
||||
|
||||
|
Чуть чуть АП тему)). Все же, кто может помочь куском кода, которая с тхт выбирает нужного человека(Васю) и мастрячит график времени?
|
|
#5
|
||||
|
||||
|
Цитата:
Прочитать текстовый файл? Используй TStringList. Рисовать график? Используй методы Canvas: MoveTo, LineTo, Rectangle и т.п. Или что не получается? |
|
#6
|
||||
|
||||
|
Ему надо кусок кода.
|
|
#7
|
||||
|
||||
|
Цитата:
Написал ещё позавчера, но не выкладывал, надеялся что он сам справится: Код:
type
TDataItem = record
Name: String;
Time: TTime;
IsEnter: Boolean;
end;
TDataList = array of TDataItem;
var
DataList: TDataList;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
slData, slNames, slLine: TStringList;
i: Integer;
begin
if OpenDialog1.Execute then
begin
ListBox1.Clear;
slData := TStringList.Create;
try
slData.LoadFromFile(OpenDialog1.FileName);
SetLength(DataList, slData.Count);
slNames := TStringList.Create;
try
slNames.Duplicates := dupIgnore;
slNames.Sorted := True;
slLine := TStringList.Create;
try
slLine.Delimiter := ';';
for i := 0 to slData.Count - 1 do
begin
slLine.DelimitedText := slData[i];
slNames.Add(slLine[0]);
DataList[i].Name := slLine[0];
DataList[i].Time := StrToTime(slLine[1]);
DataList[i].IsEnter := AnsiSameText(slLine[2], 'пришел');
end;
finally
slLine.Free;
end;
ListBox1.Items.Assign(slNames);
finally
slNames.Free;
end;
finally
slData.Free;
end;
end;
end;
procedure DrawTime(Canvas: TCanvas; aRect: TRect; Name: String);
var
EnterTime, ExitTime: TTime;
i, aWidth: Integer;
begin
Canvas.Pen.Color := clBlack;
Canvas.Brush.Color := clSilver;
Canvas.Rectangle(aRect);
Canvas.Pen.Color := clGreen;
Canvas.Brush.Color := clLime;
aWidth := aRect.Right - aRect.Left;
EnterTime := -1;
for i := Low(DataList) to High(DataList) do
begin
if AnsiSameText(Name, DataList[i].Name) then
begin
if DataList[i].IsEnter then
begin
if EnterTime < 0 then EnterTime := DataList[i].Time;
end else
begin
if EnterTime >= 0 then
begin
ExitTime := DataList[i].Time;
Canvas.Rectangle(Trunc(aWidth * EnterTime), aRect.Top, Trunc(aWidth * ExitTime), aRect.Bottom);
EnterTime := -1;
end;
end;
end;
end;
if EnterTime >= 0 then
begin
ExitTime := 1;
Canvas.Rectangle(Trunc(aWidth * EnterTime), aRect.Top, Trunc(aWidth * ExitTime), aRect.Bottom);
end;
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var
aRect: TRect;
i, aWidth, X: Integer;
s: string;
begin
aRect := Rect(10, 10, ClientWidth - 10, 30);
Repaint;
DrawTime(Canvas, aRect, ListBox1.Items[ListBox1.ItemIndex]);
Canvas.Brush.Color := Color;
Canvas.Pen.Color := clBlack;
aWidth := aRect.Right - aRect.Left;
for i := 0 to 24 do
begin
X := aRect.Left + (aWidth * i div 24);
Canvas.MoveTo(X, aRect.Bottom + 4);
Canvas.LineTo(X, aRect.Bottom - 4);
s := IntToStr(i);
Canvas.TextOut(X - Canvas.TextWidth(s) div 2, aRect.Bottom + 4, s);
end;
end; |
|
#8
|
||||
|
||||
|
Качаешь отсюда библиотеку для работы с регулярными выражениями:
http://www.regular-expressions.info/delphi.html Делаешь подобный модуль: Код:
unit RegExp;
interface
uses
{Standart}
SysUtils, Windows, Classes,
{Special}
PerlRegEx;
type
TRegExp = class
private
FRegExp: TPerlRegEx;
protected
property RegExp: TPerlRegEx read FRegExp write FRegExp;
public
function Work(Exp, Text: UTF8String): UTF8String;
constructor Create;
destructor Destroy; override;
end;
implementation
{ TRegExp }
constructor TRegExp.Create;
begin
inherited Create;
FRegExp := TPerlRegEx.Create;
end;
destructor TRegExp.Destroy;
begin
FreeAndNil(FRegExp);
inherited Destroy;
end;
function TRegExp.Work(Exp, Text: UTF8String): UTF8String;
begin
Result := '';
RegExp.Subject := Text;
RegExp.RegEx := Exp;
if RegExp.Match then
Result := RegExp.MatchedText;
end;
end.В программке своей подключаешь модуль описанный выше и обрабатываешь свой INI файлик, запихивая данные, например, в массив записей. Примерно так: Код:
var
SessionList: TSessionArray; // это массив записей, надеюсь пример приводить не нужно?
...
procedure WhatIMustDo(var SessionList: TSessionArray); // Тут некая процедура заполнения некого объявленного массива
var
i: Integer;
begin
for i := 0 to MyINIFile.Count - 1 do
begin
SessionList.Name := PChar(Utf8ToAnsi(RegExp.Work('^(.*?)(?=;)', AnsiToUTF8(MyINIFile[i])))); // Имя участника
SessionList.Time := PChar(Utf8ToAnsi(RegExp.Work('(?<=;)(.*?)(?=;)', AnsiToUTF8(MyINIFile[i])))); // Время акта
SessionList.Status := PChar(Utf8ToAnsi(RegExp.Work('(?<=;)(.*?)(?=\r\n)', AnsiToUTF8(MyINIFile[i])))); // Пришел-Ушел
end;
...
// Ну а дальше играйся с полученными результатамиIDE под рукой нет, могут быть синтаксические ошибки, но логика должна быть верной. Вроде как. В регулярные выражения могла закрасться ошибка, так что проверяй все. По графикам тут что-то такое было, если не то, все равно ознакомься - принцип будет тот же. Последний раз редактировалось ~TB~, 30.08.2012 в 11:34. |
|
#9
|
||||
|
||||
|
Черд. Полисмены гораздо шустрее меня...
![]() |
|
#10
|
||||
|
||||
|
Цитата:
![]() |
|
#11
|
|||
|
|||
|
[offtop]
Почему все так любят использовать регулярные выражения? Это же тянется vb-шный скрипт (хотя визуал студио на компе может и не стоять), плюс обрубает сразу даже намеки на кросс-платформенность (да-да, я верю в XE2, XE3 и firemonkey). Поправьте меня, если я не прав, можно в личку. p.s. Не нашел тега "спойлер". раньше вроде был. [/offtop] |
|
#12
|
||||
|
||||
|
nixel,
[offtop]Потому что это в 11 раз удобней чем парсить строку обычным способом. Насчет кроссплатформенности не уверен, что она не поддерживается. Почему это? Хотя я класс конечно ихний и не открывал даже (не такой уж я и любопытный оказывается), но думаю не тянется там никакой VB-скрипт. Хотя фиг его знает. Ковырять надо. IDE под рукой нет, так что посмотреть не могу.[/offtop] |