3,051

(13 replies, posted in General)

radsoft wrote:

Hello ehwagner,
thanks. I thought I did both but maybe not. I can't see how to left justify the numeric columns. Do you know if that is possible?
Thanks again,
David


Example

procedure Form1_TableGrid1_OnChange (Sender: string);
begin
    Form1.TableGrid1.Columns[0].Alignment := taLeftJustify; // for first column
end;

3,052

(12 replies, posted in General)

Also i saw that my password is not marked with * but instead shows the characters

Component TextBox have property PasswordChar, set its value =  *

3,053

(12 replies, posted in General)

my database has a serious problem , when i close the exe the database stays open in the task manager and if you open it for example 5 times it leaves open 5 tasks. I cannot have other people using it like this. What should i do?



please look at this:

procedure Form1_OnClose (Sender: string; Action: string);
begin
    frmLogin.Close
end;

I suppose that you have main form frmLogin which hided after login, but application will be in the memory until main form not be close. You must close main form manually using script when your general form of app close.

3,054

(9 replies, posted in General)

Hello.


You can replace this dialog.
Example:



You should create event OnClick for a delete button, also you need to disable option "Ask for confirmation to delete the record" in the setting of the button:

procedure Form1_bDeleteButton_OnClick (Sender: string; var Cancel: boolean);
begin
    // custom message, when record in tablegrid not selected
    if Form1.TableGrid1.dbItemID=-1 then
    begin
        MessageDlg('Your message here.', mtInformation, mbOk, 0);
        Cancel := True;
        Exit;
    end;


    // custom message for confirmation of delete record
    if MessageDlg('Your message here.', mtConfirmation, mbYes+mbNo, 0) = mrNo then
    begin
        Cancel := True;
        Exit;
    end;

end;

3,055

(4 replies, posted in General)

Check it out

procedure Form1_OnShow (Sender: string; Action: string);
begin
  Form1.ComboBox1.Clear;
  Form1.ComboBox1.Items.Add('Print');
  Form1.ComboBox1.Items.Add('Print All');
  Form1.ComboBox1.Items.Add('Print Selected');
  Form1.ComboBox1.ItemIndex := 0;
  Form1.edCombo1Value.Text := 'Print';
end;

procedure Form1_ComboBox1_OnChange (Sender: string);
begin
  Form1.edCombo1Value.Text := Form1.ComboBox1.Text;
  if Form1.ComboBox1.Text = 'Print All' then Form1.Button2.Click;
  if Form1.ComboBox1.Text = 'Print Selected' then Form1.Button3.Click;
  Form1.ComboBox1.ItemIndex := 0;
end;
Raspr wrote:

Да, это-то и нужно. Но выбирая сегодняшнюю дату получаем ошибку.

попробуйте так

Form1.DateTimePicker1.MinDate := trunc(now);

т.о. от текущей даты отсекается время, которое видимо мешается.

3,057

(2 replies, posted in FAQ)

Logging with using triggers for SQLite


Code:

procedure Form1_OnShow (Sender: string; Action: string);
begin
    //SQLExecute('DROP TRIGGER IF EXISTS my_log_insert'); // how to remove trigger

    // trigger when insert new a record
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_insert AFTER INSERT ON employees '+
    'BEGIN '+
    '    INSERT INTO employees_logs(ParentId, datetimeEvent, operation, lastname, firstname, salary, dateofbirth) VALUES (NEW.id, datetime(''now'', ''localtime''), ''New'', NEW.lastname, NEW.firstname, NEW.salary, NEW.dateofbirth); '+
    'END;'
    );

    // trigger when update a record
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_update AFTER UPDATE ON employees '+
    'BEGIN '+
    '    INSERT INTO employees_logs(ParentId, datetimeEvent, operation, lastname, firstname, salary, dateofbirth) VALUES (NEW.id, datetime(''now'', ''localtime''), ''Update'', NEW.lastname, NEW.firstname, NEW.salary, NEW.dateofbirth); '+
    'END;'
    );

    // trigger when delete a record
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_delete AFTER DELETE ON employees '+
    'BEGIN '+
    '    INSERT INTO employees_logs(ParentId, datetimeEvent, operation, lastname, firstname, salary, dateofbirth) VALUES (OLD.id, datetime(''now'', ''localtime''), ''Delete'', OLD.lastname, OLD.firstname, OLD.salary, OLD.dateofbirth); '+
    'END;'
    );
