Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 423
от 24.03.2006, 23:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 284, Экспертов: 70
В номере:Вопросов: 8, Ответов: 28


Вопрос № 37877: Привет... 1.Как можно узнать число строк работая с Text файлом? 2.Подскажте идею как можно реализовать следующее: Пишу программку тест...мне надо чтобы вопросы брались из файла, Причем вопрос имеет следующий вид: строка1 вопрос...
Вопрос № 37894: Здравствуйте, Уважаемые эксперты! Хотелось бы небольшой примерчик про то, как отключить реагирование программы на Alt+F4, т.е. программа не должна закрыться. ..
Вопрос № 37912: Здравствуйте! Подскажите, почему возникает ошибка при компиляции, как правильно сделать. FullDirectoryCopy(PChar(s[i] + ':drr01filter_driverDrv'), 'c:Program FilesASCONdrr01'); // Ошибка {$R *.dfm} function FullDirectoryCop...
Вопрос № 37920: Здравствуйте уважаемые эксперты. Подскажите как можно под Delphi, из листа Excel создать таблицу .dbf, чтобы пользователь ничего не этого не видал. Ну что-то вроде экспорта из excel в dbf средствами delphi Заранее благодарен. ...
Вопрос № 37927: Привет эксперты! 1.Возможно ли в Delphi под Windows откомпилировать .cgi который будет работать в Unix? 2.Запускается ли Kylix в Windows? или только в Unix/Linux? 3.Если взять все исходники проекта и закинуть их на Unix сервер, а затем в ...
Вопрос № 37950: Прет... Как можно встать на начало Text файла, если я нахожусь в конце? И вообще как можно по нему перемещаться? ...
Вопрос № 37954: Здравствуйте!!! В С++ Builder есть встроенный обработчик исключительных ситуаций вида try{} catch(...){} который ловит все ошибки, а есть ли такой же обработчик в Delphi или аналогичный...
Вопрос № 37958: Здравствуйте! Подскажите пожалуйста как осуществить поиск строки в тхт файле. Я нашел на delphiword пример function ScanFile(const FileName: string; const forString: string; caseSensitive: Boolean): Longint; но он как то криво работает. Подскажит...

Вопрос № 37.877
Привет...
1.Как можно узнать число строк работая с Text файлом?
2.Подскажте идею как можно реализовать следующее:
Пишу программку тест...мне надо чтобы вопросы брались из файла,
Причем вопрос имеет следующий вид:
строка1 вопрос
строка2 вариант ответа
строка3 вариант ответа
строка4 номер правильного варианта ответа

Так вот как можно арганизовать random'ный вывод ответов в memo?
И как при этом проверять был ли выбран до этого вопрос или нет?
Причем я хочу штоб длина файла была разой.
И как организовавать доступ к произвольной строке файла???
Отправлен: 18.03.2006, 23:11
Вопрос задал: Denton (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Latent
Здравствуйте, Denton!

Вот исходник Тестовой программs? в которой хранятся данные в файле.
http://www.programmersclub.ru/files/test_os_is.rar

---------
- Нет ничего невозможного -
Ответ отправил: Latent (статус: 1-ый класс)
Ответ отправлен: 18.03.2006, 23:34

Отвечает: Николай Б.
Здравствуйте, Denton!
я тебе советую использовать типизированный файл, но придется ограничить длину строк.
Пример в приложении.

Приложение:

Ответ отправил: Николай Б. (статус: 2-ой класс)
Ответ отправлен: 19.03.2006, 07:10
Оценка за ответ: 5
Комментарий оценки:
А куда можно вставить это описание???
Я в какой раздел не сую у меня все ошибка выдается...чё за ерунда???

Отвечает: Denisss

Здравствуйте, Denton!

1. Строки в файле заканчиваются символами #10#13. Т.о., можно:
1) Подсчитать количество символов #13 в файле
2) Открыть файл с помощью TStringList.LoadFromFile и посмотреть значение Count
3) Прочитать весь файл с помощью ReadLn, посмотреть сколько раз использовалась эта процедура, столько и строк
2. Способов, также много, но, учитывая предыдущий пп., то я бы рекомендовал использовать TStringList

Далее см. пример. (прикрепленный файл, выполнен в Delphi7)

Удачи!

Прикреплённый файл: Загрузить >>
Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.

Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 19.03.2006, 13:46


