Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.08.2012, 15:40
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию Помогите алгоритмом, или куском кода

День добрый. Интересует алгоритм работы такой программулины, кто чем сможет, выручите пожалуйста, желательно уже код.
Есть файлик 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  
Старый 28.08.2012, 15:53
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

canvas.rectangle
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 28.08.2012, 16:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

см. Создание графика времени
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 30.08.2012, 11:04
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

Чуть чуть АП тему)). Все же, кто может помочь куском кода, которая с тхт выбирает нужного человека(Васю) и мастрячит график времени?
Ответить с цитированием
  #5  
Старый 30.08.2012, 11:08
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от alexusankov
Чуть чуть АП тему)). Все же, кто может помочь куском кода, которая с тхт выбирает нужного человека(Васю) и мастрячит график времени?
А что у тебя не получается?
Прочитать текстовый файл? Используй TStringList.
Рисовать график? Используй методы Canvas: MoveTo, LineTo, Rectangle и т.п.
Или что не получается?
Ответить с цитированием
  #6  
Старый 30.08.2012, 11:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ему надо кусок кода.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 30.08.2012, 11:29
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Ему надо кусок кода.

Написал ещё позавчера, но не выкладывал, надеялся что он сам справится:
Код:
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  
Старый 30.08.2012, 11:30
Аватар для ~TB~
~TB~ ~TB~ вне форума
Начинающий
 
Регистрация: 17.02.2006
Адрес: Казахстан
Сообщения: 172
Версия Delphi: XE
Репутация: 1500
По умолчанию

Качаешь отсюда библиотеку для работы с регулярными выражениями:
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  
Старый 30.08.2012, 11:31
Аватар для ~TB~
~TB~ ~TB~ вне форума
Начинающий
 
Регистрация: 17.02.2006
Адрес: Казахстан
Сообщения: 172
Версия Delphi: XE
Репутация: 1500
По умолчанию

Черд. Полисмены гораздо шустрее меня...
__________________
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  
Старый 30.08.2012, 11:33
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от ~TB~
Черд. Полисмены гораздо шустрее меня...
У меня была фора, я это написал ещё позавчера
Ответить с цитированием
  #11  
Старый 30.08.2012, 11:39
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

[offtop]
Почему все так любят использовать регулярные выражения?
Это же тянется vb-шный скрипт (хотя визуал студио на компе может и не стоять), плюс обрубает сразу даже намеки на кросс-платформенность (да-да, я верю в XE2, XE3 и firemonkey).
Поправьте меня, если я не прав, можно в личку.

p.s. Не нашел тега "спойлер". раньше вроде был.
[/offtop]
Ответить с цитированием
  #12  
Старый 30.08.2012, 11:53
Аватар для ~TB~
~TB~ ~TB~ вне форума
Начинающий
 
Регистрация: 17.02.2006
Адрес: Казахстан
Сообщения: 172
Версия Delphi: XE
Репутация: 1500
По умолчанию

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
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter