Mega Code Archive

 
Categories / Delphi / Examples
 

An improved stringgrid component

(* DESCRIPTION : A improved version of the stringgrid component AUTHOR : Harm v. Zoest, email : 4923559@hsu1.HVU.nl VERSION : 0.95 (beta) 06-27- 1996 REMARKS : If you have comments, found bugs, ore you have added some nice features, please mail me! *) {$S-,I-,D-,L-} unit ImpGrid; interface uses WinTypes, SysUtils, Messages, Classes, Controls, Grids; type { own exeptions}} EErrorInCell = class(Exception); EFileNotFound = class(Exception); TImpGrid = class(TStringGrid) private FHCol, FHRow: TStrings; procedure InitHCol; procedure InitHRow; protected procedure Loaded; override; published property HCol: TStrings read FHCol write SetHCol; property HRow: TStrings read FHRow write SetHRow; public constructor Create(AOwner: TComponent); override; procedure RemoveRows(RowIndex, RCount: LongInt); procedure InsertRows(RowIndex, RCount: LongInt); procedure RemoveCols(ColIndex, CCount: LongInt); procedure InsertCols(ColIndex, CCount: LongInt); procedure Clear; function isCell(SubStr: String; var ACol, ARow: LongInt): Boolean; procedure SaveToFile(FileName: String); procedure LoadFromFile(FileName: String); function CellToReal(ACol, ARow: LongInt): Real; end; procedure Register; implementation constructor TImpGrid.Create(AOwner: TComponent); begin inherited Create(AOwner); FHCol:=TStringList.Create; FHRow:=TStringList.Create; end; procedure Timpgrid.Loaded; begin inherited Loaded; initHCol; initHRow; end; procedure TImpGrid.SetHCol(Value: TStrings); begin FHCol.Assign(Value); InitHCol; Refresh; end; procedure TImpGrid.SetHRow(Value: TStrings); begin FHRow.Assign(Value); InitHRow; Refresh; end; procedure TImpgrid.InitHCol; var I: Integer; begin if (FHCol <> nil) then for I :=0 to pred( ColCount) do begin if I <FHCol.Count then Cells[I, 0] :=FHCol[I] else Cells[I, 0] :=''; end;{for} end; procedure ImpGrid.InitHRow; var I: Integer; begin if (FHRow <> nil) then for I :=0 to RowCount -2 do begin if I <FHRow.Count then Cells[0, I + 1]:=FHRow[I] else Cells[0, I + 1]:=''; end; end; procedure TImpGrid.RemoveRows(RowIndex, RCount : LongInt); var i: LongInt; begin for i := RowIndex to RowCount - 1 do Rows[i] := Rows[i + RCount]; RowCount := RowCount - RCount; end; procedure TImpGrid.InsertRows(RowIndex, RCount : LongInt); var i: LongInt; begin RowCount := RowCount + RCount; for i := RowCount - 1 downto RowIndex do Rows[i] := Rows[i - RCount]; end; procedure TImpGrid.RemoveCols(ColIndex, CCount : LongInt); var i: LongInt; begin for i := ColIndex to ColCount - 1 do Cols[i] := Cols[i + CCount]; ColCount := ColCount - CCount; end; procedure TImpGrid.InsertCols(ColIndex, CCount : LongInt); var i: LongInt; begin ColCount := ColCount + CCount; for i := ColCount - 1 downto ColIndex do Cols[i] := Cols[i - CCount]; end; procedure TImpGrid.Clear; var i: LongInt; begin for i:= 0 to ColCount - 1 do Cols[i].Clear; end; function TImpGrid.isCell(SubStr: String; var ACol, ARow: LongInt): Boolean; var i, j: LongInt; begin for i := 0 to RowCount - 1 do begin for j := 0 to ColCount - 1 do begin if Rows[i].Strings[j] = SubStr then begin ARow := i; ACol := j; Result := True; exit; end; end; end; Result := False; end; procedure TImpGrid.SaveToFile(FileName: String); var i, j: LongInt; ss: string; f: TextFile; begin AssignFile(f, FileName); Rewrite(f); ss := IntToStr(ColCount) + ',' + IntToStr(RowCount); Writeln(f, ss); for i := 0 to RowCount - 1 do begin for j := 0 to ColCount - 1 do begin if Cells[j, i] <> '' then begin ss := IntToStr(j) + ',' + IntToStr(i) + ',' + Cells[j, i]; Writeln(f, ss); end; end; end; CloseFile(f); end; procedure TImpGrid.LoadFromFile(FileName: String); var X, Y: Integer; ss, ss1: string; f: TextFile; begin AssignFile(f, FileName); Reset(f); if IOResult <> 0 then raise EFileNotFound.Create('File ' + FileName + ' not found'); Readln(f, ss); if ss <> '' then begin ss1 := Copy(ss, 1, Pos(',', ss) - 1); ColCount := StrToInt(ss1); ss1 := Copy(ss, Pos(',', ss) + 1, Length(ss)); RowCount := StrToInt(ss1); end; while not Eof(f) do begin Readln(f, ss); ss1 := Copy(ss, 1, Pos(',', ss) - 1); ss := Copy(ss, Pos(',', ss) + 1, Length(ss)); X := StrToInt(ss1); ss1 := Copy(ss, 1, Pos(',', ss) - 1); ss := Copy(ss, Pos(',', ss) + 1, Length(ss)); Y := StrToInt(ss1); Cells[X, Y] := ss; end; CloseFile(f); end; function TImpGrid.CellToReal(ACol, ARow: LongInt): Real; var i: Real; Code: Integer; begin if Cells[ACol, ARow] <> '' then begin Val(Cells[ACol, ARow], i, Code); if Code <> 0 then raise EErrorInCell.Create('Error at position: ' + IntToStr(Code) + ' in Cell [' + IntToStr(ACol) + ', ' + IntToStr(ARow) + '].') else Result := i; end; end; procedure Register; begin RegisterComponents('Improved Components', [TImpGrid]); end; end.