• Что не так в этом классе?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Согласен с другими ответчиками, это не совсем ООП. Лишь один принцип ООП используется - класс и то как просто namespace.
    Вот примерно как ООП и VK API в Delphi:

    Класс - группировка для методов Auth

    TAuth = class(TVKEntity)
        /// <summary>
        /// Проверяет правильность введённого номера (возможность его использования для регистрации или авторизации).
        /// </summary>
        /// <param name="Phone">номер телефона регистрируемого пользователя</param>
        /// <param name="ClientId">идентификатор Вашего приложения</param>
        /// <param name="ClientSecret">секретный ключ приложения, доступный в разделе редактирования приложения</param>
        /// <param name="AuthByPhone">True — проверить правильность номера для авторизации,
        ///                           а не для регистрации нового аккаунта. По умолчанию: False.</param>
        function CheckPhone(Phone: string; ClientId, ClientSecret: string; AuthByPhone: Boolean = False): Boolean; overload;
        /// <summary>
        /// Проверяет правильность введённого номера (возможность его использования для регистрации или авторизации).
        /// С указанием текущих данных приложения ClientId и ClientSecret
        /// </summary>
        /// <param name="Phone">номер телефона регистрируемого пользователя</param>
        /// <param name="AuthByPhone">True — проверить правильность номера для авторизации,
        ///                           а не для регистрации нового аккаунта. По умолчанию: False.</param>
        function CheckPhone(Phone: string; AuthByPhone: Boolean = False): Boolean; overload;
        /// <summary>
        /// https://vk.com/dev/auth.restore
        /// </summary>
        function Restore(Phone, LastName: string): TResponse;
      end;


    Класс - асинхронный обработчик запросов

    TVKHandler = class
        const
          RequestLimit = 3; //Round(1000 / 3) + 10; //задержка между запросами 3 запроса в секунду + 10 мс страховка
      private
        FStartRequest: Cardinal;
        FRequests: Integer;
        FRESTClient: TRESTClient;
        FOnConfirm: TOnConfirm;
        FOnError: TOnVKError;
        FOnLog: TOnLog;
        FUseServiceKeyOnly: Boolean;
        FOwner: TObject;
        FOnCaptcha: TOnCaptcha;
        function DoConfirm(Answer: string): Boolean;
        procedure ProcError(Code: Integer; Text: string = ''); overload;
        procedure ProcError(E: Exception); overload;
        procedure ProcError(Msg: string); overload;
        procedure SetOnConfirm(const Value: TOnConfirm);
        procedure SetOnError(const Value: TOnVKError);
        procedure FLog(const Value: string);
        procedure SetOnLog(const Value: TOnLog);
        procedure SetUseServiceKeyOnly(const Value: Boolean);
        procedure SetOwner(const Value: TObject);
        procedure SetOnCaptcha(const Value: TOnCaptcha);
      public
        constructor Create(AOwner: TObject);
        destructor Destroy; override;
        function AskCaptcha(Sender: TObject; const CaptchaImg: string; var Answer: string): Boolean;
        function Execute(Request: string; Params: TParams): TResponse; overload;
        function Execute(Request: string; Param: TParam): TResponse; overload;
        function Execute(Request: string): TResponse; overload;
        function Execute(Request: TRESTRequest; FreeRequset: Boolean = False): TResponse; overload;
        property RESTClient: TRESTClient read FRESTClient;
        property OnConfirm: TOnConfirm read FOnConfirm write SetOnConfirm;
        property OnCaptcha: TOnCaptcha read FOnCaptcha write SetOnCaptcha;
        property OnError: TOnVKError read FOnError write SetOnError;
        property OnLog: TOnLog read FOnLog write SetOnLog;
        property UseServiceKeyOnly: Boolean read FUseServiceKeyOnly write SetUseServiceKeyOnly;
        property Owner: TObject read FOwner write SetOwner;
      end;


    Класс - LongPoll сервера, работающий в отдельном потоке

    TLongPollServer = class
       ...
        function Start: Boolean;
        procedure Stop;
        constructor Create; overload;
        constructor Create(AClient: TRESTClient; AMethod: string; AParams: TParams); overload;
        destructor Destroy; override;
        property OnError: TOnVKError read FOnError write SetOnError;
        property Interval: Integer read FInterval write SetInterval;
        property GroupID: string read FGroupID write SetGroupID;
        property OnUpdate: TOnLongPollServerUpdate read FOnUpdate write SetOnUpdate;
        property Client: TCustomRESTClient read GetClient write SetClient;
        property Method: string read FMethod write SetMethod;
        property Params: TParams read FParams write SetParams;
      end;


    Основной класс - невизуальный компонент для разработчиков

    TCustomVK = class(TComponent)
      private
        FOAuth2Authenticator: TOAuth2Authenticator;
        FOnLogin: TOnLogin;
        FPermissionsList: TPermissions;
        FGroupLongPollServers: TGroupLongPollServers;
        FAuthForm: TFormOAuth2;
        FAppID: string;
        FAppKey: string;
        FEndPoint: string;
        FHandler: TVKHandler;
        FBaseURL: string;
        FAPIVersion: string;
        FAccount: TAccount;
        FAuth: TAuth;
        FServiceKey: string;
        FUseServiceKeyOnly: Boolean;
        FIsLogin: Boolean;
        FOnError: TOnVKError;
        FOnLog: TOnLog;
        FOnErrorLogin: TOnVKError;
        FChangePasswordHash: string;
        FUsers: TUsers;
        FOnCaptcha: TOnCaptcha;
        FOnConfirm: TOnConfirm;
        FOnAuth: TOnAuth;
        function GetPermissions: string;
        procedure FAskCaptcha(Sender: TObject; const CaptchaImg: string; var Answer: string);
        procedure FAfterRedirect(const AURL: string; var DoCloseWebView: boolean);
        procedure FAuthError(const AURL: string; AStatusCode: Integer; var Cancel: WordBool);
        procedure FLog(Sender: TObject; const Value: string);
        procedure FVKError(Sender: TObject; Code: Integer; Text: string);
        procedure SetOnLogin(const Value: TOnLogin);
        procedure SetPermissionsList(const Value: TPermissions);
        procedure DoLogin;
        procedure SetAppID(const Value: string);
        procedure SetAppKey(const Value: string);
        procedure SetEndPoint(const Value: string);
        procedure SetPermissions(const Value: string);
        procedure SetHandler(const Value: TVKHandler);
        procedure SetBaseURL(const Value: string);
        procedure SetAPIVersion(const Value: string);
        procedure SetServiceKey(const Value: string);
        procedure SetUseServiceKeyOnly(const Value: Boolean);
        procedure SetOnError(const Value: TOnVKError);
        procedure SetOnLog(const Value: TOnLog);
        procedure SetOnErrorLogin(const Value: TOnVKError);
        procedure SetOnCaptcha(const Value: TOnCaptcha);
        procedure SetOnConfirm(const Value: TOnConfirm);
        procedure SetOnAuth(const Value: TOnAuth);
        procedure DoAuth(const AURL: string);
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure DoLog(Sender: TObject; Text: string);
        procedure Login(AParentWindow: TWinControl = nil);
        procedure CallMethod(MethodName: string; Params: TParams; Callback: TCallMethodCallback = nil);
        procedure GroupLongPollServerStart(GroupID: string);
        procedure GroupLongPollServerStop(GroupID: string);
        /// <summary>
        /// Универсальный метод, который позволяет запускать последовательность других методов, сохраняя и фильтруя промежуточные результаты.
        /// https://vk.com/dev/execute
        /// </summary>
        /// <param name="Code">код алгоритма в VKScript - формате, похожем на JavaSсript или ActionScript (предполагается совместимость с ECMAScript). Алгоритм должен завершаться командой return %выражение%. Операторы должны быть разделены точкой с запятой. </param>
        function Execute(Code: string): TResponse;
        property PermissionsList: TPermissions read FPermissionsList write SetPermissionsList;
        //Группы методов
        property Account: TAccount read FAccount;
        property Auth: TAuth read FAuth;
        property Users: TUsers read FUsers;
        //
        property AppID: string read FAppID write SetAppID;
        property AppKey: string read FAppKey write SetAppKey;
        property EndPoint: string read FEndPoint write SetEndPoint;
        property Permissions: string read GetPermissions write SetPermissions;
        property Handler: TVKHandler read FHandler write SetHandler;
        property APIVersion: string read FAPIVersion write SetAPIVersion;
        property BaseURL: string read FBaseURL write SetBaseURL;
        property ServiceKey: string read FServiceKey write SetServiceKey;
        property UseServiceKeyOnly: Boolean read FUseServiceKeyOnly write SetUseServiceKeyOnly;
        property IsLogin: Boolean read FIsLogin;
        property ChangePasswordHash: string read FChangePasswordHash;
        //
        property OnLogin: TOnLogin read FOnLogin write SetOnLogin;
        property OnError: TOnVKError read FOnError write SetOnError;
        property OnErrorLogin: TOnVKError read FOnErrorLogin write SetOnErrorLogin;
        property OnLog: TOnLog read FOnLog write SetOnLog;
        property OnCaptcha: TOnCaptcha read FOnCaptcha write SetOnCaptcha;
        property OnConfirm: TOnConfirm read FOnConfirm write SetOnConfirm;
        property OnAuth: TOnAuth read FOnAuth write SetOnAuth;
      end;


    И конечно, все представления и структуры в виде классов

    5e1c425e0b2f5671276122.png

    Ну и вот работа такого класса в designtime

    5e1c404cea6dd998958891.png

    И код равный твоему

    5e1c446dea3d6273622206.png

    Конечно не образец идеального кода... Но что есть
    Ответ написан
    Комментировать
  • Как устранить ошибку windows?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Исправить ты вероятнее всего не сможешь. Но вот ход действий, которые помогут решить:
    1. Проверить жесткий диск "Викторией" из под загрузчика (например, сборка hiren's);
    2. Если всё ок, то необходимо восстановить загрузочную область на диске (инструкцию в много много строк можно найти в первой же ссылке в гугле. Нужно будет пользоваться командной строкой в режиме восстановления)
    Готово.
    Ответ написан
    Комментировать
  • Черный экран и ошибка "перезапустить драйвера видеокарты" как это сделать?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    У тебя вылазит уведомление об уже совершившемся действии. О перезагрузке драйвера видеокарты, т.к. он перестал отвечать. Я так полагаю, у тебя ATI? Переустанови драйвера.
    Ответ написан
  • Как можно диск ужать?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Сделай дефрагментацию диска. Все данные упадут в начало диска. После, попробуй ещё раз стандартными средствами ужать диск.
    Ответ написан
  • Как развиваться дальше самостоятельно?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Знание синтаксиса - это ни что, по сравнению с тем, что нужно знать, чтобы создавать что-либо нужное хоть кому-то. Большую часть из того, что ты перечислил ты знаешь только как название и сферу применения, но не использовал в рабочих проектах. А это уже не навык, а лишь небольшое поверхностное знание.
    Не думал, почему именно не берут на полный раб. день? Потому что пользы от тебя будет как с козла молока. Тебя придётся обучать конкретным вещам, которым ты бы обучился самостоятельно параллельно обучению в ВУЗе или профильном училище.
    Иди учись, ищи параллельно подработки для получения опыта, но не в ущерб обучению. Общие знания тоже важны. Общая грамотность ценится.
    Ответ написан
    Комментировать
  • Как я могу посмотреть историю браузера с другого аккаунта Windows 10?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Данные, относящиеся к конкретному пользователю хранятся в каталоге пользователя. По умолчанию в "C:\Users\<имя пользователя>". Каждая программа, которая позволяет сохранять данные хранит их как захочет и разграничивает их как захочет, но есть и стандарты. Рекомендуется сохранять в AppData - каталог, который находится там же в каталоге пользователя, но он скрыт. В нём все программы должны хранить локальные данные пользователя.

    Реестр пользователя находится тоже в этом же каталоге. Называется он ntuser.dat.

    Прочесть историю чужого браузера ты сможешь, скопировав данные браузера из AppData в свой каталог и заменив их. Но это не всегда работает.
    5e14ad6237f29578113650.png
    Ответ написан
    3 комментария
  • Как понять, что в ноутбук можно вставить второй диск?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    В твой ноут вставить второй диск нельзя. Т.к. там даже первого диска нет. Там используется SSD в M2.
    csm_MG_7028_aa08917586.jpg
    Следовательно купи ещё один такой SSD и вставляй, вон рядом есть ещё разъём.

    А по поводу общего вопроса. Если в ноуте есть привод компакт дисков, то его можно заменить на hdd, путём покупки такого держателя.
    spoiler
    maxresdefault.jpg
    Ответ написан
    8 комментариев
  • Простая программа в Pascal выдаёт ошибку; что делать?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Массивы не выводятся напрямую. Выводи через цикл.
    for i:= 0 to 8 do
    begin
     write(m[i], ', ');
    end;
    Ответ написан
    Комментировать
  • Как поместить в sqlite запрос переменную?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    :
    sqlCommand.CommandText = "SELECT ID FROM :category";
    sqlCommand.CommandType = CommandType.Text;
    sqlCommand.Parameters["name"].Value = category;


    Так стоп, что? Название таблицы?
    А че, просто конкатенация тебя не устраивает?
    sqlCommand.CommandText = "SELECT ID FROM " + category;


    Ужас... Вы хоть поняли, что написали?
    Вот примерно так, думаю должно быть.

    sqlCommand.CommandText = "SELECT ID FROM category where name = :name";
    sqlCommand.CommandType = CommandType.Text;
    sqlCommand.Parameters["name"].Value = category;
    Ответ написан
  • Не могу начать установку windows 7. Почему?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Если образ оригинальный, то видимо установщик не смог определить совместимых образов (версий) винды для вашего проца. Отсюда следует, что стоит посмотреть на настройки ВМ касательно проца.
    Ответ написан
    Комментировать
  • Почему наушники распознает как динамик?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Динамики от наушников технически ни чем не отличаются. Картинка и текст определяются по умолчанию. Задний разъём - динамики, передний - наушники. А также, звук тем более не может отличаться. Только если настройки не разные. Открывай программу, которая ставится с драйвером звука, например для Realtek - Realtek HD Audio. Смотри настройки, регулируй. А в диалоге на картинке ты можешь изменить текст и иконку вручную на что угодно (из списка иконок)
    Ответ написан
    Комментировать
  • SSH client for windows?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    mRemote
    Ответ написан
    Комментировать
  • Как работает клонирование диска?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Всё зависит от выбора режима разметки при клонировании.
    Есть "1 в 1", есть "пропорционально". (Может и ещё появились режимы)
    "1 в 1" - акронис создаст разделы точно такого же размера, всё остальное будет в конце как "не размеченное"
    "Пропорционально" - акронис рассчитает пропорциональный размер разделов, если их несколько. Если раздел один, то он будет максимальный.
    Ответ написан
    Комментировать
  • Как можно создать программу для создания инсталлятора?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Т.е. тебе необходимо:
    1. Создать приложение инсталлятор (он будет шаблоном)
    2. Создать конструктор инсталлятора.

    Конструктор будет добавлять файлы в ресурсы exe (или просто в конец файла, или отдельные файлы) шаблона и прочую информацию.
    Ответ написан
    Комментировать
  • Стоит ли работать на эмуляторе?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    А что на счет Win10, WSL?
    И просто настроить винду под себя.
    Ответ написан
  • Windows 10 блокирует порты для uTorrent, как исправить?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    А до вин10 точно работало? Часто, блокируется провайдером такое.
    Ответ написан
    4 комментария
  • Возможно ли создание программы с интерфейсом на html?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Во многих IDE есть компоненты для отображения html страниц. Такие компоненты позволяют перехватывать нажатия, вызовы и не только. Т.е. можно по нажатию на странице выполнить код на языке в этой IDE.
    Есть стандартный на Windows компонент WebBrowser, который работает на движке IE. Есть и сторонние компоненты, например движок Chromium (он потяжелее и посложнее). Формируй страницу, открывай её через такой встроенный браузер и вот тебе интерфейс.
    Ответ написан
    Комментировать
  • IDE с Искусственным интеллектом улучшающим код программы?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    А зачем собсна тогда нужен будешь ты?

    Если AI может предложить более оптимальный алгоритм, то он уже должен понимать, какая должна быть конечная цель. Т.е. он знает что нужно сделать, как нужно сделать. Для чего нужен тогда ты сам? Запустить IDE?
    Ответ написан
    6 комментариев
  • Какой язык программирования изучать в свободное время?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Питон хоть и называют языком с низким порогом вхождения, но это на самом деле не так. Выучить синтаксис любого языка (хотя исключения существуют) - не сложное дело. Всё остальное - постижение других технологий. ЯП - лишь инструмент.
    Низкий ли порог вхождения для использования молотка? А для постройки дома? И подойдёт ли молоток для постройки дома, если он напечатан на 3D-принтере (дом)?
    Важен не сам язык, а то, чем ты хочешь заниматься, используя этот язык. Область применения, сфера применения, типы/виды задач. Хочется просто программировать? Т.е. софт для себя? Тогда вам нужна мощная среда разработки, которая позволит быстро накидать нужный функционал с визуальным оформлением. Для этого лучше подходят такие языки как C#, Delphi, C++. Если интересует веб - то другие языки (хотя и не обязательно).

    Ты ведь не желаешь просто изучить тему "как работать с молотком?". У тебя должна быть цель. И если для достижения этой цели тебе требуется молоток - изучаем молоток. С языками так же. Определись хотя бы с интересующей тебя сферой. Поставь цель (что бы ты хотел создать?) и тогда ты поймешь, какие инструменты тебе будут необходимы.

    P.S. мой ответ лишь не такой абстрактный как у dollar, но смысл тот же.
    Ответ написан
    1 комментарий
  • На каком языке и с применением каких технологий, IDE лучше писать программы для Windows, которые бы занимали минимум оперативной памяти?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Если хотите минимум требований по ОЗУ попробуйте Delphi (RAD Studio). Ни каких фреймворков и сторонних библиотек. Единственный, самодостаточный exe, использование памяти которого контролируете вы сами.

    5dff12d6edd12517608015.png
    Пример приложения по-дефолту. Имеется возможность и уменьшить потребление, исключив некоторые элементы или изменив настройки компилятора, добавив директивы в проект.
    Ответ написан
    5 комментариев