A Bitcoin Kalkulátorom forráskódja magyarázattal, hogy mit csinál a program pontosan.
Szeretném hozzáfűzni, hogy a programozást magamtól tanultam (könyvekből stb), szóval közel nem vagyok profi. Tehát sok kezdő hiba van a programomban, amitől persze működik, viszont nem "szép" megoldás. Légyszi ezt nézzétek el nekem:)
A másik fontos dolog, hogy a Projekt futtatásához Delphi 2010 vagy annál nagyobb kell (Én Rad Studio XE2-ben írtam),
illetve a program a pingeléshez használ egy beépíthető modult, a TPing komponenst az ICS csomagból, amit innen tölthettek le:
http://www.overbyte.be/frame_index.html
A telepítéséhez nem fűznék semmit, minden le van írva értelemszerűen a csomagban!
Illetve a projekt fájlokat innen lehet letölteni (921Kb):
http://data.hu/get/6820465/BTC_Kalkulator_forraskod.rar
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdHTTP, ActiveX, MSHTML, SHDocVw, Vcl.ExtCtrls, Vcl.OleCtrls,
Vcl.ActnMan, Vcl.ActnColorMaps, Vcl.Buttons, Vcl.Imaging.pngimage,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, WinInet,
OverbyteIcsWndControl, OverbyteIcsPing;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Label4: TLabel;
Edit4: TEdit;
Label5: TLabel;
Edit5: TEdit;
Edit6: TEdit;
Label6: TLabel;
LEdit1: TLabeledEdit;
Button2: TButton;
WebBrowser1: TWebBrowser;
Button3: TButton;
Memo1: TMemo;
Timer1: TTimer;
Edit7: TEdit;
Label7: TLabel;
Timer2: TTimer;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Edit11: TEdit;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
ComboBox1: TComboBox;
Label16: TLabel;
Button5: TButton;
Memo2: TMemo;
XPColorMap1: TXPColorMap;
Panel1: TPanel;
Image1: TImage;
Image2: TImage;
IdHTTP1: TIdHTTP;
Ping1: TPing;
Image3: TImage;
Image4: TImage;
Label17: TLabel;
Label18: TLabel;
procedure FormShow(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit7KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure Timer2Timer(Sender: TObject);
procedure Panel1Click(Sender: TObject);
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
procedure Edit4KeyPress(Sender: TObject; var Key: Char);
procedure Edit5KeyPress(Sender: TObject; var Key: Char);
procedure Edit6KeyPress(Sender: TObject; var Key: Char);
procedure Edit8KeyPress(Sender: TObject; var Key: Char);
procedure Edit9KeyPress(Sender: TObject; var Key: Char);
procedure Edit10KeyPress(Sender: TObject; var Key: Char);
procedure Edit11KeyPress(Sender: TObject; var Key: Char);
procedure Panel1MouseEnter(Sender: TObject);
procedure Panel1MouseLeave(Sender: TObject);
procedure Ping1DnsLookupDone(Sender: TObject; Error: Word);
procedure Ping1EchoReply(Sender, Icmp: TObject; Status: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject); //A nehézség lekérése internetről
var
s:string;
Http: TIdHTTP;
i: Integer;
begin
Http := TIdHTTP.Create(Nil);
s:=Http.Get('http://dot-bit.org/tools/nextDifficulty_old.php'); //Erről a honlapról
memo1.Text:=s;
s:=memo1.lines[68];
Delete(s,1,2);
Delete(s,15,60); //A lekért adat formázása (Alapvetően a honlap forráskódját tölti be a program, és abból szűri ki az adatot)
//s:=edit2.Text;
s:=stringreplace(s, '.', ',', [rfReplaceAll]); //Egy kis formázgatás. A Delphi nem értelmezi a . (pont) mint tizedes választó, így azt át kell alakítani , (vessző)-vé.
edit2.text:=s; //Majd a kapott eredményt beírja a 2. mezőbe, tehát a Difficulty mezőbe.
end;
procedure TForm1.Button3Click(Sender: TObject); //BTC/USD érték letöltése az adott honlapról. (Azért nem az MTGox.com-ról, mert az https:,
var //a Delphi pedig csak http-t kezel gyorsan. Sajnos nem találtam rá más megoldást.
s: string;
IdHTTP: TIdHTTP;
begin
IdHTTP := TIdHTTP.Create(nil);
Memo2.Lines.Text := idHTTP.Get('http://www.plus500.hu/Instruments/BTCUSD'); //A honlap forráskódját egy a felhasználó számára láthatatlan
IdHTTP.Free; //szövegdobozba írja be
end;
procedure TForm1.ComboBox1Change(Sender: TObject); //MH/s illetve GH/s választás
begin
if combobox1.Text='GH/s' then
begin
Label1.Caption:='Hashrate (GH/s)';
end
else
begin
Label1.Caption:='Hashrate (MH/s)';
end;
end;
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); //A legördülő menübe írás letiltása
begin
if (Key in ['0'..'9','a'..'z','A'..'Z','/','*','+','-',',','.','?','!']) then
begin
Key:=#0;
end;
end;
procedure TForm1.Edit10KeyPress(Sender: TObject; var Key: Char); //Szöveg mezőbe való írás letiltása
begin
Key:=#0;
end;
procedure TForm1.Edit11KeyPress(Sender: TObject; var Key: Char); //Szöveg mezőbe való írás letiltása
begin
Key:=#0;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); //Hashrate mezőbe csak számokat illetve Backspace-t lehet írni
begin
if not (Key in [#8, '0'..'9',' ']) then
begin
Key:=#0;
end;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); //Difficulty mezőbe csak számokat illetve Backspace-t lehet írni
begin
if not (Key in [#8, '0'..'9']) then
begin
Key:=#0;
end;
end;
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char); //Szöveg mezőbe való írás letiltása
begin
key:=#0;
end;
procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char); //Szöveg mezőbe való írás letiltása
begin
Key:=#0;
end;
procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char); //Szöveg mezőbe való írás letiltása
begin
Key:=#0;
end;
procedure TForm1.Edit6KeyPress(Sender: TObject; var Key: Char); //Szöveg mezőbe való írás letiltása
begin
Key:=#0;
end;
procedure TForm1.Edit7KeyPress(Sender: TObject; var Key: Char); //USD/BTC mezőbe csak számokat illetve Backspace-t lehet írni
begin
if not (Key in [#8, '0'..'9', ',']) then
begin
Key:=#0;
end;
end;
procedure TForm1.Edit8KeyPress(Sender: TObject; var Key: Char); //Szöveg mezőbe való írás letiltása
begin
Key:=#0;
end;
procedure TForm1.Edit9KeyPress(Sender: TObject; var Key: Char); //Szöveg mezőbe való írás letiltása
begin
Key:=#0;
end;
procedure TForm1.FormShow(Sender: TObject); //A program indulásakor pingeli az adott IP címet (www.google.hu)
var
s:string;
begin
edit2.Text:='0';
Ping1.DnsLookup('173.194.44.50');
end;
procedure TForm1.Panel1Click(Sender: TObject); //Számítás
var
Hash:real;
Diff:real;
m1,m2:integer;
BTC:real;
money,usd:real;
begin
if not(edit1.Text='') then //Ha az első mező nem üres, akkor a benne lévő adatot beolvassa
begin
Hash:=strtofloat(edit1.Text);
m1:=1;
end
else
begin
showmessage('A '+label1.Caption+' mező üres'); //Egyébként Kiírja hogy az adott mező üres
end;
if not(edit2.Text='') then //Ugyan ez a vizsgálat a második mezőre
begin
Diff:=strtofloat(edit2.Text);
m2:=1;
end
else
begin
showmessage('A '+label2.Caption+' mező üres');
end;
if m1+m2=2 then //Ha egyik mező sem üres, akkor indulhat a számítás
begin
if combobox1.Text='MH/s' then
begin
BTC:=24/(Diff*4294967296 /(Hash*1000000)/60/60)*25; //MH/s számítás
end
else
begin
BTC:=24/(Diff*4294967296 /(Hash*1000000000)/60/60)*25; //GH/s számítás
end;
Edit3.Text:=floattostrf(BTC,ffgeneral,8,4); //Egy kis konvertálás: Maximum 8 számjegyű számot ír ki, 4 tizedes jegyig...BTC/Nap
Edit4.Text:=floattostrf(BTC*7,ffgeneral,8,4); //BTC/Hét
edit5.Text:=floattostrf(BTC*30,ffgeneral,8,4); //BTC/Hónap
edit6.Text:=floattostrf(BTC*365,ffgeneral,8,4); //BTC/Év
end;
if not(edit7.Text='') and not(edit3.Text='') then //Vizsgálat, hogy be van-e írva a USD/BTC érték
begin
usd:=strtofloat(edit7.Text);
money:=strtofloat(edit3.Text);
edit8.Text:='$' + floattostrf(money*usd,ffnumber,8,4); //Megintcsak egy kis szám csinosítgatás
money:=strtofloat(edit4.Text);
edit9.Text:='$' + floattostrf(money*usd,ffnumber,8,4);
money:=strtofloat(edit5.Text);
edit10.Text:='$' + floattostrf(money*usd,ffnumber,8,4);
money:=strtofloat(edit6.Text);
edit11.Text:='$' + floattostrf(money*usd,ffnumber,8,4);
end;
end;
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; //Gomb lenyomáskor a gomb kinézetének változtatása
Shift: TShiftState; X, Y: Integer);
begin
panel1.BevelOuter:=bvlowered;
end;
procedure TForm1.Panel1MouseEnter(Sender: TObject); //Ha az egér a gombon van, a gomb kinézetének változtatása
begin
panel1.Color:=$00666666;
end;
procedure TForm1.Panel1MouseLeave(Sender: TObject); //Ha az egér elhagyja a gombot, a gomb kinézetének változtatása eredeti kinézetre
begin
panel1.BevelKind:=bknone;
panel1.Color:=$005c5c5c;
end;
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; //Ha a kattintás befejeződik a gomb kinézetének változtatása eredeti
Shift: TShiftState; X, Y: Integer); //kinézetre
begin
panel1.BevelOuter:=bvspace;
end;
procedure TForm1.Ping1DnsLookupDone(Sender: TObject; Error: Word); //Ha az adott IP cím létezik és él (www.google.hu)...
begin
if Error <> 0 then begin
// Showmessage('Nincs net');
Exit;
end;
Ping1.Address := Ping1.DnsResult; //...akkor pingelje meg
Ping1.Ping;
end;
procedure TForm1.Ping1EchoReply(Sender, Icmp: TObject; Status: Integer); //Ha az adott IP címről van fogadott adat (van válasz/van internet)...
begin
if Status <> 0 then
{ Success }
begin webbrowser1.Navigate('http://dot-bit.org/tools/nextDifficulty_old.php'); //Betölti az adott oldalt, bár most jöttem rá hogy feleslegesen:)
timer1.Enabled:=true; //Akkor indítson el két ciklust, amik az időzítőre vannak megírva (végtelen ciklusok kilépési ponttal)
timer2.Enabled:=true;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject); //Időzítőn lévő végtelen ciklus
begin
if Assigned(webbrowser1.Document) then //vizsgálat, hogy sikerült-e betölteni az előbb az oldalt, ha igen...
begin
button2Click(self); //...(bocs lusta voltam) akkor a Button2-t meghívom, vagyis szimulálom a gomb lenyomását, így a rá megírt
Button1.Enabled:=true; //program lefut (láthatatlan gomb)
image4.Visible:=false;
label17.Caption:='Online'; //jobb felső sarokban zöldre változik a lámpa, ha van internet
timer1.Enabled:=false; //Ha teljesült a feltétel, akkor a ciklus kilép
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject); //Időzítőn lévő végtelen ciklus2
var
s : string;
i,StartPos,EndPos : integer;
begin
button3Click(self); //megintcsak lustaság: Button3-n lévő kód futtatása (láthatatlan gomb)
s:=memo2.Lines[122]; //honlap forráskódjának (122. sor) beolvasása szövegdobozból
image4.Visible:=false;
label17.Caption:='Online';
if (Pos('<span',s) > 0) then //A honlap forráskódjában a '<span' kifejezés keresése
begin //ha van találat:
StartPos := Pos('<span',s); //A forráskód sorának szerkesztése, illetve az USD/BTC érték kikeresése a sorból
Delete(s, 1, StartPos);
StartPos := Pos('>',s);
EndPos := Pos('<', s);
s := Copy(S, StartPos+1, Endpos-StartPos-1);
s := StringReplace(s, '.', ',',[rfReplaceAll, rfIgnoreCase]);
edit7.Text:=s;
timer2.Enabled:=false; //Ha végzett, ciklus kilép
end
else //Különben az USD/BTC mező legyen üres...
begin
edit7.Text:=s;
timer2.Enabled:=false; //és lépjen ki a ciklus
end;
End;
end.