228 lines
6.2 KiB
Plaintext
228 lines
6.2 KiB
Plaintext
|
||
{ Copyright (c) 1989 by Borland International, Inc. }
|
||
|
||
unit TCCellSp;
|
||
{ Turbo Pascal 5.5 object-oriented example cell support routines.
|
||
This unit is used by TCALC.PAS.
|
||
See TCALC.DOC for an more information about this example.
|
||
}
|
||
|
||
{$N+,S-}
|
||
|
||
interface
|
||
|
||
uses TCUtil, TCLStr, TCScreen, TCInput, TCCell;
|
||
|
||
function GetColumn(Prompt : String; MaxCols, ColSpace : Word) : Word;
|
||
|
||
function GetRow(Prompt : String; MaxRows : Word) : Word;
|
||
|
||
function GetCellPos(Prompt : String; MaxCols, MaxRows, ColSpace,
|
||
RowNumberSpace : Word; var P : CellPos) : Boolean;
|
||
|
||
function FormulaStart(Inp : LStringPtr; Start, MaxCols, MaxRows : Word;
|
||
var P : CellPos; var FormLen : Word) : Boolean;
|
||
|
||
procedure FixFormulaCol(CP : CellPtr; Diff : Longint;
|
||
MaxCols, MaxRows : Word);
|
||
|
||
procedure FixFormulaRow(CP : CellPtr; Diff : Longint;
|
||
MaxCols, MaxRows : Word);
|
||
|
||
implementation
|
||
|
||
function GetColumn(Prompt : String; MaxCols, ColSpace : Word) : Word;
|
||
{ Lets the user enter a column from the keyboard }
|
||
var
|
||
I : InputField;
|
||
S : String;
|
||
C : Word;
|
||
begin
|
||
with I do
|
||
begin
|
||
if not Init(Length(Prompt) + 3, 0, -1, ColSpace, AllUpper) then
|
||
begin
|
||
GetColumn := 0;
|
||
Exit;
|
||
end;
|
||
WriteXY(Prompt + ': ', 1, Pred(Scr.CurrRows), Colors.PromptColor);
|
||
repeat
|
||
Edit(0);
|
||
S := InputData^.ToString;
|
||
if (not GetQuit) and (S <> '') then
|
||
begin
|
||
C := StringToCol(S, MaxCols);
|
||
if C = 0 then
|
||
Scr.PrintError(ErrColumnError1 + ColToString(1) +
|
||
ErrColumnError2 + ColToString(MaxCols));
|
||
end
|
||
else
|
||
C := 0;
|
||
until (C <> 0) or (S = '');
|
||
InputArea.Clear;
|
||
Done;
|
||
end; { with }
|
||
ClrEOLXY(1, Pred(Scr.CurrRows), Colors.BlankColor);
|
||
GetColumn := C;
|
||
end; { GetColumn }
|
||
|
||
function GetRow(Prompt : String; MaxRows : Word) : Word;
|
||
{ Lets the user enter a row from the keyboard }
|
||
var
|
||
R : Word;
|
||
Good : Boolean;
|
||
begin
|
||
R := GetNumber(Prompt, 1, MaxRows, Good);
|
||
if Good then
|
||
GetRow := R
|
||
else
|
||
GetRow := 0;
|
||
end; { GetRow }
|
||
|
||
function GetCellPos(Prompt : String; MaxCols, MaxRows, ColSpace,
|
||
RowNumberSpace : Word; var P : CellPos) : Boolean;
|
||
{ Lets the user enter a cell position from the keyboard }
|
||
var
|
||
I : InputField;
|
||
S : String;
|
||
FormLen : Word;
|
||
begin
|
||
GetCellPos := False;
|
||
with I do
|
||
begin
|
||
if not Init(Length(Prompt) + 3, 0, -1, Pred(ColSpace + RowNumberSpace),
|
||
AllUpper) then
|
||
Exit;
|
||
WriteXY(Prompt + ': ', 1, Pred(Scr.CurrRows), Colors.PromptColor);
|
||
repeat
|
||
Edit(0);
|
||
S := InputData^.ToString;
|
||
if (not GetQuit) and (S <> '') then
|
||
begin
|
||
if FormulaStart(InputData, 1, MaxCols, MaxRows, P, FormLen) then
|
||
GetCellPos := True
|
||
else
|
||
Scr.PrintError(ErrCellError);
|
||
end
|
||
else
|
||
FormLen := 0;
|
||
until (FormLen <> 0) or (S = '');
|
||
InputArea.Clear;
|
||
Done;
|
||
end; { with }
|
||
ClrEOLXY(1, Pred(Scr.CurrRows), Colors.BlankColor);
|
||
end; { GetCellPos }
|
||
|
||
function FormulaStart(Inp : LStringPtr; Start, MaxCols, MaxRows : Word;
|
||
var P : CellPos; var FormLen : Word) : Boolean;
|
||
{ Checks to see if a place in a long string is the beginning of a formula }
|
||
var
|
||
Col, Row : Word;
|
||
CS : String[10];
|
||
RS : String[10];
|
||
begin
|
||
with Inp^ do
|
||
begin
|
||
FormulaStart := False;
|
||
FormLen := 0;
|
||
FillChar(P, SizeOf(P), 0);
|
||
CS := '';
|
||
while (Start <= Length) and (Data^[Start] in Letters) do
|
||
begin
|
||
CS := CS + Data^[Start];
|
||
Inc(Start);
|
||
end;
|
||
Col := StringToCol(CS, MaxCols);
|
||
if Col = 0 then
|
||
Exit;
|
||
RS := '';
|
||
while (Start <= Length) and (Data^[Start] in Numbers) do
|
||
begin
|
||
RS := RS + Data^[Start];
|
||
Inc(Start);
|
||
end;
|
||
Row := StringToRow(RS, MaxRows);
|
||
if Row = 0 then
|
||
Exit;
|
||
P.Col := Col;
|
||
P.Row := Row;
|
||
FormLen := System.Length(CS) + System.Length(RS);
|
||
FormulaStart := True;
|
||
end; { with }
|
||
end; { FormulaStart }
|
||
|
||
procedure FixFormulaCol(CP : CellPtr; Diff : Longint;
|
||
MaxCols, MaxRows : Word);
|
||
{ Adjusts a formula for a new column }
|
||
var
|
||
FormLen, Place, OldLen, NewLen : Word;
|
||
P : CellPos;
|
||
S : String[10];
|
||
Good : Boolean;
|
||
begin
|
||
with FormulaCellPtr(CP)^, GetFormula^ do
|
||
begin
|
||
Place := 1;
|
||
Good := True;
|
||
while Good and (Place <= Length) do
|
||
begin
|
||
if FormulaStart(GetFormula, Place, MaxCols, MaxRows, P, FormLen) then
|
||
begin
|
||
OldLen := System.Length(ColToString(P.Col));
|
||
S := ColToString(Longint(P.Col) + Diff);
|
||
NewLen := System.Length(S);
|
||
if NewLen > OldLen then
|
||
Good := Insert(FillString(NewLen - OldLen, ' '), Place)
|
||
else if NewLen < OldLen then
|
||
Delete(Place, OldLen - NewLen);
|
||
if Good then
|
||
begin
|
||
Move(S[1], Data^[Place], System.Length(S));
|
||
Inc(Place, FormLen + NewLen - OldLen);
|
||
end;
|
||
end
|
||
else
|
||
Inc(Place);
|
||
end;
|
||
end; { with }
|
||
end; { FixFormulaCol }
|
||
|
||
procedure FixFormulaRow(CP : CellPtr; Diff : Longint;
|
||
MaxCols, MaxRows : Word);
|
||
{ Adjusts a formula for a new row }
|
||
var
|
||
ColLen, FormLen, Place, OldLen, NewLen : Word;
|
||
P : CellPos;
|
||
S : String[10];
|
||
Good : Boolean;
|
||
begin
|
||
with FormulaCellPtr(CP)^, GetFormula^ do
|
||
begin
|
||
Place := 1;
|
||
Good := True;
|
||
while Good and (Place <= Length) do
|
||
begin
|
||
if FormulaStart(GetFormula, Place, MaxCols, MaxRows, P, FormLen) then
|
||
begin
|
||
OldLen := System.Length(RowToString(P.Row));
|
||
S := RowToString(P.Row + Diff);
|
||
NewLen := System.Length(S);
|
||
ColLen := System.Length(ColToString(P.Col));
|
||
if NewLen > OldLen then
|
||
Good := Insert(FillString(NewLen - OldLen, ' '), Place + ColLen)
|
||
else if NewLen < OldLen then
|
||
Delete(Place + ColLen, OldLen - NewLen);
|
||
if Good then
|
||
begin
|
||
Move(S[1], Data^[Place + ColLen], System.Length(S));
|
||
Inc(Place, FormLen + NewLen - OldLen);
|
||
end;
|
||
end
|
||
else
|
||
Inc(Place);
|
||
end;
|
||
end; { with }
|
||
end; { FixFormulaRow }
|
||
|
||
end.
|
||
|