751

(2 replies, posted in Reports)

I have created several procedures that allow you to call the report generator for displaying tabular data, as well as any others that are passed to it through parameters. That is, you can create a report without a database using only parameters.

https://createmyvisualdatabaseapp.blogs … st_14.html


https://lh3.googleusercontent.com/-BhA4RerPvCA/YE3PZFsORRI/AAAAAAAAFr8/YEIxlioIeV0hfraS1sZKgqWXpj8S8vd9QCLcBGAsYHQ/w640-h446/image.png


But you still have to create an application, since there are no other ways to access the FastReport libraries built into My Visual Database.

Нужен ваш проект. Причин может быть несколько.

В календаре дата всегда выбрана.

754

(8 replies, posted in General)

I wouldn't rely on this setting. At the most unexpected moment, she can let us down. If you find that the Table View Builder fails to produce the desired result, use SQL . This gives you full control over the result and allows you to optimize database queries. Yes, it's more complicated and requires learning the query language, but it's worth it.

joshuA wrote:

Привет к245,
Могу я узнать размеры (ширину и высоту) логотипа в вашем примере.
Спасибо!


Hi k245,
May I know the dimensions (width and height) for the logo in your example.
Thanks!

-joshuA

Размеры изображения 128х128, но вы можете менять всё: размеры и положение картинки, размеры формы логина, добавлять новые элементы. Только не нужно удалять элементы, которые задействованы в логике работы формы.


Image dimensions are 128x128, but you can change everything: image size and position, login form size, add new elements. Just do not need to remove the elements that are involved in the logic of the form.

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

0anion0 wrote:

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

Ps: я всего 4 дня с программой разбираюсь.


Евгений, за четыре дня такого вы не найдете ))).

procedure Init;
var
  tmpLabel:TLabel;
  tmpImage: TImage;
begin
  // Заменить надпись в заголовке
  frmdbCoreLogin.Caption := 'Моя программа v.1.0';
  // Заменить картинку
  tmpImage := TImage( frmdbCoreLogin.FindComponent('Image1') );
  tmpImage.Picture.LoadFromFile( ExtractFilePath( Application.ExeName ) +'logo.png' );
  // Добавить текст
  tmpLabel := TLabel.Create( frmdbCoreLogin );
  tmpLabel.Name := 'labVersion';
  tmpLabel.Parent := frmdbCoreLogin;
  tmpLabel.Left := 4;
  tmpLabel.Top := 4;
  tmpLabel.Caption := 'Version 1.0';
end;

begin
  Init;
end.

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


Тут можно почитать, как искать ответы на подобные вопросы: 
https://createmyvisualdatabaseapp.blogs … lorer.html

Значит нужно исправить сам отчет smile

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

{$MySQL disable_connectdialog}

begin
end.

вы так и не показали скрипт вызова ColorRowGrid() из обработчика OnAfterSort(). Боюсь, что вашего словесного описания недостаточно для поиска причины ошибки....


И ещё: если вы использовали BeginUpdate то нужен также EndUpdate() после завершения изменений грида. И я бы избавился от переменных c и q.

procedure ColorRowGrid (Grid:TdbStringGridEx;ColorEven,ColorOdd:TColor);
//Grid - Таблица для раскрашивания (Form1.TableGrid1)
//ColorEven - цвет четных строк
//ColorOdd - цвет нечетных строк
var
  iRow: integer;
  iCol: integer;
begin
   Grid.BeginUpdate;
   for iRow := 0 to Grid.RowCount - 1 do
      for iCol := 0 to Grid.Columns.Count-1 do
      begin
         if iRow mod 2 = 0 then 
           Grid.Cell[iCol,iRow].Color := ColorEven
         else
           Grid.Cell[iCol,iRow].Color := ColorOdd;
      end;
  Grid.EndUpdate;
end;
0anion0 wrote:

Кстати да, одним запросом будет лучше. Благодарю.
но у меня в там есть Null, мне кажется это помешает.

Если кажется, то попробуйте - практика укрепит вашу веру в силу SQL smile  Если не получится, покажите ваш запрос

Устройство вашего отчета и то, как вы его вызываете, нужно угадать?

0anion0 wrote:

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

Если использовать как в примере alex842 то при сортировки по какой либо колонке появляется ошибка.
Функцию вешаю на событие OnChange и OnAfterSort/

Ошибку в студию!

Моё предварительное предположение, что  функцию ColorRowGrid() нужно не "вешать", а "вызывать из" smile

Эволюция абстракций


https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYfbGtTFNYW45LDfGlyWUVaF7xqZXuquTjmtVfqPtFryNPuzgS4Nt1zMvf86vRLbpvhfPVU9j-bf1BuiDpbs5kvqVDhlG6EVIKB8DZ3w-HTxFwK51NZLSmmBM3EbKQlAEDIi-MphRCujZeZP6BhzcJFRUU1WygNhegnZN-1mII_k8uQL2QI0AocRtp/w640-h360/%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_2022-05-25_144651057.png


Эту статью можно рассматривать как вступление в тему “Разработка программ” без уточнения, на каком именно языке, хотя статья базируется на эволюции вполне определенного языка программирования. По форме статья напоминает глоссарий, который выстроен в хронологической последовательности.


Читать: https://createmyvisualdatabaseapp.blogs … st_25.html

Привет jean.brezhonek, 0anion0 !

Решение рабочее, но я рекомендую получать данные одним запросом

var
  tmpDataSet: TDataSet;
  tmpSQL: string;
...
  // один запрос, к той же таблице, что отображается в табличном представлении на форме
  tmpSQL :=  'SELECT table1.Field1  data1, table1.Field2 data2, table2.Field1 data3 ... '+ // нужные данные с алиасами для полей
    ' FROM table 1 LEFT JOIN table2 .... '+ // главная таблица и остальные по зависимостям (если есть)
    ' WHERE table1.id = '+IIntToStr(Form1.TableGrid1.dbItemID); // фильтр по главной таблице
  SQLQuery(tmpSQL,tmpDataSet);
  // нужные данные в датасете, вытаскиваем по алиасам
  Form1.Label1.Caption := tmpDataSet.FieldByName('data1').asString;
  Form1.Label2.Caption := tmpDataSet.FieldByName('data2').asString;
  ...
  // TODO: эту часть можно сделать циклом, если использовать соглашение по наименованию компонентов отображения и алиасов
  Form1.LabelN.Caption := tmpDataSet.FieldByName('dataN').asString;
  // обязательно освобождаем ресурсы
  tmpDataSet.Free;

765

(16 replies, posted in FAQ)

MVD is RAD. ObjectPascal-based scripting language is used. In some cases, knowledge of the SQL is required.

sibprogsistem wrote:

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

В рамках MVDB - нет. Можно ли сделать свой стиль для отдельных компонентов? Вряд ли, так как меняются свойства базовых классов

Хамелеон


https://blogger.googleusercontent.com/img/a/AVvXsEi5mZjmWcVgFaJbl9JWJ-RS_UxRkmYgSb7qYpzFAxipc-Ixd2JhSsuvvJsE3fKvSi8QWuyKdTgFzyvC1oLsirV1jvqtDOrF7Ux9v7dC2OkN0xQhv0apMBYcv-z8gzIAJjogUIA3zB4RyK2yBp6VRIvJ7wfoo59uWWeco0aYeWsZ5NRnx1rpl0OBTpGz=w640-h386


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


Рассмотрим возможность программного изменения стиля оформления конечного приложения, а также расширения палитры стилей.


Читать: https://createmyvisualdatabaseapp.blogs … -post.html

768

(1 replies, posted in General)

The PIVOT command is not standard SQL command, it is supported only by some DBMS, SQLite and MySQL are not among them.


But you can make a similar view of the data using a script that will create a table view with the desired number of columns and rows.
This is not often ordered, I don’t have a ready-made simple example. All I can say is that you will need three SQL queries: 1) get a list of headers for rows 2) get a list of headers for columns 3) get data.

Key methods:

1) add Column for Row Names

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

2) add a column for data

    
    try
      Grid.Columns.Add(TNxTextColumn);
    except
    end;
    Grid.Columns[Grid.Columns.count-1].Header.Caption := ColData.FieldByName('name').asString;
    Grid.Columns[Grid.Columns.count-1].Color := clWhite;
    Grid.Columns[Grid.Columns.count-1].Width := 40;

3) add a row

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

4) fill the cell with data.

       Grid.Cells[col, row] := CellData;

769

(13 replies, posted in Russian)

konstruktor wrote:

При удалении записи файла из базы данных не удаляется сам файл  в папке files.  Что делать?

Ничего не делать. Стандартная система хранения файлов позволяет один и тот же файл добавлять в разные записи БД. Поэтому, если вы физически удалите такой файл, то он станет недоступным в другой записи. Но, если у вас стоит проверка на уникальность, тогда удаляйте, конечно... Скриптом. Но тут свои нюансы. Например, если вы удаляете запись кнопкой с функцией "Удаление". Тогда в обработчике OnClick нужно запомнить путь к удаляемому файлу, а в обработчике onAfterClick удалить файл. Либо полностью написать скрипт удаления по схеме, предложенной sibprogsistem и не использовать функцию кнопки "Удаление". Вот только я бы рекомендовал удалять файл после удаления записи, так как возможно запись не удастся удалить из-за контроля целостности данных (наличия ссылок на неё без каскадного удаления)

770

(13 replies, posted in Russian)

Landropa wrote:

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

Файлы удаляет ОС, поэтому по умолчанию они перемещаются в корзину.

771

(8 replies, posted in General)

sibprogsistem wrote:
k245 wrote:

You can draw graphical primitives on the shape canvas or panel. But hardly anyone will provide you with ready-made scripts for drawing diagrams.


Specifically, in your example, I would use the TShape and TLabel components.

не, ну колбу-то я нарисовать могу
я не понимаю как закрашивать ее только на определенный процент
http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=8638&download=0

