1

(3 replies, posted in Russian)

Спасибо заработало!
Действительно нужно было запустить и остановить процедуру выбора ключей.

2

(3 replies, posted in Russian)

Поправка. Если вышеописанную процедуру написать таким образом:
procedure Form1k_Edit4_OnKeyPress (Sender: string; var Key: Char);
begin
     case Key of
     '0'..'9':;
     #8:;
     ',','.': IF Pos(DecimalSeparator,Form1k.Edit4.Text)=0 Then Key:=DecimalSeparator Else Key:=#0;
     Else
     //Key:=#0; (Пропустить эту часть кода)
     end;
end;

То все вводится, но уже можно вписать в поле не только цифровые значения но и буквенные, а мне их нужно отсеять!

3

(3 replies, posted in Russian)

Добрый день!
Проблема такая, хочу контролировать ввод символов в поле. Маска ввода не подходит так как я использую в этом поле значения суммы, в формате: 9 999 999,99
Использую для этого следующий метод контроля:

procedure Form1k_Edit4_OnKeyPress (Sender: string; var Key: Char);
begin
     case Key of
     '0'..'9':;
     #8:;
     ',','.': IF Pos(DecimalSeparator,Form1k.Edit4.Text)=0 Then Key:=DecimalSeparator Else Key:=#0;
     Else
     Key:=#0;
     end;
end;

Вот только при попытке ввода в поле ничего не происходит, значения клавиш не вводятся, поле остается пустым!
В чем может быть проблема?

DriveSoft wrote:

alik
Т.е. все ок, разобрались? )

Да вопрос решен!
Спасибо Вам Дмитрий, Вы как всегда, если даже прямо не говорите как есть, задаете курс решения проблемы, а дальше дело техники!

DriveSoft wrote:

К сожалению не пойму, что вы имеете ввиду под "записывать занчения в Грид2"

Имел ввиду ввыводить значения из таблицы.
В общем я хотел сделать как:
1. Есть таблица исполнители по контракту:
2. Есть таблица банков
3. Есть таблица расчетных счетов
4. Есть таблица сертификатов соответсвия
5. Есть таблица лицензий.

Записи таблицы исполнители по контракту выводятся в Грид1.
Записи Таблицы банков и расчетных счетов выводятся в Грид2
Записи Таблицы сертификатов соответствия и лицензии выводятся в Грид3

Но есть условие, в Грид2 и Грид3 выводятся записи которые относятся к к конкретному исполнителю в Грид1.
Если бы надо было связать только Грид1 и Грид2 то встроенная функция Increm.Search работает, так как здесь мы указываем какая конпка должна сработать. Вот я и хотел узнать как в определеннем событии сработали не 1 кнопка а 2.
Я уже разобрался с этим.
Я просто ничего в функции Increm.Search не указываю, а вот в самом скрипте создаю событие нажатия на кнопки, где есть события поиска, например кнопка1 и кнопка2, то есть в кодовом выражении
Form1.Button1.Click
Form1.Button2.Click
что в принципе и есть встроенная функция Increm.Search только с возможностью неограниченного выбора кнопок.

Спасибо разобрался.
А возможно как нибудь записывать занчения в Грид2 (тут собираются значения из 1 и 2 таблиц) и Грид3 (тут собираются значения из 3 и 4 таблицы)  по выбору значения в Грид1?

Дмитрий добрый день!
Заполнять Грид скриптом мне нужно для того что бы связать 2 Грида.
Например у меня есть грид со списком заказчиков, и есть отдельный грид где расположены все контракты по этому заказчику с полной информацией. Так вот при выборе определенного Заказчика в Гриде1, во втором Гриде хочу вывести из базы контрактов только те записи которые принадлежат именно этому Заказчику. Пробовал кнопкой через sql-запросы и поиском, но не смог понять как это сделать, и все время выдаются ошибки, либо ошибок просто нет и результата тоже.

идентификатор записи хранится в поле с именем id в каждой таблице, т.е. SELECT id FROM .... - это понятно, но вот как раз таки тут и кроется проблема. Как вытащить именно нужный мне id? Все остальные данные из таблицы я вытаскиваю с помощью запроса где в условии указывается id записи. Но как вытащить именно сам id зная только само значение id. Ведь если я сделаю запрос следующего вида: SELECT id FROM Table Where id= C, где С - это переменная которую я использую для перебора id, то синтаксис выражения уже не правилен. Вот я и думаю как мне вытащить именно тот id который существует в базе. Ведь синтаксис моего скрипта работать будет правильно если в ней не будут удаляться строки из базы и в дальнейшем не будут изменяться значения id. А если существуют разрывы в порядке id, например есть записи с 1 по 12, записи с 13 по 16 удалены. Тогда при заполнении Грида у меня в колонке Код, значений с 13 по 16 быть не должно.
Судя по Вашему ответу на данный момент это сделать скриптом невозможно.

