Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3

Модерирует : ShIvADeSt

ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
RezchiK
Если я правильно понимаю что у тебя в программе написано, для того чтобы картинка выбиралась комбобоксом для него должен быть написан обработчик OnChange - вот он и вызывается (для случая если комбобокс называется ComboBox1)
 
Maks150988
Код:
var
  st: TSystemTime;
  s1: string;
  s2: string;
  s3: string;
  s: string;
begin
  GetLocalTime(st);
  Str(st.wHour, s1);
  Str(st.wMinute, s2);
  Str(st.wSecond, s3);
  s := s1 + ':' + s2 + ':' + s3;

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 22:36 20-01-2008 | Исправлено: RomanTim, 22:44 20-01-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
да мне не время нужно узнавать, а секундомер запустить. мне тут уже давали пример, однако надо отказаться от использования sysutils в проекте.
 
 
 
потом все-таки отыскал реализацию картинок в меню. в исходном примере блокнота bred окно создается кодом, а я гружу из ресурсов. поэтому видать напутал с хэндлами. менюшка сама прорисовывается в нужных местах, но картинки не грузятся в пункты. пожалуйста посмотрите. >>>
 
Читать дальше..

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 23:54 20-01-2008 | Исправлено: Maks150988, 23:56 20-01-2008
AntonVA1



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну, вот и у меня вопросик появился, бьюсь уже несколько часов- не получается.
Тема для меня новая, поэтому прошу не пинать.
 
Есть функция:
 
function  get_dog_num(const subacct_id: WideString): WideString;
Результат возвращает в кодировке UTF-8
 
Мне нужно прописать ее в dll, делаю так:
 
function get_dog_num (AccNo, UserName, Password:ShortString): ShortString; stdcall;
var
  SoapDM : TdmSoap;
begin
  SoapDM := TdmSoap.Create(nil);
  with SoapDM do
  try
    htSubAcct.HTTPWebNode.UserName := UserName;
    htSubAcct.HTTPWebNode.Password := Password;
    Result:=(htSubAcct as subacctPortType).get_dog_num(AccNo);
  finally
    SoapDM.Free;
  end;
end;
 
Соответственно, в вызывающем приложении делаю так:
 
  function get_dog_num (AccNo, UserName, Password:ShortString): ShortString; stdcall; external 'soapfunc.dll' name 'get_dog_num';
 
{$R *.DFM}
 
procedure TCashRegForm.btnInetCheckPrintClick(Sender: TObject);
var
  AccNo, UserName, Password: ShortString;
begin
  UserName:='123123';
  Password:='123213';
  AccNo:=edtAccNo.Text;
  memResult.Lines.Clear;
  try
    memResult.Lines.Add(strpas(get_dog_num(AccNo, UserName, Password)));
  except
    on E:Exception do memResult.Lines.Add(e.Message);
  end;
 
Получаю Invalid pointer operation. Sharemem использовать нежелательно, при использовании pcchar непонятно как его коонвертировать в WideString и наоборот.
 
У меня уже была целая куча вариантов этого кода, поэтому просто напишите, как надо это сделать, я уже совсем запутался

Всего записей: 474 | Зарегистр. 17-09-2003 | Отправлено: 07:17 21-01-2008
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
AntonVA1
Для WideString есть PWideChar (в С - LPWSTR)
Только есть одно но - если ты вернешь указатель на строку, которая описана как локальная в функции, то прочитать ее не успеешь - область кода где она живет закончилась. Я у себя в дллке модуле объявлял переменную в модуле, писал в нее результат, и возвращал указатель на нее.
Это не совсем красиво и правильно, но если вызывающий код будет у себя сохранять для дальнейшего использования содержимое строки, а не указатель, и не дергать функцию одновременно из нескольких потоков (это можно обойти через threadvar), то работать должно.
 
Maks150988
Блин, а подумать чуть вообще не бывает?
d := ("GetTickCount сейчас" - "GetTickCount раньше") div 1000 - разница времени в секундах
как div и mod дальше использовать тоже разжевать или догадаешься?
 

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 07:48 21-01-2008 | Исправлено: RomanTim, 07:56 21-01-2008
AntonVA1



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim  
Спасибо за ответ, но я туго соображаю в этой части. А как ты бы написал этот код?

