876

(1 replies, posted in Russian)

senseyesenseye1983 wrote:

Возможен ли такой сценарий в MVDB?

При нажатии на таблицу осуществляем поиск через textbox ( его можно срыть )
dbgrid.datasource.dataset.locate ?

Нет, через скрипты нет доступа к свойству datasource у таблицы

Вы подробней опишите, что вы хотите искать и для чего. У грида есть встроенный поиск, доступный через всплывающее меню.

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

877

(13 replies, posted in Russian)

senseyesenseye1983 wrote:
DriveSoft wrote:

Переделал немного проект для MySQL

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

Можно создать свой календарь с любыми цветами:

https://1.bp.blogspot.com/-lcuwODRjxlg/YUH32J987_I/AAAAAAAAIZk/ZGqW9yE0_Lociwd_TWek-ErDzt5lHUpHwCLcBGAsYHQ/w640-h482/%25D0%25B8%25D0%25B7%25D0%25BE%25D0%25B1%25D1%2580%25D0%25B0%25D0%25B6%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5_2021-09-15_164041.png

https://createmyvisualdatabaseapp.blogs … /ui-4.html

878

(16 replies, posted in General)

Guys, all this will not work with OneDrive, since synchronization with the cloud is at the file level, not the record. Database editing is editing a local copy. Therefore, if two users simultaneously edit the base, then the result of editing one will overwrite the result of the other. Don't reinvent the wheel, use MySQL server.

879

(6 replies, posted in General)

try this code

procedure Default_OnClose (Sender: TObject; Action: string);
var
  tmpForm:TAForm;
begin
  tmpForm := TAForm(Sender);
  if tmpForm.CalledForm<> nil then
    tmpForm.CalledForm.Show
end;

procedure Default_OnShow (Sender: TObject; Action: string);
var
  tmpForm:TAForm;
begin
  tmpForm := TAForm(Sender);
  if tmpForm.CalledForm<> nil then
    tmpForm.CalledForm.Hide;
end;

procedure Init;
var
  tmpForm: TAForm;
  i: integer;
begin
  for i := 0 to Screen.FormCount - 1 do
  begin
    tmpForm := TAForm(Screen.Forms[i]);
    if tmpForm.dbOnClose = '' then
      tmpForm.OnClose := 'Default_OnClose';
    if tmpForm.dbOnShow = '' then
      tmpForm.OnShow := 'Default_OnShow';
  end;
end;

procedure q_OnShow (Sender: TObject; Action: string);
begin
  // if such handler already exists, you need to add a call to the default handler
  Default_OnShow (Sender, Action);
  ShowMessage('Show');
end;

begin
  Init;
end.

880

(6 replies, posted in General)

sonixax wrote:

Thank you for the solution,
did top level images ignore transparent areas as hotspots?

All logic is implemented when analyzing the color of the map. For example, white color on a map might match a transparent color on a top-level image.

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


OnClick  - вытащить имя удаляемого файла из базы, как указано в вашем примере, с учетом того, что к имени файла из базы нужно добавить ваш путь хранения

FileName:= SQLExecute ('Select file_filename From Anketa Where id='+Anketa.TableGrid1.sqlValue);
FileName:= ExtractFileDir (Application.ExeName)+'\files\'+FileName;

OnAfterClick - удалить файл командой, указанной sibprogsisten


DeleteFile(FileName);

Переменную FileName объявите  глобальной.

MasrGo!


https://1.bp.blogspot.com/-rlIBZqfpVUw/YVbN0nRdkgI/AAAAAAAAIkg/Xgizq6-OtDEV2pegK1wmLdQY4_VBKh1TACLcBGAsYHQ/s1200/%25D0%25BA%25D0%25B0%25D1%2580%25D1%2582%25D0%25B0%2B%25D0%25BC%25D0%25B0%25D1%2580%25D1%2581%25D0%25B0.jpg