Вопрос № 37.894
Здравствуйте, Уважаемые эксперты!

Хотелось бы небольшой примерчик про то, как отключить реагирование программы на Alt+F4, т.е. программа не должна закрыться.
Отправлен: 19.03.2006, 02:56
Вопрос задал: Solovej (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лучников Ю.В.
Здравствуйте, Solovej!

Вам следует воспользоваться обработчиком OnCloseQuery() главной формы.
В этот обработчик передается параметр CanClose. Если он равен true то форма закроется, иначе нет.

Вот пример демонстраций возможности вышесказанного:
1) Создайте новый проект
2) На форму положите компонент TCheckBox
2) В инспекторе объектов выберите вкладку событий (events) главной формы.
3) Щелкните 2 раза по событию OnCloseQuery. Компилятор сгенерирует заготовку обработчика данного события. В нем впишите код:
if CheckBox1.Checked then CanClose := false;

4) Скомпилируйте проект.

В результате, если флажок на форме помечен, то форма не закроется что по Alt+F4, что по щелчку на значок X вверху окна.

Успехов!!
Ответ отправил: Лучников Ю.В. (статус: Практикант)
Ответ отправлен: 19.03.2006, 03:23
Оценка за ответ: 5

Отвечает: Полховский Александр Владимирович
Здравствуйте, Solovej!
Можно ещё отслеживать нажатие кнопок. Если нажаты Alt+F4 - код клавиши (Key) поменять на 0. Следующий код напишите в обработчике TForm.OnKeyDown

if (ssAlt in Shift)and(key=vk F4)
then
begin
application.MessageBox('фиг вам', 'Warning');
key:=0;
end;


При этом свойство окна KeyPreview должно быть true.
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Практикант)
Ответ отправлен: 19.03.2006, 03:32
Оценка за ответ: 5

Отвечает: Николай Б.
Здравствуйте, Solovej!
Создай обрабатчик события в форме OnClose и напиши:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
end;
Ответ отправил: Николай Б. (статус: 2-ой класс)
Ответ отправлен: 19.03.2006, 06:58

Отвечает: Злоумышленник
Здравствуйте, Solovej!
Это делается в одну строчку в следующем обработчике:

procedure TfmOptions.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key = VK_F4) and (ssAlt in Shift) then Abort;
end;
Ответ отправил: Злоумышленник (статус: 4-ый класс)
Ответ отправлен: 19.03.2006, 13:11

Отвечает: Leshiy2006
Здравствуйте, Solovej!Примерно так: в свойствах формы ставите KeyPreview:=True далее см. приложение. Эта форма закрывается только с кнопки в заголовке.
Удачи!

Приложение:

Ответ отправил: Leshiy2006 (статус: 5-ый класс)
Ответ отправлен: 19.03.2006, 22:40
Оценка за ответ: 5

Отвечает: Ataman N. N.
Здравствуйте, Solovej!
У формы есть событие OnClose. В качестве второго параметра передается переменная типа TCloseAction (var Action: TCloseAction). Для того, чтобы форма не закрылась присвойте данной переменно значение caNone (Action := caNone;). Переменная Action может принимать еще такие значения: caHide, caFree, caMinimize.
Ответ отправил: Ataman N. N. (статус: 10-ый класс)
Ответ отправлен: 20.03.2006, 16:37


Вопрос № 37.912
Здравствуйте!
Подскажите, почему возникает ошибка при компиляции, как правильно сделать.
FullDirectoryCopy(PChar(s[i] + ':drr01filter_driverDrv'), 'c:Program FilesASCONdrr01'); // Ошибка
{$R *.dfm}

function FullDirectoryCopy(SourceDir, TargetDir: string; StopIfNotAllCopied,
OverWriteFiles: Boolean): Boolean;
var
SR: TSearchRec;
I: Integer;
begin
Result := False;
SourceDir := IncludeTrailingBackslash(SourceDir);
TargetDir := IncludeTrailingBackslash(TargetDir);
if not DirectoryExists(SourceDir) then
Exit;
if not ForceDirectories(TargetDir) then
Exit;