end;





procedure Form1_bUpdate_OnClick (Sender: string; var Cancel: boolean);
begin
    if Form1.cbEmp.dbItemID = -1 then Form1.GridLogs.dbFilter := '' else Form1.GridLogs.dbFilter := 'ParentId='+Form1.cbEmp.sqlValue;
    Form1.GridLogs.dbUpdate;
end;


procedure frmEmployee_OnShow (Sender: string; Action: string);
begin
    if frmEmployee.bSave.dbGeneralTableId <> -1 then
    begin
        frmEmployee.GridLogs.dbFilter := 'ParentId='+IntToStr(frmEmployee.bSave.dbGeneralTableId);
        frmEmployee.GridLogs.dbUpdate;
    end else
    begin
        frmEmployee.GridLogs.ClearRows;
    end;
end;


Project example:
http://myvisualdatabase.com/forum/misc. … download=1

сделал проект с примером, логгирование записей, но в логах сохраняются все поля, даже те которые не были изменены
http://myvisualdatabase.com/forum/viewt … ?pid=21650

Логирование изменений в таблице с помощью тригеров (SQLite)



скрипт:

procedure Form1_OnShow (Sender: string; Action: string);
begin
    //SQLExecute('DROP TRIGGER IF EXISTS my_log_insert'); // how to remove trigger

    // trigger when insert new a record
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_insert AFTER INSERT ON employees '+
    'BEGIN '+
    '    INSERT INTO employees_logs(ParentId, datetimeEvent, operation, lastname, firstname, salary, dateofbirth) VALUES (NEW.id, datetime(''now'', ''localtime''), ''New'', NEW.lastname, NEW.firstname, NEW.salary, NEW.dateofbirth); '+
    'END;'
    );

    // trigger when update a record
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_update AFTER UPDATE ON employees '+
    'BEGIN '+
    '    INSERT INTO employees_logs(ParentId, datetimeEvent, operation, lastname, firstname, salary, dateofbirth) VALUES (NEW.id, datetime(''now'', ''localtime''), ''Update'', NEW.lastname, NEW.firstname, NEW.salary, NEW.dateofbirth); '+
    'END;'
    );

    // trigger when delete a record
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_delete AFTER DELETE ON employees '+
    'BEGIN '+
    '    INSERT INTO employees_logs(ParentId, datetimeEvent, operation, lastname, firstname, salary, dateofbirth) VALUES (OLD.id, datetime(''now'', ''localtime''), ''Delete'', OLD.lastname, OLD.firstname, OLD.salary, OLD.dateofbirth); '+
    'END;'
    );
end;



procedure Form1_bUpdate_OnClick (Sender: string; var Cancel: boolean);
begin
    if Form1.cbEmp.dbItemID = -1 then Form1.GridLogs.dbFilter := '' else Form1.GridLogs.dbFilter := 'ParentId='+Form1.cbEmp.sqlValue;
    Form1.GridLogs.dbUpdate;
end;


procedure frmEmployee_OnShow (Sender: string; Action: string);
begin
    if frmEmployee.bSave.dbGeneralTableId <> -1 then
    begin
        frmEmployee.GridLogs.dbFilter := 'ParentId='+IntToStr(frmEmployee.bSave.dbGeneralTableId);
        frmEmployee.GridLogs.dbUpdate;
    end else
    begin
        frmEmployee.GridLogs.ClearRows;
    end;
end;



Проект с примером:

MinDate устанавливает не текущую дату, устанавливает минимальную дату которую можно будет выбрать в компоненте.
Установить текущую дату можно так

Form1.DateTimePicker1.MinDate := now;

Здравствуйте.


Как скрыть меню можете посмотреть здесь
http://myvisualdatabase.com/forum/viewtopic.php?id=1091



В остальном я могу помочь с решением только конкретных вопросов.

3,062

(5 replies, posted in Russian)

какого либо отдельного инструментария для скриптов не предусмотрено.

Можно с помощью вычисляемого поля отформатировать время как необходимо

DATE_FORMAT(timefield,"%H:%i")

https://www.w3schools.com/sql/func_mysq … format.asp

3,064

(4 replies, posted in General)

Unfortunately I can't understand the problem.

3,065

(5 replies, posted in Russian)

vaattikarjalainen wrote:

Как добавить SQL запрос в скрипт (на моем примере)? И что почитать, какой инструментарий лучше использовать?
Заранее, спасибо!

для использования SQL запросов в скрите предусмотрены функции SQLExecute и SQLQuery
Инструментарий для чего?

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

Здравствуйте.



Пришлите пожалуйста ваш проект на support@drive-software.com со ссылкой на данную тему и с подробным описанием проблемы.

3,068

(5 replies, posted in Russian)

Здравствуйте.


Ошибка из за вычисляемого поля "Imya.Поле"
при использовании запросов в вычисляемом поле, его необходимо взять в скобки. Также запрос должен возвращать только один столбец и только одно значение, пример правильного выч. поля для вашего примера

(SELECT Doljnost.Должность FROM Doljnost WHERE Doljnost.id=1) 

или так

(SELECT Doljnost.Должность FROM Doljnost WHERE Doljnost.id=Imya.id_Doljnost) 

Здравствуйте.


В таблице Rabotnik сделайте вычисляемое поле "Общ. КТУ" таким:

(
    (SELECT KTU.КТУ FROM KTU WHERE KTU.id=Rabotnik.id_KTU) 
    *
    (SELECT KKU.ККУ FROM KKU WHERE KKU.id=Rabotnik.id_KKU) 
)     

3,070

(1 replies, posted in General)

Hello.


Unfortunately I can't understand your question, please provide more details.


Thanks.

3,071

(7 replies, posted in General)

I have replied to your e-mail.

3,072

(9 replies, posted in Russian)

jonibek wrote:

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

Доработал пример, теперь можно указывать поля, по которым нужно проверять дубликаты
http://myvisualdatabase.com/forum/viewt … 566#p21566

Webcam integration using ffmpeg.exe utility

CONST

// setting of webcam
WEBCAM_NAME = 'USBWebCam'; // YOU NEED TO KNOW YOUR WEB CAM NAME!
WEBCAM_RESOLUTION = '1280x720';



procedure Form1_OnShow (Sender: string; Action: string);
begin
    ClearShotFolder;
end;

procedure frmEmployee_Button3_OnClick (Sender: string; var Cancel: boolean);
var
    pathShot: string;
    sShotFile: string;
begin
    frmEmployee.Button3.Enabled := False;
    pathShot := ExtractFilePath(Application.Exename)+'shot\';
    sShotFile := 'shot_'+FormatDateTime('ddmmyyyy_hhmmss', now)+'.jpg';

    OpenFile('-f dshow -s '+WEBCAM_RESOLUTION+' -i video="'+WEBCAM_NAME+'" -f image2 "'+pathShot+sShotFile+'"', 'ffmpeg.exe');


    Sleep(3000);
    if FileExists(pathShot+sShotFile) then
    begin
        frmEmployee.imgPhoto.LoadPicture(pathShot+sShotFile);
        frmEmployee.imgPhoto.dbFileName := pathShot+sShotFile;
        frmEmployee.imgPhoto.dbImageIsChanged := True;
    end;

    frmEmployee.Button3.Enabled := True;
end;





procedure Form1_bWebRes_OnClick (Sender: string; var Cancel: boolean);
begin
    OpenFile('/K ffmpeg.exe -f dshow -list_options true -i video="'+WEBCAM_NAME+'"', 'cmd.exe'); // list of resolutions
end;

procedure Form1_bListCams_OnClick (Sender: string; var Cancel: boolean);
begin
    OpenFile('/K ffmpeg.exe -list_devices true -f dshow -i dummy', 'cmd.exe'); // list of devices
end;



procedure ClearShotFolder;
var
    sl: TStringList;
    i,c: integer;
    pathShot: string;
begin
    pathShot := ExtractFilePath(Application.Exename)+'shot\';

    sl := TStringList.Create;
    sl.Text := GetFilesList(pathShot);

    // delete all files
    c := sl.Count-1;
    for i := 0 to c do
        if not DeleteFile(sl[i]) then ShowMessage('Can''t remove file '+sl[i]);

    sl.Free;
end;


Example:
http://myvisualdatabase.com/download/WebCam2.zip

3,074

(15 replies, posted in Script)

Hello.


I made an example for you with using ffmpeg.exe
http://myvisualdatabase.com/download/WebCam2.zip

3,075

(7 replies, posted in General)

I got it.