В начале века я работал в команде Quazar Studio, которая занималась созданием игровых проектов. Это было очень увлекательно, хотя и рискованно: первый проект редко бывает успешным. Но нам повезло и "Хроники Тарр: Призраки звёзд" был издан "Акеллой", а фанаты космических симуляторов получили возможность погрузиться в яркое космическое приключение с кинематографическим видеорядом и драматическим сюжетом. Я часто вспоминаю наш разговор с Тимуром Лазаренко - руководителем команды, когда при нашем знакомстве я рассказывал о том, чем я раньше занимался, а он смешно морщился и говорил: "а... скучные базы данных". С тех пор я изо всех сил стараюсь, чтобы базы данных, с которыми я работаю, не были скучными.


Читать полностью: https://createmyvisualdatabaseapp.blogs … arsgo.html

883

(6 replies, posted in General)

I have no ready-made solution. I can only offer an idea of implementation.


You will need two large pictures. One for the front of the button panel, which will display your buttons of any configuration. The second is with button map. In this map, each button must have its own color. When you click on the first picture, you see where you hit the map. And, if there is a color at this point, then by this color we process the pressing of the corresponding button.

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

indigen wrote:
k245 wrote:

В дереве компонентов отображать иерархию по свойству Parent, чтобы было видно вложенность компонентов.

P.S. В настоящий момент они отображаются в иерархии по свойству Owner, что и так очевидно: у всех компонентов формы владельцем является форма.

Правой кнопкой по списку и выбрать вариант "дерево"

"На четвертый день плена Зоркий Сокол, увидев, что в хижине, где его держали бледнолицые, не было одной стены, сбежал...." 


Спасибо! Пользовался пару лет и не знал smile

3. Форма редактирования и кнопка наполнения данными


Одним из типовых решений в My Visual Database является форма с табличным представлением, на которой находятся кнопки: 1) заполнение данными табличного представления 2) открытие формы редактирования. Оказывается, между ними имеется связь, которая в некоторых случаях необходима для определения таблицы, которую вы собираетесь редактировать. И, если эта связь нарушена, то при открытии формы редактирования вы получаете загадочные ошибки со ссылками на строки внутренней реализации функции открытия формы редактирования.


В частности, если для заполнения данных вы использовали кнопку с функцией [SQL ЗАПРОС], то для корректной работы внутренних механизмов вы обязаны указать в свойстве "Главную таблицу базы данных в запросе" таблицу, запись из которой будет открыта на редактирование в форме редактирования. Это связано с тем, что алгоритм открытия формы редактирования ориентируется не на свойства кнопки сохранения данных, а на другие свойства: на настройку табличного представления или на  настройку кнопки для заполнения данными табличного представления.


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

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

886

(16 replies, posted in Script)

brian.zaballa wrote:

...You can also use the TIniFile...

The TIniFile file solution is good if you need different default settings for each user in a multi-user version of the program.

887

(16 replies, posted in Script)

derek wrote:

Hi Corey, Brian, Konstantin,

A different approach might be to simply hold a 'user default' field on each table where you want a default setting to be pre-set;  the default setting can be changed by the user. 
In the attached example, all new records take the user default settings, all existing records display the settings that were valid at the time they were created.
I'm not sure how often you envisage these default settings being changed (if at all) once they've been set but you need to exercise caution if they can be amended as it could get confusing with a mix of units.  Or do you plan to re-work all the old entries and convert them?
I'd also look at making use of parent comboboxes so that choices are more structured for the user.
I changed your project around a bit so I could more easily see what was happening but the principles are the same.
Derek.

Your solution is more elegant in terms of coding and queries. But in terms of data normalization, I would rather store references to values.

888

(16 replies, posted in Script)

It is necessary to create a DefaultSettings table and store one record in it with the default settings. You can open the DefaultSettings form like this:

procedure Form1_Button2_OnClick (Sender: TObject; var Cancel: boolean);
begin
  if SQLExecute('select count(*) from DefaultSettings ') = 0 then
    SQLExecute( 'insert into DefaultSettings (id) values (1) '); // add record with ID=1
  DefaultSettings.ShowRecord('DefaultSettings',1); // open record with ID=1
end;

889

(6 replies, posted in General)

Just use scripts:

Form1.Hide;  // hide Form1
...
Form2.Show;  // Show Form2
...
Form3.ShowRecord(); //  edit data
...
Form4.NewRecord(); //  add data 

Don't use modal form. Don't use action buttons to open forms, only scripts.

890

(2 replies, posted in General)

Most likely this happens when creating a new form, and you simply forget to set the property to "False". It often happens with me)). Add a script that, when launched, runs through all the application forms and sets the desired property to the buttons. Below is an example of such a procedure. It works provided that all buttons for saving are named the same, for example, btnSave

procedure Init;
var
  tmpForm: TAForm;
  tmpButton: TdbButton;
  i: integer;
begin
  for i := 0 to Screen.FormCount - 1 do
  begin
    tmpForm := TAForm(Screen.Forms[i]);
    tmpButton := TdbButton( tmpForm.FindComponent('btnSave') );
    if tmpButton <> nil then
      tmpButton.Default := False;
  end;
end;

...

begin
  Init;
end.

В библиотеку "My Visual Database" добавлена статья "Современный UI", в которой рассматриваются приёмы создания привлекательного и удобного пользовательского интерфейса для приложений, созданных в среде разработки My Visual Database (MVD). В статье приводятся исходные тексты для создания графических кнопок, панели инструментов, главного меню, календаря и чата. Данная статья была опубликована в блоге "Визуальное программирование" и дополнена полным исходным кодом описываемого проекта.

https://mvdlibrary.blogspot.com

Alexandr wrote:

Есть форма с двумя таблицами и форма для заполнения этих таблиц. Добавление новых записей происходит по одной кнопке, удаление также по одной кнопке. Проблема с редактированием записей..при редактировании создается новая запись, а не изменяется существующая...

Вопрос: как сделать чтобы редактировало записи также по одной кнопке?

Изменить процедуру:

procedure Form2_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
  maxID:string;
begin
   if Form2.dbAction = 'NewRecord' then
   begin
     // запись в таблицу prodavec
     SQLExecute('INSERT INTO prodavec (nameS) VALUES ("'+Form2.Edit2.Text+'")');
     // получаем id последней записи в таблице prodavec
     maxID:= SQLExecute ('select max(id) from prodavec');
     // запись в таблицу client
     SQLExecute('INSERT INTO client (name, id_prodavec) VALUES ("'+Form2.Edit1.Text+'", "'+maxID+'")');
   end;
   if Form2.dbAction = 'ShowRecord' then
   begin
     // запись в таблицу prodavec
     SQLExecute('UPDATE prodavec SET nameS = "'+Form2.Edit2.Text+'" WHERE id = '+Form2.edtIDProdavec.Text );
     // запись в таблицу client
     SQLExecute('UPDATE client SET name = "'+Form2.Edit1.Text+'" WHERE id = '+IntToStr(Form1.TableGrid1.dbItemID) );
   end;
   Form1.TableGrid1.dbUpdate;
   Form1.TableGrid2.dbUpdate;
   Form2.Close;
end;

На форме добавить поле:

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


Вот только всё это зря вы затеяли ))) У вас есть две таблицы - клиенты и продавцы. И связь между ними. Почему такая структура данных?  И зачем понадобилось двойное редактирование? На практике стараются так не делать, потому что реляционные СУБД плохо приспособлены для хранения наследования объектов. Могу предположить, что вы хотели бы иметь иерархию:


Клиенты
    Покупатели
    Продавцы
    ...

На практике Продавцы не отливаются от Покупателей или от Клиентов по набору признаков, поэтому не стоит для них создавать отдельные сущности (таблицы), оставьте одну таблицу Клиенты и, если вам очень надо как-то их отличать,  добавьте признаки "Покупатель" и "Продавец". Именно признаки флаги, а не справочник "Тип клиента", так как на практике один и тот же клиент может быть как покупателем, так и продавцом. Но всё зависит от вашего ТЗ.

Современный UI. Часть 5

https://1.bp.blogspot.com/-uAHFqRduZOU/YUl4s2rtYwI/AAAAAAAAIfE/m-oiwrRYVA0tJxDmzsQ8UA3x_aNPntYFwCLcBGAsYHQ/w640-h484/%25D0%25B8%25D0%25B7%25D0%25BE%25D0%25B1%25D1%2580%25D0%25B0%25D0%25B6%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5_2021-09-21_091617.png


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


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


Читать далее:  https://createmyvisualdatabaseapp.blogs … /ui-5.html

CDB wrote:

I'm very interested in this and I'm trying to follow along.


