Барои расми дуюм мо расми якумро истифода мебарем. Мо ба таври пайдарпай ҳуҷайраҳои ҷадвалро, ки аз ҳама графика тоза карда шудаанд, бо рангҳои беназир дар модели ранги RGB пур мекунем. R ва G ҳамеша 0 ва B=1 барои гидроген, 2 барои гелий ва ғайра хоҳанд буд. Ин расм корти назоратии мо хоҳад буд, ки мо онро дар файли номдор нигоҳ медорем. table2.bmp.
Марҳилаи якуми барномасозии графикӣ дар Photoshop анҷом ёфт. Биёед ба барномасозии графикии GUI дар IDE Delpi-7 гузарем. Барои ин лоиҳаи навро кушоед, ки дар он дар шакли асосӣ тугмаи муколамаро ҷойгир мекунем (tableDlg), ки дар он кор бо чадвал сурат мегирад. Минбаъд мо бо форма кор мекунем tableDlg.
Дар форма ҷузъи синфро ҷойгир кунед Тасвир. Мо даст Image1. Дар хотир доред, ки дар маҷмӯъ, барои лоиҳаҳои калон, номҳои шакли ба таври худкор тавлидшуда Тасвири Нки дар N метавонад ба якчанд даҳҳо ё бештар аз он бирасад - ин беҳтарин услуби барномасозӣ нест ва бояд номҳои пурмазмунтар дода шаванд. Аммо дар лоихаи хурди мо, ки дар он чо N аз 2 зиёд нахоҳад буд, шумо метавонед онро ҳамчун тавлидшуда тарк кунед.
Ба моликият Тасвир 1. Расм файлро бор кунед table01.bmp. Мо эҷод мекунем Image2 ва корти назоратии моро дар он ҷо бор кунед table2.bmp. Дар ин ҳолат мо файлро хурд ва барои корбар ноаён мегардонем, чунон ки дар кунҷи чапи поёни форма нишон дода шудааст. Мо унсурҳои иловагии назоратро илова мекунем, ки ҳадафи онҳо маълум аст. Марҳилаи дуюми барномасозии графикии GUI дар IDE Delpi-7 анҷом ёфт.
Биёед ба марҳилаи сеюм - навиштани код дар IDE Delpi-7 гузарем. Модул танҳо аз панҷ коркардкунандаи рӯйдодҳо иборат аст: эҷоди шакл (FormCreate), ҳаракати курсор Image1 (Тасвир 1 Mouse Move), пахш кардани LMB дар ячейка (Тасвир 1-ро клик кунед) ва бо истифода аз тугмаҳои OK аз муколама баромадан (OKBtnClick) ё Бекор кардан (CancelBtnClick). Сарлавҳаҳои ин коркардкунандагон ба таври стандартӣ бо истифода аз 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.
Дар версияи худ, мо ҷадвали 104 элементро гирифтем (constant андоза). Албатта, ин андозаро зиёд кардан мумкин аст. Нишонаҳои элементҳо (рамзҳои кимиёвӣ) ба массив навишта мешаванд Аломатҳои ҷадвал. Бо вуҷуди ин, бо сабабҳои зич будани коди ибтидоӣ, мувофиқи мақсад ба назар мерасад, ки пайдарпайии ин қайдҳоро дар шакли доимии сатр нависед. Ҷадвали даврии Str1..., Ҷадвали даврии Str4то ки хангоми сохтани форма худи программа ин нишондодхоро дар байни элементхои массив пароканда мекунад. Ҳар як нишонаи элемент аз як ё ду ҳарфи лотинӣ иборат аст, ки ҳарфи аввал бо ҳарфи калон ва дуюм (агар мавҷуд бошад) хурд аст. Ин қоидаи оддӣ ҳангоми боркунии массив амалӣ карда мешавад. Ҳамин тариқ, пайдарпайии қайдҳоро метавон ба таври мухтасар бидуни фосила навишт. Ба чор қисм тақсим кардани пайдарпай (константҳо Ҷадвали даврии Str1..., Ҷадвали даврии Str4) ба мулоҳизаҳои осонии хондани коди сарчашма вобаста аст, зеро Хате, ки аз ҳад дароз аст, метавонад ба экран комилан мувофиқат накунад.
Вақте ки курсори муш ба болои Image1 коркардкунанда Тасвир 1 Mouse Move ин ҳодиса арзиши ҷузъи ранги кабуди пиксел корти назоратро муайян мекунад Image2 барои координатҳои ҷории курсор. Аз руи сохтмон Image2 ин арзиш ба рақами элемент баробар аст, агар курсор дар дохили ячейка бошад; сифр, агар дар сарҳад ва 255 дар ҳолатҳои дигар. Амалҳои боқимондае, ки барнома иҷро мекунад, ночизанд ва шарҳро талаб намекунанд.
Илова ба усулҳои услубии барномасозии дар боло зикршуда, бояд услуби тафсирро қайд кард. Ба таври қатъӣ гӯем, кодекси баррасишаванда он қадар хурд ва содда аст, ки шарҳҳо махсусан зарур нестанд. Бо вуҷуди ин, онҳо инчунин бо сабабҳои методологӣ илова карда шуданд - рамзи кӯтоҳ ба мо имкон медиҳад, ки баъзе хулосаҳои умумиро равшантар кунем. Дар рамзи пешниҳодшуда як синф эълон карда мешавад (TtableDlg). Усулҳои ин синфро иваз кардан мумкин аст ва ин ба кори барнома ба ҳеҷ ваҷҳ таъсир намерасонад, балки метавонад ба хондани он таъсир расонад. Масалан, пайдарпайро тасаввур кунед:
Дар клавиатураи компютери худ Enterро пахш кунед. Ба кор андохтани реактиви якум ба охир расида, ба киштзор мегузарад реактив 2. Дар хотир доред, ки дар ин мисол мо версияи минималиро пешниҳод мекунем. Агар хоҳед, шумо метавонед мултипликаторҳои атомҳои як навъро ба осонӣ ташкил кунед, то масалан, ҳангоми ворид шудан ба формулаи хром (K2Cr2O7) ба ҳуҷайраи оксиген ҳафт маротиба пай дар пай пахш накунед.
LMB-ро дар чашмаки ҷадвал бо рамзи H. Навишта дар майдон пахш кунед реактив 2 тағирот: "Реагенти дуюми H 1.008 x пайдо кунед."
LMB-ро дар чашмаки ҷадвал бо рамзи Cl пахш кунед. Навишта дар майдон реактив 2 тағирот: "Реагенти дуюм HCl 36.458 x ёфт." Ҳисобкунак вазнҳои атомии гидроген ва хлорро ҷамъ кард. Дар муодилаи реаксияи дар боло овардашуда хлориди гидроген бо коэффисиенти 2 пеш аз он ҷойгир аст. Аз ин рӯ, дар майдон LMB -ро пахш кунед. реактив 2. Вазни молекулавӣ ду баробар меафзояд (ҳангоми ду маротиба пахш кардан ва ғ. се баробар). Навишта дар майдон реактив 2 тағирот: "Реагенти дуюм 2HCl 72.916 x ёфт."
Дар клавиатураи компютери худ Enterро пахш кунед. Воридкунии реактиви дуюм ба охир мерасад ва ҳисобкунак аз таносуб х-ро меёбад
Ин чизест, ки мо бояд пайдо кунем.
Эзоҳи 1 Маънои таносуби натиҷавӣ: барои парокандашавӣ 100.086 Da вуҷур 72.916 Да кислотаро талаб мекунад ва барои об кардани 10 г вуғ кислотаи х лозим аст.
Эзоҳи 2 Маҷмӯаҳои мушкилоти шабеҳ:
Хомченко И.Г., Маҷмӯаи масъалаҳо ва машқҳо аз химия 2009 (синфҳои 8-11).
Хомченко Г.П., Хомченко И.Г., Маҷмӯаи масъалаҳо аз химия барои довталабон ба донишгоҳҳо, 2019.
ки дар он шохис адади элементи химиявй ва арзиш дар ин шохис шумораи атомхо мебошад (дар аввал хамаи элементхои массив ба сифр баргардонида мешаванд). Тартиби дар формула навишта шудани атомҳо, ки дар химия қабул шудааст, бояд ба назар гирифта шавад. Масалан, кам одамон O3CaC-ро дӯст медоранд. Биёед масъулиятро ба зиммаи истифодабаранда гузорем. Сохтани массив:
formulaOrder : array [1..size] of integer; // можно взять покороче
ки дар он мо шумораи элементи химиявиро аз руи индекси пайдоиши он дар формула менависем. Илова кардани атом currNo ба формула:
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;