Сп. помогло... думал что OnCloseQuery должно только в основном теле.

Это чтоб на панели задач не было открыто много окон при открытых двух формах...

А подскажите, как условия сделать приведенных примерах... не понимаю к чему привязываться...
А то у меня реализовано

frmFon.OnCloseQuery := @frmFon_OnCloseQuery;

и поэтому постоянно выскакивает подтверждение выхода.
А если поставить в теле программы

begin
...
end.

до OnCloseQuery , то появляется пустое окно, на которое надо нажать, чтоб оно исчезло...
т.е. мне надо условие чтоб можно было перепрыгнуть show следующей формы.

procedure frmFon_OnShow (Sender: TObject; Action: string);
begin
    //Контроль запуска одного экземпляра программы
    if FindWindow('','already_launched')>0 then
        begin
            MessageBox('Уже запущен экземпляр программы','Ошибка',MB_OK+MB_ICONINFORMATION);
            Application.Minimize;
            frmFon.Close;
        end;

    with TForm.Create(Application) do
    begin
        Name := 'already_launched';
        BorderStyle := bsNone;
        Width:=0;
        Height:=0;
        Show;
        Hide;
    end;
   
    begin
        //При стиле "без рамки" убирает второе окно
        frmMain.Parent := frmFon;

        frmMain.Show;
        frmMain.TableGrid1.dbUpdate;
    end;
end;

begin
    frmFon.OnCloseQuery := @frmFon_OnCloseQuery;
end.

Люблю "сделать" красиво...
Блин, просто DeleteFile('~$applock') не прокатывает, надо оказывается путь прописывать или его создавать из начально в корне или Temp...
Ну это подумает сп. TZipMode - подходит.

    try
    ZF:=TZipFile.Create;
    ZF.Open('C:\Windows\Temp\~$applock',zmWrite);
    except
      ZF.Free;
      MessageBox('Уже запущен экземпляр программы','Ошибка',MB_OK+MB_ICONINFORMATION);
      Application.Minimize;
      frmFon.Close;

Как понял про TZipMode, она создает файл, и дальше смотрит его наличие... и после завершения созданная "какашка" остается... а функции удаления нет или скрытого параметра...

И больше подходит с TZipMode, т.к. у меня выскакивает запрос на закрытие...

Понял, сп.

Реакция на Zip... smile

if FindWindow(nil,'Database') <> 0 then

Перепробовал разные знаки и цифры. Реагирует на первый запуск.

Спасибо. А во втором случаи это если прогу из архива извлекать или для каких случаев...

Здравствуйте, подскажите, как можно контролировать запуск одного экземпляра программы. Сп.

Странно, но я пробовал вбивать простое значение, чтоб выяснить... нужно маску снимать или нет... Тогда ошибку выдавало и так и так. В этот раз попробовал цикл сделать, как Вы мне предлагали в одной из веток.

procedure frmAddNew_OnShow (Sender: TObject; Action: string);
var
   tel,telx : string;
   i,i2     : Integer;
   arr      : string ='0123456789';
begin
    tel := frmNew.Edit1.Text;
    telx := '';

    for i := 1 to Length(tel) do
    begin
        for i2 := 0 to Length(arr)-1 do
        begin
             if (tel[i] = arr[i2]) then
             begin
                telx := telx + tel[i];
             end;
        end;
     end;
    frmAddNew.Edit1.Text := telx;
end;

Опять решил палкой потыкать свой долгострой... Спасибо vovka3003, более красиво и компактно получается. Но вот попрежнему не могу получить вторую строку ответа...

ShowMessage(JSON(j,'["sms"]["'+SMSPhone+'"]["status_code"]'));

Выдает ошибку на функцию JSON

Вам достаточно создать кнопку с функцией редактирования оной таблицы.

sibprogsistem, json из примера Sms, причем в примере тоже, у меня, не работает.

function smsAnswer(sdata:string):string;
var
    JSONObject, JSONObjProp, JSONObjProp2: TJSONObject;
    JSONString: TJSONString;
    sD: string;