Всего записей: 474 | Зарегистр. 17-09-2003 | Отправлено: 08:07 21-01-2008
RezchiK

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
RomanTimу мнея маленько по другому, я в комбобоксе выбираю картинку и жму кнопку просмотра  
procedure TFGall.Button1Click(Sender: TObject);//Просмотр
begin
if
  FGall.ComboBox1.ItemIndex=0
then
  FGall.Image2.Picture.LoadFromFile('1.bmp');
if
  FGall.ComboBox1.ItemIndex=1
then
  FGall.Image2.Picture.LoadFromFile('2.bmp');
end;
procedure TFGall.Button3Click(Sender: TObject);       //Следующий
 begin
if ComboBox1.ItemIndex < ComboBox1.Items.Count - 1
then
  begin
   ComboBox1.ItemIndex := ComboBox1.ItemIndex + 1;
  // ComboBox1.Change(nil); так как компилятор руггается на Change
    end;
end;
 
procedure TFGall.Button4Click(Sender: TObject);  //пердыдущий
begin
  if ComboBox1.ItemIndex > 0 then begin
    ComboBox1.ItemIndex := ComboBox1.ItemIndex - 1;
    //ComboBox1Change(nil); так как компилятор руггается на Change
end;
 end;

Всего записей: 19 | Зарегистр. 19-12-2007 | Отправлено: 08:37 21-01-2008
PavelO

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здраствуйте. Помогите пожалуйста решить такую задачку:
Нужно отобразить на форме все изображения хранящиеся в определенной папке, причем они имеют разные размеры и должны встать так, чтобы использовать свободное пространство по максимуму.
Собственно часть этой задачи я решил без проблемм, осталась одна заморочка: Как использовать свободное место на форме по максимуму?
На данный я создаю массив из изображений, кладу их на форму после выбора директории и если они не влазеют по ширине я прибавляю примерно так: .Top[i]:=.Top[i-1]+.height[i], а .left = 0; Но есть изображения которые меньше текущего(i-изображения) и которые влезут туда по ширине, но они пока не загружены.
 
Добавлено:
Поправка: .Top[i]:=.Top[i-1]+.height[i-1], а .left = 0

Всего записей: 27 | Зарегистр. 19-09-2006 | Отправлено: 12:17 21-01-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
спасибо. просто я ночью уже не сообразил.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 13:31 21-01-2008
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
AntonVA1
В dll-ке делаешь так:
var
  resstr: WideString;
 
function get_dog_num (AccNo, UserName, Password: PWideChar): PWideChar; stdcall;
...
    resstr:=(htSubAcct as subacctPortType).get_dog_num(AccNo);
    Result := PWideChar(resstr);
....
end;  
 
RezchiK
Ну тогда вызывай не ComboBox1Change(nil), а Button1Click(nil) - то есть тот метод, в котором прописана логика отображения картинки в зависимости от состояния комбобокса

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 14:21 21-01-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladk1973

Цитата:
Интересный ответ.  
Однако ты умалчиваешь о размере самих BPL в C:\WINDOWS\SYSTEM32  
Например vcl60.bpl = 1295k  
А без нее твоя чудо программка, даже пустая на 10к - работать не будет  

Тоже интересный ответ. Но ты забываешь об объеме операционной системы и DLL в C:\WINDOWS\SYSTEM32 .
Например shell32.dll = 8471k  
А без неё многие чудо программки неработают, даже если инсталлируются с виндой и никогда не запускаются. Да буде известно что BPL - это DLL с расширенным специфическим ресурсом. Так что если говорить о объеме и стандартах, то на 1 гигабайт Microsoft, по идее можно отвести 10 мегобайт VCL.
 
Естественно, что не на каждом компе имеется, и я раньше думал - ну нестандарт, значит вариант не устраивает. Но идёт жизнь, мои стандартные программули пользую только я сам, а компа где нет vcl60.bpl я не встречал. Так что пересмотри довод Borland я уважаю не меньше чем Microsoft. А вот MFC-шной дряни у меня полно во всех директориях, хотя вроде не пользую.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 14:48 21-01-2008
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
компа где нет vcl60.bpl я не встречал

