Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический таймер, на стрингриде 
:(
    Опции темы
MrDmitry
Дата 12.8.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Как Динамически создавать таймер на ячейку StrinGrida? 

Например есть такая таблица(StrinGrid)

Id Таймер Телефон Дата

По какой то кнопке добавляем новую запись в StrinGrid, в столбце Таймер нужно чтоб запускался таймер,  При добавлении новой записи в StrinGrid в Следующей строке запускался таймер начиная с нуля, при этом таймер предыдущий строки не обнулялся ну и т.д
PM MAIL   Вверх
Amphiluke
Дата 12.8.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Лучше всего, видимо, создать потомка StringGrid'а и определить соответствующие методы.

На скорую руку, без написания компонент можно так. Забросить на форму единственный таймер, который будет «обслуживать» все воображаемые таймеры ячеек StringGrid'а. При добавлении очередной строки в StringGrid запоминать в свойстве Objects текущее время. Можно даже не распределять динамическую память под добавляемый «объект» времени, а просто обойтись приведением типов. Тогда и освобождать память не придется. Ну а в обработчике OnTimer останется извлекать из Objects для каждой строки время создания и отображать, как надо.

Вот пример.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Grids, DateUtils;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  with StringGrid1 do
  begin
    FixedCols := 0;
    FixedRows := 1;
    RowCount := 2;
    ColCount := 4;
    Rows[0].Text := 'Id'#13#10'Timer'#13#10'Tel'#13#10'Date'#13#10;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LastRow: Integer;
  UnixTime: Int64;
  TimeLo, TimeHi: Integer;
begin
  LastRow := StringGrid1.RowCount;
  StringGrid1.RowCount := LastRow + 1;
  UnixTime := DateTimeToUnix(Now());
  TimeLo := Integer(UnixTime and $FFFFFFFF);
  TimeHi := Integer(UnixTime shr 32);
  { "Раскидаем" текущее время по двум ячейкам, поскольку в одну можно
    поместить только 4 байта без динамического выделения памяти под объект.
    Integer и TObject - 4-хбайтные типы, можно приводить их друг к другу }
  StringGrid1.Objects[0, LastRow] := TObject(TimeLo);
  StringGrid1.Objects[1, LastRow] := TObject(TimeHi);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  UnixTime: Int64;
  h, m, s: Integer;
  i: Integer;
begin
  with StringGrid1 do
    for i := 1 to RowCount - 1 do
    begin
      if (Objects[0, i] = nil) and (Objects[1, i] = nil) then Continue;
      { собираем из двух частей время создания строки StringGrid'a }
      UnixTime := Integer(Objects[0, i]) or (Integer(Objects[1, i]) shl 32);
      { время прошедшее, с момента создания }
      UnixTime := DateTimeToUnix(Now()) - UnixTime;
      h := Trunc(UnixTime / 3600); // сколько прошло часов с момента добавления строки
      m := Trunc(UnixTime / 60) - h * 60; // сколько прошло минут
      s := UnixTime - h * 3600 - m * 60; // сколько секунд
      Cells[1, i] := IntToStr(h) + ':' + IntToStr(m) + ':' + IntToStr(s);
    end;
end;

end.

PM   Вверх
MrDmitry
Дата 13.8.2010, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Спасибо большое, а например как такое же можно осуществить работая с базами? Например чтоб все время обновлялось в DBGrid? )) Рефрешить базу?
PM MAIL   Вверх
drkot
Дата 24.8.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(MrDmitry @  13.8.2010,  10:03 Найти цитируемый пост)
Рефрешить базу?

вы сами ответили на вопрос...

но метод есть только инструмент для решения задачи... а вот задача собственно и определяет методы которые надо использовать.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.