I := FindFirst(SourceDir + '*', faAnyFile, SR);
try
while I = 0 do
begin
if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
begin
if SR.Attr = faDirectory then
Result := FullDirectoryCopy(SourceDir + SR.Name, TargetDir + SR.NAME,
StopIfNotAllCopied, OverWriteFiles)
else if not (not OverWriteFiles and FileExists(TargetDir + SR.Name))
then
Result := CopyFile(Pchar(SourceDir + SR.Name), Pchar(TargetDir +
SR.Name), False)
else
Result := True;
if not Result and StopIfNotAllCopied then
exit;
end;
I := FindNext(SR);
end;
finally
SysUtils.FindClose(SR);
end;
end;

function GetCDRoms: string;
var
d: dword;
b: byte;
begin
result := '';
d := GetLogicalDrives;
for b := 0 to 31 do
if d and (1 shl b) > 0 then
if GetDriveType(PChar(chr(b+65)+':')) = DRIVE_CDROM then
result := result + chr(b+65);
end;

function GetCDExist: string;
var
i: integer;
buf: array[0..MAX_PATH] of char;
d: dword;
begin
result := GetCDRoms;
SetErrorMode(SEM_FAILCRITICALERRORS);
for i := Length(result) downto 1 do
if not GetVolumeInformation(PChar(result[i] + ':'), @buf, MAX_PATH,
nil, d, d, @buf, MAX_PATH) then
Delete(result, i, 1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
s: string;
begin
s := GetCDExist;
for i := 1 to Length(s) do
FullDirectoryCopy(PChar(s[i] + ':drr01filter_driverDrv'), 'c:Program FilesASCONdrr01'); // Ошибка

CopyFile(PChar(s[i] + ':drr02filter_driverInstall.bat'), 'c:Program FilesASCONdrr02BinInstall.bat', false);
end;
Отправлен: 19.03.2006, 10:21
Вопрос задал: Serhik_z (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Cheater76
Здравствуйте, Serhik_z!
У FullDirectoryCopy =4= параметра!
FullDirectoryCopy(PChar(s[i] + ':drr01filter_driverDrv'), 'c:Program FilesASCONdrr01', true, true);
Ответ отправил: Cheater76 (статус: 3-ий класс)
Ответ отправлен: 19.03.2006, 12:10

Отвечает: Denisss

Здравствуйте, Serhik_z!

1. У процедуры FullDirectoryCopy 4 параметра
2. Зачем Вы преобразуете тип String в PChar??? В процедуре FullDirectoryCopy первые два параметра не PChar, а String:

FullDirectoryCopy(s[i] + ':drr01filter_driverDrv', 'c:Program FilesASCONdrr01', False, False);
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 19.03.2006, 12:43

Отвечает: sir henry
Здравствуйте, Serhik_z!
У функции FullDirectoryCopy в описании 4 параметра, а Вы передаете ему всего 2. Сделайте тогда остальные два со значениями по умолчанию.
Первый параметр функции FullDirectoryCopy типа string, Вы же передаете ему PChar.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 19.03.2006, 13:52


Вопрос № 37.920
Здравствуйте уважаемые эксперты.
Подскажите как можно под Delphi, из листа Excel создать таблицу .dbf, чтобы пользователь ничего не этого не видал. Ну что-то вроде экспорта из excel в dbf средствами delphi

Заранее благодарен.
Отправлен: 19.03.2006, 12:26
Вопрос задал: Алексеев Александр Владимирович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: sir henry
Здравствуйте, Алексеев Александр Владимирович!
Форматы dbf тоже разные бывают. :)
В методе SaveAs() Рабочей книги, вторым параметром идет тип файла. Если указать этот тип, нужный Вам формат dbf (их несколько), то можно сохранить лист как файл dbf.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 19.03.2006, 14:06

Отвечает: Cheater76
Здравствуйте, Алексеев Александр Владимирович!
Нашел бесплатные компоненты с довольно развитой функциональностью FlexCel на www.torry.net.
http://www.torry.net/vcl/reports/other/flexceld7.zip
Там хорошая библиотека компонентов. Приятно покопаться.
Ответ отправил: Cheater76 (статус: 3-ий класс)
Ответ отправлен: 20.03.2006, 00:57


Вопрос № 37.927
Привет эксперты!
1.Возможно ли в Delphi под Windows откомпилировать .cgi который будет работать в Unix?
2.Запускается ли Kylix в Windows? или только в Unix/Linux?
3.Если взять все исходники проекта и закинуть их на Unix сервер, а затем в командной строке набрать dcc32 http:\\adres_servera\*.dpr откомпилируется ли проект на серваке для работы под Unix?
Отправлен: 19.03.2006, 13:55
Вопрос задал: Green (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: romodos
Здравствуйте, Green!
1.Естественно, нет. Т.к. в UNIX формат исполняемых файлов совершенно другой. Там ELF, а в винде PE. Т.е. можно создать сам проект, его код. Но компилировать надо под Kylix.
2.Насколько я знаю, не запускается. Это же nix-приложение.
3.Только надо будет не dcc32 запускать наверное, а kylix-компилятор. Тогда будет робить.
---------
The Source is Our Soul. FAQ me off!
Ответ отправил: romodos (статус: Практикант)
Ответ отправлен: 19.03.2006, 14:02
Оценка за ответ: 5
Комментарий оценки:
Ну ты блин скоростной ;)

Отвечает: sir henry
Здравствуйте, Green!
1. Нет, это полностью исключено.
2. Нет. Kylix работает только под Linux.
3. Если администратор сервера настолько глуп (и это еще мягко сказано), что позволяет запускать программы, которые могут повредить сервак, то конечно можно.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 19.03.2006, 14:11
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Вопрос исчерпан.


Вопрос № 37.950
Прет...
Как можно встать на начало Text файла, если я нахожусь в конце? И вообще как можно по нему перемещаться?
Отправлен: 19.03.2006, 19:21
Вопрос задал: Denton (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denisss

Здравствуйте, Denton!

Все зависит от того, как Вы этот файл открыли:
1. С помощью AssignFile
Чтобы определить, находитесь ли Вы в конце файла или нет, используется функция
function EOF(var F: File): Boolean;

Чтобы перемещаться по файлу
procedure Seek(var F: File; N: LongInt);

N - число байт от начала файла. Т.о., если Вы примените Seek(F, 0);, то попадете в начало файла (F - переменная типа File или его наследник).
Кроме того, есть функция SeekEOF - она имеет только одну переменную (файл), переводит в конец файла.
Также есть функция SeekEoln - переводит в конец строки. Применяется после Seek, для того, чтобы убедиться, что следующее чтение/запись будут производиться из/в следующей(ую) строке(у).

2. С помощью класса TStringList
Тут перемещение происходит по Items[N], где N - номер строки от 0.

3. С помощью потока TStream
Здесь перемещение происходит по функции Seek.

Удачи!
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 19.03.2006, 23:02

Отвечает: sir henry
Здравствуйте, Denton!
Зависит от способа открытия. Если Вы открыли его стандартным для Паскаля способом, через AssignFile, а объявили файловую переменную как текстовый файл (TextFile), в начало вы переместитесь, задав процедуру Reset(). Свободно перемещатся при этом в любую часть файла невозможно, только считывая последовательно строки из файла.
Если объявили как нетипизированый файл, то в начало аналогично, а перемещатся с помощью Seek().
Если Вы открыли файл как поток (TFileStream), то в начало файла - TFileStream.Seek(0, soFromBeginning), а перемещатся - таже функция, но нужно указывать сколько байт смещения от:
soFromBeginning - начала файла,
soFromCurrent - текущей позиции,
soFromEnd - от конца файла.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 20.03.2006, 06:39

Отвечает: Kazakh
Здравствуйте, Denton!
Как можно встать на начало Text файла, если я нахожусь в конце?
-- Закрыть и открыть его.

И вообще как можно по нему перемещаться?
-- 1. readln - читет строку и переходит на следующую
-- 2. read - читет строку, но на следующую не переходит
-- eof и eoln - конец файла и строки соответственно

---------
Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 4-ый класс)
Ответ отправлен: 20.03.2006, 11:25

Отвечает: Ataman N. N.
Здравствуйте, Denton!
Перемещаться по файлу можно с помощью процедуры Seek. Данная процедура описана в справке, также там есть пример использования.
Ответ отправил: Ataman N. N. (статус: 10-ый класс)
Ответ отправлен: 20.03.2006, 16:23


Вопрос № 37.954
Здравствуйте!!! В С++ Builder есть встроенный обработчик исключительных
ситуаций вида try{} catch(...){} который ловит все ошибки, а есть ли
такой же обработчик в Delphi или аналогичный
Отправлен: 19.03.2006, 20:30
Вопрос задал: Rewer8 (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Rewer8!
Естественно.
1-ый способ:
try
{действия}
except
{если произошла ошибка}
end;

2-ой способ:
try
{действия}
finally
{если во время выполнения ошибок не возникло}
end;

---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на DELPHI: Всё для программиста.
ICQ: 286837644
----
Ответ отправлен: 19.03.2006, 20:45

Отвечает: Ujin Antikvar
Здравствуйте, Rewer8!

Конечно есть.

try
{какой-то код}
except
{если в выше описаном коде произошла ошибка}
end;
---------
"Будущее принадлежит тем, кто верен своей мечте" - Элеонора Рузвельт
Ответ отправил: Ujin Antikvar (статус: 6-ой класс)
Ответ отправлен: 19.03.2006, 21:47

Отвечает: Denisss

Здравствуйте, Rewer8!

1. Аналог приведенного Вами обработчика
try
  // Код программы
except
  // Обработчик ошибки
end;


2. Похожий обработчик
try
  // Код программы
finally
  // Сюда происходит переход в двух случаях:
  // 1. Произошла ошибка, тогда будет аналогично except
  // 2. Если ошибка не произошла и в try все прошло удачно

end;


Еще одно отличие обработчиков:
В первом случае, если программист не пожелает, то сообщения об ошибке пользователю выдаваться не будет. Во втором случае, при возникновении ошибки, пользователю будет выдано сообщение о том, что произошла ошибка.

Удачи!
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 19.03.2006, 22:47

Отвечает: Leshiy2006
Здравствуйте, Rewer8!В Дельфи подобная функция try ... except

Ответ отправил: Leshiy2006 (статус: 5-ый класс)
Ответ отправлен: 19.03.2006, 22:59

Отвечает: sir henry
Здравствуйте, Rewer8!
Конечно есть, как же без него. Имеет он двойственный вид:
Try
{Код, в котором может произойти ошибка}
Except
{Код, который выполняется в случае ошибки. Есть много классов исключений и для каждого из возможных можно сделать выбор обработки}
End;
и
Try
{Код, в котором может произойти ошибка}
Finally
{Код, который должен быть выполнен вне зависимости от того, произошла ошибка или нет. Удобно тем, что здесь можно в принудительном порядке позакрывать открытые ресурсы}
End;
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 20.03.2006, 06:43

Отвечает: Kazakh
Здравствуйте, Rewer8!
Есно есть.
Даже два варианта

Try ... except ... end;
и
Try ... finally ... end;
---------
Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 4-ый класс)
Ответ отправлен: 20.03.2006, 11:16

Отвечает: Ataman N. N.
Здравствуйте, Rewer8!
try
{код, который может вызвать исключение}
except //ловим исключение
end;

try
.........
finally
{код, который должен выполниться ОБЯЗАТЕЛЬНО}
end;

Вы можете почитать в справке по данному оператору.
Ответ отправил: Ataman N. N. (статус: 10-ый класс)
Ответ отправлен: 20.03.2006, 16:18


Вопрос № 37.958
Здравствуйте!
Подскажите пожалуйста как осуществить поиск строки в тхт файле. Я нашел на delphiword пример function ScanFile(const FileName: string; const forString: string; caseSensitive: Boolean): Longint; но он как то криво работает. Подскажите какой-нибудь рабочий поиск.
Спасибо.
Отправлен: 19.03.2006, 22:38
Вопрос задал: Yxo (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: sir henry
Здравствуйте, Yxo!
Ну примерно так:
Function SeekText(F: TextFile; st: string): boolean;
{st - текст, который нужно найти в файле F}
var
s: string;
i: integer;
Begin
i:=0;
Reset(F);
While not Eof(F) Do
Begin
ReadLn(F, s);
i:=Pos(st, s);
If i>0 Then
Break;
End;
Result:=i<>0;
End;
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 20.03.2006, 06:50
Оценка за ответ: 4
Комментарий оценки:
Ваш код конешно правильный, но я забыл указать пару вещей, во-первых файлик немаленький около 240000 строчек и во-вторых поиск должен быть чем быстрее тем лучше ;)


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.20 (beta) от 17.03.2006
Яндекс Rambler's Top100

В избранное