initial commit moved from svn
This commit is contained in:
698
uelemlistclass.pas
Normal file
698
uelemlistclass.pas
Normal file
@@ -0,0 +1,698 @@
|
||||
{
|
||||
********************************************************************************
|
||||
|
||||
YaPeTaVi - Yet another Periodic Table Viewer
|
||||
Copyright (C) 2009-2011 Geoffray Levasseur <geoffray.levasseurbrandin@numericable.fr>.
|
||||
All rights reserved.
|
||||
http://www.geoffray-levasseur.org/
|
||||
|
||||
This source 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 2 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This code 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.
|
||||
|
||||
A copy of the GNU General Public License is available on the World Wide Web
|
||||
at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
|
||||
to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA.
|
||||
|
||||
|
||||
********************************************************************************
|
||||
|
||||
Description:
|
||||
Element list class
|
||||
|
||||
}
|
||||
unit uElemListClass;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
ComCtrls, Classes, SysUtils, uStrings, uCommon;
|
||||
|
||||
type
|
||||
TElemFamily = (atAlkaline, atRareEarth, atNonMetal, atAlkalieMetal,
|
||||
atOtherMetal, atHalogen, atTransMetal, atNobleGas,
|
||||
atMetalloid);
|
||||
|
||||
const
|
||||
AFamilyStr: array[TElemFamily] of string = (rsAlcaline, rsRareEarth,
|
||||
rsNonMetal, rsAlkalieMetal, rsOtherMetal, rsHalogen, rsTransMetal,
|
||||
rsNobleGas, rsMetalloid);
|
||||
|
||||
type
|
||||
TIonisationEnergy = record
|
||||
First: Double;
|
||||
Second: Double;
|
||||
Third: Double;
|
||||
end;
|
||||
|
||||
St2 = String[2];
|
||||
|
||||
TElement = record
|
||||
Name: string;
|
||||
ShortName: St2;
|
||||
Mass: Double;
|
||||
CAS: string;
|
||||
DiscoYear: Integer;
|
||||
Discoverer: string;
|
||||
Etymology: String;
|
||||
Family: TElemFamily;
|
||||
Block: Char;
|
||||
MeltingPt: Double;
|
||||
BoilingPt: Double;
|
||||
ElecAffinity: Double;
|
||||
ElecConf: string;
|
||||
CovalentRd: integer; //in picometer so no real needed
|
||||
VanDerWaalsRd: integer; //in picometer so no real needed
|
||||
IonisationEnergy: TIonisationEnergy;
|
||||
Electroneg: Double;
|
||||
Radioactivity: string;
|
||||
Number: byte;
|
||||
Aspect: string;
|
||||
Use: string;
|
||||
WikiLink: string;
|
||||
end;
|
||||
|
||||
TElemArray = array[0..ElemNumber] of TElement;
|
||||
|
||||
TElemSortType = (estNumber, estName, estSymbol, estDiscoveryDate, estMass,
|
||||
estMeltingPoint, estBoilingPoint, estElectronicAffinity, estCovalentRadius,
|
||||
estVanDerWaalsRadius, estFirstIonisationEnergy, estSecondIonisationEnergy,
|
||||
estThirdIonisationEnergy, estElectronegativity);
|
||||
|
||||
TFilterKind = (fkDate, fkMass, fkMeltingPoint, fkBoilingPoint,
|
||||
fkElectronicAffinity, fkCovalentRadius, fkVanDerWaalsRadius,
|
||||
fkFirstIonisationEnergy, fkSecondIonisationEnergy, fkThirdIonisationEnergy,
|
||||
fkElectronegativity);
|
||||
|
||||
TFilter = record
|
||||
Min, Max: Double;
|
||||
Kind: TFilterKind;
|
||||
DisplayUnknow: Boolean;
|
||||
end;
|
||||
|
||||
PFilterNode = ^TFilterNode;
|
||||
TFilterNode = record
|
||||
Item: TFilter;
|
||||
Next, Prev: PFilterNode;
|
||||
end;
|
||||
|
||||
TElemList = class(TPersistent)
|
||||
private
|
||||
FFilterTable: Boolean;
|
||||
FFilterList: Boolean;
|
||||
FFilterGraph: Boolean;
|
||||
FElements: TElemArray;
|
||||
FSortType: TElemSortType;
|
||||
FSortUpToDown: Boolean;
|
||||
FSortUnknowFirst: Boolean;
|
||||
FSortedElements: TElemArray;
|
||||
FMinMass, FMaxMass: Double;
|
||||
FMinDiscoveryDate, FMaxDiscoveryDate: Integer;
|
||||
FMinMeltingPt, FMaxMeltingPt: Double;
|
||||
FMinBoilingPt, FMaxBoilingPt: Double;
|
||||
FMinElecAffinity, FMaxElecAffinity: Double;
|
||||
FMinCovalentRd, FMaxCovalentRd: Integer;
|
||||
FMinVanDerWaalsRd, FMaxVanDerWaalsRd: Integer;
|
||||
FMinFirstIonisationEnergy, FMaxFirstIonisationEnergy: Double;
|
||||
FMinSecondIonisationEnergy, FMaxSecondIonisationEnergy: Double;
|
||||
FMinThirdIonisationEnergy, FMaxThirdIonisationEnergy: Double;
|
||||
FMinElectroneg, FMaxElectroneg: Double;
|
||||
FMinFilteredMass, FMaxFilteredMass: Double;
|
||||
FMinFilteredDiscoveryDate, FMaxFilteredDiscoveryDate: Integer;
|
||||
FMinFilteredMeltingPt, FMaxFilteredMeltingPt: Double;
|
||||
FMinFilteredBoilingPt, FMaxFilteredBoilingPt: Double;
|
||||
FMinFilteredElecAffinity, FMaxFilteredElecAffinity: Double;
|
||||
FMinFilteredCovalentRd, FMaxFilteredCovalentRd: Integer;
|
||||
FMinFilteredVanDerWaalsRd, FMaxFilteredVanDerWaalsRd: Integer;
|
||||
FMinFilteredFirstIonisationEnergy, FMaxFilteredFirstIonisationEnergy: Double;
|
||||
FMinFilteredSecondIonisationEnergy, FMaxFilteredSecondIonisationEnergy: Double;
|
||||
FMinFilteredThirdIonisationEnergy, FMaxFilteredThirdIonisationEnergy: Double;
|
||||
FMinFilteredElectroneg, FMaxFilteredElectroneg: Double;
|
||||
FUpdating: Boolean;
|
||||
FFltCount: Integer;
|
||||
FFltFirst: PFilterNode;
|
||||
procedure SetSortType(const AType: TElemSortType);
|
||||
procedure SetSortUpToDown(const AUpToDown: Boolean);
|
||||
procedure SetSortUnknowFirst(const AUnknowFirst: Boolean);
|
||||
procedure UpdateMinMax;
|
||||
procedure UpdateFilteredMinMax;
|
||||
procedure Sort;
|
||||
protected
|
||||
function FltGet(Index: Integer): TFilter; virtual;
|
||||
function FltGetCount: Integer; virtual;
|
||||
procedure FltPut(Index: Integer; const Flt: TFilter); virtual;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); virtual;
|
||||
destructor Destroy; override;
|
||||
function Filtered(const I: Integer): Boolean;
|
||||
function InActiveRange(const I: Integer): Boolean;
|
||||
function Add(const FElem: TElement): integer;
|
||||
function AddFilter(Flt: TFilter): integer;
|
||||
procedure RemoveFilter(Index: Integer);
|
||||
procedure ClearFilters;
|
||||
procedure UpdateList(var AListView: TListView);
|
||||
procedure UpdateList(var AListItems: TStrings);
|
||||
property FilterTable: Boolean read FFilterTable write FFilterTable
|
||||
default True;
|
||||
property FilterList: Boolean read FFilterList write FFilterList
|
||||
default True;
|
||||
property FilterGraph: Boolean read FFilterGraph write FFilterGraph
|
||||
default True;
|
||||
property Elements: TElemArray read FElements;
|
||||
property SortedElements: TElemArray read FSortedElements;
|
||||
property Filters[Index: integer]: TFilter read FltGet write FltPut;
|
||||
property FiltersCount: integer read FltGetCount;
|
||||
property MinDiscoveryDate: integer read FMinDiscoveryDate default 0;
|
||||
property MaxDiscoveryDate: integer read FMaxDiscoveryDate default 0;
|
||||
property MinMass: Double read FMinMass;
|
||||
property MaxMass: Double read FMaxMass;
|
||||
property MinMeltingPoint: Double read FMinMeltingPt;
|
||||
property MaxMeltingPoint: Double read FMaxMeltingPt;
|
||||
property MinBoilingPoint: Double read FMinBoilingPt;
|
||||
property MaxBoilingPoint: Double read FMaxBoilingPt;
|
||||
property MinElectronicAffinity: Double read FMinElecAffinity;
|
||||
property MaxElectronicAffinity: Double read FMaxElecAffinity;
|
||||
property MinCovalentRadius: integer read FMinCovalentRd default 0;
|
||||
property MaxCovalentRadius: integer read FMaxCovalentRd default 0;
|
||||
property MinVanDerWaalsRadius: integer read FMinVanDerWaalsRd default 0;
|
||||
property MaxVanDerWaalsRadius: integer read FMaxVanDerWaalsRd default 0;
|
||||
property MinFirstIonisationEnergy: Double read FMinFirstIonisationEnergy;
|
||||
property MaxFirstIonisationEnergy: Double read FMaxFirstIonisationEnergy;
|
||||
property MinSecondIonisationEnergy: Double read FMinSecondIonisationEnergy;
|
||||
property MaxSecondIonisationEnergy: Double read FMaxSecondIonisationEnergy;
|
||||
property MinThirdIonisationEnergy: Double read FMinThirdIonisationEnergy;
|
||||
property MaxThirdIonisationEnergy: Double read FMaxThirdIonisationEnergy;
|
||||
property MinElectronegativity: Double read FMinElectroneg;
|
||||
property MaxElectronegativity: Double read FMaxElectroneg;
|
||||
property MinFilteredMass: Double read FMinFilteredMass;
|
||||
property MaxFilteredMass: Double read FMaxFilteredMass;
|
||||
property MinFilteredMeltingPoint: Double read FMinFilteredMeltingPt;
|
||||
property MaxFilteredMeltingPoint: Double read FMaxFilteredMeltingPt;
|
||||
property MinFilteredBoilingPoint: Double read FMinFilteredBoilingPt;
|
||||
property MaxFilteredBoilingPoint: Double read FMaxFilteredBoilingPt;
|
||||
property MinFilteredElectronicAffinity: Double read FMinFilteredElecAffinity;
|
||||
property MaxFilteredElectronicAffinity: Double read FMaxFilteredElecAffinity;
|
||||
property MinFilteredCovalentRadius: integer read FMinFilteredCovalentRd
|
||||
default 0;
|
||||
property MaxFilteredCovalentRadius: integer read FMaxFilteredCovalentRd
|
||||
default 0;
|
||||
property MinFilteredVanDerWaalsRadius: integer
|
||||
read FMinFilteredVanDerWaalsRd default 0;
|
||||
property MaxFilteredVanDerWaalsRadius: integer
|
||||
read FMaxFilteredVanDerWaalsRd default 0;
|
||||
property MinFilteredFirstIonisationEnergy: Double
|
||||
read FMinFilteredFirstIonisationEnergy;
|
||||
property MaxFilteredFirstIonisationEnergy: Double
|
||||
read FMaxFilteredFirstIonisationEnergy;
|
||||
property MinFilteredSecondIonisationEnergy: Double
|
||||
read FMinFilteredSecondIonisationEnergy;
|
||||
property MaxFilteredSecondIonisationEnergy: Double
|
||||
read FMaxFilteredSecondIonisationEnergy;
|
||||
property MinFilteredThirdIonisationEnergy: Double
|
||||
read FMinFilteredThirdIonisationEnergy;
|
||||
property MaxFilteredThirdIonisationEnergy: Double
|
||||
read FMaxFilteredThirdIonisationEnergy;
|
||||
property MinFilteredElectronegativity: Double read FMinFilteredElectroneg;
|
||||
property MaxFilteredElectronegativity: Double read FMaxFilteredElectroneg;
|
||||
property SortType: TElemSortType read FSortType write SetSortType
|
||||
default estNumber;
|
||||
property SortUpToDown: Boolean read FSortUpToDown write SetSortUpToDown
|
||||
default False;
|
||||
property SortUnknowFirst: Boolean read FSortUnknowFirst
|
||||
write SetSortUnknowFirst default True;
|
||||
procedure BeginUpdate;
|
||||
procedure EndUpdate;
|
||||
function GetDiscovererList: TStrings;
|
||||
procedure DbgShowFilters;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
uSort, uUtils, uDebug, Forms, Dialogs;
|
||||
|
||||
|
||||
procedure TElemList.ClearFilters;
|
||||
var
|
||||
Node: PFilterNode;
|
||||
begin
|
||||
if FFltFirst <> nil then
|
||||
begin
|
||||
repeat
|
||||
Node := FFltFirst;
|
||||
FFltFirst := FFltFirst^.Next;
|
||||
Dispose(Node);
|
||||
until FFltFirst = nil;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TElemList.AddFilter(Flt: TFilter): integer;
|
||||
var
|
||||
I: integer;
|
||||
Node, Node2: PFilterNode;
|
||||
begin
|
||||
Node := FFltFirst;
|
||||
I := 0;
|
||||
if Node = nil then
|
||||
begin
|
||||
New(Node);
|
||||
Node^.Item := Flt;
|
||||
Node^.Prev := nil;
|
||||
Node^.Next := nil;
|
||||
FFltFirst := Node;
|
||||
Result := 0;
|
||||
Exit;
|
||||
end;
|
||||
while Node^.Next <> nil do
|
||||
begin
|
||||
Node := Node^.Next;
|
||||
Inc(I);
|
||||
end;
|
||||
New(Node2);
|
||||
Node2^.Item := Flt;
|
||||
Node2^.Next := nil;
|
||||
Node2^.Prev := Node;
|
||||
Node^.Next := Node2;
|
||||
Result := I;
|
||||
Application.ProcessMessages;
|
||||
end;
|
||||
|
||||
function TElemList.FltGet(Index: integer): TFilter;
|
||||
var
|
||||
I: integer;
|
||||
Node: PFilterNode;
|
||||
begin
|
||||
Node := FFltFirst;
|
||||
if Index = 0 then
|
||||
begin
|
||||
Result := FFltFirst^.Item;
|
||||
Exit;
|
||||
end;
|
||||
for I := 0 to Index - 1 do
|
||||
if Node <> nil then
|
||||
Node := Node^.Next
|
||||
else Exit; //this is an error (leave an exception)
|
||||
if Node <> nil then
|
||||
Result := Node^.Item;
|
||||
end;
|
||||
|
||||
procedure TElemList.FltPut(Index: integer; const Flt: TFilter);
|
||||
var
|
||||
I: integer;
|
||||
Node: PFilterNode;
|
||||
begin
|
||||
Node := FFltFirst;
|
||||
if Index = 0 then
|
||||
begin
|
||||
FFltFirst^.Item := Flt;
|
||||
Exit;
|
||||
end;
|
||||
for I := 0 to Index do
|
||||
if Node <> nil then
|
||||
Node := Node^.Next
|
||||
else Exit; //this is an error as above
|
||||
if Node <> nil then
|
||||
Node^.Item := Flt;
|
||||
end;
|
||||
|
||||
function TElemList.FltGetCount: integer;
|
||||
var
|
||||
I: integer;
|
||||
Node: PFilterNode;
|
||||
begin
|
||||
Node := FFltFirst;
|
||||
I := 0;
|
||||
if Node <> nil then
|
||||
while Node <> nil do
|
||||
begin
|
||||
Node := Node^.Next;
|
||||
Inc(I);
|
||||
end;
|
||||
Result := I;
|
||||
end;
|
||||
|
||||
procedure TElemList.RemoveFilter(Index: integer);
|
||||
var
|
||||
Node: PFilterNode;
|
||||
I: integer;
|
||||
begin
|
||||
Node := FFltFirst;
|
||||
if Index = 0 then
|
||||
begin
|
||||
if Node^.Next <> nil then
|
||||
Node^.Next^.Prev := nil;
|
||||
FFltFirst := Node^.Next;
|
||||
Dispose(Node);
|
||||
Exit;
|
||||
end;
|
||||
for I := 1 to Index do
|
||||
if Node <> nil then
|
||||
Node := Node^.Next
|
||||
else Exit; //show error here
|
||||
if Node <> nil then
|
||||
begin
|
||||
Node^.Prev^.Next := Node^.Next;
|
||||
if Node^.Next <> nil then
|
||||
Node^.Next^.Prev := Node^.Prev;
|
||||
Dispose(Node);
|
||||
end; //add an else statement showing an error
|
||||
end;
|
||||
|
||||
constructor TElemList.Create(AOwner: TComponent);
|
||||
begin
|
||||
FUpdating := False;
|
||||
FFltCount := 0;
|
||||
FFltFirst := nil;
|
||||
end;
|
||||
|
||||
destructor TElemList.Destroy;
|
||||
begin
|
||||
ClearFilters;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
function TElemList.Filtered(const I: Integer): Boolean;
|
||||
var
|
||||
bDate, bMass, bMelting, bBoiling, bCovalent, bVanDerWaals, bElecAff,
|
||||
bElectroneg, bFIE, bSIE, bTIE: Boolean;
|
||||
begin
|
||||
if FUpdating then
|
||||
begin
|
||||
UpdateMinMax;
|
||||
UpdateFilteredMinMax;
|
||||
Sort;
|
||||
end;
|
||||
{$warning TElemList.Filtered: To be done}
|
||||
end;
|
||||
|
||||
function TELemList.InActiveRange(const I: Integer): Boolean;
|
||||
begin
|
||||
Result := not Filtered(I);
|
||||
end;
|
||||
|
||||
function TElemList.Add(const FElem: TElement): integer;
|
||||
begin
|
||||
FElements[FElem.Number] := FElem;
|
||||
Result := FElem.Number;
|
||||
PrintLnDbg('Element #' + IntToStr(FElem.Number) + ' added successfully',
|
||||
vlHigh);
|
||||
if not FUpdating then
|
||||
begin
|
||||
UpdateMinMax;
|
||||
UpdateFilteredMinMax;
|
||||
Sort;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TElemList.UpdateList(var AListView: TListView);
|
||||
begin
|
||||
if FUpdating then
|
||||
begin
|
||||
UpdateMinMax;
|
||||
UpdateFilteredMinMax;
|
||||
Sort;
|
||||
end;
|
||||
{$warning TElemList.UpdtateList(ListView): To be done}
|
||||
end;
|
||||
|
||||
procedure TElemList.UpdateList(var AListItems: TStrings);
|
||||
begin
|
||||
if FUpdating then
|
||||
begin
|
||||
UpdateMinMax;
|
||||
UpdateFilteredMinMax;
|
||||
Sort;
|
||||
end;
|
||||
{$warning TElemList.UpdtateList(Strings): To be done}
|
||||
end;
|
||||
|
||||
procedure TElemList.SetSortType(const AType: TElemSortType);
|
||||
begin
|
||||
FSortType := AType;
|
||||
if not FUpdating then Sort;
|
||||
end;
|
||||
|
||||
procedure TElemList.SetSortUpToDown(const AUpToDown: Boolean);
|
||||
begin
|
||||
FSortUpToDown := AUpToDown;
|
||||
if not FUpdating then Sort;
|
||||
end;
|
||||
|
||||
procedure TElemList.SetSortUnknowFirst(const AUnknowFirst: Boolean);
|
||||
begin
|
||||
FSortUnknowFirst := AUnknowFirst;
|
||||
if not FUpdating then Sort;
|
||||
end;
|
||||
|
||||
procedure TElemList.UpdateMinMax;
|
||||
var
|
||||
I: integer;
|
||||
begin
|
||||
PrintLnDbg('Updating min and max values...', vlLow);
|
||||
for I := 1 to ElemNumber do
|
||||
begin
|
||||
if FElements[I].Mass > FMaxMass then
|
||||
FMaxMass := FElements[I].Mass;
|
||||
if FElements[I].DiscoYear > FMaxDiscoveryDate then
|
||||
FMaxDiscoveryDate := FElements[I].DiscoYear;
|
||||
if FElements[I].MeltingPt > FMaxMeltingPt then
|
||||
FMaxMeltingPt := FElements[I].MeltingPt;
|
||||
if FElements[I].BoilingPt > FMaxBoilingPt then
|
||||
FMaxBoilingPt := FElements[I].BoilingPt;
|
||||
if FElements[I].ElecAffinity > FMaxElecAffinity then
|
||||
FMaxElecAffinity := FElements[I].ElecAffinity;
|
||||
if FElements[I].CovalentRd > FMaxCovalentRd then
|
||||
FMaxCovalentRd := FElements[I].CovalentRd;
|
||||
if FElements[I].VanDerWaalsRd > FMaxVanDerWaalsRd then
|
||||
FMaxVanDerWaalsRd := FElements[I].VanDerWaalsRd;
|
||||
if FElements[I].IonisationEnergy.First > FMaxFirstIonisationEnergy then
|
||||
FMaxFirstIonisationEnergy := FElements[I].IonisationEnergy.First;
|
||||
if FElements[I].IonisationEnergy.Second > FMaxSecondIonisationEnergy then
|
||||
FMaxSecondIonisationEnergy := FElements[I].IonisationEnergy.Second;
|
||||
if FElements[I].IonisationEnergy.Third > FMaxThirdIonisationEnergy then
|
||||
FMaxThirdIonisationEnergy := FElements[I].IonisationEnergy.Third;
|
||||
if FElements[I].Electroneg > FMaxElectroneg then
|
||||
FMaxElectroneg := FElements[I].Electroneg;
|
||||
end;
|
||||
FMinMass := FMaxMass;
|
||||
FMinDiscoveryDate := FMaxDiscoveryDate;
|
||||
FMinMeltingPt := FMaxMeltingPt;
|
||||
FMinBoilingPt := FMaxBoilingPt;
|
||||
FMinElecAffinity := FMaxElecAffinity;
|
||||
FMinCovalentRd := FMaxCovalentRd;
|
||||
FMinVanDerWaalsRd := FMaxVanDerWaalsRd;
|
||||
FMinFirstIonisationEnergy := FMaxFirstIonisationEnergy;
|
||||
FMinSecondIonisationEnergy := FMaxSecondIonisationEnergy;
|
||||
FMinThirdIonisationEnergy := FMaxThirdIonisationEnergy;
|
||||
FMinElectroneg := FMaxElectroneg;
|
||||
for I := 1 to ElemNumber do
|
||||
begin
|
||||
if (FElements[I].Mass < FMinMass) and (FElements[I].Mass <> 0) then
|
||||
FMinMass := FElements[I].Mass;
|
||||
if (FElements[I].DiscoYear < FMinDiscoveryDate) and
|
||||
(FElements[I].DiscoYear <> 0) then
|
||||
FMinDiscoveryDate := FElements[I].DiscoYear;
|
||||
if (FElements[I].MeltingPt < FMinMeltingPt) and
|
||||
(FElements[I].MeltingPt <> 0) then
|
||||
FMinMeltingPt := FElements[I].MeltingPt;
|
||||
if (FElements[I].BoilingPt < FMinBoilingPt) and
|
||||
(FElements[I].BoilingPt <> 0) then
|
||||
FMinBoilingPt := FElements[I].BoilingPt;
|
||||
if (FElements[I].ElecAffinity < FMinElecAffinity) then
|
||||
FMinElecAffinity := FElements[I].ElecAffinity;
|
||||
if (FElements[I].CovalentRd < FMinCovalentRd) and
|
||||
(FElements[I].CovalentRd <> 0) then
|
||||
FMinCovalentRd := FElements[I].CovalentRd;
|
||||
if (FElements[I].VanDerWaalsRd < FMinVanDerWaalsRd) and
|
||||
(FElements[I].VanDerWaalsRd <> 0) then
|
||||
FMinVanDerWaalsRd := FElements[I].VanDerWaalsRd;
|
||||
if (FElements[I].IonisationEnergy.First < FMinFirstIonisationEnergy) and
|
||||
(FElements[I].IonisationEnergy.First <> 0) then
|
||||
FMinFirstIonisationEnergy := FElements[I].IonisationEnergy.First;
|
||||
if (FElements[I].IonisationEnergy.Second < FMinSecondIonisationEnergy) and
|
||||
(FElements[I].IonisationEnergy.Second <> 0) then
|
||||
FMinSecondIonisationEnergy := FElements[I].IonisationEnergy.Second;
|
||||
if (FElements[I].IonisationEnergy.Third < FMinThirdIonisationEnergy) and
|
||||
(FElements[I].IonisationEnergy.Third <> 0) then
|
||||
FMinThirdIonisationEnergy := FElements[I].IonisationEnergy.Third;
|
||||
if (FElements[I].Electroneg < FMinElectroneg) and
|
||||
(FElements[I].Electroneg <> -1) then
|
||||
FMinElectroneg := FElements[I].Electroneg;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TElemList.UpdateFilteredMinMax;
|
||||
var
|
||||
I: integer;
|
||||
begin
|
||||
PrintLnDbg('Updating min and max filtered values...', vlLow);
|
||||
for I := 1 to ElemNumber do
|
||||
begin
|
||||
if (FElements[I].Mass > FMaxFilteredMass) and InActiveRange(I) then
|
||||
FMaxFilteredMass := FElements[I].Mass;
|
||||
if (FElements[I].DiscoYear > FMaxFilteredDiscoveryDate) and InActiveRange(I) then
|
||||
FMaxFilteredDiscoveryDate := FElements[I].DiscoYear;
|
||||
if (FElements[I].MeltingPt > FMaxFilteredMeltingPt) and InActiveRange(I) then
|
||||
FMaxFilteredMeltingPt := FElements[I].MeltingPt;
|
||||
if (FElements[I].BoilingPt > FMaxFilteredBoilingPt) and InActiveRange(I) then
|
||||
FMaxFilteredBoilingPt := FElements[I].BoilingPt;
|
||||
if (FElements[I].ElecAffinity > FMaxFilteredElecAffinity) and InActiveRange(I) then
|
||||
FMaxFilteredElecAffinity := FElements[I].ElecAffinity;
|
||||
if (FElements[I].CovalentRd > FMaxFilteredCovalentRd) and InActiveRange(I) then
|
||||
FMaxFilteredCovalentRd := FElements[I].CovalentRd;
|
||||
if (FElements[I].VanDerWaalsRd > FMaxFilteredVanDerWaalsRd) and InActiveRange(I) then
|
||||
FMaxFilteredVanDerWaalsRd := FElements[I].VanDerWaalsRd;
|
||||
if (FElements[I].IonisationEnergy.First > FMaxFilteredFirstIonisationEnergy) and
|
||||
InActiveRange(I) then
|
||||
FMaxFilteredFirstIonisationEnergy := FElements[I].IonisationEnergy.First;
|
||||
if (FElements[I].IonisationEnergy.Second > FMaxFilteredSecondIonisationEnergy) and
|
||||
InActiveRange(I) then
|
||||
FMaxFilteredSecondIonisationEnergy := FElements[I].IonisationEnergy.Second;
|
||||
if (FElements[I].IonisationEnergy.Third > FMaxFilteredThirdIonisationEnergy) and
|
||||
InActiveRange(I) then
|
||||
FMaxFilteredThirdIonisationEnergy := FElements[I].IonisationEnergy.Third;
|
||||
if (FElements[I].Electroneg > FMaxFilteredElectroneg) and InActiveRange(I) then
|
||||
FMaxFilteredElectroneg := FElements[I].Electroneg;
|
||||
end;
|
||||
FMinFilteredMass := FMaxFilteredMass;
|
||||
FMinFilteredDiscoveryDate := FMaxFilteredDiscoveryDate;
|
||||
FMinFilteredMeltingPt := FMaxFilteredMeltingPt;
|
||||
FMinFilteredBoilingPt := FMaxFilteredBoilingPt;
|
||||
FMinFilteredElecAffinity := FMaxFilteredElecAffinity;
|
||||
FMinFilteredCovalentRd := FMaxFilteredCovalentRd;
|
||||
FMinFilteredVanDerWaalsRd := FMaxFilteredVanDerWaalsRd;
|
||||
FMinFilteredFirstIonisationEnergy := FMaxFilteredFirstIonisationEnergy;
|
||||
FMinFilteredSecondIonisationEnergy := FMaxFilteredSecondIonisationEnergy;
|
||||
FMinFilteredThirdIonisationEnergy := FMaxFilteredThirdIonisationEnergy;
|
||||
FMinFilteredElectroneg := FMaxFilteredElectroneg;
|
||||
for I := 1 to ElemNumber do
|
||||
begin
|
||||
if (FElements[I].Mass < FMinFilteredMass) and (FElements[I].Mass <> 0) and
|
||||
InActiveRange(I) then
|
||||
FMinFilteredMass := FElements[I].Mass;
|
||||
if (FElements[I].DiscoYear < FMinFilteredDiscoveryDate) and
|
||||
(FElements[I].DiscoYear <> 0) and InActiveRange(I) then
|
||||
FMinFilteredDiscoveryDate := FElements[I].DiscoYear;
|
||||
if (FElements[I].MeltingPt < FMinFilteredMeltingPt) and
|
||||
(FElements[I].MeltingPt <> 0) and InActiveRange(I) then
|
||||
FMinFilteredMeltingPt := FElements[I].MeltingPt;
|
||||
if (FElements[I].BoilingPt < FMinFilteredBoilingPt) and
|
||||
(FElements[I].BoilingPt <> 0) and InActiveRange(I) then
|
||||
FMinFilteredBoilingPt := FElements[I].BoilingPt;
|
||||
if (FElements[I].ElecAffinity < FMinFilteredElecAffinity) and InActiveRange(I) then
|
||||
FMinFilteredElecAffinity := FElements[I].ElecAffinity;
|
||||
if (FElements[I].CovalentRd < FMinFilteredCovalentRd) and
|
||||
(FElements[I].CovalentRd <> 0) and InActiveRange(I) then
|
||||
FMinFilteredCovalentRd := FElements[I].CovalentRd;
|
||||
if (FElements[I].VanDerWaalsRd < FMinFilteredVanDerWaalsRd) and
|
||||
(FElements[I].VanDerWaalsRd <> 0) and InActiveRange(I) then
|
||||
FMinFilteredVanDerWaalsRd := FElements[I].VanDerWaalsRd;
|
||||
if (FElements[I].IonisationEnergy.First < FMinFilteredFirstIonisationEnergy) and
|
||||
(FElements[I].IonisationEnergy.First <> 0) and InActiveRange(I) then
|
||||
FMinFilteredFirstIonisationEnergy := FElements[I].IonisationEnergy.First;
|
||||
if (FElements[I].IonisationEnergy.Second < FMinFilteredSecondIonisationEnergy) and
|
||||
(FElements[I].IonisationEnergy.Second <> 0) and InActiveRange(I) then
|
||||
FMinFilteredSecondIonisationEnergy := FElements[I].IonisationEnergy.Second;
|
||||
if (FElements[I].IonisationEnergy.Third < FMinFilteredThirdIonisationEnergy) and
|
||||
(FElements[I].IonisationEnergy.Third <> 0) and InActiveRange(I) then
|
||||
FMinFilteredThirdIonisationEnergy := FElements[I].IonisationEnergy.Third;
|
||||
if (FElements[I].Electroneg < FMinFilteredElectroneg) and
|
||||
(FElements[I].Electroneg <> -1) and InActiveRange(I) then
|
||||
FMinFilteredElectroneg := FElements[I].Electroneg;
|
||||
end;
|
||||
end;
|
||||
|
||||
//there's only arround 110 elements to sort so a "dirty" sort is quitte quick
|
||||
//enough
|
||||
procedure TElemList.Sort;
|
||||
begin
|
||||
PrintLnDbg('-- Sorting elements...', vlHigh);
|
||||
Inc(DebugLevel);
|
||||
case FSortType of
|
||||
estName: SortByName(FElements, FSortedElements, FSortUpToDown);
|
||||
estSymbol: SortByShortName(FElements, FSortedElements, FSortUpToDown);
|
||||
estDiscoveryDate : SortByDate(FElements, FSortedElements, FSortUpToDown,
|
||||
FSortUnknowFirst);
|
||||
estMass: SortByMass(FElements, FSortedElements, FSortUpToDown);
|
||||
else SortByAtNum(FElements, FSortedElements, FSortUpToDown);
|
||||
end;
|
||||
Dec(DebugLevel);
|
||||
PrintLnDbg('-- Done', vlHigh);
|
||||
end;
|
||||
|
||||
procedure TElemList.BeginUpdate;
|
||||
begin
|
||||
FUpdating := True;
|
||||
end;
|
||||
|
||||
procedure TElemList.EndUpdate;
|
||||
begin
|
||||
FUpdating := False;
|
||||
UpdateMinMax;
|
||||
UpdateFilteredMinMax;
|
||||
Sort;
|
||||
end;
|
||||
|
||||
function TElemList.GetDiscovererList: TStrings;
|
||||
var
|
||||
I, J: integer;
|
||||
SDisco: string;
|
||||
Strs: TStringList;
|
||||
begin
|
||||
PrintLnDbg('-- Building discoverer list...', vlHigh);
|
||||
Inc(DebugLevel);
|
||||
Strs := TStringList.Create;
|
||||
for I := 1 to ElemNumber do
|
||||
if FElements[I].Discoverer <> '' then
|
||||
for J := 1 to CountItemsInStr(FElements[I].Discoverer, ',') do
|
||||
begin
|
||||
SDisco := Trim(GetItemInStr(FElements[I].Discoverer, ',', J));
|
||||
if StrExistsInList(Strs, SDisco) = -1 then
|
||||
begin
|
||||
Strs.Add(SDisco);
|
||||
PrintLnDbg('Discoverer found: ' + SDisco, vlHigh);
|
||||
end;
|
||||
end;
|
||||
Result := Strs;
|
||||
Dec(VerboseLevel);
|
||||
PrintLnDbg('-- Done', vlHigh);
|
||||
end;
|
||||
|
||||
procedure TElemList.DbgShowFilters;
|
||||
var
|
||||
I: integer;
|
||||
S, Tmp: String;
|
||||
begin
|
||||
S := IntToStr(FltGetCount) + ' counted filters:' + LineEnding;
|
||||
for I := 0 to FiltersCount - 1 do
|
||||
begin
|
||||
case Filters[I].Kind of
|
||||
fkDate: Tmp := 'Date';
|
||||
fkBoilingPoint: Tmp := 'Boiling point';
|
||||
fkCovalentRadius: Tmp := 'Covalent Radius';
|
||||
fkElectronegativity: Tmp := 'Electronegativity';
|
||||
fkElectronicAffinity: Tmp := 'Electronic Affinity';
|
||||
fkFirstIonisationEnergy: Tmp := 'First Ionisation Energy';
|
||||
fkMass: Tmp := 'Mass';
|
||||
fkMeltingPoint: Tmp := 'Melting Point';
|
||||
fkSecondIonisationEnergy: Tmp := 'Second Ionisation Energy';
|
||||
fkThirdIonisationEnergy: Tmp := 'Third Ionisation Energy';
|
||||
fkVanDerWaalsRadius: Tmp := 'Van Der Walls Radius';
|
||||
end;
|
||||
S := S + Tmp + ': '#9' (min: ' + FloatToStr(Filters[I].Min) + ' / max: ' +
|
||||
FloatToStr(Filters[I].Max) + ')' + LineEnding;
|
||||
end;
|
||||
ShowMessage(S);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user