{ ******************************************************************************** YaPeTaVi - Yet another Periodic Table Viewer Copyright (C) 1997-2000, 2009-2012 Geoffray Levasseur . All rights reserved. http://www.geoffray-levasseur.org/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ******************************************************************************** Description: Periodic table (main) form unit } unit frmTable; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Graphics, TACustomSeries, TASeries, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, LResources, ComCtrls, Spin, Menus, CheckLst, Buttons, IniPropStorage, TAGraph, TATools, uConst, IniFiles, //project classes uElemListClass, uElecDistClass; type { TTableForm } TTableForm = class(TForm) btnAddState: TBitBtn; btnSaveFilterSet: TBitBtn; btnOpenFilterSet: TBitBtn; btnAddFilterSet: TBitBtn; btnClearFilterSet: TBitBtn; btnAddFilter: TBitBtn; btnChangeFilter: TBitBtn; btnRemoveFilter: TBitBtn; btnWikipedia: TBitBtn; btnAdd: TButton; btnFullRange: TButton; cbListApplyFilter: TCheckBox; cbShowUnknown: TCheckBox; cbStateShowUnknown: TCheckBox; cbxSort: TComboBox; cbxState: TComboBox; Chart: TChart; cbTableApplyFilters: TCheckBox; cbxLayout: TComboBox; cbxXAxis: TComboBox; cbxYAxis: TComboBox; cbDrawLines: TCheckBox; cbChartApplyFilters: TCheckBox; cbChartUnknowVal: TCheckBox; ChartToolset: TChartToolset; cbxInvertSortOrder: TCheckBox; clbRange: TCheckListBox; cbxChartLabels: TComboBox; cbFilterKind: TComboBox; edRange: TEdit; gbState: TGroupBox; GroupBox10: TGroupBox; GroupBox11: TGroupBox; GroupBox3: TGroupBox; imgAtom: TImage; imgAtom1: TImage; IniPropStorage: TIniPropStorage; Label16: TLabel; Label17: TLabel; lbExpandedElecConf: TLabel; lbNoPic: TLabel; lbSecondIonisationEnergy: TLabel; lbThirdIonisationEnergy: TLabel; lbCASNumber: TLabel; Label22: TLabel; Label23: TLabel; Label32: TLabel; Label33: TLabel; Label42: TLabel; lbPAtNum1: TLabel; lbPMass1: TLabel; lbPName1: TLabel; lvFilters: TListView; MenuItem5: TMenuItem; mmUse: TMemo; mmAspect: TMemo; MenuItem3: TMenuItem; MenuItem4: TMenuItem; mnuHeapStatus: TMenuItem; mnuShowFilterList: TMenuItem; mnuDiscoverer: TMenuItem; mnuOpenConsole: TMenuItem; dlgOpen: TOpenDialog; pnCn: TPanel; pnSelected: TPanel; rbStateCelcius: TRadioButton; rbStateKelvin: TRadioButton; dlgSave: TSaveDialog; sedFilterMax: TFloatSpinEdit; sedFilterMin: TFloatSpinEdit; sedStateTemp: TFloatSpinEdit; sedXStart: TFloatSpinEdit; sedYStart: TFloatSpinEdit; sedXEnd: TFloatSpinEdit; sedYEnd: TFloatSpinEdit; Label38: TLabel; Label39: TLabel; Label40: TLabel; Label41: TLabel; mnuFullZoom: TMenuItem; pmChart: TPopupMenu; MainMenu: TMainMenu; MenuItem1: TMenuItem; MenuItem2: TMenuItem; mnuAbout: TMenuItem; mnuConfigure: TMenuItem; mnuExit: TMenuItem; mnuFile: TMenuItem; mnuHelp: TMenuItem; mnuManual: TMenuItem; mnuMassCalc: TMenuItem; mnuTools: TMenuItem; GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox4: TGroupBox; GroupBox5: TGroupBox; GroupBox7: TGroupBox; GroupBox8: TGroupBox; GroupBox9: TGroupBox; Isotopes: TTabSheet; Label1: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label19: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; lbAtNumber: TLabel; lbAverageX1: TLabel; lbAverageY1: TLabel; lbBoilingPt: TLabel; lbCovalentRd: TLabel; lbDiscovery: TLabel; lbElecAff: TLabel; lbElecConf: TLabel; lbElectroneg: TLabel; lbEtimology: TLabel; lbFamily: TLabel; lbFirsIonisationEnergy: TLabel; lbMass: TLabel; lbMaxX: TLabel; lbMaxX1: TLabel; lbMaxY1: TLabel; lbMeltingPt: TLabel; lbMinX: TLabel; lbAverageX: TLabel; lbMaxY: TLabel; lbMinX1: TLabel; lbMinY: TLabel; lbAverageY: TLabel; lbMinY1: TLabel; lbName: TLabel; lbNatRadio: TLabel; lbRadioHalfLife: TLabel; lbUnitX: TLabel; lbUnitX1: TLabel; lbUnitY: TLabel; lbUnitY1: TLabel; lbUnknownSort: TLabel; lbVanDerWalsRd: TLabel; lvList: TListView; PageControl2: TPageControl; Panel1: TPanel; Panel2: TPanel; pnNum1: TPanel; pnNum10: TPanel; pnNum11: TPanel; pnNum12: TPanel; pnNum13: TPanel; pnNum14: TPanel; pnNum15: TPanel; pnNum16: TPanel; pnNum17: TPanel; pnNum18: TPanel; pnNum2: TPanel; pnNum3: TPanel; pnNum4: TPanel; pnNum5: TPanel; pnNum6: TPanel; pnNum7: TPanel; pnNum8: TPanel; pnNum9: TPanel; rbSortFirst: TRadioButton; rbSortLast: TRadioButton; Splitter1: TSplitter; GroupBox6: TGroupBox; gbLegend: TGroupBox; lbContextInfo: TLabel; Label20: TLabel; lbPMass: TLabel; lbPAtNum: TLabel; lbPName: TLabel; PageControl1: TPageControl; pnHighlight: TPanel; pnGe: TPanel; pnI: TPanel; pnAc: TPanel; pnDy: TPanel; pnTb: TPanel; pnGd: TPanel; pnEu: TPanel; pnSm: TPanel; pnCe: TPanel; pnTh: TPanel; pnPa: TPanel; pnU: TPanel; pnNp: TPanel; pnLa2: TPanel; pnPu: TPanel; pnAm: TPanel; pnCm: TPanel; pnBk: TPanel; pnCf: TPanel; pnEs: TPanel; pnFm: TPanel; pnMd: TPanel; pnNo: TPanel; pnLr: TPanel; pnPr: TPanel; pnNd: TPanel; pnPm: TPanel; pnYb: TPanel; pnTm: TPanel; pnEr: TPanel; pnHo: TPanel; pnXe: TPanel; pnAl: TPanel; pnSi: TPanel; pnP: TPanel; pnS: TPanel; pnCl: TPanel; pnAr: TPanel; pnB: TPanel; pnC: TPanel; pnAs: TPanel; pnN: TPanel; pnO: TPanel; pnF: TPanel; pnNe: TPanel; pnHe: TPanel; pnBi: TPanel; pnPo: TPanel; pnPb: TPanel; pnTl: TPanel; pnAt: TPanel; pnSe: TPanel; pnRn: TPanel; pnBr: TPanel; pnKr: TPanel; pnIn: TPanel; pnSn: TPanel; pnSb: TPanel; pnTe: TPanel; pnH: TPanel; pnLi: TPanel; pnCa: TPanel; pnSc: TPanel; pnGa: TPanel; pnTi: TPanel; pnTa: TPanel; pnDb: TPanel; pnW: TPanel; pnSg: TPanel; pnMn: TPanel; pnTc: TPanel; pnRe: TPanel; pnBh: TPanel; pnFe: TPanel; pnCo: TPanel; pnY: TPanel; pnNi: TPanel; pnCu: TPanel; pnLa: TPanel; pnZn: TPanel; pnCd: TPanel; pnAg: TPanel; pnPd: TPanel; pnRh: TPanel; pnRu: TPanel; pnIr: TPanel; pnPt: TPanel; pnZr: TPanel; pnAu: TPanel; pnHg: TPanel; pnRg: TPanel; pnDs: TPanel; pnMt: TPanel; pnOs: TPanel; pnHs: TPanel; pnV: TPanel; pnNb: TPanel; pnHf: TPanel; pnRf: TPanel; pnCr: TPanel; pnMo: TPanel; pnSr: TPanel; pnBa: TPanel; pnRa: TPanel; pnBe: TPanel; pnNa: TPanel; pnMg: TPanel; pnK: TPanel; pnCs: TPanel; pnFr: TPanel; pnRb: TPanel; TabSheet1: TTabSheet; TabSheet2: TTabSheet; tsElecConf: TTabSheet; tsAspectUse: TTabSheet; tsElemDB: TTabSheet; tsGlobalInfo: TTabSheet; tsHistory: TTabSheet; tsTable: TTabSheet; tsList: TTabSheet; procedure btnAddFilterClick(Sender: TObject); procedure btnAddFilterSetClick(Sender: TObject); procedure btnAddStateClick(Sender: TObject); procedure btnChangeFilterClick(Sender: TObject); procedure btnClearFilterSetClick(Sender: TObject); procedure btnExitClick(Sender: TObject); procedure btnFullRangeClick(Sender: TObject); procedure btnMassCalcClick(Sender: TObject); procedure btnOpenFilterSetClick(Sender: TObject); procedure btnRemoveFilterClick(Sender: TObject); procedure btnSaveFilterSetClick(Sender: TObject); procedure btnWikipediaClick(Sender: TObject); procedure cbChartApplyFiltersChange(Sender: TObject); procedure cbFilterKindChange(Sender: TObject); procedure cbListApplyFilterChange(Sender: TObject); procedure cbShowUnknownChange(Sender: TObject); procedure cbTableApplyFiltersChange(Sender: TObject); procedure cbxChartLabelsChange(Sender: TObject); procedure cbxInvertSortOrderChange(Sender: TObject); procedure cbxLayoutChange(Sender: TObject); procedure cbxSortChange(Sender: TObject); procedure cbxXAxisChange(Sender: TObject); procedure cbxYAxisChange(Sender: TObject); procedure clbRangeClick(Sender: TObject); procedure edRangeChange(Sender: TObject); procedure FormShow(Sender: TObject); procedure lbListClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure btnAddClick(Sender: TObject); procedure lbListDblClick(Sender: TObject); procedure lvFiltersChange(Sender: TObject; Item: TListItem; Change: TItemChange); procedure lvFiltersClick(Sender: TObject); procedure lvFiltersSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); procedure lvListKeyPress(Sender: TObject; var Key: char); procedure lvListKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure MenuItem5Click(Sender: TObject); procedure mnuAboutClick(Sender: TObject); procedure mnuConfigureClick(Sender: TObject); procedure mnuDiscovererClick(Sender: TObject); procedure mnuFullZoomClick(Sender: TObject); procedure mnuHeapStatusClick(Sender: TObject); procedure mnuOpenConsoleClick(Sender: TObject); procedure mnuShowFilterListClick(Sender: TObject); procedure pnElmClick(Sender: TObject); procedure pnElmMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure rbSortFirstChange(Sender: TObject); procedure rbStateCelciusChange(Sender: TObject); procedure rbStateKelvinChange(Sender: TObject); procedure sedXEndChange(Sender: TObject); procedure sedXStartChange(Sender: TObject); procedure sedYEndChange(Sender: TObject); procedure sedYStartChange(Sender: TObject); procedure tsTableMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Déclarations privées } ActiveLegend: TForm; FLine: TLineSeries; ElecDist: TElecDistDisplay; CurrPanel: TPanel; procedure SetColorBloc; procedure SetLegendBloc; procedure SetColorFamily; procedure SetLegendFamily; procedure SetColorMass; procedure SetLegendMass; procedure SetColorDisco; procedure SetLegendDisco; procedure SetColorMelting; procedure SetLegendMelting; procedure SetColorBoiling; procedure SetLegendBoiling; procedure SetColorElecAff; procedure SetLegendElecAff; procedure SetColorCovalentRd; procedure SetLegendCovalentRd; procedure SetColorVanDerWaals; procedure SetLegendVanDerWaals; procedure SetColorFIE; procedure SetLegendFIE; procedure SetColorSIE; procedure SetLegendSIE; procedure SetColorTIE; procedure SetLegendTIE; procedure SetColorElectroneg; procedure SetLegendElectroneg; procedure BringToFront(ASeries: TChartSeries); procedure InitChart; procedure DrawChartGraph; procedure GraphAddXY(X, Y: Double; Index: integer); procedure ChangeIconSet; procedure ChangeColors; procedure ChangePaths; procedure ChangeBackup; procedure UpdateFilterList; public { Déclarations publiques } procedure UpdateFilterView; procedure FillList; end; var TableForm: TTableForm; implementation uses uUtils, frmAdd, frmAbout, frmMassCalculator, frmBlocLegend, frmFamilyLegend, frmGradientLegend, TAChartUtils, uStrings, uIconManager, frmOptions, uCommon, frmdiscovererlist, TATypes, uDebug; procedure TTableForm.SetColorBloc; var I: integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then case ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].Block of 's': begin (tsTable.Controls[I] as TPanel).Color := clSBlocBG; (tsTable.Controls[I] as TPanel).Font.Color := clSBlocFG; end; 'd': begin (tsTable.Controls[I] as TPanel).Color := clDBlocBG; (tsTable.Controls[I] as TPanel).Font.Color := clDBlocFG; end; 'p': begin (tsTable.Controls[I] as TPanel).Color := clPBlocBG; (tsTable.Controls[I] as TPanel).Font.Color := clPBlocFG; end; 'f': begin (tsTable.Controls[I] as TPanel).Color := clFBlocBG; (tsTable.Controls[I] as TPanel).Font.Color := clFBlocFG; end; end; end; procedure TTableForm.SetLegendBloc; begin if BlocLegendForm = nil then Exit; ActiveLegend := BlocLegendForm; BlocLegendForm.Parent := gbLegend; BlocLegendForm.BorderStyle := bsNone; BlocLegendForm.Align := alClient; BlocLegendForm.Visible := True; BlocLegendForm.Show; end; procedure TTableForm.SetColorFamily; var I: integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then case ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].Family of atNonMetal: begin (tsTable.Controls[I] as TPanel).Color := clNonMetalBG; (tsTable.Controls[I] as TPanel).Font.Color := clNonMetalFG; end; atNobleGas: begin (tsTable.Controls[I] as TPanel).Color := clNobleGasBG; (tsTable.Controls[I] as TPanel).Font.Color := clNobleGasFG; end; atMetalloid: begin (tsTable.Controls[I] as TPanel).Color := clMetalloidBG; (tsTable.Controls[I] as TPanel).Font.Color := clMetalloidFG; end; atHalogen: begin (tsTable.Controls[I] as TPanel).Color := clHalogenBG; (tsTable.Controls[I] as TPanel).Font.Color := clHalogenFG; end; atAlkalieMetal: begin (tsTable.Controls[I] as TPanel).Color := clAlkalieMetalBG; (tsTable.Controls[I] as TPanel).Font.Color := clAlkalieMetalFG; end; atAlkaline: begin (tsTable.Controls[I] as TPanel).Color := clAlkalineBG; (tsTable.Controls[I] as TPanel).Font.Color := clAlkalineFG; end; atTransMetal: begin (tsTable.Controls[I] as TPanel).Color := clTransMetalBG; (tsTable.Controls[I] as TPanel).Font.Color := clTransMetalFG; end; atRareEarth: begin (tsTable.Controls[I] as TPanel).Color := clRareEarthBG; (tsTable.Controls[I] as TPanel).Font.Color := clRareEarthFG; end; atOtherMetal: begin (tsTable.Controls[I] as TPanel).Color := clOtherMetalBG; (tsTable.Controls[I] as TPanel).Font.Color := clOtherMetalFG; end; end; end; procedure TTableForm.SetLegendFamily; begin if LegendFamilyForm = nil then Exit; ActiveLegend := LegendFamilyForm; LegendFamilyForm.Parent := gbLegend; LegendFamilyForm.BorderStyle := bsNone; LegendFamilyForm.Align := alClient; LegendFamilyForm.Visible := True; LegendFamilyForm.Show; end; procedure TTableForm.SetColorMass; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].Mass <> 0 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinMass, ElementsList.MaxMass, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].Mass, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendMass; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := False; GradientLegendForm.pnNonAppl.Visible := False; GradientLegendForm.lbMax.Caption := rsMaxMass; GradientLegendForm.lbMin.Caption := rsMinMass; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsMassDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorDisco; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].DiscoYear <> 0 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinDiscoveryDate, ElementsList.MaxDiscoveryDate, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].DiscoYear, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendDisco; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := False; GradientLegendForm.pnNonAppl.Visible := False; GradientLegendForm.lbMax.Caption := rsMaxDate; GradientLegendForm.lbMin.Caption := rsMinDate; GradientLegendForm.lbUnknow.Caption := rsKnownFromAntiq; GradientLegendForm.lbInfo.Caption := rsDateDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorMelting; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].MeltingPt <> 0 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinMeltingPoint, ElementsList.MaxMeltingPoint, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].MeltingPt, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendMelting; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := False; GradientLegendForm.pnNonAppl.Visible := False; GradientLegendForm.lbMax.Caption := rsMaxMeltingPt; GradientLegendForm.lbMin.Caption := rsMinMeltingPt; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsMeltingPtDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorBoiling; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].BoilingPt <> 0 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinBoilingPoint, ElementsList.MaxBoilingPoint, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].BoilingPt, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendBoiling; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := False; GradientLegendForm.pnNonAppl.Visible := False; GradientLegendForm.lbMax.Caption := rsMaxBoilingPt; GradientLegendForm.lbMin.Caption := rsMinBoilingPt; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsBoilingPtDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorElecAff; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinElectronicAffinity, ElementsList.MaxElectronicAffinity, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].ElecAffinity, clGradientMin, clGradientMax); (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendElecAff; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := False; GradientLegendForm.pnNonAppl.Visible := False; GradientLegendForm.lbMax.Caption := rsMaxElecAffinity; GradientLegendForm.lbMin.Caption := rsMinElecAffinity; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsElecAffinityDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorCovalentRd; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].CovalentRd <> 0 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinCovalentRadius, ElementsList.MaxCovalentRadius, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].CovalentRd, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendCovalentRd; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := False; GradientLegendForm.pnNonAppl.Visible := False; GradientLegendForm.lbMax.Caption := rsMaxCovalentRd; GradientLegendForm.lbMin.Caption := rsMinCovalentRd; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsCovalentRdDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorVanDerWaals; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].VanDerWaalsRd <> 0 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinVanDerWaalsRadius, ElementsList.MaxVanDerWaalsRadius, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].VanDerWaalsRd, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendVanDerWaals; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := False; GradientLegendForm.pnNonAppl.Visible := False; GradientLegendForm.lbMax.Caption := rsMaxVanDerWaalsRd; GradientLegendForm.lbMin.Caption := rsMinVanDerWaalsRd; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsVanDerWaalsRdDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorFIE; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].IonisationEnergy.First <> 0 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinFirstIonisationEnergy, ElementsList.MaxFirstIonisationEnergy, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].IonisationEnergy.First, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendFIE; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := False; GradientLegendForm.pnNonAppl.Visible := False; GradientLegendForm.lbMax.Caption := rsMaxFIE; GradientLegendForm.lbMin.Caption := rsMinFIE; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsFIEDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorSIE; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].IonisationEnergy.Second <> 0 then if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].IonisationEnergy.Second <> -1 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinSecondIonisationEnergy, ElementsList.MaxSecondIonisationEnergy, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].IonisationEnergy.Second, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientNonApp else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendSIE; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := True; GradientLegendForm.pnNonAppl.Visible := True; GradientLegendForm.lbMax.Caption := rsMaxSIE; GradientLegendForm.lbMin.Caption := rsMinSIE; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsSIEDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorTIE; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].IonisationEnergy.Third <> 0 then if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].IonisationEnergy.Third <> -1 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinThirdIonisationEnergy, ElementsList.MaxThirdIonisationEnergy, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].IonisationEnergy.Third, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientNonApp else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendTIE; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := True; GradientLegendForm.pnNonAppl.Visible := True; GradientLegendForm.lbMax.Caption := rsMaxTIE; GradientLegendForm.lbMin.Caption := rsMinTIE; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsTIEDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.SetColorElectroneg; var I: Integer; begin for I := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[I] is TPanel) and ((tsTable.Controls[I] as TPanel).Tag <> 0) then begin if ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].Electroneg <> -1 then (tsTable.Controls[I] as TPanel).Color := GetGradientColor( ElementsList.MinElectronegativity, ElementsList.MaxElectronegativity, ElementsList.Elements[(tsTable.Controls[I] as TPanel).Tag].Electroneg, clGradientMin, clGradientMax) else (tsTable.Controls[I] as TPanel).Color := clGradientUnknow; (tsTable.Controls[I] as TPanel).Font.Color := clGradientText; end; end; procedure TTableForm.SetLegendElectroneg; begin if GradientLegendForm = nil then Exit; ActiveLegend := GradientLegendForm; GradientLegendForm.lbNonAppl.Visible := False; GradientLegendForm.pnNonAppl.Visible := False; GradientLegendForm.lbMax.Caption := rsMaxElectroneg; GradientLegendForm.lbMin.Caption := rsMinElectroneg; GradientLegendForm.lbUnknow.Caption := rsUnknowVal; GradientLegendForm.lbInfo.Caption := rsElectronegDetails; GradientLegendForm.Parent := gbLegend; GradientLegendForm.BorderStyle := bsNone; GradientLegendForm.Align := alClient; GradientLegendForm.Visible := True; GradientLegendForm.Show; end; procedure TTableForm.btnExitClick(Sender: TObject); begin {Click on Close} Application.Terminate; end; procedure TTableForm.btnAddFilterClick(Sender: TObject); var Flt: TFilter; begin case cbFilterKind.ItemIndex of 0: Flt.Kind := fkDate; 1: Flt.Kind := fkMass; 2: Flt.Kind := fkElectronicAffinity; 3: Flt.Kind := fkMeltingPoint; 4: Flt.Kind := fkBoilingPoint; 5: Flt.Kind := fkCovalentRadius; 6: flt.Kind := fkVanDerWaalsRadius; 7: Flt.Kind := fkFirstIonisationEnergy; 8: Flt.Kind := fkSecondIonisationEnergy; 9: Flt.Kind := fkThirdIonisationEnergy; 10: Flt.Kind := fkElectronegativity; end; Flt.DisplayUnknow := cbShowUnknown.Checked; Flt.Max := sedFilterMax.Value; Flt.Min := sedFilterMin.Value; ElementsList.AddFilter(Flt); UpdateFilterList; end; procedure TTableForm.btnAddFilterSetClick(Sender: TObject); var Cnt, I: integer; Flt: TFilter; begin dlgOpen.DefaultExt := sFilterExt; if dlgOpen.Execute then begin {$warning We should clear the list here if sender is btnOpenFilterset} //if Sender = btnOpenFilterSet then //don't work... why? IniPropStorage.IniFileName := dlgSave.FileName; IniPropStorage.IniSection := 'FilterSet'; Cnt := IniPropStorage.ReadInteger('Count', 0); if Cnt = 0 then Exit; //probably invalid file triggering an error for I := 0 to Cnt - 1 do begin case IniPropStorage.ReadInteger('Kind' + IntToStr(I), -1) of 0: Flt.Kind := fkDate; 1: Flt.Kind := fkMass; 2: Flt.Kind := fkElectronicAffinity; 3: Flt.Kind := fkMeltingPoint; 4: Flt.Kind := fkBoilingPoint; 5: Flt.Kind := fkCovalentRadius; 6: Flt.Kind := fkVanDerWaalsRadius; 7: Flt.Kind := fkFirstIonisationEnergy; 8: Flt.Kind := fkSecondIonisationEnergy; 9: Flt.Kind := fkThirdIonisationEnergy; 10: Flt.Kind := fkElectronegativity; else ShowMessage('Error at index ' + IntToStr(I)); //would be better to trigger an exception end; Flt.Min := StrToFloat(IniPropStorage.ReadString('Min' + IntToStr(I), '0')); Flt.Max := StrToFloat(IniPropStorage.ReadString('Max' + IntToStr(I), '0')); Flt.DisplayUnknow := IniPropStorage.ReadBoolean('DispUnknow' + IntToStr(I), True); ElementsList.AddFilter(Flt); end; UpdateFilterList; end; end; procedure TTableForm.btnAddStateClick(Sender: TObject); var FltMelt: TFilter; FltBoil: TFilter; Temp: Double; begin FltMelt.Kind := fkMeltingPoint; FltBoil.Kind := fkBoilingPoint; FltMelt.Max := ElementsList.MaxMeltingPoint; FltMelt.Min := ElementsList.MinMeltingPoint; FltBoil.Max := ElementsList.MaxBoilingPoint; FltBoil.Min := ElementsList.MinBoilingPoint; FltMelt.DisplayUnknow := cbStateShowUnknown.Checked; FltBoil.DisplayUnknow := cbStateShowUnknown.Checked; if rbStateCelcius.Checked then Temp := sedStateTemp.Value - 273.15 else Temp := sedStateTemp.Value; case cbxState.ItemIndex of 0: begin //Gas FltBoil.Min := Temp; ElementsList.AddFilter(FltBoil); end; 1: begin //Liquid FltMelt.Min := Temp; FltBoil.Max := Temp; ElementsList.AddFilter(FltMelt); ElementsList.AddFilter(FltBoil); end; 2: begin //Solid FltMelt.Max := Temp; ElementsList.AddFilter(FltMelt); end; 3: begin //Not gas FltBoil.Max := Temp; ElementsList.AddFilter(FltBoil); end; 4: begin //Not liquid FltMelt.Max := Temp; FltBoil.Min := Temp; ElementsList.AddFilter(FltMelt); ElementsList.AddFilter(FltBoil); end; 5: begin //Not solid FltMelt.Max := Temp; ElementsList.AddFilter(FltMelt); end; else Exit; //strange error triggering an exception end; UpdateFilterList; end; procedure TTableForm.btnChangeFilterClick(Sender: TObject); var Flt: TFilter; I: Integer; begin case cbFilterKind.ItemIndex of 0: Flt.Kind := fkDate; 1: Flt.Kind := fkMass; 2: Flt.Kind := fkElectronicAffinity; 3: Flt.Kind := fkMeltingPoint; 4: Flt.Kind := fkBoilingPoint; 5: Flt.Kind := fkCovalentRadius; 6: flt.Kind := fkVanDerWaalsRadius; 7: Flt.Kind := fkFirstIonisationEnergy; 8: Flt.Kind := fkSecondIonisationEnergy; 9: Flt.Kind := fkThirdIonisationEnergy; 10: Flt.Kind := fkElectronegativity; end; Flt.DisplayUnknow := cbShowUnknown.Checked; Flt.Max := sedFilterMax.Value; Flt.Min := sedFilterMin.Value; for I := 0 to lvFilters.Items.Count - 1 do if lvFilters.Items[I].Selected then Break; ElementsList.Filters[I] := Flt; UpdateFilterList; end; procedure TTableForm.btnClearFilterSetClick(Sender: TObject); var I: integer; begin for I := 0 to ElementsList.FiltersCount - 1 do ElementsList.RemoveFilter(I); ElementsList.ClearFilters; lvFilters.Items.Clear; end; procedure TTableForm.btnFullRangeClick(Sender: TObject); var I: byte; begin edRange.Text := '1-' + IntToStr(ElemNumber); for I := 0 to clbRange.Count - 1 do clbRange.Checked[I] := True; edRangeChange(nil); DrawChartGraph; end; procedure TTableForm.btnMassCalcClick(Sender: TObject); begin if MassCalcForm <> nil then begin MassCalcForm.Visible := not MassCalcForm.Visible; MassCalcForm.BringToFront end else begin MassCalcForm := TMassCalcForm.Create(Application); MassCalcForm.Show; end {if}; end; procedure TTableForm.btnOpenFilterSetClick(Sender: TObject); begin btnClearFilterSetClick(Sender); btnAddFilterSetClick(Sender); end; procedure TTableForm.btnRemoveFilterClick(Sender: TObject); var I: integer; begin for I := 0 to lvFilters.Items.Count - 1 do if lvFilters.Items[I].Selected then ElementsList.RemoveFilter(I); UpdateFilterList; end; procedure TTableForm.btnSaveFilterSetClick(Sender: TObject); var I, K: integer; begin dlgSave.DefaultExt := sFilterExt; if dlgSave.Execute then begin IniPropStorage.IniFileName := dlgSave.FileName; IniPropStorage.IniSection := 'FilterSet'; IniPropStorage.WriteInteger('Count', ElementsList.FiltersCount); for I := 0 to ElementsList.FiltersCount - 1 do begin case ElementsList.Filters[I].Kind of fkDate: K := 0; fkMass: K := 1; fkElectronicAffinity: K := 2; fkMeltingPoint: K := 3; fkBoilingPoint: K := 4; fkCovalentRadius: K := 5; fkVanDerWaalsRadius: K := 6; fkFirstIonisationEnergy: K := 7; fkSecondIonisationEnergy: K := 8; fkThirdIonisationEnergy: K := 9; fkElectronegativity: K := 10; end; IniPropStorage.WriteInteger('Kind' + IntToStr(I), K); IniPropStorage.WriteString('Min' + IntToStr(I), FloatToStr(ElementsList.Filters[I].Min)); IniPropStorage.WriteString('Max' + IntToStr(I), FloatToStr(ElementsList.Filters[I].Max)); IniPropStorage.WriteBoolean('DispUnknow' + IntToStr(I), ElementsList.Filters[I].DisplayUnknow); end; end; end; procedure TTableForm.btnWikipediaClick(Sender: TObject); begin if not OpenURL(ElementsList.Elements[GetListIndexFromView(lvList, lvList.Selected.Index)].WikiLink) then MessageDlg(rsError, erOpenUrl, mtError, [mbOK], ''); end; procedure TTableForm.cbChartApplyFiltersChange(Sender: TObject); begin ElementsList.FilterGraph := cbChartApplyFilters.Checked; if not cbChartApplyFilters.Checked then begin FreeAndNil(FLine); DrawChartGraph; end; UpdateFilterView; end; procedure TTableForm.cbFilterKindChange(Sender: TObject); begin case cbFilterKind.ItemIndex of 0: begin sedFilterMin.MinValue := ElementsList.MinDiscoveryDate; sedFilterMin.MaxValue := ElementsList.MaxDiscoveryDate; sedFilterMax.MinValue := ElementsList.MinDiscoveryDate; sedFilterMax.MaxValue := ElementsList.MaxDiscoveryDate; sedFilterMin.Value := ElementsList.MinDiscoveryDate; sedFilterMax.Value := ElementsList.MaxDiscoveryDate; end; 1: begin sedFilterMin.MinValue := ElementsList.MinMass; sedFilterMin.MaxValue := ElementsList.MaxMass; sedFilterMax.MinValue := ElementsList.MinMass; sedFilterMax.MaxValue := ElementsList.MaxMass; sedFilterMin.Value := ElementsList.MinMass; sedFilterMax.Value := ElementsList.MaxMass; end; 2: begin sedFilterMin.MinValue := ElementsList.MinElectronicAffinity; sedFilterMin.MaxValue := ElementsList.MaxElectronicAffinity; sedFilterMax.MinValue := ElementsList.MinElectronicAffinity; sedFilterMax.MaxValue := ElementsList.MaxElectronicAffinity; sedFilterMin.Value := ElementsList.MinElectronicAffinity; sedFilterMax.Value := ElementsList.MaxElectronicAffinity; end; 3: begin sedFilterMin.MinValue := ElementsList.MinMeltingPoint; sedFilterMin.MaxValue := ElementsList.MaxMeltingPoint; sedFilterMax.MinValue := ElementsList.MinMeltingPoint; sedFilterMax.MaxValue := ElementsList.MaxMeltingPoint; sedFilterMin.Value := ElementsList.MinMeltingPoint; sedFilterMax.Value := ElementsList.MaxMeltingPoint; end; 4: begin sedFilterMin.MinValue := ElementsList.MinBoilingPoint; sedFilterMin.MaxValue := ElementsList.MaxBoilingPoint; sedFilterMax.MinValue := ElementsList.MinBoilingPoint; sedFilterMax.MaxValue := ElementsList.MaxBoilingPoint; sedFilterMin.Value := ElementsList.MinBoilingPoint; sedFilterMax.Value := ElementsList.MaxBoilingPoint; end; 5: begin sedFilterMin.MinValue := ElementsList.MinCovalentRadius; sedFilterMin.MaxValue := ElementsList.MaxCovalentRadius; sedFilterMax.MinValue := ElementsList.MinCovalentRadius; sedFilterMax.MaxValue := ElementsList.MaxCovalentRadius; sedFilterMin.Value := ElementsList.MinCovalentRadius; sedFilterMax.Value := ElementsList.MaxCovalentRadius; end; 6: begin sedFilterMin.MinValue := ElementsList.MinVanDerWaalsRadius; sedFilterMin.MaxValue := ElementsList.MaxVanDerWaalsRadius; sedFilterMax.MinValue := ElementsList.MinVanDerWaalsRadius; sedFilterMax.MaxValue := ElementsList.MaxVanDerWaalsRadius; sedFilterMin.Value := ElementsList.MinVanDerWaalsRadius; sedFilterMax.Value := ElementsList.MaxVanDerWaalsRadius; end; 7: begin sedFilterMin.MinValue := ElementsList.MinFirstIonisationEnergy; sedFilterMin.MaxValue := ElementsList.MaxFirstIonisationEnergy; sedFilterMax.MinValue := ElementsList.MinFirstIonisationEnergy; sedFilterMax.MaxValue := ElementsList.MaxFirstIonisationEnergy; sedFilterMin.Value := ElementsList.MinFirstIonisationEnergy; sedFilterMax.Value := ElementsList.MaxFirstIonisationEnergy; end; 8: begin sedFilterMin.MinValue := ElementsList.MinSecondIonisationEnergy; sedFilterMin.MaxValue := ElementsList.MaxSecondIonisationEnergy; sedFilterMax.MinValue := ElementsList.MinSecondIonisationEnergy; sedFilterMax.MaxValue := ElementsList.MaxSecondIonisationEnergy; sedFilterMin.Value := ElementsList.MinSecondIonisationEnergy; sedFilterMax.Value := ElementsList.MaxSecondIonisationEnergy; end; 9: begin sedFilterMin.MinValue := ElementsList.MinThirdIonisationEnergy; sedFilterMin.MaxValue := ElementsList.MaxThirdIonisationEnergy; sedFilterMax.MinValue := ElementsList.MinThirdIonisationEnergy; sedFilterMax.MaxValue := ElementsList.MaxThirdIonisationEnergy; sedFilterMin.Value := ElementsList.MinThirdIonisationEnergy; sedFilterMax.Value := ElementsList.MaxThirdIonisationEnergy; end; 10: begin sedFilterMin.MinValue := ElementsList.MinElectronegativity; sedFilterMin.MaxValue := ElementsList.MaxElectronegativity; sedFilterMax.MinValue := ElementsList.MinElectronegativity; sedFilterMax.MaxValue := ElementsList.MaxElectronegativity; sedFilterMin.Value := ElementsList.MinElectronegativity; sedFilterMax.Value := ElementsList.MaxElectronegativity; end; end; end; procedure TTableForm.cbListApplyFilterChange(Sender: TObject); begin ElementsList.FilterList := cbListApplyFilter.Checked; if not cbListApplyFilter.Checked then FillList; UpdateFilterView; end; procedure TTableForm.cbShowUnknownChange(Sender: TObject); begin end; procedure TTableForm.cbTableApplyFiltersChange(Sender: TObject); begin ElementsList.FilterTable := cbTableApplyFilters.Checked; UpdateFilterView; end; procedure TTableForm.cbxChartLabelsChange(Sender: TObject); begin FreeAndNil(FLine); DrawChartGraph; end; procedure TTableForm.cbxInvertSortOrderChange(Sender: TObject); begin ElementsList.SortUpToDown := cbxInvertSortOrder.Checked; FillList; end; procedure TTableForm.cbxLayoutChange(Sender: TObject); begin case cbxLayout.ItemIndex of 0: SetColorBloc; 1: SetColorFamily; 2: SetColorMass; 3: SetColorDisco; 4: SetColorMelting; 5: SetColorBoiling; 6: SetColorElecAff; 7: SetColorCovalentRd; 8: SetColorVanDerWaals; 9: SetColorFIE; 10: SetColorSIE; 11: SetColorTIE; 12: SetColorElectroneg; end {case}; if ActiveLegend <> nil then begin ActiveLegend.Visible := False; ActiveLegend.Parent := nil; end; case cbxLayout.ItemIndex of 0: SetLegendBloc; 1: SetLegendFamily; 2: SetLegendMass; 3: SetLegendDisco; 4: SetLegendMelting; 5: SetLegendBoiling; 6: SetLegendElecAff; 7: SetLegendCovalentRd; 8: SetLegendVanDerWaals; 9: SetLegendFIE; 10: SetLegendSIE; 11: SetLegendTIE; 12: SetLegendElectroneg; end {case}; end; procedure TTableForm.cbxSortChange(Sender: TObject); begin PrintLnDbg('cbxSort changed to item index #' + IntToStr(cbxSort.ItemIndex), vlHigh); case cbxSort.ItemIndex of 1: ElementsList.SortType := estName; 2: ElementsList.SortType := estSymbol; 3: ElementsList.SortType := estDiscoveryDate; 4: ElementsList.SortType := estMass; 5: ElementsList.SortType := estMeltingPoint; 6: ElementsList.SortType := estBoilingPoint; 7: ElementsList.SortType := estElectronicAffinity; 8: ElementsList.SortType := estCovalentRadius; 9: ElementsList.SortType := estVanDerWaalsRadius; 10: ElementsList.SortType := estFirstIonisationEnergy; 11: ElementsList.SortType := estSecondIonisationEnergy; 12: ElementsList.SortType := estThirdIonisationEnergy; 13: ElementsList.SortType := estElectronegativity; else ElementsList.SortType := estNumber; end; FillList; end; procedure TTableForm.cbxXAxisChange(Sender: TObject); begin FreeAndNil(FLine); case cbxXAxis.ItemIndex of 0: begin lbMinX.Caption := '1'; lbMaxX.Caption := IntToStr(ElemNumber); lbAverageX.Caption := FloatToStr((ElemNumber + 1) / 2); lbUnitX.Caption := rsNone; end; 1: begin lbMinX.Caption := FloatToStr(ElementsList.MinMass); lbMaxX.Caption := FloatToStr(ElementsList.MaxMass); lbAverageX.Caption := FloatToStr((ElementsList.MinMass + ElementsList.MaxMass) / 2); lbUnitX.Caption := rsUgstrom; end; 2: begin lbMinX.Caption := FloatToStr(ElementsList.MinMeltingPoint); lbMaxX.Caption := FloatToStr(ElementsList.MaxMeltingPoint); lbAverageX.Caption := FloatToStr((ElementsList.MinMeltingPoint + ElementsList.MaxMeltingPoint) / 2); lbUnitX.Caption := rsKelvin; end; 3: begin lbMinX.Caption := FloatToStr(ElementsList.MinBoilingPoint); lbMaxX.Caption := FloatToStr(ElementsList.MaxBoilingPoint); lbAverageX.Caption := FloatToStr((ElementsList.MinBoilingPoint + ElementsList.MaxBoilingPoint) / 2); lbUnitX.Caption := rsKelvin; end; 4: begin lbMinX.Caption := FloatToStr(ElementsList.MinElectronicAffinity); lbMaxX.Caption := FloatToStr(ElementsList.MaxElectronicAffinity); lbAverageX.Caption := FloatToStr((ElementsList.MinElectronicAffinity + ElementsList.MaxElectronicAffinity) / 2); lbUnitX.Caption := rsElectroVolt; end; 5: begin lbMinX.Caption := IntToStr(ElementsList.MinCovalentRadius); lbMaxX.Caption := IntToStr(ElementsList.MaxCovalentRadius); lbAverageX.Caption := FloatToStr((ElementsList.MinCovalentRadius + ElementsList.MaxCovalentRadius) / 2); lbUnitX.Caption := rsPicoMeter; end; 6: begin lbMinX.Caption := IntToStr(ElementsList.MinVanDerWaalsRadius); lbMaxX.Caption := IntToStr(ElementsList.MaxVanDerWaalsRadius); lbAverageX.Caption := FloatToStr((ElementsList.MinVanDerWaalsRadius + ElementsList.MaxVanDerWaalsRadius) / 2); lbUnitX.Caption := rsPicoMeter; end; 7: begin lbMinX.Caption := FloatToStr(ElementsList.MinFirstIonisationEnergy); lbMaxX.Caption := FloatToStr(ElementsList.MaxFirstIonisationEnergy); lbAverageX.Caption := FloatToStr((ElementsList.MinFirstIonisationEnergy + ElementsList.MaxFirstIonisationEnergy) / 2); lbUnitX.Caption := rsKiloJouleByVolt; end; end; DrawChartGraph; end; procedure TTableForm.cbxYAxisChange(Sender: TObject); begin FreeAndNil(FLine); case cbxYAxis.ItemIndex of 0: begin lbMinY.Caption := '1'; lbMaxY.Caption := IntToStr(ElemNumber); lbAverageY.Caption := FloatToStr((ElemNumber + 1) / 2); lbUnitY.Caption := rsNone; end; 1: begin lbMinY.Caption := FloatToStr(ElementsList.MinMass); lbMaxY.Caption := FloatToStr(ElementsList.MaxMass); lbAverageY.Caption := FloatToStr((ElementsList.MinMass + ElementsList.MaxMass) / 2); lbUnitY.Caption := rsUgstrom; end; 2: begin lbMinY.Caption := FloatToStr(ElementsList.MinMeltingPoint); lbMaxY.Caption := FloatToStr(ElementsList.MaxMeltingPoint); lbAverageY.Caption := FloatToStr((ElementsList.MinMeltingPoint + ElementsList.MaxMeltingPoint) / 2); lbUnitY.Caption := rsKelvin; end; 3: begin lbMinY.Caption := FloatToStr(ElementsList.MinBoilingPoint); lbMaxY.Caption := FloatToStr(ElementsList.MaxBoilingPoint); lbAverageY.Caption := FloatToStr((ElementsList.MinBoilingPoint + ElementsList.MaxBoilingPoint) / 2); lbUnitY.Caption := rsKelvin; end; 4: begin lbMinY.Caption := FloatToStr(ElementsList.MinElectronicAffinity); lbMaxY.Caption := FloatToStr(ElementsList.MaxElectronicAffinity); lbAverageY.Caption := FloatToStr((ElementsList.MinElectronicAffinity + ElementsList.MaxElectronicAffinity) / 2); lbUnitY.Caption := rsElectroVolt; end; 5: begin lbMinY.Caption := IntToStr(ElementsList.MinCovalentRadius); lbMaxY.Caption := IntToStr(ElementsList.MaxCovalentRadius); lbAverageY.Caption := FloatToStr((ElementsList.MinCovalentRadius + ElementsList.MaxCovalentRadius) / 2); lbUnitY.Caption := rsPicoMeter; end; 6: begin lbMinY.Caption := IntToStr(ElementsList.MinVanDerWaalsRadius); lbMaxY.Caption := IntToStr(ElementsList.MaxVanDerWaalsRadius); lbAverageY.Caption := FloatToStr((ElementsList.MinVanDerWaalsRadius + ElementsList.MaxVanDerWaalsRadius) / 2); lbUnitY.Caption := rsPicoMeter; end; 7: begin lbMinY.Caption := FloatToStr(ElementsList.MinFirstIonisationEnergy); lbMaxY.Caption := FloatToStr(ElementsList.MaxFirstIonisationEnergy); lbAverageY.Caption := FloatToStr((ElementsList.MinFirstIonisationEnergy + ElementsList.MaxFirstIonisationEnergy) / 2); lbUnitY.Caption := rsKiloJouleByVolt; end; end; DrawChartGraph; end; procedure TTableForm.clbRangeClick(Sender: TObject); begin FreeAndNil(FLine); DrawChartGraph; end; procedure TTableForm.edRangeChange(Sender: TObject); begin FreeAndNil(FLine); if not SetRange(edRange.Text) then FullRange; DrawChartGraph; end; procedure TTableForm.FormShow(Sender: TObject); begin pnHighlight.Visible := False; lbContextInfo.Visible := False; //initializing display PageControl1.ActivePage := tsTable; BlocLegendForm := TBlocLegendForm.Create(Application); LegendFamilyForm := TLegendFamilyForm.Create(Application); GradientLegendForm := TGradientLegendForm.Create(Application); //set min max values for SpinEdit components UpdateFilterView; //init graph system cbxLayoutChange(nil); cbxXAxisChange(nil); cbxYAxisChange(nil); btnFullRangeClick(nil); InitBtnGlyphs(Self); end; procedure TTableForm.lbListClick(Sender: TObject); var I, J, ElemIndex, Err, P: integer; begin //initialization //Writeln('Selcount = ', lvList.SelCount); if lvList.SelCount < 1 then begin PrintLnDbg('*** frmTable.TTableFor.lbListClick: ERROR: no item selected ' + '(this should not happen)!', vlLow); btnAdd.Enabled := False; btnWikipedia.Enabled := False; lvList.OnDblClick := nil; Exit; end else begin btnAdd.Enabled := True; pnSelected.Visible := True; btnWikipedia.Enabled := True; lvList.OnDblClick := @lbListDblClick; end; //getting the good atom index for J := lvList.Items.Count - 1 downto 0 do if lvList.Items[J].Selected then begin for I := 1 to ElemNumber do if lvList.Items[J].Caption = IntToStr(ElementsList.Elements[I].Number) then begin PrintLnDbg('J = ' + IntToStr(J) + ' / I = ' + IntToStr(I) + ' / ' + ElementsList.Elements[I].ShortName, vlFull); ElemIndex := ElementsList.Elements[I].Number; Break; end; {if} Break; end; {if} PrintLnDbg('Showing information on element at index #' + IntToStr(ElemIndex), vlLow); {showing informations} case ElementsList.Elements[ElemIndex].Block of 's': begin pnSelected.Color := clSBlocBG; pnSelected.Font.Color := clSBlocFG; lbPName1.Font.Color := clSBlocFG; //on windows colors are not properly herited at runtime lbPAtNum1.Font.Color := clSBlocFG; lbPMass1.Font.Color := clSBlocFG; end; 'p': begin pnSelected.Color := clPBlocBG; pnSelected.Font.Color := clPBlocFG; lbPName1.Font.Color := clPBlocFG; //on windows colors are not properly herited at runtime lbPAtNum1.Font.Color := clPBlocFG; lbPMass1.Font.Color := clPBlocFG; end; 'f': begin pnSelected.Color := clFBlocBG; pnSelected.Font.Color := clFBlocFG; lbPName1.Font.Color := clFBlocFG; //on windows colors are not properly herited at runtime lbPAtNum1.Font.Color := clFBlocFG; lbPMass1.Font.Color := clFBlocFG; end; 'd': begin pnSelected.Color := clDBlocBG; pnSelected.Font.Color := clDBlocFG; lbPName1.Font.Color := clDBlocFG; //on windows colors are not properly herited at runtime lbPAtNum1.Font.Color := clDBlocFG; lbPMass1.Font.Color := clDBlocFG; end; end; case ElemIndex of 57..71 : lbName.Caption := ElementsList.Elements[ElemIndex].Name + rsLanthanids; 89..103: lbName.Caption := ElementsList.Elements[ElemIndex].Name + rsActinids; else lbName.Caption := ElementsList.Elements[ElemIndex].Name; end {case}; lbCASNumber.Caption := ElementsList.Elements[ElemIndex].CAS; if ElementsList.Elements[ElemIndex].Radioactivity <> '' then case ElementsList.Elements[ElemIndex].Radioactivity[Length( ElementsList.Elements[ElemIndex].Radioactivity)] of 'y': lbRadioHalfLife.Caption := Copy(ElementsList.Elements[ElemIndex].Radioactivity, 1, Length(ElementsList.Elements[ElemIndex].Radioactivity) - 1) + rsYears; 'd': lbRadioHalfLife.Caption := Copy(ElementsList.Elements[ElemIndex].Radioactivity, 1, Length(ElementsList.Elements[ElemIndex].Radioactivity) - 1) + rsDays; 'h': lbRadioHalfLife.Caption := Copy(ElementsList.Elements[ElemIndex].Radioactivity, 1, Length(ElementsList.Elements[ElemIndex].Radioactivity) - 1) + rsHours; 'm': lbRadioHalfLife.Caption := Copy(ElementsList.Elements[ElemIndex].Radioactivity, 1, Length(ElementsList.Elements[ElemIndex].Radioactivity) - 1) + rsMins; 's': lbRadioHalfLife.Caption := Copy(ElementsList.Elements[ElemIndex].Radioactivity, 1, Length(ElementsList.Elements[ElemIndex].Radioactivity) - 1) + rsSecs; end {case} else lbRadioHalfLife.Caption := rsNoRadioactivity; if ElementsList.Elements[ElemIndex].Mass <> 0 then lbMass.Caption := FloatToStr(ElementsList.Elements[ElemIndex].Mass) + ' u' else lbMass.Caption := rsUnknown; lbAtNumber.Caption := IntToStr(ElemIndex) + rsBlock + ElementsList.Elements[ElemIndex].Block; if ElementsList.Elements[ElemIndex].MeltingPt <> 0 then lbMeltingPt.Caption := FloatToStr(ElementsList.Elements[ElemIndex].MeltingPt) + ' K, ' + FloatToStr(ElementsList.Elements[ElemIndex].MeltingPt - 273.15) + ' °C' else lbMeltingPt.Caption := rsUnknown; if ElementsList.Elements[ElemIndex].BoilingPt <> 0 then lbBoilingPt.Caption := FloatToStr(ElementsList.Elements[ElemIndex].BoilingPt) + ' K, ' + FloatToStr(ElementsList.Elements[ElemIndex].BoilingPt - 273.15) + ' °C' else lbBoilingPt.Caption := rsUnknown; if ElementsList.Elements[ElemIndex].ElecAffinity <> -1 then lbElecAff.Caption := FloatToStr(ElementsList.Elements[ElemIndex].ElecAffinity) + ' eV' else lbElecAff.Caption := rsUnknown; if ElementsList.Elements[ElemIndex].ElecConf <> '' then lbElecConf.Caption := ElementsList.Elements[ElemIndex].ElecConf else lbElecConf.Caption := rsUnknown; if ElementsList.Elements[ElemIndex].CovalentRd <> 0 then lbCovalentRd.Caption := IntToStr(ElementsList.Elements[ElemIndex].CovalentRd) + ' pm' else lbCovalentRd.Caption := rsUnknown; if ElementsList.Elements[ElemIndex].VanDerWaalsRd <> 0 then lbVanDerWalsRd.Caption := IntToStr(ElementsList.Elements[ElemIndex].VanDerWaalsRd) + ' pm' else lbVanDerWalsRd.Caption := rsUnknown; if ElementsList.Elements[ElemIndex].IonisationEnergy.First <> 0 then lbFirsIonisationEnergy.Caption := FloatToStr(ElementsList.Elements[ElemIndex].IonisationEnergy.First) + ' kJ/mol' + rsFirst else lbFirsIonisationEnergy.Caption := rsUnknown + rsFirst; if ElementsList.Elements[ElemIndex].IonisationEnergy.Second <> 0 then if ElementsList.Elements[ElemIndex].IonisationEnergy.Second <> -1 then lbSecondIonisationEnergy.Caption := FloatToStr(ElementsList.Elements[ElemIndex].IonisationEnergy.Second) + ' kJ/mol' + rsSecond else lbSecondIonisationEnergy.Caption := rsImpossible + rsSecond else lbSecondIonisationEnergy.Caption := rsUnknown + rsSecond; if ElementsList.Elements[ElemIndex].IonisationEnergy.Third <> 0 then if ElementsList.Elements[ElemIndex].IonisationEnergy.Third <> -1 then lbThirdIonisationEnergy.Caption := FloatToStr(ElementsList.Elements[ElemIndex].IonisationEnergy.Third) + ' kJ/mol' + rsThird else lbThirdIonisationEnergy.Caption := rsImpossible + rsThird else lbThirdIonisationEnergy.Caption := rsUnknown + rsThird; if ElementsList.Elements[ElemIndex].Electroneg <> -1 then lbElectroneg.Caption := FloatToStr(ElementsList.Elements[ElemIndex].Electroneg) + ' ' + rsPaulingScale else lbElectroneg.Caption := rsUnknown; if ElementsList.Elements[ElemIndex].DiscoYear <> 0 then if ElementsList.Elements[ElemIndex].Discoverer <> '' then lbDiscovery.Caption := Format(rsDiscoInBy, [ElementsList.Elements[ElemIndex].DiscoYear, ElementsList.Elements[ElemIndex].Discoverer]) else lbDiscovery.Caption := Format(rsDiscoInByUnknow, [ElementsList.Elements[ElemIndex].DiscoYear]) else lbDiscovery.Caption := rsDiscoAntiq; lbEtimology.Caption := ElementsList.Elements[ElemIndex].Etymology; if ElementsList.Elements[ElemIndex].Radioactivity <> '' then lbNatRadio.Caption := rsYes else lbNatRadio.Caption := rsNo; case ElementsList.Elements[ElemIndex].Family of atOtherMetal: lbFamily.Caption := rsOtherMetal; atRareEarth: lbFamily.Caption := rsRareEarth; atTransMetal: lbFamily.Caption := rsTransMetal; atAlkaline: lbFamily.Caption := rsAlcaline; atAlkalieMetal: lbFamily.Caption := rsAlkalieMetal; atHalogen: lbFamily.Caption := rsHalogen; atMetalloid: lbFamily.Caption := rsMetalloid; atNobleGas: lbFamily.Caption := rsNobleGas; atNonMetal: lbFamily.Caption := rsNonMetal; else lbFamily.Caption := rsUnknown; end {case}; ElecDist.ElecronicConf := lbElecConf.Caption; lbExpandedElecConf.Caption := ElecDist.ExpandedElecConf; if lbExpandedElecConf.Caption = '' then lbExpandedElecConf.Caption := rsUnknoxElecDist; lbPName1.Caption := ElementsList.Elements[ElemIndex].Name; lbPAtNum1.Caption := IntToStr(ElementsList.Elements[ElemIndex].Number); pnSelected.Caption := ElementsList.Elements[ElemIndex].ShortName; lbPMass1.Caption := FloatToStr(ElementsList.Elements[ElemIndex].Mass) + ' u'; lbPAtNum1.Left := 47 - lbPAtNum1.Width; lbPMass1.Left := 109 - lbPMass1.Width; try lbNopic.Visible := False; imgAtom.Visible := True; imgAtom.Picture.LoadFromFile(GetPicRessource(ElementsList.Elements[ElemIndex].ShortName)); except imgAtom.Picture.Clear; imgAtom.Visible := False; lbNopic.Visible := True; end;; end; procedure TTableForm.FormCreate(Sender: TObject); var I, J: Byte; begin ActiveLegend := nil; btnChangeFilter.Enabled := False; btnRemoveFilter.Enabled := False; btnClearFilterSet.Enabled := False; pnSelected.Visible := False; pnSelected.ParentColor := False; pnSelected.FullRepaint := True; pnHighlight.FullRepaint := True; pnHighlight.ParentColor := False; PrintLnDbg('Filling list...', vlLow); FillList; {creating list} PrintLnDbg('Initializing table...', vlLow); for I := 1 to ElemNumber do for J := 0 to tsTable.ControlCount - 1 do if (tsTable.Controls[J] is TPanel) then if (tsTable.Controls[J] as TPanel).Caption = ElementsList.Elements[I].ShortName then (tsTable.Controls[J] as TPanel).Tag := I; //load icons PrintLnDbg('-- Loading icon set...', vlLow); Inc(VerboseLevel); LoadIconSet(sIconsBase, 'oxygen', is16x16); MainMenu.Images := ilDefault; PageControl2.TabIndex := 0; PageControl1.TabIndex := 0; ElecDist := TElecDistDisplay.Create(tsElecConf); ElecDist.ElecronicConf := ''; cbFilterKindChange(nil); end; procedure TTableForm.FillList; var I: integer; LI: TListItem; begin lvList.Clear; case cbxSort.ItemIndex of 0, 1, 2: lvList.Columns[2].Caption := rsName; 3: lvList.Columns[2].Caption := rsDiscoveryDate; 4: lvList.Columns[2].Caption := rsMass; 5: lvList.Columns[2].Caption := rsMeltingPoint; 6: lvList.Columns[2].Caption := rsBoilingPoint; 7: lvList.Columns[2].Caption := rsElectronicAffinity; 8: lvList.Columns[2].Caption := rsCovalentRadius; 9: lvList.Columns[2].Caption := rsVanDerWaalsRadius; 10: lvList.Columns[2].Caption := rsFirstIonisationEnergy; 11: lvList.Columns[2].Caption := rsSecondIonisationEnergy; 12: lvList.Columns[2].Caption := rsThirdIonisationEnergy; 13: lvList.Columns[2].Caption := rsElectronegativity; end; btnAdd.Enabled := False; for I := 1 to ElemNumber do if (not cbListApplyFilter.Checked) or ElementsList.Filtered(I) then begin LI := lvList.Items.Add; LI.Caption := IntToStr(ElementsList.SortedElements[I].Number); LI.SubItems.Add(ElementsList.SortedElements[I].ShortName); case cbxSort.ItemIndex of 0, 1, 2: LI.SubItems.Add(ElementsList.SortedElements[I].Name); 3: if ElementsList.SortedElements[I].DiscoYear <> 0 then LI.SubItems.Add(IntToStr(ElementsList.SortedElements[I].DiscoYear)) else LI.SubItems.Add(rsKnownFromAntiq); 4: LI.SubItems.Add(FloatToStr(ElementsList.SortedElements[I].Mass)); 5: if ElementsList.SortedElements[I].MeltingPt <> 0 then LI.SubItems.Add(FloatToStr(ElementsList.SortedElements[I].MeltingPt)) else LI.SubItems.Add(rsUnknown); 6: if ElementsList.SortedElements[I].BoilingPt <> 0 then LI.SubItems.Add(FloatToStr(ElementsList.SortedElements[I].BoilingPt)) else LI.SubItems.Add(rsUnknown); 7: LI.SubItems.Add(FloatToStr(ElementsList.SortedElements[I].ElecAffinity)); 8: if ElementsList.SortedElements[I].CovalentRd <> 0 then LI.SubItems.Add(IntToStr(ElementsList.SortedElements[I].CovalentRd)) else LI.SubItems.Add(rsUnknown); 9: if ElementsList.SortedElements[I].VanDerWaalsRd <> 0 then LI.SubItems.Add(IntToStr(ElementsList.SortedElements[I].VanDerWaalsRd)) else LI.SubItems.Add(rsUnknown); 10: if ElementsList.SortedElements[I].IonisationEnergy.First <> 0 then LI.SubItems.Add(FloatToStr(ElementsList.SortedElements[I].IonisationEnergy.First)) else LI.SubItems.Add(rsUnknown); 11: if ElementsList.SortedElements[I].IonisationEnergy.Second <> 0 then if ElementsList.SortedElements[I].IonisationEnergy.Second <> -1 then LI.SubItems.Add(FloatToStr(ElementsList.SortedElements[I].IonisationEnergy.Second)) else LI.SubItems.Add(rsImpossible) else LI.SubItems.Add(rsUnknown); 12: if ElementsList.SortedElements[I].IonisationEnergy.Third <> 0 then if ElementsList.SortedElements[I].IonisationEnergy.Third <> -1 then LI.SubItems.Add(FloatToStr(ElementsList.SortedElements[I].IonisationEnergy.Third)) else LI.SubItems.Add(rsImpossible) else LI.SubItems.Add(rsUnknown); 13: if ElementsList.SortedElements[I].Electroneg <> -1 then LI.SubItems.Add(FloatToStr(ElementsList.SortedElements[I].Electroneg)) else LI.SubItems.Add(rsUnknown); end; end; lvList.Column[0].Width := 50; lvList.Column[1].Width := 50; end; procedure TTableForm.btnAddClick(Sender: TObject); begin {Add button click} with TAddForm.Create(Application) do try Label2.Caption := lvList.Selected.Caption; Label4.Caption := Self.lbName.Caption; ShowModal; finally Free; end {try}; end; procedure TTableForm.lbListDblClick(Sender: TObject); begin btnAddClick(Sender); end; procedure TTableForm.lvFiltersChange(Sender: TObject; Item: TListItem; Change: TItemChange); begin btnClearFilterSet.Enabled := lvFilters.Items.Count > 0; end; procedure TTableForm.lvFiltersClick(Sender: TObject); var LI: TListItem; I: integer; begin if ElementsList.FiltersCount <= 0 then begin btnRemoveFilter.Enabled := False; btnClearFilterSet.Enabled := False; Exit; end else btnClearFilterSet.Enabled := True; for I := 0 to lvFilters.Items.Count - 1 do if lvFilters.Items[I].Selected then begin LI := lvFilters.Items[I]; btnChangeFilter.Enabled := True; btnRemoveFilter.Enabled := True; Break; end else if I >= lvFilters.Items.Count - 1 then begin btnChangeFilter.Enabled := False; btnRemoveFilter.Enabled := False; end; for I := 0 to cbFilterKind.Items.Count - 1 do if LI.Caption = cbFilterKind.Items[I] then cbFilterKind.ItemIndex := I; case cbFilterKind.ItemIndex of 0: begin sedFilterMin.MinValue := ElementsList.MinDiscoveryDate; sedFilterMin.MaxValue := ElementsList.MaxDiscoveryDate; sedFilterMax.MinValue := ElementsList.MinDiscoveryDate; sedFilterMax.MaxValue := ElementsList.MaxDiscoveryDate; end; 1: begin sedFilterMin.MinValue := ElementsList.MinMass; sedFilterMin.MaxValue := ElementsList.MaxMass; sedFilterMax.MinValue := ElementsList.MinMass; sedFilterMax.MaxValue := ElementsList.MaxMass; end; 2: begin sedFilterMin.MinValue := ElementsList.MinElectronicAffinity; sedFilterMin.MaxValue := ElementsList.MaxElectronicAffinity; sedFilterMax.MinValue := ElementsList.MinElectronicAffinity; sedFilterMax.MaxValue := ElementsList.MaxElectronicAffinity; end; 3: begin sedFilterMin.MinValue := ElementsList.MinMeltingPoint; sedFilterMin.MaxValue := ElementsList.MaxMeltingPoint; sedFilterMax.MinValue := ElementsList.MinMeltingPoint; sedFilterMax.MaxValue := ElementsList.MaxMeltingPoint; end; 4: begin sedFilterMin.MinValue := ElementsList.MinBoilingPoint; sedFilterMin.MaxValue := ElementsList.MaxBoilingPoint; sedFilterMax.MinValue := ElementsList.MinBoilingPoint; sedFilterMax.MaxValue := ElementsList.MaxBoilingPoint; end; 5: begin sedFilterMin.MinValue := ElementsList.MinCovalentRadius; sedFilterMin.MaxValue := ElementsList.MaxCovalentRadius; sedFilterMax.MinValue := ElementsList.MinCovalentRadius; sedFilterMax.MaxValue := ElementsList.MaxCovalentRadius; end; 6: begin sedFilterMin.MinValue := ElementsList.MinVanDerWaalsRadius; sedFilterMin.MaxValue := ElementsList.MaxVanDerWaalsRadius; sedFilterMax.MinValue := ElementsList.MinVanDerWaalsRadius; sedFilterMax.MaxValue := ElementsList.MaxVanDerWaalsRadius; end; 7: begin sedFilterMin.MinValue := ElementsList.MinFirstIonisationEnergy; sedFilterMin.MaxValue := ElementsList.MaxFirstIonisationEnergy; sedFilterMax.MinValue := ElementsList.MinFirstIonisationEnergy; sedFilterMax.MaxValue := ElementsList.MaxFirstIonisationEnergy; end; 8: begin sedFilterMin.MinValue := ElementsList.MinSecondIonisationEnergy; sedFilterMin.MaxValue := ElementsList.MaxSecondIonisationEnergy; sedFilterMax.MinValue := ElementsList.MinSecondIonisationEnergy; sedFilterMax.MaxValue := ElementsList.MaxSecondIonisationEnergy; end; 9: begin sedFilterMin.MinValue := ElementsList.MinThirdIonisationEnergy; sedFilterMin.MaxValue := ElementsList.MaxThirdIonisationEnergy; sedFilterMax.MinValue := ElementsList.MinThirdIonisationEnergy; sedFilterMax.MaxValue := ElementsList.MaxThirdIonisationEnergy; end; 10: begin sedFilterMin.MinValue := ElementsList.MinElectronegativity; sedFilterMin.MaxValue := ElementsList.MaxElectronegativity; sedFilterMax.MinValue := ElementsList.MinElectronegativity; sedFilterMax.MaxValue := ElementsList.MaxElectronegativity; end; end; sedFilterMin.Value := StrToFloat(LI.SubItems[0]); sedFilterMax.Value := StrToFloat(LI.SubItems[1]); cbShowUnknown.Checked := LI.SubItems[2] = rsYes; end; procedure TTableForm.lvFiltersSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); begin btnRemoveFilter.Enabled := lvFilters.SelCount <> 0; btnChangeFilter.Enabled := lvFilters.SelCount <> 0; btnSaveFilterSet.Enabled := lvFilters.Items.Count <> 0; end; procedure TTableForm.lvListKeyPress(Sender: TObject; var Key: char); begin if Key = #13 then lbListDblClick(Sender); end; procedure TTableForm.lvListKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var Start, I, J: integer; begin inherited; Start := 0; if (Key <> 13) and (Key <> 10) then begin if (Key in [Ord('a')..Ord('z')]) or (Key in [Ord('A')..Ord('Z')]) then begin for I := 0 to lvList.Items.Count - 1 do if lvList.Items[I].Selected then begin lvList.Items[I].Selected := False; Start := I + 1; end; //ShowMessage('Start = ' + IntToStr(Start)); for I := 0 to lvList.Items.Count - 1 do begin if I + Start < lvList.Items.Count then J := I + Start else J := I + Start - lvList.Items.Count; if Ord(lvList.Items[J].SubItems[0][1]) = Key then begin lvList.Items[J].Selected := True; Break; end; end; end; lbListClick(Sender); end; end; procedure TTableForm.MenuItem5Click(Sender: TObject); var ini: TIniFile; I: Integer; begin for I := 1 to ElemNumber do begin Ini := TIniFile.Create(GetProgramPrefix + 'datas/' + ElementsList.Elements[I].ShortName + '.dat'); Ini.WriteInteger('Global', 'Number', ElementsList.Elements[I].Number); Ini.WriteString('Global', 'ShortName', ElementsList.Elements[I].ShortName); Ini.WriteString('Global', 'CAS', ElementsList.Elements[I].CAS); Ini.WriteString('Global', 'Name', ElementsList.Elements[I].Name); Ini.WriteString('Global', 'Bloc', ElementsList.Elements[I].Block); Ini.WriteString('Global', 'Family', AFamilyStr[ElementsList.Elements[I].Family]); Ini.WriteString('Global', 'Wikipedia', ElementsList.Elements[I].WikiLink); Ini.WriteInteger('History', 'Year', ElementsList.Elements[I].DiscoYear); Ini.WriteString('History', 'Discoverer', ElementsList.Elements[I].Discoverer); Ini.WriteString('History', 'Etymology', ElementsList.Elements[I].Etymology); Ini.WriteFloat('Values', 'MeltingPoint', ElementsList.Elements[I].MeltingPt); Ini.WriteFloat('Values', 'BoilingPoint', ElementsList.Elements[I].BoilingPt); Ini.WriteFloat('Values', 'Mass', ElementsList.Elements[I].Mass); Ini.WriteInteger('Values', 'CovalentRadius', ElementsList.Elements[I].CovalentRd); Ini.WriteInteger('Values', 'VanDerWaalsRadius', ElementsList.Elements[I].VanDerWaalsRd); Ini.WriteFloat('Values', 'ElectronicAffinity', ElementsList.Elements[I].ElecAffinity); Ini.WriteFloat('Values', 'Electronegativity', ElementsList.Elements[I].Electroneg); Ini.WriteString('Values', 'ElectronicConf', ElementsList.Elements[I].ElecConf); Ini.WriteFloat('Values', 'FirstIonistionEnergy', ElementsList.Elements[I].IonisationEnergy.First); Ini.WriteFloat('Values', 'SecondIonisationEnergy', ElementsList.Elements[I].IonisationEnergy.Second); Ini.WriteFloat('Values', 'ThirdIonisationEnergy', ElementsList.Elements[I].IonisationEnergy.Third); end; end; procedure TTableForm.mnuAboutClick(Sender: TObject); begin ShowAboutBox; end; procedure TTableForm.mnuConfigureClick(Sender: TObject); begin with TOptionsForm.Create(Application) do try if ShowModal = mrOK then begin if ChangedColors then begin clSBlocBG := pnSBloc.Color; clSBlocFG := pnSBloc.Font.Color; clPBlocBG := pnPBloc.Color; clPBlocFG := pnPBloc.Font.Color; clFBlocBG := pnFBloc.Color; clFBlocFG := pnFBloc.Font.Color; clDBlocBG := pnDBloc.Color; clDBlocFG := pnDBloc.Font.Color; ChangeColors; end; if ChangedBackup then ChangeBackup; if ChangedIconSet then ChangeIconSet; if ChangedPaths then ChangePaths; end; finally Free; end; end; procedure TTableForm.mnuDiscovererClick(Sender: TObject); begin if (DiscovererListForm <> nil) and Assigned(DiscovererListForm) then DiscovererListForm.Visible := not DiscovererListForm.Visible else begin DiscovererListForm := TDiscovererListForm.Create(Application); DiscovererListForm.Show; end; end; procedure TTableForm.mnuFullZoomClick(Sender: TObject); begin Chart.Extent.UseXMax := False; Chart.Extent.UseXMin := False; Chart.Extent.UseYMax := False; Chart.Extent.UseYMin := False; Chart.ZoomFull; end; procedure TTableForm.mnuHeapStatusClick(Sender: TObject); begin //ShowMessage(GetHeapStatus); end; procedure TTableForm.mnuOpenConsoleClick(Sender: TObject); begin end; procedure TTableForm.mnuShowFilterListClick(Sender: TObject); begin ElementsList.DbgShowFilters; end; procedure TTableForm.pnElmClick(Sender: TObject); var N: integer; begin PageControl1.ActivePage := tsList; for N := 0 to ElemNumber - 1 do lvList.Items[N].Selected := lvList.Items[N].SubItems[0] = (Sender as TPanel).Caption; lbListClick(Sender); end; procedure TTableForm.pnElmMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var N, Err, P: integer; begin if (Sender is TPanel) then begin pnHighlight.Visible := True; lbContextInfo.Visible := True; end else begin pnHighlight.Visible := False; lbContextInfo.Visible := False; CurrPanel := nil; Exit; end {if}; if (Sender as TPanel) = CurrPanel then Exit else CurrPanel := (Sender as TPanel); pnHighlight.Caption := CurrPanel.Caption; pnHighlight.Color := CurrPanel.Color; pnHighlight.Font.Color := CurrPanel.Font.Color; lbPName.Font.Color := CurrPanel.Font.Color; lbPAtNum.Font.Color := CurrPanel.Font.Color; lbPMass.Font.Color := CurrPanel.Font.Color; for N := 1 to ElemNumber do if CurrPanel.Caption = ElementsList.Elements[N].ShortName then begin lbPName.Caption := ElementsList.Elements[N].Name; lbPAtNum.Caption := IntToStr(ElementsList.Elements[N].Number); lbPMass.Caption := FloatToStr(ElementsList.Elements[N].Mass) + ' u'; lbPAtNum.Left := 47 - lbPAtNum.Width; lbPMass.Left := 109 - lbPMass.Width; case cbxLayout.ItemIndex of 0: lbContextInfo.Caption := ''; 1: lbContextInfo.Caption := ''; 2: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%n u', [ElementsList.Elements[N].Mass]); 3: if ElementsList.Elements[N].DiscoYear <> 0 then lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%d', [ElementsList.Elements[N].DiscoYear]) else lbContextInfo.Caption := rsKnownFromAntiq; 4: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%n K', [ElementsList.Elements[N].MeltingPt]); 5: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%n K', [ElementsList.Elements[N].BoilingPt]); 6: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%n eV', [ElementsList.Elements[N].ElecAffinity]); 7: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%d pm', [ElementsList.Elements[N].CovalentRd]); 8: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%d pm', [ElementsList.Elements[N].VanDerWaalsRd]); 9: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%n kJ/mol', [ElementsList.Elements[N].IonisationEnergy.First]); 10: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%n kJ/mol', [ElementsList.Elements[N].IonisationEnergy.Second]); 11: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%n kJ/mol', [ElementsList.Elements[N].IonisationEnergy.Third]); 12: lbContextInfo.Caption := Format(cbxLayout.Items[cbxLayout.ItemIndex] + ':' + LineBreak + '%n', [ElementsList.Elements[N].Electroneg]); end; try imgAtom1.Picture.LoadFromFile(GetPicRessource(ElementsList.Elements[N].ShortName)); except imgAtom1.Picture.Clear; end; end {if}; end; procedure TTableForm.rbSortFirstChange(Sender: TObject); begin ElementsList.SortUnknowFirst := rbSortFirst.Checked; FillList; end; procedure TTableForm.rbStateCelciusChange(Sender: TObject); begin if rbStateCelcius.Checked then sedStateTemp.Value := sedStateTemp.Value + 273.15; end; procedure TTableForm.rbStateKelvinChange(Sender: TObject); begin if rbStateKelvin.Checked then sedStateTemp.Value := sedStateTemp.Value - 273.15; end; procedure TTableForm.sedXEndChange(Sender: TObject); begin if sedXEnd.Value > sedXStart.Value then begin Chart.Extent.UseXMax := True; Chart.Extent.XMax := sedXEnd.Value; end else if (Sender = sedXEnd) then sedXEnd.Value := sedXStart.Value else if (Sender = sedXStart) then sedXStart.Value := sedXEnd.Value; end; procedure TTableForm.sedXStartChange(Sender: TObject); begin if sedXEnd.Value > sedXStart.Value then begin Chart.Extent.UseXMin := True; Chart.Extent.XMin := sedXStart.Value; end else if (Sender = sedXEnd) then sedXEnd.Value := sedXStart.Value else if (Sender = sedXStart) then sedXStart.Value := sedXEnd.Value; end; procedure TTableForm.sedYEndChange(Sender: TObject); begin if sedYEnd.Value > sedYStart.Value then begin Chart.Extent.UseYMax := True; Chart.Extent.YMax := sedYEnd.Value; end else if (Sender = sedYEnd) then sedYEnd.Value := sedYStart.Value else if (Sender = sedYStart) then sedYStart.Value := sedYEnd.Value; end; procedure TTableForm.sedYStartChange(Sender: TObject); begin if sedYEnd.Value > sedYStart.Value then begin Chart.Extent.UseYMin := True; Chart.Extent.YMin := sedYStart.Value; end else if (Sender = sedYEnd) then sedYEnd.Value := sedYStart.Value else if (Sender = sedYStart) then sedYStart.Value := sedYEnd.Value; end; procedure TTableForm.tsTableMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin pnHighlight.Visible := False; lbContextInfo.Visible := False; imgAtom1.Picture.Clear; end; procedure TTableForm.UpdateFilterView; var I: integer; begin //FillList; for I := 0 to tsTable.ControlCount - 1 do if tsTable.Controls[I] is TPanel then if (tsTable.Controls[I] as TPanel).Tag <> 0 then if ElementsList.FilterTable then (tsTable.Controls[I] as TPanel).Visible := ElementsList.Filtered((tsTable.Controls[I] as TPanel).Tag) else (tsTable.Controls[I] as TPanel).Visible := True; if cbChartApplyFilters.Checked then begin FreeAndNil(FLine); DrawChartGraph; end; if cbListApplyFilter.Checked then FillList; end; procedure TTableForm.BringToFront(ASeries: TChartSeries); var I: Integer; begin for I := 0 to Chart.SeriesCount - 1 do Chart.Series[I].ZPosition := Ord(Chart.Series[I] = ASeries); end; procedure TTableForm.GraphAddXY(X, Y: Double; Index: integer); begin if RangeArray[Index] then if (clbRange.Checked[0] and (ElementsList.Elements[Index].Block = 's')) or (clbRange.Checked[1] and (ElementsList.Elements[Index].Block = 'p')) or (clbRange.Checked[2] and (ElementsList.Elements[Index].Block = 'd')) or (clbRange.Checked[3] and (ElementsList.Elements[Index].Block = 'f')) or (clbRange.Checked[4] and (ElementsList.Elements[Index].Family = atAlkaline)) or (clbRange.Checked[5] and (ElementsList.Elements[Index].Family = atAlkalieMetal)) or (clbRange.Checked[6] and (ElementsList.Elements[Index].Family = atTransMetal)) or (clbRange.Checked[7] and (ElementsList.Elements[Index].Family = atOtherMetal)) or (clbRange.Checked[8] and (ElementsList.Elements[Index].Family = atMetalloid)) or (clbRange.Checked[9] and (ElementsList.Elements[Index].Family = atNonMetal)) or (clbRange.Checked[10] and (ElementsList.Elements[Index].Family = atHalogen)) or (clbRange.Checked[11] and (ElementsList.Elements[Index].Family = atNobleGas)) or (clbRange.Checked[12] and (ElementsList.Elements[Index].Family = atRareEarth)) then if cbxChartLabels.ItemIndex = 1 then FLine.AddXY(X, Y, ElementsList.Elements[Index].Name, clLime) else FLine.AddXY(X, Y, ElementsList.Elements[Index].ShortName, clLime); end; procedure TTableForm.InitChart; begin Chart.Extent.UseXMax := False; Chart.Extent.UseXMin := False; Chart.Extent.UseYMax := False; Chart.Extent.UseYMin := False; FLine := TLineSeries.Create(Chart); FLine.ShowLines := cbDrawLines.Checked; FLine.ShowPoints := True; FLine.Pointer.Style := psRectangle; FLine.Pointer.Brush.Color := clLime; FLine.Title := 'line'; FLine.SeriesColor := clTeal; case cbxChartLabels.ItemIndex of 0: FLine.Marks.Style := smsNone; 1: FLine.Marks.Style := smsLabel; 2: FLine.Marks.Style := smsLabel; 3: FLine.Marks.Style := smsXValue; 4: FLine.Marks.Style := smsValue; end; FLine.Marks.Frame.Color := clWhite; FLine.Marks.LabelBrush.Color := clNavy; Fline.Marks.LabelFont.Color := clWhite; Chart.AddSeries(FLine); end; procedure TTableForm.DrawChartGraph; var I: integer; begin if FLine = nil then InitChart; BringToFront(FLine); for I := 1 to ElemNumber do if (not cbChartApplyFilters.Checked) or ElementsList.Filtered(I) then case cbxXAxis.ItemIndex of 0: case cbxYAxis.ItemIndex of 0: GraphAddXY(I, I, I); 1: GraphAddXY(I, ElementsList.Elements[I].Mass, I); 2: if ElementsList.Elements[I].MeltingPt <> 0 then GraphAddXY(I, ElementsList.Elements[I].MeltingPt, I); 3: if ElementsList.Elements[I].BoilingPt <> 0 then GraphAddXY(I, ElementsList.Elements[I].BoilingPt, I); 4: GraphAddXY(I, ElementsList.Elements[I].ElecAffinity, I); 5: if ElementsList.Elements[I].CovalentRd <> 0 then GraphAddXY(I, ElementsList.Elements[I].CovalentRd, I); 6: if ElementsList.Elements[I].VanDerWaalsRd <> 0 then GraphAddXY(I, ElementsList.Elements[I].VanDerWaalsRd, I); 7: if ElementsList. Elements[I].IonisationEnergy.First <> 0 then GraphAddXY(I, ElementsList.Elements[I].IonisationEnergy.First, I); end; 1: case cbxYAxis.ItemIndex of 0: GraphAddXY(ElementsList.Elements[I].Mass, I, I); 1: GraphAddXY(ElementsList.Elements[I].Mass, ElementsList.Elements[I].Mass, I); 2: if ElementsList.Elements[I].MeltingPt <> 0 then GraphAddXY(ElementsList.Elements[I].Mass, ElementsList.Elements[I].MeltingPt, I); 3: if ElementsList.Elements[I].BoilingPt <> 0 then GraphAddXY(ElementsList.Elements[I].Mass, ElementsList.Elements[I].BoilingPt, I); 4: GraphAddXY(ElementsList.Elements[I].Mass, ElementsList.Elements[I].ElecAffinity, I); 5: if ElementsList.Elements[I].CovalentRd <> 0 then GraphAddXY(ElementsList.Elements[I].Mass, ElementsList.Elements[I].CovalentRd, I); 6: if ElementsList.Elements[I].VanDerWaalsRd <> 0 then GraphAddXY(ElementsList.Elements[I].Mass, ElementsList.Elements[I].VanDerWaalsRd, I); 7: if ElementsList.Elements[I].IonisationEnergy.First <> 0 then GraphAddXY(ElementsList.Elements[I].Mass, ElementsList.Elements[I].IonisationEnergy.First, I); end; 2: if ElementsList.Elements[I].MeltingPt <> 0 then case cbxYAxis.ItemIndex of 0: GraphAddXY(ElementsList.Elements[I].MeltingPt, I, I); 1: GraphAddXY(ElementsList.Elements[I].MeltingPt, ElementsList.Elements[I].Mass, I); 2: if ElementsList.Elements[I].MeltingPt <> 0 then GraphAddXY(ElementsList.Elements[I].MeltingPt, ElementsList.Elements[I].MeltingPt, I); 3: if ElementsList.Elements[I].BoilingPt <> 0 then GraphAddXY(ElementsList.Elements[I].MeltingPt, ElementsList.Elements[I].BoilingPt, I); 4: GraphAddXY(ElementsList.Elements[I].MeltingPt, ElementsList.Elements[I].ElecAffinity, I); 5: if ElementsList.Elements[I].CovalentRd <> 0 then GraphAddXY(ElementsList.Elements[I].MeltingPt, ElementsList.Elements[I].CovalentRd, I); 6: if ElementsList.Elements[I].VanDerWaalsRd <> 0 then GraphAddXY(ElementsList.Elements[I].MeltingPt, ElementsList.Elements[I].VanDerWaalsRd, I); 7: if ElementsList.Elements[I].IonisationEnergy.First <> 0 then GraphAddXY(ElementsList.Elements[I].MeltingPt, ElementsList.Elements[I].IonisationEnergy.First, I); end; 3: if ElementsList.Elements[I].BoilingPt <> 0 then case cbxYAxis.ItemIndex of 0: GraphAddXY(ElementsList.Elements[I].BoilingPt, I, I); 1: GraphAddXY(ElementsList.Elements[I].BoilingPt, ElementsList.Elements[I].Mass, I); 2: if ElementsList.Elements[I].MeltingPt <> 0 then GraphAddXY(ElementsList.Elements[I].BoilingPt, ElementsList.Elements[I].MeltingPt, I); 3: if ElementsList.Elements[I].BoilingPt <> 0 then GraphAddXY(ElementsList.Elements[I].BoilingPt, ElementsList.Elements[I].BoilingPt, I); 4: if ElementsList.Elements[I].ElecAffinity <> 0 then GraphAddXY(ElementsList.Elements[I].BoilingPt, ElementsList.Elements[I].ElecAffinity, I); 5: if ElementsList.Elements[I].CovalentRd <> 0 then GraphAddXY(ElementsList.Elements[I].BoilingPt, ElementsList.Elements[I].CovalentRd, I); 6: if ElementsList.Elements[I].VanDerWaalsRd <> 0 then GraphAddXY(ElementsList.Elements[I].BoilingPt, ElementsList.Elements[I].VanDerWaalsRd, I); 7: GraphAddXY(ElementsList.Elements[I].BoilingPt, ElementsList.Elements[I].IonisationEnergy.First, I); end; 4: case cbxYAxis.ItemIndex of 0: GraphAddXY(ElementsList.Elements[I].ElecAffinity, I, I); 1: GraphAddXY(ElementsList.Elements[I].ElecAffinity, ElementsList.Elements[I].Mass, I); 2: if ElementsList.Elements[I].MeltingPt <> 0 then GraphAddXY(ElementsList.Elements[I].ElecAffinity, ElementsList.Elements[I].MeltingPt, I); 3: if ElementsList.Elements[I].BoilingPt <> 0 then GraphAddXY(ElementsList.Elements[I].ElecAffinity, ElementsList.Elements[I].BoilingPt, I); 4: GraphAddXY(ElementsList.Elements[I].ElecAffinity, ElementsList.Elements[I].ElecAffinity, I); 5: if ElementsList.Elements[I].CovalentRd <> 0 then GraphAddXY(ElementsList.Elements[I].ElecAffinity, ElementsList.Elements[I].CovalentRd, I); 6: if ElementsList.Elements[I].VanDerWaalsRd <> 0 then GraphAddXY(ElementsList.Elements[I].ElecAffinity, ElementsList.Elements[I].VanDerWaalsRd, I); 7: if ElementsList.Elements[I].IonisationEnergy.First <> 0 then GraphAddXY(ElementsList.Elements[I].ElecAffinity, ElementsList.Elements[I].IonisationEnergy.First, I); end; 5: if ElementsList.Elements[I].CovalentRd <> 0 then case cbxYAxis.ItemIndex of 0: GraphAddXY(ElementsList.Elements[I].CovalentRd, I, I); 1: GraphAddXY(ElementsList.Elements[I].CovalentRd, ElementsList.Elements[I].Mass, I); 2: if ElementsList.Elements[I].MeltingPt <> 0 then GraphAddXY(ElementsList.Elements[I].CovalentRd, ElementsList.Elements[I].MeltingPt, I); 3: if ElementsList.Elements[I].BoilingPt <> 0 then GraphAddXY(ElementsList.Elements[I].CovalentRd, ElementsList.Elements[I].BoilingPt, I); 4: GraphAddXY(ElementsList.Elements[I].CovalentRd, ElementsList.Elements[I].ElecAffinity, I); 5: if ElementsList.Elements[I].CovalentRd <> 0 then GraphAddXY(ElementsList.Elements[I].CovalentRd, ElementsList.Elements[I].CovalentRd, I); 6: if ElementsList.Elements[I].VanDerWaalsRd <> 0 then GraphAddXY(ElementsList.Elements[I].CovalentRd, ElementsList.Elements[I].VanDerWaalsRd, I); 7: if ElementsList.Elements[I].IonisationEnergy.First <> 0 then GraphAddXY(ElementsList.Elements[I].CovalentRd, ElementsList.Elements[I].IonisationEnergy.First, I); end; 6: if ElementsList.Elements[I].VanDerWaalsRd <> 0 then case cbxYAxis.ItemIndex of 0: GraphAddXY(ElementsList.Elements[I].VanDerWaalsRd, I, I); 1: GraphAddXY(ElementsList.Elements[I].VanDerWaalsRd, ElementsList.Elements[I].Mass, I); 2: if ElementsList.Elements[I].MeltingPt <> 0 then GraphAddXY(ElementsList.Elements[I].VanDerWaalsRd, ElementsList.Elements[I].MeltingPt, I); 3: if ElementsList.Elements[I].BoilingPt <> 0 then GraphAddXY(ElementsList.Elements[I].VanDerWaalsRd, ElementsList.Elements[I].BoilingPt, I); 4: GraphAddXY(ElementsList.Elements[I].VanDerWaalsRd, ElementsList.Elements[I].ElecAffinity, I); 5: if ElementsList.Elements[I].CovalentRd <> 0 then GraphAddXY(ElementsList.Elements[I].VanDerWaalsRd, ElementsList.Elements[I].CovalentRd, I); 6: if ElementsList.Elements[I].VanDerWaalsRd <> 0 then GraphAddXY(ElementsList.Elements[I].VanDerWaalsRd, ElementsList.Elements[I].VanDerWaalsRd, I); 7: if ElementsList.Elements[I].IonisationEnergy.First <> 0 then GraphAddXY(ElementsList.Elements[I].VanDerWaalsRd, ElementsList.Elements[I].IonisationEnergy.First, I); end; 7: if ElementsList.Elements[I].IonisationEnergy.First <> 0 then case cbxYAxis.ItemIndex of 0: GraphAddXY(ElementsList.Elements[I].IonisationEnergy.First, I, I); 1: GraphAddXY(ElementsList.Elements[I].IonisationEnergy.First, ElementsList.Elements[I].Mass, I); 2: if ElementsList.Elements[I].MeltingPt <> 0 then GraphAddXY(ElementsList.Elements[I].IonisationEnergy.First, ElementsList.Elements[I].MeltingPt, I); 3: if ElementsList.Elements[I].BoilingPt <> 0 then GraphAddXY(ElementsList.Elements[I].IonisationEnergy.First, ElementsList.Elements[I].BoilingPt, I); 4: GraphAddXY(ElementsList.Elements[I].IonisationEnergy.First, ElementsList.Elements[I].ElecAffinity, I); 5: if ElementsList.Elements[I].CovalentRd <> 0 then GraphAddXY(ElementsList.Elements[I].IonisationEnergy.First, ElementsList.Elements[I].CovalentRd, I); 6: if ElementsList.Elements[I].VanDerWaalsRd <> 0 then GraphAddXY(ElementsList.Elements[I].IonisationEnergy.First, ElementsList.Elements[I].VanDerWaalsRd, I); 7: if ElementsList.Elements[I].IonisationEnergy.First <> 0 then GraphAddXY(ElementsList.Elements[I].IonisationEnergy.First, ElementsList.Elements[I].IonisationEnergy.First, I); end; end; {$warning Get the value when Extent.UseXXXX is set to false} sedXStart.Value := Chart.Extent.XMin; sedYStart.Value := Chart.Extent.YMin; sedXEnd.Value := Chart.Extent.XMax; sedYEnd.Value := Chart.Extent.YMax; Chart.ZoomFull; end; procedure TTableForm.ChangeIconSet; begin {$warning TTableForm.ChangeIconSet: to be done} end; procedure TTableForm.ChangeColors; begin cbxLayoutChange(nil); lbListClick(nil); end; procedure TTableForm.ChangeBackup; begin {$warning TTableForm.ChangeBackup: to be done} end; procedure TTableForm.ChangePaths; begin {$warning TTableForm.ChangePaths: to be done} end; procedure TTableForm.UpdateFilterList; var LI: TListItem; I: Integer; begin lvFilters.Items.Clear; for I := 0 to ElementsList.FiltersCount - 1 do begin LI := lvFilters.Items.Add; case ElementsList.Filters[I].Kind of fkDate: LI.Caption := cbFilterKind.Items[0]; fkElectronicAffinity: LI.Caption := cbFilterKind.Items[2]; fkMass: LI.Caption := cbFilterKind.Items[1]; fkMeltingPoint: LI.Caption := cbFilterKind.Items[3]; fkBoilingPoint: LI.Caption := cbFilterKind.Items[4]; fkCovalentRadius: LI.Caption := cbFilterKind.Items[5]; fkVanDerWaalsRadius: LI.Caption := cbFilterKind.Items[6]; fkFirstIonisationEnergy: LI.Caption := cbFilterKind.Items[7]; fkSecondIonisationEnergy: LI.Caption := cbFilterKind.Items[8]; fkThirdIonisationEnergy: LI.Caption := cbFilterKind.Items[9]; fkElectronegativity: LI.Caption := cbFilterKind.Items[10]; end; LI.SubItems.Add(FloatToStr(ElementsList.Filters[I].Min)); LI.SubItems.Add(FloatToStr(ElementsList.Filters[I].Max)); if ElementsList.Filters[I].DisplayUnknow then LI.SubItems.Add(rsYes) else LI.SubItems.Add(rsNo); end; lvFiltersClick(nil); end; initialization {$i frmtable.lrs} end.