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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Фаронов Архангельский Тейксейра
    там есть предметный указатель, можно незнакомые слова по указателю смотреть

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 15:28 22-08-2012
    A_V

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    ИМХО, в общем случае, нельзя  (ну если не скрывать предварительно дочерние окна ) ).
    вообще странный подход, ты хочешь, что-бы, к примеру, Label отрисовался, а StaticText - нет..

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 15:54 22-08-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот только запостил вопрос сразу нашелся ответ, хотя ковырялся три недели переставляя переменные.
    Ответ, может кому-то пригодится:
    После CallWindowProc нужно поставить ещё один CallWindowProc, но только вместо проецирования на нужный контрол проецировать в память:
     
    CallWindowProc(OldNotifyWndProc, hNotifyWnd, WM_PRINTCLIENT, hMemoryDC, PRF_ERASEBKGND or PRF_CLIENT);
     
    Вот только образовался странный косяк. Хотя я и смещаю начало координат функцией SetWindowOrgEx по X и Y и на нужном контроле нормально рисуется фон родителя, то при проецировании в память смещения по Y почему-то не происходит...
     
    Добавлено:
    A_V
    Пока писал и ты ответил...
    Если быть честным, я делая для себя программку, которая рисует свои часы вместо стандартных в трее со всеми вытекающими...
    Сделать свою прозрачную картинку и наложить её на очищенные от текста системные часы не получилось, поэтому решил забрать фон под часами, нарисовать на нём и всё это нарисовать на часах. А у меня всё время получалось наложение новой картинки на старую, хотя я как-бы старую стирал... Наверное стёрка была китайская, вот и не стирала...
    Достаточно посмотреть на компонент TrayClock, который есть в нашем варезнике и станет понятен принцип.
     
    Спасибо.

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 17:46 22-08-2012 | Исправлено: Aleksandr N, 18:00 22-08-2012
    vladok_7

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    люди объясните плизз как это понять! (я новичок)
     
    Глобальные переменные объявляютсю в секции INTERFACE МОДУЛЯ. Локаляные- в ПРОЦЕДУРАХ И ФУНКЦИЯХ.

    Всего записей: 5 | Зарегистр. 02-02-2011 | Отправлено: 21:54 22-08-2012 | Исправлено: vladok_7, 21:56 22-08-2012
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vladok_7
    Модуль (unit) делется на две части, первая начинается словом interface, а вторая словом implementation.
    Все переменные, константы, типы, объекты и т.д. находящиеся после слова interface и до слова implementation можно использовать как и в том модуле где они объявлены/, так и в других модулях.
    Все переменные, константы, типы, объекты и т.д. находящиеся после слова implementation можно использовать только в том модуле где они объявлены. Например Pi, a, b, с можно использовать в модуле MyUnit1 и в модуле MyUnit2, а вот Eps, x, y, z можно использовать только в модуле MyUnit1.
    Дла того чтобв в модуле MyUnit2 можно было импользовать переменные, константы, типы, ... из другого модуля нужно дать прописать в секции uses название модуля который будем использовать, в примере это MyUnit1.

    Код:
     
    ---- файл MyUnit1.pas
    unit MyUnit1;
     
    interface
    const
      Pi = 3.14;
    var
      a, b, c: Integer;
     
    implementation
    const
      Eps = 0.001;
    var
      x, y, z: Integer;
     
    end.
     
    ---- файл MyUnit2.pas
    unit MyUnit2;
    uses
      MyUnit1;
     
    implementation
      ...
      ...
      a := Pi; <--- правильно
      x := 0;  <--- ошибка
     
    end.
     

    А теперь самое главное - прочти любой учебник с примерами. И привыкай искать, читать, разбераться - это существенная и постоянная часть работы програмиста.

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 22:17 22-08-2012
    Wahnsinn



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    vladok_7
    Если погуглить за тебя
    Глобальные переменные — это переменные, объявленные за пределами функции или процедуры.
    Глобальные переменные создаются во время запуска приложения, существуют, пока оно выполняется, и уничтожаются по завершении его работы. Эти переменные не только доступны в течение всего времени работы приложения, но и являются общедоступными.  
    Любая создаваемая процедура или функция может обращаться к общедоступным переменным. Единственное исключение из этого правила — глобальная переменная, объявленная в разделе реализации модуля. В этом случае переменная остается глобальной, но доступна только в том модуле, в котором она объявлена.
    Примеры

    Код:
     
    unit Unit1;  
    interface
    var
    s: string; { global variable that can be used in other units }
    implementation
    var
    i: Integer; { global variable, but can only be used in this unit }
    end.
     

    Локальные переменные — это переменные, которые объявлены в процедуре или функции. Объявление локальной переменной выглядит подобно показанному ниже:

    Код:
     
    procedure ИмяПроцедуры; var
    локальнаяПеременная_1:  ТипДанных;
    локальнаяПеременная_n:   ТипДанных;  
    begin
     
    end;
     

    Локальные переменные существенно отличаются от глобальных. Локальные переменные существуют только в течение короткого периода времени. Они создаются при вызове процедуры или функции и уничтожаются немедленно по завершении ее выполнения. Локальные переменные могут использоваться только в процедуре или функции, в которой они объявлены. В отличие от глобальных переменных, локальные переменные не инициализируются компилятором автоматически, и они не могут быть инициализированы во время объявления. Их всегда нужно инициализировать вручную в теле процедуры до их использования, поскольку до инициализации они содержат случайные значения.

    Всего записей: 129 | Зарегистр. 20-01-2007 | Отправлено: 22:22 22-08-2012 | Исправлено: Wahnsinn, 22:23 22-08-2012
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да, забыл
    Переменные и константы написаные после слова procedure или function и словом  begin можно использовать только в этой процедуре, тоесть между первым begin процедуры и соответствубщему ему end.

    Код:
     
    procedure MyProc;
    var
      i, N, Q: Integer;
    begin
       ...
       Q := 4;  <--- правильно
       ...
       for i := 0 to N do  
         begin
            Q := Q+2; <--- правильно
         end;
    end;
     
       Q := 0;  <--- неправильно
     

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 22:24 22-08-2012
    Aleksandr N

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

    Цитата:
    Вот только образовался странный косяк. Хотя я и смещаю начало координат функцией SetWindowOrgEx по X и Y и на нужном контроле нормально рисуется фон родителя, то при проецировании в память смещения по Y почему-то не происходит...  

    Продолжу свой ответ для информации.
    Функцией SetWindowOrgEx  я сместил координаты для контрола, а для отображения в памяти - не подумал. Нужно добавить перед вызовом CallWindowProc:
     
    SetWindowOrgEx(hMemoryDC, DeltaPosX, GetWindowSize(hNotifyWnd) - GetWindowSize(h_Wnd), nil);
     
    Ещё раз всем спасибо.

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 22:45 22-08-2012 | Исправлено: Aleksandr N, 22:46 22-08-2012
    vladok_7

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    спасибо те  V1s1ter огромное!
    Wahnsinn тебе тоже спасибо!

    Всего записей: 5 | Зарегистр. 02-02-2011 | Отправлено: 22:52 22-08-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vladok_7
    Какую то очень неудачную книгу вы себе выбрали. Поищите в интернете книжки, о которых много положительных отзывов, можно даже времен делфи 5. Когда подберете себе парочку таких книжек, можно будет поискать их на развалах б/у книг, или распечатать.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 11:47 23-08-2012
    Maks150988



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

    Цитата:
    Потому что обычно  ф-ии (lstrcpyn) принимают кол-во символов, а не размер в байтах

    А, точно, забыл. Изначально я вобще использовал CopyMemory. Там как раз количество байт надо указывать.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 15:58 25-08-2012
    Dimrix



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Курил гугль несколько дней, но не получилось найти толкового решения "програмной" установки драйверов из програмки на Делфи. Задача следующая: девайс со встроенной флехой. При подключении флеха находится самой последней. На ней и будет находится моя програмка. Необходимо поставить драйвера и заставить винду "обновить" драйвер на устройство. Находил несколько вариантов, но везде были но:
    1. Было предложение "запуска" инфа-файла драйвера, но может они и ставятся, но при "втыкивании" устройства оно не определяется системойнаходится.
    2. Перекачал несколько программ по бекапу/восстановлению драйверов: но при восстановлении везде выпадают диалоги с кнопками и прочей фигней, а хочется что бы автоматом ставились с наименьшими вмешательствами пользователя. Перехватывать окна и нажимать кнопки - не красиво (хотя это пока единственный вариант).
     
    P.S. По гуглив ещё чуток, нарыл информацию о некой библиотеке виндовс difxapi.dll в которой есть функции DriverPackageInstall/DriverPackageUninstall, но реализации нашёл только под Си. Попробовал сам перевести, но толи я хреновый "переводчик", толи где то ошибку сделал в вызове функции. Код:
     
    const
      DifxApiModuleName = 'DIFxAPI.DLL';
    const
      DRIVER_PACKAGE_FORCE        = $00000004;
      DRIVER_PACKAGE_LEGACY_MODE  = $00000010;
    type
      PCINSTALLERINFO_W = ^PCINSTALLERINFO_W;
      INSTALLERINFO_W = packed record
        pApplicationId, pDisplayName, pProductName, pMfgName: PAnsiChar;
      end;
      TPCINSTALLERINFO_W = INSTALLERINFO_W;
    function DriverPackageInstall(DriverPackageInfPath: PAnsiChar; Flags: DWORD;
      pInstallerInfo: PCINSTALLERINFO_W; pNeedReboot: Boolean): DWORD; stdcall; external DifxApiModuleName
       name 'DriverPackageInstall';
    Это из:
    define DRIVER_PACKAGE_FORCE                            0x00000004
    define DRIVER_PACKAGE_LEGACY_MODE                      0x00000010
     
    typedef struct
    {
        PWSTR pApplicationId;
        PWSTR pDisplayName;
        PWSTR pProductName;
        PWSTR pMfgName;
    } INSTALLERINFO_W, * PINSTALLERINFO_W;
     
    typedef const PINSTALLERINFO_W PCINSTALLERINFO_W;
     
    WINDIFXAPI
    DWORD
    WINAPI
    DriverPackageInstallW(  
         PCWSTR DriverPackageInfPath,  
         DWORD Flags,
         PCINSTALLERINFO_W pInstallerInfo,
         BOOL * pNeedReboot  
        );
    Ну и вызывал так:
     
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    const
      lqrInfFile: String = 'cm_mdm.inf';
    var
      NR: Boolean;
      Res: DWORD;
    begin
      Res := DriverPackageInstall (PChar (lqrInfFile), DRIVER_PACKAGE_FORCE or DRIVER_PACKAGE_LEGACY_MODE, nil, NR);
      if (Res <> 0) then
     
    end;
    end;
    Возвращает Res=2, что означает файл не найден. (Файл лежит в папке с програмкой, пробовал указать полный путь - таже фигня).

    Всего записей: 61 | Зарегистр. 04-04-2004 | Отправлено: 19:19 26-08-2012 | Исправлено: Dimrix, 04:22 27-08-2012
    Dimrix



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Вопрос снимается ввиду самостоятельного решения. Кому интересно - пишите в ПМ поделюсь...

    Всего записей: 61 | Зарегистр. 04-04-2004 | Отправлено: 15:37 27-08-2012
    shadow user777



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уххх, почитал страницы темы, аж дух захватывает и зависть берёт.
    Мне бы такие познания в этой области .... К сожалению таковыми не обладаю, и по специальности очень далёк от программирования.
    Хочу попросить помощи. Мне кажется что задача которая у меня нарисовалась, для человека имеющего навыки весьма проста, но для меня она из области сверхъестественного.
    Нужна обычная длл под Windows.
    1. Ищем процесс в памяти по имени (LoginUS.exe)
    2. Получаем название родительского процесса (Run.exe)
    3. Если родительский процесс другой - завершаем работу процесса LoginUS.exe(закрывает)  
    4. Если родительский процесс соответствует (Run.exe), то получаем путь родительского процесса.
    5. Вычисляем хэш родительского процесса и сравниваем с эталонным хэшем (эталонный хранится в коде dll).
    6. Если хэш совпадает - ничего не делать (или повторить проверку через 3-5 минут). Если хэш не совпадает - завершает работу процесса LoginUS.exe (закрывает)
     
    Дополнительно.
    Как вариант, эталонный хэш берется из файла расположенного на удаленном веб-сервере.
     
    Прошу сильно не пинать что вот так напрямую обратился за изготовлением, но других вариантов кроме как кинуть клич о помощи я не нашел.

    Всего записей: 1449 | Зарегистр. 31-07-2005 | Отправлено: 16:00 27-08-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть стандартная задача - не допустить запуска второй копии программы и её реализация, которую можно найти на любом сайте:
     
    function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; stdcall;
    begin
      Result := 0;
      if Msg <> MessageID then
       Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
    end;
     
    function InitInstance: Boolean;
    var BSMRecipients: DWORD;
    begin
      WProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)));
      if WProc = nil then
       begin
        Result := False;
        Exit;
       end;
      MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);
      if MutHandle = 0 then
       begin
        Result := True;
        MutHandle := CreateMutex(nil, False, UniqueAppStr);
        if MutHandle = 0 then
         Result := False;
       end
      else
       begin
        BSMRecipients := BSM_APPLICATIONS;
        BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE, @BSMRecipients, MessageID, MI_QUERYWINDOWHANDLE, Application.Handle);
        Application.ProcessMessages;
        Result := False;
       end;
    end;
     
    Если одна копия уже запущена и вручную запускать вторую - всё нормально, запус не происходит. Но я поставил программу в автозагрузку. По непонятной причине Виндовс дважды пытается запустить программу. В этом случае, примерно в 80% происходит запуск второй копии программы.
     
    Что в этом коде может быть не так/не дописано? Как 100% не допустить вторую копию?
    (В интернете видел кучу способов - либо слишком простые, либо не подходят, либо глючные)

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 17:59 27-08-2012
    MrZeRo



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    непонятно зачем так много кода, в частности BroadcastSystemMessage, переопределение оконной функции и т.д.
    Вот тут достаточно толково написано и в коде ничего лишнего:
    хттп://www.delphimaster.ru/articles/limit.html

    ----------
    ... не это главное ...

    Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 18:35 27-08-2012 | Исправлено: MrZeRo, 18:36 27-08-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MrZeRo
    Ну не знаю, считаю что просто CreateMutex - это слишком просто, а, по моему, про CreateSemaphore слышал, что если что пойдёт не так семафор остается в памяти и поможет только перезагрузка.
     
    Добавлено:
    К таму-же в не зависимости от BroadcastSystemMessage проверки на CreateMutex в моём коде ведёт себя неадекватно.
     
    Может ещё кто-нибудь что-нибудь подскажет?

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 18:51 27-08-2012 | Исправлено: Aleksandr N, 20:55 27-08-2012
    shadow user777



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Найденные в инете сорцы:
    Вычисление хэш МД5 файла.
    http://pastebin.com/ESDT6eEm
    Определение родительского процесса.
    http://pastebin.com/0cgcp1sk
     
    Это я что бы облегчить труд того, кто может быть возьмется сделать мою просьбу.

    Всего записей: 1449 | Зарегистр. 31-07-2005 | Отправлено: 22:01 27-08-2012
    MrZeRo



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    Удивительные у вас сведения про CreateSemaphore, если это правда (хотя бы на треть), то нужно просто-таки запретить всем пользоваться этой функцией, вычеркнуть ее из документации и навсегда забыть и книжки с ее упоминанием, в частности Рихтера "Windows для профессионалов" предать анафеме во веки веков.
    Можно ли узнать, в чем "неадекватность" кода основанного на CreateMutex (не тот путаный, что вы привели, а тот короткий и внятный, который опубликован по ссылке, которую я дал выше) и чем конкретно не устраивает этот подход? Если он простой, то еще не значит, что нерабочий, у меня подобный код прекрасно работал.
    Есть другие подходы, но они хуже. Например, если приложение имеет главное окно, то можно при помощи FindWindow найти, существует ли такое окно и если да, то считать, что приложение уже запущено - реализация простая, но есть недостатки: медленно и не очень надежно.
    Можно еще попытаться поискать по имени процесса через EnumProcesses, но тут нужны права админа на машине, иначе вы не увидите процесс (вашу программу), запущенный другим пользователем, пример тут: хттп://www.delphisources.ru/pages/faq/base/get_active_apps.html (этот не проверял, но идея понятна).


    ----------
    ... не это главное ...

    Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 23:02 27-08-2012
    Aleksandr N

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

    Цитата:
    Удивительные у вас сведения про CreateSemaphore

    Я просто где-то читал, не утверждаю, что испытал на своей шкуре.
    Возможно без лишнего кода CreateMutex сработает, проверю - отпишусь. Просто мне показалось что это слишком просто.
    Поиск процесса знаю - не подходит, по окну - принципиально не подходит.

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 23:17 27-08-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru