Files
lazarus-ccr/applications/lazstats/source/forms/misc/dictionaryunit.pas
wp_xxyyzz 2f33dc9f7b LazStats: initial commit.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7345 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2020-03-30 18:01:44 +00:00

385 lines
11 KiB
ObjectPascal

unit DictionaryUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, Grids, ExtCtrls,
Globals, OptionsUnit, ContextHelpUnit;
type
{ TDictionaryFrm }
TDictionaryFrm = class(TForm)
Bevel1: TBevel;
HelpBtn: TButton;
Label2: TLabel;
DescMemo: TMemo;
RowDelBtn: TButton;
RowInstBtn: TButton;
JustCombo: TComboBox;
Splitter1: TSplitter;
TypeCombo: TComboBox;
Label1: TLabel;
ReturnBtn: TButton;
CancelBtn: TButton;
DictGrid: TStringGrid;
Panel1: TPanel;
procedure DictGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure DictGridSelectEditor(Sender: TObject; aCol, aRow: Integer;
var Editor: TWinControl);
procedure DictGridSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: string);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure HelpBtnClick(Sender: TObject);
procedure JustComboClick(Sender: TObject);
procedure JustComboSelect(Sender: TObject);
procedure ReturnBtnClick(Sender: TObject);
procedure RowDelBtnClick(Sender: TObject);
procedure RowInstBtnClick(Sender: TObject);
procedure Defaults(Sender: TObject; row : integer);
procedure TypeComboSelect(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
procedure DelRow(row : integer);
procedure NewVar(row : integer);
procedure PasteVar(row : integer);
procedure CopyVar(row : integer);
procedure Init;
end;
var
DictionaryFrm: TDictionaryFrm;
implementation
{ TDictionaryFrm }
uses MainUnit;
procedure TDictionaryFrm.ReturnBtnClick(Sender: TObject);
var
i, j, count : integer;
NoRows : integer;
begin
// determine number of rows with complete data
NoRows := 0;
for i := 1 to DictGrid.RowCount - 1 do
begin
count := 0;
for j := 1 to 5 do
begin
if DictGrid.Cells[j,i] <> '' then count := count + 1;
end;
if count > 4 then NoRows := NoRows + 1;
end;
if NoRows < DictGrid.RowCount - 1 then
begin
ShowMessage('Error! A definition entry for one or more variables missing!');
DictGrid.SetFocus;
exit;
end;
// Place short labels in main grid
OS3MainFrm.DataGrid.ColCount := NoRows + 1;
for i := 1 to NoRows do OS3MainFrm.DataGrid.Cells[i,0] := DictGrid.Cells[1,i];
// Make sure integers have a 0 for decimals
for i := 1 to NoRows do
if DictGrid.Cells[4,i] = 'I' then DictGrid.Cells[5,i] := '0';
OS3MainFrm.NoVarsEdit.Text := IntToStr(OS3MainFrm.DataGrid.ColCount-1);
if OS3MainFrm.FileNameEdit.Text = '' then exit;
end;
procedure TDictionaryFrm.RowDelBtnClick(Sender: TObject);
var
index : integer;
i, j : integer;
begin
index := DictGrid.Row;
if index = DictGrid.RowCount-1 then // last row
begin
for i := 0 to 7 do DictGrid.Cells[i,index] := '';
DictGrid.RowCount := DictGrid.RowCount - 1;
VarDefined[index] := false;
end
else
begin // move lines below current lines up and delete last
for i := index+1 to DictGrid.RowCount - 1 do
begin
for j := 0 to 6 do DictGrid.Cells[j,i-1] := DictGrid.Cells[j,i];
VarDefined[i-1] := VarDefined[i];
end;
VarDefined[DictGrid.RowCount-1] := false;
DictGrid.RowCount := DictGrid.RowCount - 1;
for i := 1 to DictGrid.RowCount - 1 do // renumber rows
DictGrid.Cells[0,i] := IntToStr(i);
end;
end;
procedure TDictionaryFrm.RowInstBtnClick(Sender: TObject);
var
index : integer;
i, j : integer;
begin
index := DictGrid.Row;
DictGrid.RowCount := DictGrid.RowCount + 1; // add new row to grid
// move all rows from index down 1
for i := DictGrid.RowCount - 1 downto index+1 do
begin
for j := 1 to 6 do
begin
DictGrid.Cells[j,i] := DictGrid.Cells[j,i-1];
end;
VarDefined[i] := VarDefined[i-1];
end;
// place default values in new row
Defaults(Self,index);
VarDefined[index] := true;
end;
procedure TDictionaryFrm.FormShow(Sender: TObject);
begin
ReturnBtn.Constraints.MinWidth := CancelBtn.Width;
Init;
end;
procedure TDictionaryFrm.Init;
begin
DictGrid.ColCount := 8;
if NoVariables = 0 then
DictGrid.RowCount := 2
else
DictGrid.RowCount := NoVariables + 1;
// insert headings
DictGrid.Cells[0,0] := 'VAR/CHAR.';
DictGrid.Cells[1,0] := 'Short Name';
DictGrid.Cells[2,0] := 'Long Name';
DictGrid.Cells[3,0] := 'Width';
DictGrid.Cells[4,0] := 'Type';
DictGrid.Cells[5,0] := 'Decimals';
DictGrid.Cells[6,0] := 'Missing';
DictGrid.Cells[7,0] := 'Justify';
DictGrid.Cells[0,1] := '1';
DictGrid.ColWidths[1] := 100;
DictGrid.ColWidths[2] := 200;
DictGrid.ColWidths[3] := 50;
DictGrid.ColWidths[4] := 50;
DictGrid.ColWidths[5] := DictGrid.Canvas.TextWidth('Decimals') + 2*varCellPadding;
DictGrid.ColWidths[6] := DictGrid.Canvas.TextWidth('Missing') + 2*varCellPadding;
DictGrid.ColWidths[7] := DictGrid.Canvas.TextWidth('Justify') + 2*varCellPadding;
// check for absence of a defined variable
if VarDefined[1] = false then
begin
// load defaults
Defaults(Self,1);
VarDefined[1] := true;
end;
end;
procedure TDictionaryFrm.HelpBtnClick(Sender: TObject);
begin
if ContextHelpForm = nil then
Application.CreateForm(TContextHelpForm, ContextHelpForm);
ContextHelpForm.HelpMessage((Sender as TButton).tag);
end;
procedure TDictionaryFrm.JustComboClick(Sender: TObject);
var
achar : char;
astr : string;
index : integer;
GRow : integer;
begin
index := JustCombo.ItemIndex;
astr := JustCombo.Items.Strings[index];
achar := astr[2];
GRow := DictGrid.Row;
DictGrid.Cells[7,GRow] := achar;
JustCombo.Text := 'Justification';
end;
procedure TDictionaryFrm.JustComboSelect(Sender: TObject);
var
achar : char;
astr : string;
index : integer;
GRow : integer;
begin
index := JustCombo.ItemIndex;
astr := JustCombo.Items.Strings[index];
achar := astr[2];
GRow := DictGrid.Row;
if GRow>0 then DictGrid.Cells[7,GRow] := achar;
JustCombo.Text := 'Justification';
DictGrid.SetFocus;
end;
procedure TDictionaryFrm.DictGridKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
x, y, v : integer;
begin
x := DictGrid.Row;
y := DictGrid.Col;
v := ord(Key);
case v of
13 : if y = 7 then DictGrid.Col := 1 else DictGrid.Col := DictGrid.Col + 1;
40 : begin // arrow down key
if x = DictGrid.RowCount - 1 then
begin
if DictGrid.RowCount < (x + 2) then
DictGrid.RowCount := DictGrid.RowCount + 1;
Defaults(Self,x+1);
VarDefined[x+1] := true;
end;
end;
end;
end;
procedure TDictionaryFrm.DictGridSelectEditor(Sender: TObject; aCol,
aRow: Integer; var Editor: TWinControl);
begin
if (aCol in [4, 7]) then
begin
Editor := DictGrid.EditorByStyle(cbsPickList);
if (Editor is TCustomComboBox) then
with Editor as TCustomComboBox do begin
Style := csDropDown;
case ACol of
4: Items.CommaText := 'I,F,S,M,D';
7: Items.CommaText := 'L,C,R';
end;
end
end;
end;
procedure TDictionaryFrm.DictGridSetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: string);
begin
if (ACol in [4, 7]) then
DictGrid.Cells[ACol, ARow] := UpperCase(Value);
end;
procedure TDictionaryFrm.FormCreate(Sender: TObject);
begin
Assert(OS3MainFrm <> nil);
{
if OptionsFrm = nil then
Application.CreateForm(TOptionsFrm, OptionsFrm);
}
end;
procedure TDictionaryFrm.Defaults(Sender: TObject; row : integer);
var
i: integer;
begin
DictGrid.Cells[0,row] := IntToStr(row);
DictGrid.Cells[1,row] := 'VAR.' + IntToStr(row);
DictGrid.Cells[2,row] := 'VARIABLE ' + IntToStr(row);
DictGrid.Cells[3,row] := '8';
DictGrid.Cells[4,row] := 'F';
DictGrid.Cells[5,row] := '2';
DictGrid.Cells[6, row] := MissingValueCodes[Options.DefaultMiss];
DictGrid.Cells[7, row] := JustificationCodes[Options.DefaultJust];
for i := 1 to DictGrid.RowCount - 1 do
DictGrid.Cells[0,i] := IntToStr(i);
end;
procedure TDictionaryFrm.TypeComboSelect(Sender: TObject);
var
achar : char;
astr : string;
index : integer;
GRow : integer;
begin
index := TypeCombo.ItemIndex;
astr := TypeCombo.Items.Strings[index];
achar := astr[2];
GRow := DictGrid.Row;
if GRow>0 then
begin
DictGrid.Cells[4,GRow] := achar;
if achar='F' then DictGrid.Cells[5,GRow] := '3' // set decimal digits
else DictGrid.Cells[5,GRow] := '0';
end;
TypeCombo.Text := 'Type';
DictGrid.SetFocus;
end;
procedure TDictionaryFrm.DelRow(row : integer);
begin
DictGrid.Row := row;
TempVarItm.Clear;
DictGrid.Rows[row].SaveToStream(TempVarItm);
RowDelBtnClick(Self);
end;
//-------------------------------------------------------------------
procedure TDictionaryFrm.NewVar(row : integer);
var
i, j : integer;
begin
DictGrid.RowCount := DictGrid.RowCount + 1; // add new row
NoVariables := NoVariables + 1;
if (row < NoVariables) AND (NoVariables > 1) then // move current rows down 1
begin
for i := NoVariables downto row + 1 do
begin
for j := 1 to 7 do DictGrid.Cells[j,i] := DictGrid.Cells[j,i-1];
VarDefined[i] := VarDefined[i-1];
end;
end;
// put default values in new variable
Defaults(Self,row);
VarDefined[row] := true;
// add to grid if grid column does not exist
if OS3MainFrm.DataGrid.ColCount < row then
begin
OS3MainFrm.DataGrid.ColCount := OS3MainFrm.DataGrid.ColCount + 1;
OS3MainFrm.DataGrid.Cells[row,0] := DictGrid.Cells[1,row];
end;
ReturnBtnClick(Self);
end;
//-------------------------------------------------------------------
procedure TDictionaryFrm.PasteVar(row : integer);
var i : integer;
begin
TempVarItm.Position := 0;
DictGrid.Rows[row].LoadFromStream(TempVarItm);
for i := 1 to DictGrid.RowCount - 1 do DictGrid.Cells[0,i] := IntToStr(i);
// FormShow(Self);
end;
//-------------------------------------------------------------------
procedure TDictionaryFrm.CopyVar(row : integer);
begin
DictGrid.Row := row;
TempVarItm.Clear;
DictGrid.Rows[row].SaveToStream(TempVarItm);
end;
//-------------------------------------------------------------------
initialization
{$I dictionaryunit.lrs}
end.