begin
    try
        ShowMessage(smsquestion.ResponseText);
        //if smsquestion.Status() = 200 then
        //begin

        //if smsAn = 'SMS.RU' then
        //begin
        JSONObject := nil;
        JSONObject := TJSONObject(TJSONObject.ParseJSONValue(smsquestion.responsetext));
        if JSONObject <> nil then
        begin
            //JSONString := TJSONString(JSONObject.GetPairByName('status_code').JsonValue);
            //ShowMessage(JSONString.Value);

            //if Pos('100',JSONString.Value) then
            //begin
                JSONObjProp := TJSONObject(JSONObject.GetPairByName('sms').JsonValue);
                JSONObjProp2 := TJSONObject(JSONObjProp.GetPairByName(sD).JsonValue);
                JSONString := TJSONString(JSONObjProp2.GetPairByName('status_code').JsonValue);
                ShowMessage(JSONString.Value);
            //end;

             //Коды SMS
             if Pos('100',JSONString.Value) then
             begin
                 //ShowMessage('ОК');
                 JSONString := TJSONString(JSONObject.GetPairByName('balance').JsonValue);

                 //Вывод баланса
                 frmMain.Label4.Caption := JSONString.Value;

                 //Условие на проверку - открыта форма или нет
                 If frmWord.Visible then
                 begin
                     //Запомнить состояние флага
                     SQLExecute('UPDATE SMS SET sms_switch="'+frmWord.CheckBox2.sqlValue+'" WHERE id=1');

                     //Обновить содержимое
                     SQLEXecute('UPDATE SMS SET sms_API="'+frmWord.Memo1.Text+'" WHERE id=1');
                     SQLEXecute('UPDATE SMS SET sms_name="'+frmWord.Edit1.Text+'" WHERE id=1');

                     frmWord.Memo1.Enabled := False;
                     frmWord.Edit1.Enabled := False;
                     frmWord.Button25.Enabled := False;

                     frmMain.GroupBox2.Visible := True;
                     frmAddNew.CheckBox1.Visible := True;
                 end;
             end;
             if Pos('232',JSONString.Value) then ShowMessage('Превышен лимит одинаковых сообщений на этот номер в день');
             if Pos('-1',JSONString.Value) then ShowMessage('Сообщение не найдено');
             if Pos('107',JSONString.Value) then ShowMessage('Не может быть доставлено: неизвестная причина');
             if Pos('108',JSONString.Value) then ShowMessage('Не может быть доставлено: отклонено');
             if Pos('200',JSONString.Value) then
             begin
                ShowMessage('Неправильный API');
                MessageBeep(1); //Звуковой сигнал
                frmWord.Memo1.Text := '';
                frmWord.Memo1.SetFocus;
             end;
             if Pos('201',JSONString.Value) then ShowMessage('Не хватает средств на лицевом счету');
             if Pos('202',JSONString.Value) then ShowMessage('Неправильно указан номер телефона получателя, либо на него нет маршрута');
             if Pos('203',JSONString.Value) then ShowMessage('Нет текста сообщения ');
             if Pos('204',JSONString.Value) then ShowMessage('Имя отправителя не согласовано с администрацией');
             if Pos('209',JSONString.Value) then ShowMessage('Вы добавили этот номер (или один из номеров) в стоп-лист');
             if Pos('220',JSONString.Value) then ShowMessage('Сервис временно недоступен, попробуйте чуть позже');
             if Pos('230',JSONString.Value) then ShowMessage('Превышен общий лимит количества сообщений на этот номер в день');
             if Pos('231',JSONString.Value) then ShowMessage('Превышен лимит одинаковых сообщений на этот номер в минуту');
             if Pos('233',JSONString.Value) then ShowMessage('Превышен лимит отправки повторных сообщений с кодом на этот номер за короткий промежуток времени ("защита от мошенников"), можно отключить в разделе "Настройки")');
             if Pos('301',JSONString.Value) then ShowMessage('Неправильный api_id, либо логин/пароль');
             if Pos('205',JSONString.Value) then ShowMessage('Сообщение слишком длинное (превышает 8 СМС)');
             if Pos('206',JSONString.Value) then ShowMessage('Будет превышен или уже превышен дневной лимит на отправку сообщений ');
             if Pos('207',JSONString.Value) then ShowMessage('На этот номер нет маршрута для доставки сообщений');
             if Pos('302',JSONString.Value) then ShowMessage('Пользователь авторизован, но аккаунт не подтвержден (пользователь не ввел код, присланный в регистрационной смс)');
             if Pos('500',JSONString.Value) then ShowMessage('Ошибка на сервере. Повторите запрос');
           end;
        //end;


    except
    end;
    smsTimer.Enabled:=False;
end;

vovka3003. понимаю, что надо полученное сообщение загонять в константу и оттуда извлекать необходимое?

Ни как неполучается получить вторую страку строку из json. Постоянно выдает ноль...

        JSONObject := nil;
        JSONObject := TJSONObject(TJSONObject.ParseJSONValue(smsquestion.responsetext));
        if JSONObject <> nil then
        begin
            JSONString := TJSONString(JSONObject.GetPairByName('status_code').JsonValue);
            ShowMessage(JSONString.Value);

            if Pos('100',JSONString.Value) then
            begin
                JSONObjProp := TJSONObject(JSONObject.GetPairByName('sms').JsonValue);
                JSONObjProp2 := TJSONObject(JSONObjProp.GetPairByName(sD).JsonValue);
                JSONString := TJSONString(JSONObjProp2.GetPairByName('status_code').JsonValue);
                ShowMessage(JSONString.Value);
            end;

Да вроде система SMS.ru проглатила маску...

У меня в базе телефон вводится по маске, но надо ее сбросить для изьятия номера для работы с смс. Подскажите как. Сп.

18

(4 replies, posted in Russian)

Сп, попробую.

19

(4 replies, posted in Russian)

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

20

(4 replies, posted in Russian)

Подскажите, как реализовать гиперссылку...

21

(5 replies, posted in Russian)

Спасибо

22

(5 replies, posted in Russian)

Что-то и так никак. Остается делать грабли... Заносить значение 0 или 1 сравнивать с базой и устанавливать DefaultState... Может есть другие варианты?

23

(5 replies, posted in Russian)

В лоб не получилось. Надо еще при старте делать SELECT?

24

(5 replies, posted in Russian)

Вроде понятно, как сиеминутно сделать выбор с помощью скрипта...
А вот как закрепить положение флажка в базе, чтоб, она, база, помнила, в каком положение, он стоит, при каждом ее запуске. Так понимаю нужно поле да/нет.

Ну как-то так

if not (Key in ['0'..'9',  'A'..'Z', 'a'..'z', #8, #32 ]) then Key:=#0;