Co do tlenku czy ditlenku to bym się kłócił, bo obie nazwy są poprawne. Mógłbym nawet powiedzieć tlenek siarki(+4), ale co to za różnica skoro i tak nie ma ładu w nomenklaturze chemicznej. Heh zresztą odsyłam do artykułu Nomen omen mojego autorstwa gdzie prezentuję swój pogląd na ten temat.
Jakkolwiek nazwa zmieniałaby się na przestrzeni wieków, tak wzór substancji pozostaje niezmienny (strukturalny, bo pomysły co do wzorów sumarycznych też są różne), dlatego też pisze ten program.
Siak czy owak – udało się!
Oto co ostatecznie zrobiłem:
unit Lewis;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ToolWin, Menus, XPMan, TB97Ctls, TB97,
TB97Tlbr, ExtCtrls, ShellApi, Math;
const crAtom = 2;
const crBond = 3;
const crKoor = 4;
const crJony = 5;
const crNorm = 6;
const crEmov = 7;
const WE = 4;
const OdlOdAt = 5;
type TElektron = class(TShape)
end;
type TAtom = class(TLabel)
private
Elektrony: array [1..12] of TElektron;
public
procedure DodajEl(e: TElektron);
procedure UsunEl(e: TElektron);
end;
type TCzastka = class(TPanel)
private
Atomy: array of TAtom;
end;
type
TForm1 = class(TForm)
StatusBar1: TStatusBar;
MainMenu1: TMainMenu;
Plik1: TMenuItem;
Zakocz1: TMenuItem;
Zapiszjako1: TMenuItem;
Edycja1: TMenuItem;
Kopiuj1: TMenuItem;
Pomoc1: TMenuItem;
Pomoc2: TMenuItem;
Aktualnawersja1: TMenuItem;
Oprogramie1: TMenuItem;
XPManifest1: TXPManifest;
Dock971: TDock97;
Dock972: TDock97;
Toolbar971: TToolbar97;
bH: TToolbarButton97;
bNa: TToolbarButton97;
bO: TToolbarButton97;
bN: TToolbarButton97;
bC: TToolbarButton97;
bCl: TToolbarButton97;
bP: TToolbarButton97;
bS: TToolbarButton97;
Toolbar973: TToolbar97;
ToolbarButton974: TToolbarButton97;
ObszarB: TPanel;
Obszar: TImage;
Widok1: TMenuItem;
Pokasiatk1: TMenuItem;
PopupMenu1: TPopupMenu;
H1: TMenuItem;
B1: TMenuItem;
C1: TMenuItem;
N1: TMenuItem;
O1: TMenuItem;
F1: TMenuItem;
Na1: TMenuItem;
Mg1: TMenuItem;
Al1: TMenuItem;
Si1: TMenuItem;
P1: TMenuItem;
S1: TMenuItem;
Cl1: TMenuItem;
K1: TMenuItem;
Ca1: TMenuItem;
Mn1: TMenuItem;
Fe1: TMenuItem;
Co1: TMenuItem;
Ni1: TMenuItem;
Cu1: TMenuItem;
Zn1: TMenuItem;
Br1: TMenuItem;
Ag1: TMenuItem;
Au1: TMenuItem;
Hg1: TMenuItem;
Pb1: TMenuItem;
grid: TEdit97;
ToolbarButton975: TToolbarButton97;
procedure bHClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ToolbarButton974Click(Sender: TObject);
procedure ObszarMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure bCClick(Sender: TObject);
procedure bOClick(Sender: TObject);
procedure bNClick(Sender: TObject);
procedure bClClick(Sender: TObject);
procedure bSClick(Sender: TObject);
procedure bPClick(Sender: TObject);
procedure bNaClick(Sender: TObject);
procedure ObszarDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure ObszarDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure WiazDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure WiazDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure Zakocz1Click(Sender: TObject);
procedure Pomoc2Click(Sender: TObject);
procedure Aktualnawersja1Click(Sender: TObject);
procedure Oprogramie1Click(Sender: TObject);
procedure MitClick(Sender: TObject);
procedure AtomContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
procedure ToolbarButton975Click(Sender: TObject);
procedure Rozmiesc(e: TAtom);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
rysuj:boolean;
typ:string;
Atom:TAtom;
Elektron:TElektron;
n, I:integer;
ktory : TObject;
implementation
uses aktualizacja, OProg;
{$R *.dfm}
{$R ZASOBY.RES}
procedure TForm1.bHClick(Sender: TObject);
begin
bH.Color:=clGradientActiveCaption;
bC.Color:=clBtnFace;
bO.Color:=clBtnFace;
bN.Color:=clBtnFace;
bCl.Color:=clBtnFace;
bS.Color:=clBtnFace;
bP.Color:=clBtnFace;
bNa.Color:=clBtnFace;
Obszar.Cursor := crAtom;
typ:='H';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.Cursors[crAtom] := LoadCursor (HInstance, 'ATOM');
Screen.Cursors[crBond] := LoadCursor (HInstance, 'BOND');
Screen.Cursors[crNorm] := LoadCursor (HInstance, 'NORM');
Screen.Cursors[crEmov] := LoadCursor (HInstance, 'EMOV');
Screen.Cursors[crKoor] := LoadCursor (HInstance, 'KOOR');
Screen.Cursors[crJony] := LoadCursor (HInstance, 'JONY');
Obszar.Cursor := crNorm;
Obszar.Canvas.Brush.Color:=clWhite;
Obszar.Canvas.Pen.Color:=clWhite;
Obszar.Canvas.Rectangle(0,0,Obszar.Width,Obszar.Height);
n:=0;
end;
procedure TForm1.ToolbarButton974Click(Sender: TObject);
begin
Obszar.Cursor := crNorm;
typ:='';
bH.Color:=clBtnFace;
bC.Color:=clBtnFace;
bO.Color:=clBtnFace;
bN.Color:=clBtnFace;
bCl.Color:=clBtnFace;
bS.Color:=clBtnFace;
bP.Color:=clBtnFace;
bNa.Color:=clBtnFace;
end;
procedure TForm1.ObszarMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
IF typ <> '' THEN
BEGIN
Atom:=TAtom.Create(Form1);
with Atom do
begin
for I := 1 to 12 do Elektrony[I]:=TElektron.Create(Atom);
Left:=Round(X/StrToInt(Form1.grid.Text))*StrToInt(Form1.grid.Text);
Top:=Round(Y/StrToInt(Form1.grid.Text))*StrToInt(Form1.grid.Text);
DragMode:=dmAutomatic;
Caption:=typ;
Parent:=Form1.ObszarB;
Font.Name:='Courier New';
Font.Size:=14;
DragCursor:=crNorm;
PopupMenu:=PopupMenu1;
OnContextPopup:=AtomContextPopup;
for I := 1 to 12 do
begin
WITH Elektrony[I] DO
BEGIN
Shape:=stCircle;
Brush.Color:=clBlack;
Width:=WE;
Height:=WE;
Parent:=ObszarB;
OnDragDrop:=WiazDragDrop;
OnDragOver:=WiazDragOver;
DragMode:=dmAutomatic;
END;
end;
Rozmiesc(Atom);
end;
END;
ToolbarButton974Click(Form1);
end;
procedure TForm1.bCClick(Sender: TObject);
begin
bC.Color:=clGradientActiveCaption;
bH.Color:=clBtnFace;
bO.Color:=clBtnFace;
bN.Color:=clBtnFace;
bCl.Color:=clBtnFace;
bS.Color:=clBtnFace;
bP.Color:=clBtnFace;
bNa.Color:=clBtnFace;
Obszar.Cursor := crAtom;
typ:='C';
end;
procedure TForm1.bOClick(Sender: TObject);
begin
bO.Color:=clGradientActiveCaption;
bC.Color:=clBtnFace;
bH.Color:=clBtnFace;
bN.Color:=clBtnFace;
bCl.Color:=clBtnFace;
bS.Color:=clBtnFace;
bP.Color:=clBtnFace;
bNa.Color:=clBtnFace;
Obszar.Cursor := crAtom;
typ:='O';
end;
procedure TForm1.bNClick(Sender: TObject);
begin
bN.Color:=clGradientActiveCaption;
bC.Color:=clBtnFace;
bO.Color:=clBtnFace;
bH.Color:=clBtnFace;
bCl.Color:=clBtnFace;
bS.Color:=clBtnFace;
bP.Color:=clBtnFace;
bNa.Color:=clBtnFace;
Obszar.Cursor := crAtom;
typ:='N';
end;
procedure TForm1.bClClick(Sender: TObject);
begin
bCl.Color:=clGradientActiveCaption;
bC.Color:=clBtnFace;
bO.Color:=clBtnFace;
bN.Color:=clBtnFace;
bH.Color:=clBtnFace;
bS.Color:=clBtnFace;
bP.Color:=clBtnFace;
bNa.Color:=clBtnFace;
Obszar.Cursor := crAtom;
typ:='Cl';
end;
procedure TForm1.bSClick(Sender: TObject);
begin
bS.Color:=clGradientActiveCaption;
bC.Color:=clBtnFace;
bO.Color:=clBtnFace;
bN.Color:=clBtnFace;
bCl.Color:=clBtnFace;
bH.Color:=clBtnFace;
bP.Color:=clBtnFace;
bNa.Color:=clBtnFace;
Obszar.Cursor := crAtom;
typ:='S';
end;
procedure TForm1.bPClick(Sender: TObject);
begin
bP.Color:=clGradientActiveCaption;
bC.Color:=clBtnFace;
bO.Color:=clBtnFace;
bN.Color:=clBtnFace;
bCl.Color:=clBtnFace;
bS.Color:=clBtnFace;
bH.Color:=clBtnFace;
bNa.Color:=clBtnFace;
Obszar.Cursor := crAtom;
typ:='P';
end;
procedure TForm1.bNaClick(Sender: TObject);
begin
bNa.Color:=clGradientActiveCaption;
bC.Color:=clBtnFace;
bO.Color:=clBtnFace;
bN.Color:=clBtnFace;
bCl.Color:=clBtnFace;
bS.Color:=clBtnFace;
bP.Color:=clBtnFace;
bH.Color:=clBtnFace;
Obszar.Cursor := crAtom;
typ:='Na';
end;
procedure TForm1.ObszarDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
IF (Source is TAtom) THEN Accept:=True ELSE Accept:=False;
TLabel(Source).DragCursor:=crEmov;
end;
procedure TForm1.ObszarDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
TAtom(Source).Left:=Round(X/StrToInt(Form1.grid.Text))*StrToInt(Form1.grid.Text);
TAtom(Source).Top:=Round(Y/StrToInt(Form1.grid.Text))*StrToInt(Form1.grid.Text);
Rozmiesc(TAtom(Source));
end;
procedure TForm1.WiazDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
IF ((Sender<>Source) AND (Sender is TElektron) AND (Source is TElektron) AND (TAtom(Sender)<>TAtom(Source))) THEN Accept:=True ELSE Accept:=False;
TElektron(Source).DragCursor:=crBond;
end;
procedure TForm1.WiazDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
Obszar.Canvas.Pen.Color:=clBlack;
Obszar.Canvas.MoveTo(TElektron(Source).Left+Round(TElektron(Source).Width/2),TElektron(Source).Top+Round(TElektron(Source).Height/2));
Obszar.Canvas.LineTo(TElektron(Sender).Left+Round(TElektron(Sender).Width/2),TElektron(Sender).Top+Round(TElektron(Sender).Height/2));
end;
procedure TForm1.Zakocz1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Pomoc2Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'Pomoc - Lewis.pdf', nil, nil, SW_SHOWNORMAL);
end;
procedure TForm1.Aktualnawersja1Click(Sender: TObject);
begin
Form3.ShowModal;
end;
procedure TForm1.Oprogramie1Click(Sender: TObject);
begin
Form4.ShowModal;
end;
procedure TForm1.MitClick(Sender: TObject);
begin
TLabel(ktory).Caption:=TMenuItem(sender).Caption;
end;
procedure TForm1.AtomContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
begin
ktory:=sender;
end;
procedure TForm1.ToolbarButton975Click(Sender: TObject);
begin
Obszar.Canvas.Brush.Color:=clWhite;
Obszar.Canvas.Pen.Color:=clWhite;
Obszar.Canvas.Rectangle(0,0,Obszar.Width,Obszar.Height);
end;
procedure TAtom.DodajEl(e: TElektron);
begin
Application.MessageBox('a','a');
end;
procedure TAtom.UsunEl(e: TElektron);
begin
Application.MessageBox('a','a');
end;
procedure TForm1.Rozmiesc(e: TAtom);
begin
with TAtom(e) do
begin
Elektrony[1].Left:=Left+Round((Width-5*(OdlOdAt-1))/2);
Elektrony[1].Top:=Top-OdlOdAt;
Elektrony[2].Left:=Left+Round((Width-5*(OdlOdAt-1))/2)+2*(OdlOdAt-1);
Elektrony[2].Top:=Top-OdlOdAt;
Elektrony[3].Left:=Left+Round((Width-5*(OdlOdAt-1))/2)+4*(OdlOdAt-1);
Elektrony[3].Top:=Top-OdlOdAt;
Elektrony[4].Left:=Left+Width+(OdlOdAt-1);
Elektrony[4].Top:=Top+Round((Height-3*WE-2*(OdlOdAt-1))/2);
Elektrony[5].Left:=Left+Width+(OdlOdAt-1);
Elektrony[5].Top:=Top+Round((Height-3*WE-2*(OdlOdAt-1))/2)+2*(OdlOdAt-1);
Elektrony[6].Left:=Left+Width+(OdlOdAt-1);
Elektrony[6].Top:=Top+Round((Height-3*WE-2*(OdlOdAt-1))/2)+4*(OdlOdAt-1);
Elektrony[7].Left:=Left+Round((Width-5*(OdlOdAt-1))/2)+4*(OdlOdAt-1);
Elektrony[7].Top:=Top+Height;
Elektrony[8].Left:=Left+Round((Width-5*(OdlOdAt-1))/2)+2*(OdlOdAt-1);
Elektrony[8].Top:=Top+Height;
Elektrony[9].Left:=Left+Round((Width-5*(OdlOdAt-1))/2);
Elektrony[9].Top:=Top+Height;
Elektrony[10].Left:=Left-OdlOdAt-2;
Elektrony[10].Top:=Top+Round((Height-3*WE-2*(OdlOdAt-1))/2)+4*(OdlOdAt-1);
Elektrony[11].Left:=Left-OdlOdAt-2;
Elektrony[11].Top:=Top+Round((Height-3*WE-2*(OdlOdAt-1))/2)+2*(OdlOdAt-1);
Elektrony[12].Left:=Left-OdlOdAt-2;
Elektrony[12].Top:=Top+Round((Height-3*WE-2*(OdlOdAt-1))/2);
end;
end;
end.
Jak widać TElektron dziedziczy class(TShape), a TAtom dziedziczy class(TLabel) i dzięki temu nie musze ich potem wyrysowywać tylko są Od razu.
Troche tego jest, a to nie koniec przecież... ale działa. Musze jeszcze poprawić funkcję Rozmiesc, utworzyć funkcje DodajEl i UsunEl i przy wstawianiu automatycznie usuwac stosowne elektrony. Infrormacje o ich rozmieszczeniu zapisze sobie w pliku ini. I wszystko powinno być ok.
Aha... nie wiem jeszcze jak robić linie pomiędzy tymi elektronami, bo moje rozwiązanie ma swoje wady, bo po przesunięciu atomu wiązanie zostaje: zupełnie to zmienić, czy próbować coś z tym - prosze o rade.