Представьте себе у меня такой комп. И я готов отказаться почти от любой проги если в дистрибутиве с ней не идут все нужные нестандартные библиотеки. А это значит, что размер дистрибутива все равно должен быть 1305Кб, а не 10Кб. ИМХО использование "Build with runtime pakages" имеет смысл если:
-прога работает с dll в которой тоже есть формы;
-дистрибутив состоит из нескольких экзешников с формами.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 15:20 21-01-2008 | Исправлено: Frodo_Torbins, 15:22 21-01-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
AntonVA1
В общем виде - это не стандарт:

Цитата:
function get_dog_num (AccNo, UserName, Password: PWideChar): PWideChar; stdcall;  

Пролистай файл Windows.pas ты не найдёшь ни одной функции возвращающей PChar или PWideChar. Происходит это потому, что DLL для строки выделяет память сама и другая DLL/EXE выделяет сама. Предсавь DLL выделила память я EXE освободила - это можно только с sharemem и то если версии компилера одинаковые. Так делать нельзя!!!!! Ай-яй-яй.  
 
Делается это всегда так, в Value я даю готовую память для результата:

Код:
 
//В dll которая видит ToolsAPI и возвращает строку с опцией компилятора.
procedure OptionProc(const OptionName, Value: PChar;
  MaxLen: Integer); safecall; //или - не важно stdcall;
var
  S: string;
begin
  if SubrealIDEServices <> nil then
  begin
    S := OptionName; //копирует имя из другого адресного пространства
    S := SubrealIDEServices.CompilerOption(S); //запрашивает интерфейс ToolsAPI
    StrLCopy(Value, PChar(S), MaxLen); //копирует результат в подготовленную память
  end;
end;
 
//вызов из другого процесса
function IDE_CompilerOption(const OptionName: string): string;
var
  Value: array[0..1023] of Char; //подготовим память в стэке,  
                                  //после работы она не нужна
begin
  Result := '';
  FillChar(Value, SizeOf(Value), 0);
  OptionProc(PChar(OptionName), Value, SizeOf(Value)-1);
  Result := PChar(@Value);
end;
 

 
Добавлено:
Frodo_Torbins

Цитата:
И я готов отказаться почти от любой проги  

Ты читать умеешь? Или по диагонали читал? - мои стандартные программули пользую только я сам Если ты прав, то я так понимаю ты будущий мой пользователь? Интересно, какие мои программки тебя интересуют. Я тебе хоть как могу откомпилить. Желание закащика - закон! А пока реального закащика не увижу пусть хоть тыщу раз отказываются, для меня его мнение - это маниакальная фантастика.
 

Цитата:
"Build with runtime pakages" имеет смысл если:  
-прога работает с dll в которой тоже есть формы;  
-дистрибутив состоит из нескольких экзешников с формами.

1. Если DLL с формами, то это тот же BPL, только кто-то явно поленился разобраться с BPL.
2. Несколько экзешников с формами - это не довод. Просто в постах раньше я писал:
Когда я вижу 30Мб у меня вопросов не возникает При чём сдесь экзешники? Ты хочешь разные продукты подвязать под одну версию компилятора? Облом.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 15:33 21-01-2008
vladk1973



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
delover

Цитата:
Тоже интересный ответ. Но ты забываешь об объеме операционной системы и DLL в C:\WINDOWS\SYSTEM32 .
Например shell32.dll = 8471k

Не понял, о чем речь. Человек сокрушался про объем exe, ты присоветовал компилить с опцией "Build with runtime packages", типа размер меньше. Ну ясно, что меньше, да только ему еще эти самые runtime packages придется вместе с маленькой exe носить, тем самым увеличивая совокупный объем инсталлируемого софта. Как в том анекдоте про супер-наручные часы с чемоданом батареек впридачу.
А при чем тут библиотеки операционной системы?
 

Цитата:
Да буде известно что BPL - это DLL с расширенным специфическим ресурсом.

О, великий, поучите меня создавать BPL
 

Цитата:
Так что если говорить о объеме и стандартах, то на 1 гигабайт Microsoft, по идее можно отвести 10 мегобайт VCL.

 

