Форум: "Потрепаться";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
ВнизПишу Твикер Для Windows!! Найти похожие ветки
← →
Zhenka (2003-02-17 07:42) [0]Подскажите алгоритм сохранения изменений, сд-х в программе,
Не проверять же На БаттонКлик Чекед Итем В лист бокас или нет,ведь Итемсов, кмк и лист боксов хватает,или можно какнибудь подругому??
Спасибо.
← →
RV (2003-02-17 08:39) [1]я делал таблицу
клик/выбор значения - изменяем байтик
по выходу - бежим по таблице, делаем/не делаем в соответствии с ней изменения, сохраняем таблицу
← →
Zhenka (2003-02-17 08:46) [2]Не понял,поподробнее
← →
RV (2003-02-17 09:38) [3]массив байтов. каждый за что-то отвечает. при каком-либо изменении - изменяем соответствующе соответствующий байт(слово).
если юзер делает _применить, бежим по таблице и делаем изменения.
сохранить значения можно сохранив массив
+
можно сохранять настройки разных вариантов
есть откат (загружаем старую таблицу)
← →
Zhenka (2003-02-17 15:43) [4]Есть ли ещё мнения по сабжу??
← →
Ketmar (2003-02-17 16:29) [5]КУДА сохранения?
Satanas Nobiscum! 17-Feb-XXXVIII A.S.
← →
Zhenka (2003-02-17 16:39) [6]В реестр надо сохр. данные, но делать так
+По кнопке 1 жать, Проверяются все итемсы Чек бокса На Чекед\нечекед, и в зависимости от этого зап-я Значение
Пример
==================
begin
Reestr.RootKey:=HKEY_CURRENT_USER;
//rescent docs
If CheckListBox1.Checked[0]=true then
begin
Reestr.OpenKey("Software\Microsoft\Windows\CurrentVersion\Policies\Explorer",false);
Reestr.WriteInteger("NoRecentDocsMenu",1);
Reestr.CloseKey;
end
else
begin
Reestr.OpenKey("Software\Microsoft\Windows\CurrentVersion\Policies\Explorer",false);
Reestr.WriteInteger("NoRecentDocsMenu",0);
Reestr.CloseKey;
end;
и так каждый параметр
← →
ION T (2003-02-17 16:57) [7]Делаешь как сказал RV, в соответсвие его массиву байтов создаешь ещё один массив строк. В строки (массива строк) заталкиваешь комма-делимитед текст с названиями ключей и параметров кот. надо сохранять, ну и потом кой-то ф-ей пробегаешь по этому делу и собственно пишешь в реестр....
← →
Zhenka (2003-02-17 17:03) [8]Вроде понял, но как сделать?? Не догоняю
← →
NetBreaker666 (2003-02-17 17:11) [9]//StateSaver.pas
unit StateSaver;
interface
uses
Windows, Messages, SysUtils, Classes, Registry, Dialogs, Controls, StdCtrls, ExtCtrls, Buttons, YesOrNoDialog, Menus;
type
TSaverEvent=procedure (Sender:TObject; Target:TComponent; var DoIt:Boolean) of object;
TStateSaver = class(TComponent)
private
{ Private declarations }
RegPath:String;
RegRoot:String;
RegRootHKEY:HKEY;
WTOP, WLEFT, WWIDTH, WHEIGHT, WTAG:Boolean;
WCAPTION, WTEXT, WCOLOR:Boolean;
WEnabled, WVisible, WChecked:Boolean;
_ONNC,_ONNCL:TSaverEvent;
procedure SetRegRoot(S:String);
procedure SetRegRootHKEY(HK:HKEY);
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property RegistryRoot:String read RegROOT write SetRegROOT ;
property RegistryRootHKEY:HKey read RegRootHKEY write SetRegRootHKEY default HKEY_CURRENT_USER;
property RegistryPath:String read RegPath write RegPath;
property WriteTop:Boolean read WTOP write WTOP;
property WriteLeft:Boolean read WLeft write WLeft;
property WriteWidth:Boolean read WWIDTH write WWidth;
property WriteHeight:Boolean read WHEIGHT write WHeight;
property WriteCaption:Boolean read WCaption write WCaption;
property WriteText:Boolean read WText write WText;
property WriteColor:boolean read WColor write WColor;
property WriteTag:Boolean read WTAG write WTag;
property WriteEnabled:Boolean read WEnabled write WEnabled;
property WriteVisible:Boolean read WVisible write WVisible;
property WriteChecked:Boolean read WChecked write WChecked;
property OnNewComponentSaving:TSaverEvent read _ONNC write _ONNC;
property OnNewComponentLoading:TSaverEvent read _ONNCL write _ONNCL;
procedure SaveComponentState(C:TComponent; preffix, postfix:String);
procedure LoadComponentState(C:TComponent; preffix, postfix:String);
end;
TUPC=class(TControl)
public
property Color;
property Caption;
property Text;
End;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("NetBreakers", [TStateSaver]);
end;
procedure TStateSaver.SetRegRoot(S:String);
Begin
S:=UpperCase(S);
if S="HKEY_LOCAL_MACHINE" then
Begin
RegRootHKEY:=HKEY_LOCAL_MACHINE;RegRoot:=S;
Exit;
End;
if S="HKEY_CURRENT_USER" then
Begin
RegRootHKEY:=HKEY_CURRENT_USER;RegRoot:=S;
Exit;
End;
if S="HKEY_CLASSES_ROOT" then
Begin
RegRootHKEY:=HKEY_CLASSES_ROOT;RegRoot:=S;
Exit;
End;
if S="HKEY_USERS" then
Begin
RegRootHKEY:=HKEY_USERS;RegRoot:=S;
Exit;
End;
if S="HKEY_PERFORMANCE_DATA" then
Begin
RegRootHKEY:=HKEY_PERFORMANCE_DATA; RegRoot:=S;
Exit;
End;
if S="HKEY_CURRENT_CONFIG" then
Begin
RegRootHKEY:=HKEY_CURRENT_CONFIG; RegRoot:=S;
Exit;
End;
← →
NetBreaker666 (2003-02-17 17:12) [10]if S="HKEY_DYN_DATA" then
Begin
RegRootHKEY:=HKEY_DYN_DATA;RegRoot:=S;
Exit;
End;
ShowMessage("Invalid registry key.");
End;
procedure TStateSaver.SetRegRootHKEY(HK:HKEY);
Begin
case HK of
HKEY_LOCAL_MACHINE:
Begin
RegRoot:="HKEY_LOCAL_MACHINE";
End;
HKEY_CURRENT_USER:
Begin
RegRoot:="HKEY_CURRENT_USER";
End;
HKEY_CLASSES_ROOT:
Begin
RegRoot:="HKEY_CLASSES_ROOT";
End;
HKEY_USERS:
Begin
RegRoot:="HKEY_USERS";
End;
HKEY_PERFORMANCE_DATA:
Begin
RegRoot:="HKEY_PERFORMANCE_DATA";
End;
HKEY_CURRENT_CONFIG:
Begin
RegRoot:="HKEY_CURRENT_CONFIG";
End;
HKEY_DYN_DATA:
Begin
RegRoot:="HKEY_DYN_DATA";
End;
else Begin
ShowMessage("Unknown registry key.");
Exit;
End;
End;
RegRootHKEY:=HK;
End;
procedure TStateSaver.SaveComponentState(C:TComponent; preffix, postfix:String);
var T:TControl;
R:TRegistry;
I:Integer;
CC:Boolean;
Begin
CC:=True;
if Assigned(_ONNC) then _ONNC(self,C,CC);
if CC then Begin
if C is TControl then Begin
T:=C as TControl;
R:=TRegistry.Create;
R.RootKey:=RegRootHKEY;
if R.OpenKey(RegPath, True)
then Begin
try
if WTOP then R.WriteInteger(preffix+C.GetNamePath+".TOP"+postfix, T.Top);
except
end;
try
if WEnabled then R.WriteBool(preffix+C.GetNamePath+".Enabled"+postfix, T.Enabled);
except
end;
try
if WVisible then R.WriteBool(preffix+C.GetNamePath+".TOP"+postfix, T.Visible);
except
end;
try
if WLEFT then R.WriteInteger(preffix+C.GetNamePath+".LEFT"+postfix, T.Left);
except
end;
try
if WTAG then R.WriteInteger(preffix+C.GetNamePath+".TAG"+postfix, T.Tag);
except
end;
try
if WHEIGHT then R.WriteInteger(preffix+C.GetNamePath+".HEIGHT"+postfix, T.Height);
except
end;
try
if WWIDTH then R.WriteInteger(preffix+C.GetNamePath+".WIDTH"+postfix, T.Width);
← →
NetBreaker666 (2003-02-17 17:13) [11]end;
if WTEXT then Begin
try
R.WriteString(preffix+C.GetNamePath+".Text"+postfix, TUPC(T).Text);
except
try
if T is TCustomEdit then R.WriteString(preffix+C.GetNamePath+".Text"+postfix, TCustomEdit(T).Text);
except
end;
end;
End;
if WCOLOR then Begin
try
R.WriteInteger(preffix+C.GetNamePath+".Color"+postfix,Integer(TUPC(T).color));
except
end;
End;
if WCAPTION then Begin
try
R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TUPC(T).caption);
except
try
if T is TButton then R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TButton(T).Caption);
if T is TCustomLabel then R.WriteString(preffix+C.GetNamePath+".caption"+postfix, TCustomLabel(T).Caption);
if T is TCheckBox then R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TCheckBox(T).Caption);
if T is TRadioButton then R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TRadioButton(T).Caption);
if T is TGroupBox then R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TGroupBox(T).Caption);
if T is TRadioGroup then R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TRadioGroup(T).Caption);
if T is TPanel then R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TPanel(T).Caption);
if T is TSpeedButton then R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TSpeedButton(T).Caption);
if T is TStaticText then R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TStaticText(T).Caption);
except
end;
end;
End;
End else Begin
//ShowMessage("Couldn""t open key ""+RegPath+"".");
Exit;
End;
R.Free;
End else Begin
if C is TYesOrNoDialog then Begin
R:=TRegistry.Create;
R.RootKey:=RegRootHKEY;
if R.OpenKey(RegPath, True)
then Begin
← →
NetBreaker666 (2003-02-17 17:13) [12]if WCaption then R.WriteString(preffix+C.GetNamePath+".Caption"+postfix, TYesOrNoDialog(C).caption);
if WText then R.WriteString(preffix+C.GetNamePath+".Text"+postfix, TYesOrNoDialog(C).Text);
End;
R.Free;
End;
if C is TPopupMenu then Begin
R:=TRegistry.Create;
R.RootKey:=RegRootHKEY;
if R.OpenKey(RegPath, True)
then Begin
for I:=0 to TPopupMenu(C).Items.Count-1 do
Begin
if WCaption then R.WriteString(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Caption"+postfix, TPopupMenu(C).Items[I].caption);
if WEnabled then R.WriteBool(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Enabled"+postfix, TPopupMenu(C).Items[I].Enabled);
if WVisible then R.WriteBool(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Visible"+postfix, TPopupMenu(C).Items[I].Visible);
if WChecked then R.WriteBool(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Checked"+postfix, TPopupMenu(C).Items[I].Checked);
End;
End;
R.Free;
End;
End;
End;
for I:=0 to C.ComponentCount-1 do SaveComponentState(C.Components[i],preffix+C.GetNamePath+".",postfix);
End;
procedure TStateSaver.LoadComponentState(C:TComponent; preffix, postfix:String);
var T:TControl;
R:TRegistry;
I:Integer;
CC:Boolean;
Begin
CC:=True;
if Assigned(_ONNCL) then _ONNCL(self,C,CC);
if CC then Begin
if C is TControl then Begin
T:=C as TControl;
R:=TRegistry.Create;
R.RootKey:=RegRootHKEY;
if R.OpenKey(RegPath, False)
then Begin
try
if WTOP then if R.ValueExists(preffix+C.GetNamePath+".TOP"+postfix) then T.Top:=R.ReadInteger(preffix+C.GetNamePath+".TOP"+postfix);
except
end;
try
if WEnabled then if R.ValueExists(preffix+C.GetNamePath+".Enabled"+postfix) then T.Enabled:=R.ReadBool(preffix+C.GetNamePath+".Enabled"+postfix);
except
← →
NetBreaker666 (2003-02-17 17:14) [13]end;
try
if WVisible then if R.ValueExists(preffix+C.GetNamePath+".TOP"+postfix) then T.Visible:=R.ReadBool(preffix+C.GetNamePath+".TOP"+postfix);
except
end;
try
if WLEFT then if R.ValueExists(preffix+C.GetNamePath+".LEFT"+postfix) then T.Left:=R.ReadInteger(preffix+C.GetNamePath+".LEFT"+postfix);
except
end;
try
if WTAG then if R.ValueExists(preffix+C.GetNamePath+".TAG"+postfix) then T.Tag:=R.ReadInteger(preffix+C.GetNamePath+".TAG"+postfix);
except
end;
try
if WHEIGHT then if R.ValueExists(preffix+C.GetNamePath+".HEIGHT"+postfix) then T.Height:=R.ReadInteger(preffix+C.GetNamePath+".HEIGHT"+postfix);
except
end;
try
if WWIDTH then if R.ValueExists(preffix+C.GetNamePath+".WIDTH"+postfix) then T.Width:=R.ReadInteger(preffix+C.GetNamePath+".WIDTH"+postfix);
except
end;
if WTEXT then if R.ValueExists(preffix+C.GetNamePath+".Text"+postfix) then
Begin
try
TUPC(T).Text:=R.ReadString(preffix+C.GetNamePath+".Text"+postfix);
except
try
if T is TCustomEdit then TCustomEdit(T).Text:=R.ReadString(preffix+C.GetNamePath+".Text"+postfix);
except
end;
end;
End;
if WCOLOR then if R.ValueExists(preffix+C.GetNamePath+".Color"+postfix) then Begin
try
TUPC(T).Color:= R.ReadInteger(preffix+C.GetNamePath+".Color"+postfix);
except
end;
End;
if WCaption then if R.ValueExists(preffix+C.GetNamePath+".Caption"+postfix) then Begin
try
TUPC(T).Caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
except
try
if T is TButton then TButton(T).Caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
if T is TCustomLabel then TCustomLabel(T).Caption:=R.ReadString(preffix+C.GetNamePath+".caption"+postfix);
if T is TCheckBox then TCheckBox(T).Caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
if T is TRadioButton then TRadioButton(T).Caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
if T is TGroupBox then TGroupBox(T).Caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
if T is TRadioGroup then TRadioGroup(T).Caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
if T is TPanel then TPanel(T).Caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
if T is TSpeedButton then TSpeedButton(T).Caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
if T is TStaticText then TStaticText(T).Caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
except
end;
end;
End;
End;
R.Free;
End else Begin
← →
NetBreaker666 (2003-02-17 17:14) [14]if C is TYesOrNoDialog then Begin
R:=TRegistry.Create;
R.RootKey:=RegRootHKEY;
if R.OpenKey(RegPath, False)
then Begin
if WCaption then if R.ValueExists(preffix+C.GetNamePath+".Caption"+postfix) then TYesOrNoDialog(C).caption:=R.ReadString(preffix+C.GetNamePath+".Caption"+postfix);
if WText then if R.ValueExists(preffix+C.GetNamePath+".Text"+postfix) then TYesOrNoDialog(C).text:=R.ReadString(preffix+C.GetNamePath+".Text"+postfix);
End;
R.Free;
End;
if C is TPopupMenu then Begin
R:=TRegistry.Create;
R.RootKey:=RegRootHKEY;
if R.OpenKey(RegPath, True)
then Begin
for I:=0 to TPopupMenu(C).Items.Count-1 do
Begin
if WCaption then if R.ValueExists(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Caption"+postfix) then TPopupMenu(C).Items[I].caption:=R.ReadString(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Caption"+postfix);
if WEnabled then if R.ValueExists(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Enabled"+postfix) then TPopupMenu(C).Items[I].Enabled:=R.ReadBool(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Enabled"+postfix);
if WVisible then if R.ValueExists(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Visible"+postfix) then TPopupMenu(C).Items[I].Visible:=R.ReadBool(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Visible"+postfix);
if WChecked then if R.ValueExists(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Checked"+postfix) then TPopupMenu(C).Items[I].Checked:=R.ReadBool(preffix+C.GetNamePath+".Item["+IntToStr(I)+"].Checked"+postfix);
End;
End;
R.Free;
End;
End;
End;
for I:=0 to C.ComponentCount-1 do LoadComponentState(C.Components[i],preffix+C.GetNamePath+".",postfix);
End;
end.
← →
NetBreaker666 (2003-02-17 17:15) [15]//StateSaver.pas
unit YesOrNoDialog;
interface
uses
Windows, Messages, SysUtils, Classes, Dialogs, Forms;
type
TYesOrNoDialog = class(TComponent)
private
{ Private declarations }
_OnEx:TNotifyEvent;
__SNO:Boolean;
__SC:Boolean;
_Y,_N,_C:Boolean;
_Caption, _Text:String;
procedure SetNo(S:Boolean);
procedure SetCancel(S:Boolean);
protected
{ Protected declarations }
public
{ Public declarations }
property Yes:Boolean read _Y;
property No:Boolean read _N;
property Cancel:Boolean read _C;
published
{ Published declarations }
property ShowNoButton:Boolean read __SNO write SetNo ;
property ShowCancelButton:Boolean read __SC write SetCancel ;
property Caption:String read _Caption write _Caption;
property Text:String read _Text write _Text;
property OnExecute:TNotifyEvent read _OnEx Write _OnEx;
function Execute:Integer;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("NetBreakers", [TYesOrNoDialog]);
end;
//Voen secret.
// 2301900
Function TYesOrNoDialog.Execute:Integer;
var Hn:THandle;
Begin
Hn:=Application.Handle;
if __SNO and __SC then Begin
Result:=MessageBox(Hn,PChar(text),PChar(Caption),MB_YESNOCANCEL);
_Y:=(Result=6)or(Result=1);
_N:=Result=7;
_C:=REsult=2;
Exit;
End;
if __SNO then Begin
Result:=MessageBox(Hn,PChar(text),PChar(Caption),MB_YESNO);
_Y:=(Result=6)or(Result=1);
_N:=Result=7;
_C:=REsult=2;
Exit;
End;
if __SC then Begin
Result:=MessageBox(Hn,PChar(text),PChar(Caption),MB_OKCANCEL);
_Y:=(Result=6)or(Result=1);
_N:=Result=7;
_C:=REsult=2;
Exit;
End;
Result:=MessageBox(Hn,PChar(text),PChar(Caption),MB_OK);
_Y:=(Result=6)or(Result=1);
_N:=Result=7;
_C:=Result=2;
End;
procedure TYesOrNoDialog.SetNo(S:Boolean);
Begin
__SNO:=S;
End;
procedure TYesOrNoDialog.SetCancel(S:Boolean);
Begin
__SC:=S;
End;
end.
← →
Zhenka (2003-02-17 17:15) [16]Тов NetBreaker666? а что делает ваш модуль???
а тоя под конец дня несображаю
← →
NetBreaker666 (2003-02-17 17:18) [17]Писал давно (был еще ламаком), объяснять влом.
Вообщем кидаешь StateSaver на форму, выбераешь ветвь реестра куда сохранять... вот она и сохранеят состояние всех компонент на форме (TWinControl"ы, Control"ы и menu"хи). Можно также загрузить состояние компонент...
← →
NetBreaker666 (2003-02-17 17:21) [18]Ой, бл*, там где-то except пропустил :( Вообщем найдете
← →
Zhenka (2003-02-17 17:21) [19]TЕщё сабжи на тему пожалуйста
← →
NetBreaker666 (2003-02-17 17:25) [20]Не понял ?
← →
smok_er (2003-02-17 18:14) [21]Бегло просмотрел приведенные примеры
вроде этого нет
==================
begin
Reestr.RootKey:=HKEY_CURRENT_USER;
//rescent docs
Reestr.OpenKey("Software\Microsoft\Windows\CurrentVersion\Policies\Explorer",false);
Reestr.WriteInteger("NoRecentDocsMenu", Integer(CheckListBox1.Checked[0]));
Reestr.CloseKey;
...
и так каждый параметр
← →
Zhenka (2003-02-17 19:34) [22]Кто ещё что подскажет, спасибо!
← →
malkolinge (2003-02-18 11:23) [23]
> NetBreaker666 ©
Уважаемый а не проще было ваше гениальное творение(несмотря даже на то, что вы тогда были ламаком), скинуть на мыло ? Или самомнение от этого пострадало бы ? Вам наверняка не хватает того, чтобы Вами повосхищались. Так вот я Вами восхищаюсь !
← →
Ketmar (2003-02-18 12:18) [24]>Zhenka © (17.02.03 19:34)
а что, циклы и UserData моль трахнула?
Satanas Nobiscum! 18-Feb-XXXVIII A.S.
← →
Думкин (2003-02-18 12:25) [25]
> NetBreaker666 © (17.02.03 17:18)
> Писал давно (был еще ламаком), объяснять влом.
Ну а если такое публикуешь, то видимо прописку не поменял.
← →
NetBreaker666 (2003-02-18 20:50) [26]
> NetBreaker666 ©
Уважаемый а не проще было ваше гениальное творение(несмотря даже на то, что вы тогда были ламаком), скинуть на мыло ? Или самомнение от этого пострадало бы ? Вам наверняка не хватает того, чтобы Вами повосхищались. Так вот я Вами восхищаюсь !
Ой, спасиба... насчет e-mail"а - firewall не позволил использовать SMTP :( Влом было через WEB-interface отправлять.
> Ну а если такое публикуешь, то видимо прописку не поменял.
Не понял, что там насчет прописки? Тебе что-то не нравится ?
← →
Zhenka (2003-02-19 06:13) [27]2Катмар
Товароищ Хердмар
Вы только острить умеете, или я ошибаюс??
Сатану НАПиську 19 Февраля
← →
Zhenka (2003-02-19 06:24) [28]2smok_er
В принципе это меня устраивает, но размер кода умень-я где-то всего в 2 раза :*( Мало
← →
Ketmar (2003-02-19 13:37) [29]>Zhenka © (19.02.03 06:13)
нет. ты просто тупой. а я, кстати, ОТВЕТИЛ НА ВОПРОС. жаль, что тебе не хватает серого вещества, чтобы это понять. пнх.
Satanas Nobiscum! 19-Feb-XXXVIII A.S.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.01 c