|
|
Регистрация | << Правила форума >> | 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
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
Пишу программы за еду. __________________ |
#4
|
||||
|
||||
Чуть чуть АП тему)). Все же, кто может помочь куском кода, которая с тхт выбирает нужного человека(Васю) и мастрячит график времени?
|
#5
|
||||
|
||||
Цитата:
Прочитать текстовый файл? Используй TStringList. Рисовать график? Используй методы Canvas: MoveTo, LineTo, Rectangle и т.п. Или что не получается? |
#6
|
||||
|
||||
Ему надо кусок кода.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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 под рукой нет, могут быть синтаксические ошибки, но логика должна быть верной. Вроде как. В регулярные выражения могла закрасться ошибка, так что проверяй все. По графикам тут что-то такое было, если не то, все равно ознакомься - принцип будет тот же. 00110001 00101100 00110110 00110001 00111000 00110000 00110011 00110011 00111001 00111000 00111000 00110111 00110100 00111001 00111000 00111001 00110100 00111000 00110100 00111000 00110010 00110000 00110100 00110101 00111000 00110110 00111000 00110011 00110100 00110011 00110110 00110101 00110110 Последний раз редактировалось ~TB~, 30.08.2012 в 11:34. |
#9
|
||||
|
||||
Черд. Полисмены гораздо шустрее меня...
00110001 00101100 00110110 00110001 00111000 00110000 00110011 00110011 00111001 00111000 00111000 00110111 00110100 00111001 00111000 00111001 00110100 00111000 00110100 00111000 00110010 00110000 00110100 00110101 00111000 00110110 00111000 00110011 00110100 00110011 00110110 00110101 00110110 |
#10
|
||||
|
||||
Цитата:
|
#11
|
|||
|
|||
[offtop]
Почему все так любят использовать регулярные выражения? Это же тянется vb-шный скрипт (хотя визуал студио на компе может и не стоять), плюс обрубает сразу даже намеки на кросс-платформенность (да-да, я верю в XE2, XE3 и firemonkey). Поправьте меня, если я не прав, можно в личку. p.s. Не нашел тега "спойлер". раньше вроде был. [/offtop] |
#12
|
||||
|
||||
nixel,
[offtop]Потому что это в 11 раз удобней чем парсить строку обычным способом. Насчет кроссплатформенности не уверен, что она не поддерживается. Почему это? Хотя я класс конечно ихний и не открывал даже (не такой уж я и любопытный оказывается), но думаю не тянется там никакой VB-скрипт. Хотя фиг его знает. Ковырять надо. IDE под рукой нет, так что посмотреть не могу.[/offtop] 00110001 00101100 00110110 00110001 00111000 00110000 00110011 00110011 00111001 00111000 00111000 00110111 00110100 00111001 00111000 00111001 00110100 00111000 00110100 00111000 00110010 00110000 00110100 00110101 00111000 00110110 00111000 00110011 00110100 00110011 00110110 00110101 00110110 |