Цитата:
Естественно, что не на каждом компе имеется, и я раньше думал - ну нестандарт, значит вариант не устраивает.
Да все устраивает, мы что тут - спорим? Предмета спора я не вижу. Я сам компилировал большой банковский проект с "Build with runtime packages", ибо один раз инсталлируется на компьютер, записываются BPL, а потом через интернет проект постоянно обновляется - просто заменой маленького EXE и маленьких BPL. Экономится трафик, время и нервы. А для утилит и всякого "мелкого" одноразового софта любые дополнительные библиотеки - зло.
 

Цитата:
Но идёт жизнь, мои стандартные программули пользую только я сам, а компа где нет vcl60.bpl я не встречал.
Я встречал. Поверь - их очень много
 
 

Цитата:
А вот MFC-шной дряни у меня полно во всех директориях, хотя вроде не пользую.
Да, этого добра хватает, не забудь еще runtime библиотеки VB, FoxPro ну и там, по мелочи...
 

Цитата:
Предсавь DLL выделила память я EXE освободила - это можно только с sharemem и то если версии компилера одинаковые. Так делать нельзя!!!!! Ай-яй-яй.

Если вместо DLL использовать как раз BPL, то формально можно, хотя я бы не рекомендовал
 

Цитата:
Делается это всегда так, в Value я даю готовую память для результата

+1.  
Господа, прежде чем программить и спрашивать, "как?", может почитаем исходники Delphi, или хотя бы подумаем, почему так "забавно" декларированы функции WinApi?

Всего записей: 674 | Зарегистр. 23-03-2005 | Отправлено: 16:20 21-01-2008 | Исправлено: vladk1973, 16:42 21-01-2008
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
delover
Так я сразу написал, что это не совсем красиво и правильно, и потенциальное место для возникновения проблемы, и тем не менее при соблюдении определенных условий работает.
А совершенству предела вообще не бывает и вылизывать и причесывать можно до бесконечности, вопрос в целесообразности

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 16:39 21-01-2008 | Исправлено: RomanTim, 16:40 21-01-2008
lavren



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто нибуть может порекомендовать компонент для импорта даных с приложения в XLS-файл (Exel), но чтобы и OpenOffice 2.2 смог этот файл открыть нормально без кряказябликов!

Всего записей: 545 | Зарегистр. 29-05-2007 | Отправлено: 17:51 21-01-2008
RezchiK

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
RomanTim, спсибо за совет, всё получилось      

Всего записей: 19 | Зарегистр. 19-12-2007 | Отправлено: 17:56 21-01-2008
RezchiK

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Теперь в БД столкнулся с таким косяком-запись из поля memo в DBGird

Цитата:
if Memo1.Lines.Count>0 then
begin
TBlodField(DataModule1.TableGlavn_1.Fields[8]).BlodType:=ftMemo
TBlodField(DataModule1.TableGlavn_1.Fields[8]).Assign(Memo1.Lines);
end;

ругается комнилятор на не объявленный TBlodField, чем его объявить если не секрет)))

Всего записей: 19 | Зарегистр. 19-12-2007 | Отправлено: 03:37 22-01-2008
Tantos



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RezchiK, TBlobField.

Всего записей: 1038 | Зарегистр. 31-05-2005 | Отправлено: 04:00 22-01-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladk1973

Цитата:
Да все устраивает, мы что тут - спорим? Предмета спора я не вижу. Я сам компилировал большой банковский проект с "Build with runtime packages", ибо один раз инсталлируется на компьютер, записываются BPL, а потом через интернет проект постоянно обновляется - просто заменой маленького EXE и маленьких BPL. Экономится трафик, время и нервы. А для утилит и всякого "мелкого" одноразового софта любые дополнительные библиотеки - зло.

+1
Сиё основное, и бесспорно. Были выше рассуждения про целеобразность BPL, с радостью процитировал, так как лучше не скажешь.
 

Цитата:
Цитата:Но идёт жизнь, мои стандартные программули пользую только я сам, а компа где нет vcl60.bpl я не встречал.  
Я встречал. Поверь - их очень много