Пожалуй, для "колбы" лучше использовать PNG картинку с прозрачной частью - внутренностью "колбы", а для "заливки" использовать TShape или TLabel.

Perhaps, for the "tank" it is better to use a PNG image with a transparent part - the inside of the "tank", and for the "fill" use a TShape or a TLabel.
Or abandon the rounding and use the example of Destiny )))

772

(8 replies, posted in General)

You can draw graphical primitives on the shape canvas or panel. But hardly anyone will provide you with ready-made scripts for drawing diagrams.


Specifically, in your example, I would use the TShape and TLabel components.

773

(8 replies, posted in General)

derek wrote:

Привет Константин,
Я думал, что должен быть способ сделать это, но не мог получить правильный синтаксис.
Теперь я вижу, что мне нужно было сделать
       начинать
         TdbEdit( tmpForm.Components(j) ).OnEnter := @highlighton;
         TdbEdit( tmpForm.Components(j) ).OnExit := @highlightoff;
       конец;
Спасибо за это, это будет полезно для многих вещей.
Derek.
.
I thought there must be a way of doing this but couldn't get the correct syntax.
Now I see what I was needing to do
      begin
        TdbEdit( tmpForm.Components(j) ).OnEnter :=  @highlighton;
        TdbEdit( tmpForm.Components(j) ).OnExit :=  @highlightoff;
      end;
Thanks for this, it will be useful for many things.

It is more correct to cast each object to its true type:

if tmpForm.Components(j) is TdbEdit then
begin
  TdbEdit( tmpForm.Components(j) ).OnEnter :=  @highlighton;
  TdbEdit( tmpForm.Components(j) ).OnExit :=  @highlightoff;
end
else if tmpForm.Components(j) is TdbMemo then
begin
  TdbMemo( tmpForm.Components(j) ).OnEnter :=  @highlighton;
  TdbMemo( tmpForm.Components(j) ).OnExit :=  @highlightoff;
end
else if tmpForm.Components(j) is TdbComboBox then
begin
  TdbComboBox( tmpForm.Components(j) ).OnEnter :=  @highlighton;
  TdbComboBox( tmpForm.Components(j) ).OnExit :=  @highlightoff;
end;

774

(8 replies, posted in General)

derek wrote:

Hi Frank, K245,
Rather than trying to make the flashing cursor more prominent, a different approach might be to make the object that the flashing cursor is currently placed in more prominent.
A simple way to do that would be to change the object background colour when it's got focus (nb this doesn't work for datetimepickers (but I believe that's a Windows constraint rather than MVD)).
Please see the attached.
Derek.

The code works, but I wouldn't recommend ignoring the actual component class. I'm not sure if they are all related to TdbEdit )))


You can automate the assignment of handlers:

procedure highlighton (Sender: TObject);
begin
  tdbedit(sender).color := $00BEDD9F;
end;

procedure highlightoff (Sender: TObject);
begin
  tdbedit(sender).color := clwhite;
end;

procedure AutoAssign;
var
  i,j: integer;
  tmpForm: TForm;
begin
  for i:=0 to Screen.FormCount - 1 do
  begin
    tmpForm := Screen.Forms[i];
    for j := 0 to tmpForm.ComponentCount - 1 do
    begin
      if (tmpForm.Components(j) is TdbEdit) // это верно на 100%
      or (tmpForm.Components(j) is TdbMemo) // это неправильно, но работает )))
      or (tmpForm.Components(j) is TdbComboBox) // это неправильно, но тоже работает )))
      then
      begin
        TdbEdit( tmpForm.Components(j) ).OnEnter :=  @highlighton;
        TdbEdit( tmpForm.Components(j) ).OnExit :=  @highlightoff;
      end;
    end;
  end;
end;

begin
  AutoAssign;
end.

Не стоит обработку организовывать через цикл FOR, для получения нужных значений ID используйте запрос и процедуру SQLQuery, которая создает набор данных (экземпляр класса TDataSet)

var
  tmpDataSet: TDataSet;
begin
  SQLQuery('SELECT id FROM FIO',tmpDataSet);
  while not tmpDataSet.EOF do
  begin
    SQLExecute('INSERT INTO ZHYRNAL(data,id_FIO,zemlya,zarplata,dorogi) VALUES 
    ('+Nalog.DateTime.sqlDate+', '+tmpDataSet.FieldByName('id').asString+', '+Nalog.TarifZemlya.sqlValue+','+Nalog.TarifZarplata.sqlValue+','+Nalog.TarifDorogi.sqlValue+')' );
    tmpDataSet.Next;
  end;
  tmpDataSet.Free

Но, если всем нужно добавить одно и то же значение для всех, то это можно сделать одной SQL-командой:

SQLExecute('INSERT INTO ZHYRNAL(data,id_FIO,zemlya,zarplata,dorogi) SELECT '+Nalog.DateTime.sqlDate+', id , '+Nalog.TarifZemlya.sqlValue+','+Nalog.TarifZarplata.sqlValue+','+Nalog.TarifDorogi.sqlValue+' FROM FIO' );