Задать вопрос
  • Как позволить вторичному потоку выполнить синхронизацию?

    HemulGM
    @HemulGM Автор вопроса, куратор тега Delphi
    Delphi Developer, сис. админ
    Ответ нашёл сам. Если не давать и перехватить завершение программы (например, при закрытии главного окна), т.е. CanClose := False; и выполнить остановку потока (т.е. установить флаг) и ждать пока он завершится, то всё завершается без проблем и блокировки не происходит. А затем можно вызвать завершение всей программы.
    Ответ написан
    Комментировать
  • Как загрузить картинку с устройства в вк через vk_api на python?

    HemulGM
    @HemulGM Куратор тега Python
    Delphi Developer, сис. админ
    Всё там понятно описано (подробнейшая инструкция вк)
    Первым делом нужно получить адрес сервер, куда можно загрузить картинку photos.getWallUploadServer
    Далее, отправляешь на этот сервер нужный файл через Post. Файлы в полях file/file1, file2 в формате multipart/form-data
    Тебе возвращается ответ в виде массива с данными о загруженных фото photos_list. Затем, выполняешь photos.save, передав photos_list в параметрах.
    В ответ приходит массив фотографий, из которых ты уже забираешь id, owner_id, access_key, если нужно и отправляешь во вложении. Всё.
    Ответ написан
    3 комментария
  • Как скачать картинки из vk?

    HemulGM
    @HemulGM Куратор тега Python
    Delphi Developer, сис. админ
    Используя vk api обертку для питона получаешь фотоальбомы или посты группы, в постах содержатся вложения в виде объектов фото и прочего, в альбомах напрямую объекты фото. Каждый объект фото содержит ссылки на оригинал и на подготовленные фото определённых размеров. Получаешь список фото, берёшь ссылку и качаешь обычным http клиентом.
    Ответ написан
  • Как убрать приложение из автозапуска в скрытом режиме?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Не понимаю задачу. Что ты хочешь в итоге получить и что у тебя имеется?

    Рассуждаю:
    У тебя есть инсталлятор какой-то софтины (произвольной). Ты хочешь софтину установить, но чтобы при этом ключ, помещённый в автозагрузку был перехвачен и исключен?
    Если так, что тебе нужен мониторинг изменений, которые внесла программа установки (она может поместить ссылку на загрузку в реестр юзера, в реестр всей оси, в папку автозагрузки в меню пуск, в планировщик). Мониторим изменения в этих местах - удаляем то, что она там понасоздавала. Батником ты тут не отделаешься.

    Далее. Не все программы ставятся в автозагрузку установщиком, многие ставятся при запуске самой софтины.

    был у меня вариант с реестром, но он еще и подтверждение постоянно просит

    reg позволяет установить флаги, чтоб не спрашивал, если что
    Ответ написан
  • Как и с чего начать обучение?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Тут начальный старт можешь найти:
    https://ru.wikibooks.org/wiki/Delphi
    Тут тысячи примеров кода (рабочего)
    delphiworld.narod.ru/_all_articles_.html
    Здесь не мало ресурсов
    progbook.ru/delphi

    Тут качай среду
    https://www.embarcadero.com/ru/products/delphi/starter
    Ответ написан
  • Как сгенерировать JSON для keyboard VK API?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    {
      "one_time": true,
      "inline": false,
      "buttons": [    <------- а где ещё массив?
        {
          "action": {
            "type": "text",
            "payload": "{\"button\":\"btn_1\"}",
            "label": "Привет"
          },
          "color": "secondary"
        }
      ]
    }


    Каждый элемент кнопки должен находится внутри массива - слоя, а каждый слой внутри массива buttons
    Т.е. buttons - это массив слоёв кнопок (уровней, линий), каждый из которых содержит массив кнопок.

    Итого:
    public function generateButtons(array $buttons, bool $inline = false) : string {
            $array = [
                'one_time' => !$inline,
                'inline' => $inline,
                'buttons' => [],
            ];
    
            foreach ($buttons as $item) {
                $array['buttons'][][] = [  <---- ещё один массив
                    'action' => [
                        'type' => $item['type'],
                        'payload' => json_encode($item['payload'], JSON_UNESCAPED_UNICODE),
                        'label' => $item['label'],
                    ],
                    'color' => $item['color'],
                ];
            }
    
            return json_encode($array, JSON_UNESCAPED_UNICODE);
        }

    Результат:
    {
        "one_time": true,
        "inline": false,
        "buttons": [
            [
                {
                    "action": {
                        "type": "text",
                        "payload": "{\"button\":\"btn_1\"}",
                        "label": "1233123"
                    },
                    "color": "secondary"
                }
            ]
        ]
    }
    Ответ написан
    1 комментарий
  • Возможно ли бэкапить виртуалки изнутри?

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

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Можешь попробовать настроить форматер в CnPack. Там он позволяет настраивать себя достаточно тонко. Сочетание Ctrl+W.
    Ответ написан
    Комментировать
  • ПО для записи экрана?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    RAdmin (и подобные). Мониторь у себя и записывай у себя.
    Ответ написан
    Комментировать
  • Как соединить 2 кода в один на паскале?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Учи паскаль.
    Ответ написан
    Комментировать
  • Как выполнить процедуру удаления элемента из массива по индексу?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Ты инициализируешь переменную сразу в цикле. Такое не умеет TP.
    Ну и судя по заданию, не забудь, что у тебя смещаются слова и индексы слов совпадать не будут.
    Ответ написан
  • Как разделить строку на масив по пробелу?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    По циклу прогоняешь строку, если пробел, то от начала до пробела помещаешь в массив.
    Рекомендую сначала посчитать пробелы одним циклом. Установить размер массива = кол-во пробелов + 1.
    Далее уже заполнять массив.
    Тебе нужна переменная, которая запомнит последнюю позицию
    LastPos
    И переменная последнего элемента
    LastIndex
    Ну и вот:
    SetLength(a, SpaceCount + 1);
    LastPos := 1;
    LastIndex := 0;
    for i := 1 to Length(Str) do
      if Str[i] = ' ' then
      begin
        a[LastIndex] := Copy(Str, LastPos, (i - LastPos)); //-- тут возможно +-1
        Inc(LastIndex);
        LastPos := i;
      end;


    Это если для чистого Pascal, а если для Delphi, то лучше TStringList использовать и его метод DelemitedText
    Ответ написан
  • Windows XP не устанавливается?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Здесь на лицо несовместимость ОС в виде её не актуальности и современного железа.
    Ответ написан
    Комментировать
  • Как создать функцию random_id в vk_api?

    HemulGM
    @HemulGM Куратор тега Python
    Delphi Developer, сис. админ
    Для тех, кто наткнётся на вопрос в будущем (как, например, я).

    random_id - это параметр, который также нужно передавать при отправке нового сообщения.
    random_id - уникальный (в привязке к API_ID и ID отправителя) идентификатор, предназначенный для предотвращения повторной отправки одинакового сообщения. Сохраняется вместе с сообщением и доступен в истории сообщений.

    Заданный random_id используется для проверки уникальности за всю историю сообщений, поэтому используйте большой диапазон (до int64).


    Лично я рекомендую использовать в качестве random_id - дату и время в качестве уникального ключа. А именно - переводить дату и время в миллисекунды.
    Ответ написан
  • Как отследить зажатые клавиши?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Любой (почти) ЯП тебе позволит мониторить состояние кнопок. И алгоритм там не сложный. Возьми, C# или Delphi и вперёд, писать мелкий монитор. И уводить в сон сможешь принудительно.
    Ответ написан
  • Возможно у кого то завалялась кисть?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Есть набор царапин и тонна прочего дерьма в виде пулевых отверстий, шрапнели, кровоподтеков и т.д. Насекомые и прочее, но укусов вроде не нашёл.
    5e1d181c394f8058808098.png
    Ответ написан
  • Что не так в этом классе?

    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, сис. админ
    Сделай дефрагментацию диска. Все данные упадут в начало диска. После, попробуй ещё раз стандартными средствами ужать диск.
    Ответ написан