Мы тут не  спорим. Прочитай внимательно, но я поясню про какие компьютеры говорю. Я имею ввиду компьютеры с которыми сам реально имею дело. Это мой рабочий компьютер и мой домашний. На компы сослуживцев не лезу - дело администратора.  Когда помогаю знакомым - им нужно установить Файн Райдер, это далеко не мои маленькие проги. Поверь о великий учитель я тоже предполагаю, что такие компьютеры есть. Давай отделим мух от котлет. Те компьютеры которые без BPL по жизни нуждаются в твоих программах? Ты эту галочку не используешь потому, что хочешь обязательно установить свою прогу куда ни попадя? Или ты всё таки слышал такое слово ЗАКАЗЧИК?
 

Цитата:
Цитата:Да буде известно что BPL - это DLL с расширенным специфическим ресурсом.  
 
О, великий, поучите меня создавать BPL  

Я делал BPL которым не нужно даже VCL/RTL и они были взаимосвязаны. Это ничем не отличается от DLL, только появляются свои прелести. Поучить?
 

Цитата:
Не понял, о чем речь. Человек сокрушался про объем exe

Речь про то, что чел пишет на API, и как основное приемущество приводит размер exe. Так я и объясняю что это "приемущество" достигается одной галочкой. А всю суть ты сам сказал в начале поста. Можно только добавить - если Вы делаете EXE без использования BPL, то совершенно очевидно, что Вам без опасения можно использовать Anti DeDe. Чтобы всякие ламеры не могли преспокойно взламывать Вашу прогу. Я так понимаю - почти все не используют BPL и не разу не слышал что кому то надо Anti DeDe. Чтобы не быть пустомелей, пожалуйте Anti DeDe UnDebug: накрапал за вечер undeb32.dpr
Согласись в тексте объём программы ещё меньше?

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 14:23 22-01-2008 | Исправлено: delover, 16:33 03-03-2008
RezchiK

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Может кто знает как сделать вот такую хитрожёлтую вещь:
У меня в табилце первое поле, это "номер заказа"всё вводится вот таким макаром:

Цитата:
procedure TFZakaz.Button2Click(Sender: TObject);
begin
// добавляем пустую запись в набор Glavn
DataModule1.TableGlavn1.Insert;
DBGrid1.Fields[0].AsInteger;
DataModule1.TableGlavn1.Fields[1].AsInteger:=StrToInt(Edit1.Text); // номер заказа
DataModule1.TableGlavn1.Fields[2].AsString:=Edit2.Text; // заказчик
DataModule1.TableGlavn1.Fields[3].AsString:=Edit3.Text; // Адрес
DataModule1.TableGlavn1.Fields[4].AsDateTime:=StrToDateTime(MaskEdit1.Text);// дата заказа
DataModule1.TableGlavn1.Fields[5].AsDateTime:=StrToDateTime(MaskEdit2.Text);// дата изготовления
DataModule1.TableGlavn1.Fields[6].AsInteger:=StrToInt(Edit4.Text); // стоимость
DataModule1.TableGlavn1.Fields[7].AsString:=Edit5.Text; // название изделия
DataModule1.TableGlavn1.Fields[8].AsString:=Edit6.Text;
DataModule1.TableGlavn1.Fields[9].AsString:=label11.Caption;
DataModule1.TableGlavn1.Fields[10].AsString:=label12.Caption;
edit1.Clear;
edit2.Clear;
edit3.Clear;
MaskEdit1.Clear;
MaskEdit2.Clear;
edit4.Clear;
edit5.Clear;
edit6.Clear;
label11.Caption:='';
label12.Caption:='';
end;

 
 
как мне сделать чтоб при последующем заполнении поля "номер заказа" он выдал  масагу мол так и так, вообщем такой номер уже есть))), если запись с таким"номером заказа" уже имеется...
 
И вот такой ещё квейшенс...как это можно сделать: я задаю номер заказа и прога выдаёт мне всё по этому заказу(нужно для печати). Зарание благодарю    

Всего записей: 19 | Зарегистр. 19-12-2007 | Отправлено: 17:09 22-01-2008 | Исправлено: RezchiK, 17:54 22-01-2008
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3
ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru