让我们进入第三阶段——在 Delpi-7 IDE 中编写代码。该模块仅包含五个事件处理程序:表单创建(表单创建)、光标移动 Image1 (Image1鼠标移动),在单元格上单击 LMB(图片1点击)并使用“确定”按钮退出对话框(OK按钮点击) 或取消 (取消按钮单击)。这些处理程序的标头是使用 IDE 以标准方式生成的。
模块源码:
unit tableUnit;
// Периодическая таблица химических элементов Д.И.Менделеева
//
// third112
// https://habr.com/ru/users/third112/
//
// Оглавление
// 1) создание формы
// 2) работа с таблицей: указание и выбор
// 3) выход из диалога
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
const
size = 104; // число элементов
type
TtableDlg = class(TForm)
OKBtn: TButton;
CancelBtn: TButton;
Bevel1: TBevel;
Image1: TImage; //таблица химических элементов
Label1: TLabel;
Image2: TImage; //управляющая карта
Label2: TLabel;
Edit1: TEdit;
procedure FormCreate(Sender: TObject); // создание формы
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); // указание клетки
procedure Image1Click(Sender: TObject); // выбор клетки
procedure OKBtnClick(Sender: TObject); // OK
procedure CancelBtnClick(Sender: TObject); // Cancel
private
{ Private declarations }
TableSymbols : array [1..size] of string [2]; // массив обозначений элементов
public
{ Public declarations }
selectedElement : string; // выбранный элемент
currNo : integer; // текущий номер элемента
end;
var
tableDlg: TtableDlg;
implementation
{$R *.dfm}
const
PeriodicTableStr1=
'HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLa';
PeriodicTableStr2='CePrNdPmSmEuGdTbDyHoErTmYbLu';
PeriodicTableStr3='HfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAc';
PeriodicTableStr4='ThPaUNpPuAmCmBkCfEsFmMdNoLrKu ';
// создание формы ==================================================
procedure TtableDlg.FormCreate(Sender: TObject);
// создание формы
var
s : string;
i,j : integer;
begin
currNo := 0;
// инициализация массива обозначений элементов:
s := PeriodicTableStr1+ PeriodicTableStr2+PeriodicTableStr3+PeriodicTableStr4;
j := 1;
for i :=1 to size do
begin
TableSymbols [i] := s[j];
inc (j);
if s [j] in ['a'..'z'] then
begin
TableSymbols [i] := TableSymbols [i]+ s [j];
inc (j);
end; // if s [j] in
end; // for i :=1
end; // FormCreate ____________________________________________________
// работа с таблицей: указание и выбор =========================================
procedure TtableDlg.Image1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
// указание клетки
var
sl : integer;
begin
sl := GetBValue(Image2.Canvas.Pixels [x,y]);
if sl in [1..size] then
begin
Label1.Caption := intToStr (sl)+ ' '+TableSymbols [sl];
currNo := sl;
end
else
Label1.Caption := 'Select element:';
end; // Image1MouseMove ____________________________________________________
procedure TtableDlg.Image1Click(Sender: TObject);
begin
if currNo <> 0 then
begin
selectedElement := TableSymbols [currNo];
Label2.Caption := intToStr (currNo)+ ' '+selectedElement+ ' selected';
Edit1.Text := selectedElement;
end;
end; // Image1Click ____________________________________________________
// выход из диалога ==================================================
procedure TtableDlg.OKBtnClick(Sender: TObject);
begin
selectedElement := Edit1.Text;
hide;
end; // OKBtnClick ____________________________________________________
procedure TtableDlg.CancelBtnClick(Sender: TObject);
begin
hide;
end; // CancelBtnClick ____________________________________________________
end.
end; // if s [j] in
end; // for i :=1
end; // FormCreate
要突出显示组标题和方法体的末尾,您可以添加比大多数语句更长的行,例如分别包含字符“=”和“_”。
再次,我们需要预约:我们的例子太简单了。当一个方法的代码无法在一个屏幕上显示时,可能很难理解连续六端进行代码更改。在一些旧的编译器中,例如,Pascal 8000 for OS IBM 360/370,这样的服务列打印在列表的左侧
回到元素周期表上的基本问题:进一步的发展可以朝不同的方向发展。其中一个方向可供参考:当您将鼠标光标悬停在表格单元格上时,会出现一个信息窗口,其中包含有关指定元素的附加信息。进一步的发展是过滤器。例如,根据安装情况,信息窗口将仅包含:最重要的物理和化学信息、发现历史信息、自然界分布信息、最重要化合物列表(包括该元素)、生理特性、外语名称等。 e. 记住本文开头的 Kaverin 的“鸭子”,我们可以说,随着程序的开发,我们将获得自然科学方面的完整训练综合体:除了计算机之外科学、物理和化学——生物学、经济地理学、科学史甚至外语。
但本地数据库并不是限制。该程序自然地连接到互联网。当您选择一个元素时,该链接将被激活,并且有关该元素的维基百科文章将在 Web 浏览器窗口中打开。如您所知,维基百科不是权威来源。您可以设置权威来源的链接,例如化学百科全书、TSB、摘要期刊、在搜索引擎中对该元素的排序查询等。那。学生将能够完成关于 DBMS 和互联网主题的简单但有意义的作业。
formulaOrder : array [1..size] of integer; // можно взять покороче
其中我们根据化学元素在公式中出现的索引写下该化学元素的编号。添加一个原子 当前编号 代入公式:
if formula [currNo]=0 then //этот атом встретился первый раз
begin
orderIndex := orderIndex+1;//в начале ввода формулы orderIndex=0
formulaOrder [orderIndex] := currNo;
end;
formula [currNo]:=formula [currNo]+1;
将公式写到一行:
s := ''; // пустая строка для формулы
for i:=1 to orderIndex do // для всех хим.символов в формуле
begin
s:=s+TableSymbols [ formulaOrder[i]];// добавляем хим.символ
if formula [formulaOrder[i]]<>1 then //добавляем кол-во атомов
s:=s+ intToStr(formula [formulaOrder[i]]);
end;