Is it possible just to post what icon represents what in the side bar? When I'm learning something new, I like my attempts to match those in the instructions. Once I understand what is happening then I experiment.


Does the Asian Hat = user , The filing cabinet = ?  , Secured File = ?, Bookmark =?


I assume the sun = Add, the 'I' = About, Chat = chat and Next month = Next Month.

This example is taken from a real-world application. The pictures are just to illustrate the principle. But, if you are interested, I can name which images are associated with what:
1. Documents of the "Sun" group
2. Documents of the "Gnomes" group
3. Documents on labor protection (regulatory documents)
4. Charter of the organization
5. Calendar
6. Chat
7. Directories
8. About the program
The complexity of the selection of images is that the set of images, although large, is finite, therefore there is not always a simple and exact correspondence between the symbol and the content. But if you draw icons yourself, then there are no such problems.

895

(9 replies, posted in Russian)

Лучше не стало - теперь пишет о необходимости купить лицензию )))

Современный UI. Часть 4

https://1.bp.blogspot.com/-lcuwODRjxlg/YUH32J987_I/AAAAAAAAIZk/ZGqW9yE0_Lociwd_TWek-ErDzt5lHUpHwCLcBGAsYHQ/w945-h600-p-k-no-nu/%25D0%25B8%25D0%25B7%25D0%25BE%25D0%25B1%25D1%2580%25D0%25B0%25D0%25B6%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5_2021-09-15_164041.png


Стандартный компонент для отображения календаря не вписывается в дизайн нашего приложения: он маленький, нельзя настроить его размер, да и подсветка ограничивается выделением фона каким-то бледным колером. Поэтому наш календарь мы создадим сами, с помощью меток (TdbLabel), изображений (TdbImage) и скриптов


Читать далее: https://createmyvisualdatabaseapp.blogs … /ui-4.html

897

(5 replies, posted in Russian)

vovka3003 wrote:

Возможно.

Подтверждаю: возможно и даже более чем )))

898

(9 replies, posted in Russian)

Приложение дальше редактирования логина не открывается

Современный UI. Часть 3


https://1.bp.blogspot.com/-V229EAWIMgU/YUH5sx0_xqI/AAAAAAAAIZs/LCezjXzf8ZMchXvUpLOyQsg9viiEstPiACLcBGAsYHQ/w640-h504/%25D0%25B8%25D0%25B7%25D0%25BE%25D0%25B1%25D1%2580%25D0%25B0%25D0%25B6%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5_2021-09-15_164836.png


Для редактирования таблицы на каждой форме с табличным представлением разместим панель с графическими элементами-кнопками: панель инструментов. Для анимации задействуем тот же механизм, что и у кнопок на панели главного меню: обработчики событий  MenuButton_OnMouseEnter и MenuButton_OnMouseLeave. А обработку нажатия сделаем свою. Её логика основана на ещё одном соглашении, а именно: на форме должны находиться невидимые кнопки (TdbButton), названия которых должны совпадать с названиями изображений кнопок панели инструментов.


Читать далее: https://createmyvisualdatabaseapp.blogs … /ui-3.html

2. Автообновление табличного представления после редактирования


Как вы знаете, после редактирования, добавления или удаления записи происходит обновление табличного представления на форме, из которой был осуществлен вызов формы редактирования. В большинстве случаев это очень удобно и логично: изменения сразу видны без лишних движений. Однако при большом числе записей это становится не очень удобным, так как обновление производится через полное обновление данных: новый запрос и перестройка визуального компонента.


Тут явно напрашивается оптимизация - при удалении записи можно удалить только одну строчку из табличного представления, а при редактировании - обновить одну строчку в табличном представлении. При добавлении универсального алгоритма определения, в какое именно место нужно добавить новую строчку нет, но, как мне кажется, добавлять можно в конец, главное на неё фокус передать. Хотя можно определить, по какому полю сейчас осуществляется сортировка и найти точное место для вставки добавленной строки.


В настоящий момент такую оптимизацию можно сделать вручную через скрипты только в случае, если таблица заполняется через SQL-запрос, так как только в этом случае не срабатывает автоматическое обновление табличного представления. Но лучше, если такая возможность была бы встроена, например, как опция в свойствах табличного представления.