Hola El_Chava.
Como te comenta
Neftali todo puede variar según programes la estructuración de los datos.
Te pongo una idea de tantas en que podrías realizarlo. El ejemplo hace uso del mouse tanto para la elección única como múltiple de días y usa un PopupMenu cuyos ítems ponen el día o la selección en día feriado o laboral.
Por la imágen que adjuntaste pareciera que usas 12 StringGrids, el ejemplo usa uno solo (
StringGridEnero), pero es muy simple modificarlo para que funcione con los restantes.
Código Delphi
[-]
...
type
TForm1 = class(TForm)
RadioGroup1: TRadioGroup;
StringGridEnero: TStringGrid;
PopupMenu1: TPopupMenu;
pmiFeriado: TMenuItem;
pmiLaboral: TMenuItem;
btSave: TButton;
btReset: TButton;
btLoad: TButton;
procedure FormCreate(Sender: TObject);
procedure PopupItemsClick(Sender: TObject);
procedure StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure btSaveClick(Sender: TObject);
procedure btLoadClick(Sender: TObject);
procedure btResetClick(Sender: TObject);
private
FFileName : string;
procedure SaveStringGrid(SG: TStringGrid; const aFileName: string);
procedure LoadStringGrid(SG: TStringGrid; const aFileName: string);
public
end;
var
Form1: TForm1;
implementation
const
NOPRN = #144;
procedure IniciarDemo(StringGrid: TStringGrid);
var
c, r : Integer;
begin
with StringGrid do
begin
FixedCols:= 0;
FixedRows:= 1;
ColCount := 7;
RowCount := 6;
Options := Options + [goRangeSelect] - [goEditing];
for r := 0 to RowCount-1 do Rows[r].QuoteChar:= #0;
Rows[0].CommaText := 'LUN,MAR,MIE,JUE,VIE,SAB,DOM';
Rows[1].CommaText := NOPRN+','+NOPRN+','+NOPRN+',1,2,3,4';
Rows[2].CommaText := '5,6,7,8,9,10,11';
Rows[3].CommaText := '12,13,14,15,16,17,18';
Rows[4].CommaText := '19,20,21,22,23,24,25';
Rows[5].CommaText := '26,27,28,29,30,31,'+NOPRN;
for r := FixedRows to RowCount -1 do
for c:= FixedCols to ColCount-1 do
Objects[c, r] := TObject(False);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FFileName := ExtractFilePath(Application.ExeName)+'enero.dat';
IniciarDemo(StringGridEnero);
end;
procedure TForm1.StringGridDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
const
COLORCELL : array[Boolean] of TColor = (clWindow, clGray);
FLAGS = DT_SINGLELINE or DT_CENTER or DT_VCENTER;
begin
with TStringGrid(Sender) do
begin
if Boolean(Objects[ACol,ARow]) and (Cells[ACol,ARow] <> NOPRN) then
begin
Canvas.Brush.Color := COLORCELL[Boolean(Objects[ACol,ARow])];
Canvas.FillRect(Rect);
DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect, FLAGS);
end;
end;
end;
procedure TForm1.PopupItemsClick(Sender: TObject);
var
c,r : Integer;
begin
with TStringGrid(PopupMenu1.PopupComponent) do
for c := Selection.Left to Selection.Right do
for r := Selection.Top to Selection.Bottom do
Objects[c,r] := TObject(TMenuItem(Sender).MenuIndex = 0);
end;
procedure TForm1.btSaveClick(Sender: TObject);
begin
SaveStringGrid(StringGridEnero, FFileName);
end;
procedure TForm1.btResetClick(Sender: TObject);
begin
IniciarDemo(StringGridEnero);
end;
procedure TForm1.btLoadClick(Sender: TObject);
begin
LoadStringGrid(StringGridEnero, FFileName);
end;
procedure TForm1.SaveStringGrid(SG: TStringGrid; const aFileName: string);
var
c, r: Integer;
d: Byte;
b: Boolean;
begin
with TFileStream.Create(aFileName, fmCreate) do
try
for c := SG.FixedCols to SG.ColCount-1 do
for r := SG.FixedRows to SG.RowCount-1 do
begin
d := StrToIntDef(SG.Cells[c, r], 0);
WriteBuffer(d, SizeOf(Byte));
b := Boolean(SG.Objects[c, r]);
WriteBuffer(b, SizeOf(Boolean));
end;
finally
Free;
end;
end;
procedure TForm1.LoadStringGrid(SG: TStringGrid; const aFileName: string);
var
c, r: Integer;
d: Byte;
b: Boolean;
begin
with TFileStream.Create(aFileName, fmOpenRead) do
try
for c := SG.FixedCols to SG.ColCount-1 do
for r := SG.FixedRows to SG.RowCount-1 do
begin
ReadBuffer(d, SizeOf(Byte));
if d = 0 then
SG.Cells[c, r] := NOPRN
else
SG.Cells[c,r] := IntToStr(d);
ReadBuffer(b, Sizeof(Boolean));
SG.Objects[c, r] := TObject(b);
end;
finally
Free;
end;
end;
Muestra:
Saludos