Дмитрий, добрый день!
Очередняа проблема. Суть такова:
Заполняю Грид скриптом, для этого делаю следующее
1. Само собой задаю Гриду столбцы и имена столбцов (тут есть ещё 1 момент, возможно ли вручную задать количество столбцов гриду. Просто по умолчанию у него 6 столбцов, и если в базе столбцов меньше то приходиться удалять лишние, а это не есть гуд, хоть и не критично).
2. Определяю количество записей в базе.
3. Создаю условие, при котором если в базе записей нет вообще, то id первой записи я вписываю 1 без каких либо хитрых манипуляций. Если записи есть, то определяю максимальный id и следующая запись которая вписывается получает значение MAX(id)+1.
4. Запускаю цикл в котором уже по количеству записей в базе создаю строки в Гриде, и вписываю значения строки из базы в Грид.
Вот здесь и появляется проблема. Не знаю каким образом корректно записать значение id из базы в Грид что бы они совпадали.
На данный момент все это выглядит так:

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
s1, s2, s3, s4: string;
r: integer;
begin
IF (Form1.Edit2.Text='') OR (Form1.Edit3.Text='') OR (Form1.DateTimePicker1.Checked=False)
THEN
ShowMessage('Поля пустые')
ELSE
    begin
    IF SQLExecute('SELECT Count(id) FROM Contracts') < 1
    THEN
        begin
        Form1.CGrid.ClearRows;
        s1:= '1';
        s2:= ReplaceStr(Form1.Edit3.Text,'"','""');
        s3:= ReplaceStr(Form1.Edit2.Text,'"','""');
        s4:= ReplaceStr(DateToStr(Form1.DateTimePicker1.DateTime),'"','""');
        SQLExecute('INSERT INTO Contracts (id, Number, Date, Customer) VALUES ("'+s1+'","'+s2+'","'+s3+'","'+s4+'")');
        UpdateDatabase('Contracts');
        FOR r:= 0 TO (SQLExecute('SELECT Count(id) FROM Contracts')-1) DO
            begin
            Form1.CGrid.AddRow;
            Form1.CGrid.Cells[0,r]:= IntToStr(r+1);
            Form1.CGrid.Cells[1,r]:= SQLExecute('SELECT Number FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            Form1.CGrid.Cells[2,r]:= SQLExecute('SELECT Date FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            Form1.CGrid.Cells[3,r]:= SQLExecute('SELECT Customer FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            end;
        end
    ELSE
        begin
        Form1.CGrid.ClearRows;
        s1:= IntToStr(SQLExecute('SELECT Max(id) FROM Contracts')+1);
        s2:= ReplaceStr(Form1.Edit3.Text,'"','""');
        s3:= ReplaceStr(Form1.Edit2.Text,'"','""');
        s4:= ReplaceStr(DateToStr(Form1.DateTimePicker1.DateTime),'"','""');
        SQLExecute('INSERT INTO Contracts (id, Number, Date, Customer) VALUES ("'+s1+'","'+s2+'","'+s3+'","'+s4+'")');
        UpdateDatabase('Contracts');
        FOR r:= 0 TO (SQLExecute('SELECT Count(id) FROM Contracts')-1) DO
            begin
            Form1.CGrid.AddRow;
            Form1.CGrid.Cells[0,r]:= IntToStr(r+1);
            Form1.CGrid.Cells[1,r]:= SQLExecute('SELECT Number FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            Form1.CGrid.Cells[2,r]:= SQLExecute('SELECT Date FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            Form1.CGrid.Cells[3,r]:= SQLExecute('SELECT Customer FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            end;
        end;
    end;
end;
То есть на данный момент id в Грид записывается нехитрой записью Form1.CGrid.Cells[0,r]:= IntToStr(r+1); что конечно же не верно.
Если например id записей в базе идут не по порядку, то есть есть разрыв в порядке, то соответствие id в базе и значения этих записей в столбце КОД в Гриде будут разные.
Вопрос: как вытаскивать id записи из базы и записывать в Грид.

К этому:
"Но вот что будет если я буду создавать выборку по базе в Гриде пока не испытал."

Тоже думаю будет работать если сравнивать количество записей базы и грида именно по условию выборки.

Спасибо большое за направление хода мыслей. Вроде разобрались и вопросов пока нет.

DriveSoft wrote:

К сожалению тут без таймера не обойтись, попробуйте перед обновлением таблицы, запоминать выделенную строку, а после обновления снова ее выделять,


var
   i: integer;
begin
  i := Form1.TableGrid1.SelectedRow; // запоминаем номер выбранной  строки
  Form1.TableGrid1.dbUpdate; // обновление грида
  Form1.TableGrid1.ScrollToRow(i); // скролим, чтобы было видно выбранную строку
  Form1.TableGrid1.SelectedRow := i; // восстанавливаем выделение выбранной строки

но постоянно обновлять грид конечно не лучшее решение, можно завести глобальную переменную, в которой будем хранить последний добавленный id записи, который можем узнать воспользовавшись функцией:
Last_Insert_id(TableName: string): integer


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

Это если в базу только добавляется запись.
Ситуация следующая:
все id в базу у меня заносятся с предварительной проверкой на уникальность, то есть, если одновременно работают 2 сотрудника с разных компов, то определение и присвоение id новой записи в базу идет в момент нажатия на кнопку, что бы не было повторений. В связи с этим, если на 1 компе удаляется запись, то это событие в процедуре описанной Вами уже не выявит разницу между существующей id последней записи и новой якобы введенной, и таблица в гриде у других пользователей не обновится, так как последний введенный id будет равен глобальной переменной. Поэтому я решил сравнивать количество записей в гриде и базе. Но вот что будет если я буду создавать выборку по базе в Гриде пока не испытал.

Добрый день!
В общем я пошел немного другим путем.
в таймере я сравнил колчество записей в самой базе и количество записей в гриде, если они не равны то выполняется обновление базы.
А вот по тому что в Гриде ползунок (вертикальный) уходит вверх я ошибся, выделенная запись остается так же выделенной и она остается на месте, ползунок (вертикальный) тоже остается на месте, сдвигается в право только ползунок горизонтальный если столбцов больше или они шире чем границы Грида, но это уже думаю не такая уж и большая проблема. Отвлекает но неудобств не вызывает.

Допустил ошибку - так вот при изменении этого Едита (событие ОнКлик) - событие ОнЧайндж

Добрый день!
Снова нужна Ваша помощь. Суть такова:
Есть таблица Заказчики. Когда добавляю в базу новую запись, то по скрипту происходит обновление Грида который показывает все записи таблицы.
Если запустить ехе-файл на 2 компах одновременно, и работать с 1 базой по сети, то при добавлении записи в базу на 1 компе, то обновление на 2 компе не происходит, (что бы Грид обновился нужно совершить какое-либо событие). Так вот суть вопроса, можно ли каким либо образом сделать так что бы запись созданная на 1 компе, сразу показывалась на других компах бех совершения каких либо действий.
На данный момент эту проблему я обошел с помощью таймера (на главной форме есть Едит где автоматически идет время с интервалом в 1 секунду, так вот при изменении этого Едита (событие ОнКлик) обновляются все базы которые используются прогой. Но тут есть проблема, если количество отображаемых записей больше чем высота Грида, то через каждую секунду Грид при обновлении показывает первые записи из таблицы, ползунок автоматом уходит вверх.)
А возможно ли это сделать каким-то образом без таймера.
Есть ещё вариант с с изменением положения курсора мышки, но скорее всего в Гриде все равно будут показываться первые записи из таблицы.

14

(4 replies, posted in Russian)

Спасибо, действительно работатет! Сам бы недодумался.

15

(4 replies, posted in Russian)

В общем, когда я кликаю на строку Грида, то скриптом в Едит вставляется значение id выбранной строки. Если выбирать строки стрелками вверх и вниз, в Едите остается значение id той строки по которому был клик, а id выбранной (скорее выделенной) стрелками строки в Едит не выводится.
Я просто не нашел какое событие обрбатывает выбор нужной строки стрелками вверх или вниз.
Событие OnKeyDown только возвращает код клавиши которая нажата.

16

(4 replies, posted in Russian)

Здравствуйте!
Подскажите пожалуйста, как реализовать автовыбор значения id выбранной записи из Грида в Едит, только не событием Он_клик, а при движении по записям Грида стрелками вверх и вниз.
Спасибо!

отправил Вам на почту свой проект

Сюда же ещё 1 вопрос.
Возможно ли каким то образом реализовать следующий момент.
В программу пользователи входят по логину и паролю. Есть Форма настройка пользователей, где есть список всех пользователей.
В списке отображается вошел пользователь в программу или нет, у каждого пользователя есть статус активности: "Активен" и "Неактивен".
Хочу сделать следующее, по кнопке, напрмер, пусть будет "Отключить" выкинуть из программы принудительно именно выбранного пользователя, не выкидывая остальных.

Добрый день!
Столкнулся со следующей проблемой:
в форме есть 2 таблицы.
Так вот если я просто открываю форму, то выполняется автообновление таблиц и видны записи в таблицах.
Если я форму открываю модельно, то 1 таблица выполняет автообновление и данные высвечиваются, а вот вторая таблица пустая, хотя записи в базе есть.
Как можно решить сей момент?

Спасибо, работает!

Доброго времени суток!
Подскажите пожалуйста по некоторым вопросам, а именно:
1. Возможно ли через скрипт задавать имена столбцов в таблице, так как хотелось бы заполнять таблицу именно скриптом;

2. При добавлении в таблицу SQL скриптом выдает ошибку если в Едите запись в кавычках, вот пример:
procedure Form2111_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
SQLExecute('INSERT INTO Contractors (record_count, LongName, ShortName) VALUES ("'+Form2111.EditCounter1.Text+'","'+Form2111.Edit1.Text+'","'+Form2111.Edit2.Text+'")');
Form211.TableGrid1.dbUpdate;
Form2111.Close;
end;
Если в ЕДИТЫ вбить текст в кавычках ("ТЕКСТ"), выдается ошибка near "ТЕКСТ": syntax error, возможно ли обойти эту ошибку;

3. Хотелось бы в форму добавить текущее время, которое меняется с интервалом в 1 секунду, например в Label.Caption;

Заранее спасибо!