Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование TStringGrid.Objects

6.9K
10 августа 2006 года
Weer
8 / / 23.09.2004
Пытаюсь использовать TStringGrid.Objects для хранения объектов что бы потом при выделении ячейки выводит данные из привязанного объекта или при отрисовке ячеки чтонибуть рисовать.
Должно получиться нечто вроде планировщика.
Код:
unit UWiz;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, ComCtrls, DBGrids;

(type
  TFrmUWiz = class(TForm)
    SGridCalendar: TStringGrid;
    LblMonth: TLabel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure SGridCalendarSelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    Function TuningForm(Mode:byte):string;
    Procedure SetDOW(par_date:TDate);
    Function ConvertMonth(Month:word):string;
    Function GiveRow(Day,DOW:integer):word;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TCDate = class
    SessionsID: Array [0 .. 1] of integer;
    Day:TDate;
    Shift: Array [0 .. 1 ] of String[1];

  end;

var
  FrmUWiz: TFrmUWiz;

implementation
 Uses UWDate_rus,UCQ,UDB;
{$R *.dfm}

{ TFrmUWiz }

function TFrmUWiz.ConvertMonth(Month: word): string;
begin
case Month of
1: result:='Январь';
2: result:='Февраль';
3: result:='Март';
4: result:='Апрель';
5: result:='Май';
6: result:='Июнь';
7: result:='Июль';
8: result:='Август';
9: result:='Сентябрь';
10:result:='Октябрь';
11:result:='Ноябрь';
12:result:='Декабрь';
end;
end;

function TFrmUWiz.GiveRow(Day, DOW: integer): word;
Var
 ROW:integer;
begin
 ROW:=Day-DOW;
 Result:=0;
 if (-7<ROW) AND (ROW<1) then
  result:=1;
 if (1<=ROW) AND (ROW<=7) then
  result:=2;
 if (8<=ROW) AND (ROW<=14) then
  result:=3;
 if (15<=ROW) AND (ROW<=21) then
  result:=4;
 if (22<=ROW) AND (ROW<=28) then
  result:=5;
 if (29<=ROW) AND (ROW<=31) then
  result:=6;
 end;

procedure TFrmUWiz.SetDOW(par_date:TDate);
Var
 Month,Year,Day,DOW:word;
 I:integer;
 Col,Row,QDay:word;
 TmpDate:TDate;
 TmpTCDate:TCDate;
begin
SGridCalendar.Cells[0,0]:='Понедельник';
SGridCalendar.Cells[1,0]:='Вторник';
SGridCalendar.Cells[2,0]:='Среда';
SGridCalendar.Cells[3,0]:='Четверг';
SGridCalendar.Cells[4,0]:='Пятница';
SGridCalendar.Cells[5,0]:='Суббота';
SGridCalendar.Cells[6,0]:='Воскресенье';
DecodeDateFully_rus(par_date,Year,Month,Day,DOW);
LblMonth.Caption:=ConvertMonth(Month);
QDay:=MonthDays[IsLeapYear(Year), Month];
I:=1;

while I<>QDay+1  do
begin
 TmpDate:=EncodeDate(Year,Month,I);
 DOW:=DayOfWeek_rus(TmpDate);
 Row:=GiveRow(I,Dow);
 Col:=Dow;
 With SGridCalendar Do
 begin
 Objects[Col,Row]:=TCDate.Create;
 TmpTCDate:=TCDate.Create;
 TmpTCDate:=OCQ.SelectSessionsByDate(TmpDate);
 (Objects[Col,Row] As TCDate).SessionsID:= TmpTCDate.SessionsID;
 (Objects[Col,Row] As TCDate).Day:=TmpTCDate.Day;
 (Objects[Col,Row] As TCDate).Shift:=TmpTCDate.Shift;
 end;
 SGridCalendar.Cells[Col,Row]:=IntToStr(I);
 I:=I+1;
 TmpTCDate.Free;
end;
end;





procedure TFrmUWiz.SGridCalendarSelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
Label1.Caption:='';Label2.Caption:='';Label3.Caption:='';Label4.Caption:='';
Label5.Caption:='';
With SGridCalendar Do
Begin
 IF  Objects[ACol,ARow]=Nil Then
 Begin
 MessageDlg ('Объект не существует',  mtError, [mbOk], 0);
 end
 Else
 Begin
 Label1.Caption:=IntToStr((Objects[ACol,ARow] As TCDate).SessionsID[0]);
 Label2.Caption:=IntToStr((Objects[ACol,ARow] As TCDate).SessionsID[1]);
 Label3.Caption:= (Objects[ACol,ARow] As TCDate).Shift[0];
 Label4.Caption:= (Objects[ACol,ARow] As TCDate).Shift[1];
 Label4.Caption:=DateToStr((Objects[ACol,ARow] As TCDate).Day);
 end;
end;
end;

function TFrmUWiz.TuningForm(Mode: byte): string;
Var
TMp:TDate;
begin
 TMp:=StrToDate('01.02.06');
 SetDOW(Tmp);
end;

end.

Но собственно получаеться что (Objects[ACol,ARow] As TCDate) всегда Nil. И соответственно при попытке доступа к полям получаю AV.
Мне кажется что, я чего-то не понимаю :(. Пока ни одного примера гдебы использовалось это свойство не нашел, везде используеться отдельный TStringList, с пересчетом координат ячейки в индекс, примерно вот так
 
Код:
k := 2 * ACol + ARow;
With FrmMain.StringList Do
(Objects[k] as TBitMap).method;

В общем помогите, а то сроки горят уже и начальство ругает .
339
11 августа 2006 года
verybadbug
619 / / 12.09.2005
ищи у себя ошибку..... вот тебе рабочий код (на форме StringGrid1: TStringGrid и Button1: TButton)....
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  L: TLabel;
  I, J: Integer;
begin
  for I := 0 to StringGrid1.RowCount - 1 do
    for J := 0 to StringGrid1.ColCount - 1 do begin
      L := TLabel.Create(nil);
      L.Caption := IntToStr(J) + 'x' + IntToStr(I);
      StringGrid1.Objects[J, I] := L;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I, J: Integer;
begin
  for I := 0 to StringGrid1.RowCount - 1 do
    for J := 0 to StringGrid1.ColCount - 1 do begin
      StringGrid1.Cells[J, I] := TLabel(StringGrid1.Objects[J, I]).Caption;
    end;
end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог