1,151

(28 replies, posted in Russian)

Предлагаемые изменения в вашем проекте:

1,152

(28 replies, posted in Russian)

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

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=5931&download=0

Это для поиска по полям "Контакт", "email", "Городской", "Сотовый".  Если нужно сюда же добавить поля из связанных таблиц, то придется учить SQL и добавить нужные поля через запрос SELECT  smile


Я не собирался давать вам наставления или нравоучения, это привилегия для моих учеников. Вам - только советы:


1. Не используйте в названии полей кириллицу - это усложнит вам составление SQL-запросов.
2. Прочитайте книгу автора этой системы, там есть много из того, что вы ищите: http://myvisualdatabase.com/forum/viewtopic.php?id=2554

1,153

(187 replies, posted in General)

tcoton wrote:

How about opening MyVisualDatabase to plugins developed by the community? With a very strong validation process to make sure that data and privacy cannot be compromised, I think that would bring some awesome features.


If initially the project architecture was not designed for plug-ins, it is unlikely to be easy to screw this feature into a mature project. Specify what kind of plug-ins you want to see in this project? Visual components? Components for working with data (other DBMS)?


Usually a plugin replaces some standard module and differs from the rest only in appearance. Or the plugin uses API to expand the functionality of the system.


If I'm not mistaken, in the current implementation of script support, to add each new class, you need to rewrite the core of the program. I don’t even have an idea yet how this could be implemented, but the last word is up to the developer of this system.


In the meantime, you can use the standard DLL mechanism to expand functionality.

1,154

(28 replies, posted in Russian)

Artison wrote:

Обожаю такие ответы, сразу чувствуется, что вы программист именно так на форумах по программированию и отвечают. Спасибо конечно, но я прошу помощи с данным проектом. Без танцев с бубном и изучения SQL. Тем более, что мне это нужно всего один раз. Я же не так много прошу.

Обожаю такие просьбы: сделайте за меня мою работу; я не хочу разбираться и вникать, а уж тем более чему-то учиться; просто дайте мне то, что мне сейчас нужно.

1,155

(28 replies, posted in Russian)

Если хотите иметь расширенный функционал, надо изучать SQL smile
Для решения вашей задачи вам понадобится вычисляемое поле, в котором будут присутствовать текстовые данные из всех полей, по которым вы хотите искать, например, такое:


( coalesce( name, '' ) || ' ' || coalesce( phone, '' ) || ' ' || coalesce( e_mail, '' ) )

функция coalesce() нужна для того, чтобы предотвратить превращение результата в null, если в записи отсутствует какое-то из значений в искомых полях.  https://www.sqlite.org/lang_corefunc.html


Это поле вы можете использовать при настройке фильтра на форме, в свойстве Filter не забудьте прописать %s%, чтобы поиск был по вхождению.

1,156

(3 replies, posted in Russian)

Возможно, требуется обновление до последней версии:


http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=5926&download=0

1,157

(9 replies, posted in FAQ)

sibprogsistem wrote:

может я не правельно понимаю?  но у меня TextHint отображает нормально (без PasswordChar).

Действительно, после обновления до последней версии 5.7 beta проблема решилась!  Спасибо Дмитрию smile

1,158

(3 replies, posted in Russian)

Используйте функцию IncMonth() - она возвращает исходную дату, увеличенную  на нужное количество месяцев.

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=5925&download=0

1,159

(9 replies, posted in FAQ)

sibprogsistem wrote:

в этом архиве 18 примеров  формы авторизации...

Хорошая работа!  Интересные и разнообразные дизайнерские решения.


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

begin
  Form1.DoubleBuffered := true;
end.

Если у поля для ввода пароля установить свойство PasswordChar, то TextHint также будет отображаться звездочками. Но тут без вмешательства разработчика не обойтись  (я пытался решить данную проблему скриптами, на ходу меняя свойство PasswordChar при вводе текста, но положительного эффекта не получил - контрол начинает вести себя неадекватно).

1,160

(9 replies, posted in Script)

procedure frmMain_Button3_OnClick (Sender: TObject; var Cancel: boolean);
var
  h: integer;
  Max: integer;
begin
  Openfile('cmd');
  // finding window's
  h := 0;
  Max := 20;
  while (h = 0) and (Max > 0) do
  begin
    h := FindWindow('', 'c:\windows\system32\cmd.exe'); // find window using caption
    Dec(Max);
    Sleep(50);
  end;
  if h <> 0 then
  begin
    SetWindowPos( h, 0, -7, -30, 0, 0, SWP_NOSIZE); // set position
    SetParent( FindWindow('', 'c:\windows\system32\cmd.exe'), frmMain.Panel1.Handle);
  end;
end;

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=5887&amp;download=0

1,161

(3 replies, posted in General)

An alternative solution may be to use the reverse log display chronology. Then the last entry will be the first in the memo.

Волшебная фраза "Загрузите проект" способна исправить 95% ошибок smile

sibprogsistem wrote:
vit007 wrote:

Заполнял условие и заметил странную реакцию скрипта на букву 'я' - меняется цвет ниже расположенного кода, как как-будто незакрытая скобка, если добавить еще - я, становится, норм, еще - опять открылась скобка...

If (frmAddNote.ComboBox1.Text='я') then

вот

просто после Я ставьте пробел..

Именно в этом примере пробел ставить не надо, а то условие не выполнится. Используйте chr(1103).  А в других случаях, если по смыслу можно, то добавьте пробел после буквы "я"  - это  известная и неисправимая проблема редактора.

Так и должно быть. 


Метод Show() делает окно видимым. Вы можете работать с ним, а можете с любыми другими видимыми окнами, переключаясь между ними..


Для того, чтобы работать только с одним окном, используйте метод ShowModal(), который открывает окно в модальном режиме. Кнопка "Показать форму" использует метод ShowModal().

1,165

(24 replies, posted in Russian)

DateTimePicker выдает дату, а не год, поэтому одними настройками компонентов тут не обойтись, потребуется написание кода и использование вычисляемого поля, о котором говорил derek. Код понадобится для преобразования даты в номер (года), который нужно поместить в невидимый Edit. А фильтр настроить по Edit для вычисляемого поля с номером года.

1,166

(187 replies, posted in General)

ekuaeshun13 wrote:

How do I run only one instance of an application.

This topic discusses suggestions for improving the program. Please create a separate topic or look for the answer to your question on this forum.

1,167

(187 replies, posted in General)

var
  ReallyClose:boolean = false;

procedure Form1_btnClose_OnClick (Sender: TObject; var Cancel: boolean);
begin
  ReallyClose := True;
  Form1.Close;
end;

procedure Form1_OnCloseQuery (Sender: TObject; var CanClose: Boolean);
begin
  if not ReallyClose then
  begin 
    SendMessage(Form1.Handle, $0112, 61472, 0); //WM_SYSCOMMAND - $0112, SC_MINIMIZE - 61472
    CanClose := False;
  end;
end;

begin
  Form1.OnCloseQuery := @Form1_OnCloseQuery;
end.

1. Потребуются две таблицы и связь один-ко-многим, (один огурец - несколько картинок)


cucumber
  id
  name


pict
  id
  id_cucumber
  image


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


P.S. Всё так сложно, потому что люди разные и у них разные потребности и представления о том, как все должно быть в этом мире устроено )))

1,169

(29 replies, posted in Russian)

Посмотрите эту ветку форума - там есть пример кода для "приклеивания" окон (в том числе окна браузера) на панель:  http://myvisualdatabase.com/forum/viewtopic.php?id=5614

1,170

(8 replies, posted in General)

domebil wrote:

C:\Windows\System32\calc.exe

You want to say that in MVD  can only glue 32-bit applications?

1,171

(8 replies, posted in General)

You can pin the window of any application inside the MVD application. See an example for a calculator. It can also be used for the browser.

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
    h: integer;
    Max: integer;
begin
      // run calculator
      OpenFile('calc.exe');

      // finding window's calculator
      h := 0;
      Max := 20;
      while (h = 0) and (Max > 0) do
      begin
          h := FindWindow('', 'Calculator'); // find window using caption
          Dec(Max);
          Sleep(50);
      end;

      // move the calculator to the Form1
      if h <> 0 then
      begin
          SetWindowPos( h, 0, 10, 10, 0, 0, SWP_NOSIZE); // set position x=10, y=10
          SetParent( FindWindow('', 'Calculator'), Form1.Handle);
      end;
end;

P.S. It's not work on Win10


http://myvisualdatabase.com/forum/viewtopic.php?id=2957

ffpereverzeff, клиент-серверная архитектура подразумевает наличие клиента и сервера. Используйте MySQL.


sibprogsistem,  вы все это на SQLite навесили? smile И что вы называете "Серверной частью"?

Забудьте про масштабирование в Windows. Серьёзно. Установите свойство Scaled := false, чтобы какой-нибудь пользователь не угробил ваш гениальный дизайн своими кривыми настройками масштабирования  )))


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

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=5817&amp;download=0

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

Пример, который использует два запроса для формирования кросс-таблицы:

procedure UpdateStatistic(Grid: TdbStringGridEx);
var
  WorkmanData: TDataSet;
  WorkmanData2: TDataSet;
  col, row : integer;
  s: string;
  ShiftCount: integer;
  ShiftProc: integer;
  MaxSP: integer;
begin
  SQLQuery('select workman.id, workman.code, ( select count(id) from shiftbook where shiftbook.id_workman = workman.id ) as shift from workman order by code',WorkmanData);
  SQLQuery('select * from workman order by code',WorkmanData2);

  MaxSP := SQLExecute('select IntersectionRate from config');

//  ShowMessage(  INTTOSTR(MaxSP) );

  Grid.Columns.Clear;
  try
     Grid.Columns.Add(TNxTextColumn);
   except
   end;
  Grid.Columns[0].Width := 40;
  Grid.FixedCols := 1;

  Grid.Columns[0].Color := clbtnFace;
  while not WorkmanData.Eof do
  begin
    try
      Grid.Columns.Add(TNxTextColumn);
    except
    end;
    Grid.Columns[Grid.Columns.count-1].Header.Caption := WorkmanData.FieldByName('code').asString;
    Grid.Columns[Grid.Columns.count-1].Color := clWhite;
    Grid.Columns[Grid.Columns.count-1].Width := 40;

    Grid.AddRow;
    Grid.Cells[0, Grid.RowCount-1] := WorkmanData.FieldByName('code').asString;

    //
    WorkManData.next;
  end;

  row := 0;
  WorkmanData.First;
  while not WorkmanData.Eof do
  begin
    col := 1;
    WorkmanData2.First;
    while not WorkmanData2.Eof do
    begin
      if WorkmanData.FieldByName('id').asString = WorkmanData2.FieldByName('id').asString then
        Grid.Cells[col, row] := '-'
      else
      begin
    // совместные выходы
      s := ' select count(*) from shiftbook left join shiftbook as sb2 on sb2.id_shift = shiftbook.id_shift'+
         ' where shiftbook.id_workman = '+WorkmanData.FieldByName('id').asString+' and sb2.id_workman = '+WorkmanData2.FieldByName('id').asString;
      ShiftCount := SQLExecute(s);
      if WorkManData.FieldByName('shift').asInteger = 0 then
        ShiftProc := 0
      else
        ShiftProc := trunc( ShiftCount / WorkManData.FieldByName('shift').asInteger * 100 );
      //
       Grid.Cells[col, row] := inttostr(ShiftProc)+'%';
       if ShiftProc > MaxSP then
         Grid.Cell[col, row].color := RGB(255,200,200);
      end;
      col := col + 1;
      WorkManData2.next;
    end;
    //
    row := row + 1;
    WorkManData.next;
  end;

end;

P.S. С помощью запроса тоже можно, но сам запрос придётся генерировать с помощью скриптов, а результат не всегда будет гарантирован.

Как говорится, нет заголовка - нет проблемы )))

BorderStyle := bsNone