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