Фильтрация по требованию


https://lh5.googleusercontent.com/d77qFTp3_89j1uG7udfASGmwsRO-89Fyk3mvfDiVqUq1pOX1UcfL_l9eOWWmKDd7mg1d5XnBYH7_uYc4MDd0Z2rNUZStJzs3X77X8cg4f-cgbGdKhCDKp2jxCucOPdOAp8jsKT_d


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


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


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

1,127

(4 replies, posted in Russian)

Альтернативный вариант - курс обучения: теория + практика:
http://myvisualdatabase.com/forum/viewtopic.php?id=4593

https://1.bp.blogspot.com/-4n-ej-gyj7s/XYiEV27oAhI/AAAAAAAABTs/JBHAVe73zM08zHNzq1Pn9nXL-r6Jb8QWgCLcBGAsYHQ/s1600/%25D0%259E%25D0%25B1%25D0%25BB%25D0%25BE%25D0%25B6%25D0%25BA%25D0%25B0%2B%2B%25D0%259D%25D0%25B0%25D1%2587%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D1%258B%25D0%25B9%2B%25D1%2583%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B5%25D0%25BD%25D1%258C%2B%2528pdf.io%2529.jpg

1,128

(20 replies, posted in Russian)

RasNikGal wrote:

Для локализации использую Radialix 3

Radialix - хорошая программа. Жаль, что проект закрылся.


Multilang - это другое, это для встраивания в проекты My Visual Database. Мне было бы интересно мнение о ней профессионального локализатора.

1,129

(20 replies, posted in Russian)

RasNikGal wrote:
k245 wrote:

RaeNikGal, топик называется "Предложения в программе" (что само по себе непонятно - какие-такие предложения имеются в программе?), а вот содержание похоже на багрепорты. Может, стоит сменить название топика? smile

на какое название?

"Локализация" 

Для предложений по улучшению MVD уже есть топик - http://myvisualdatabase.com/forum/viewtopic.php?id=146

newusr wrote:

Спасибо, в версии 6.4 запустился, а в 5.3 ошибка:
http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=6424&download=0

Это ещё одно изменение разработчика, на этот раз функции random(). Требует изменений в модуле secure.pas, строка 40 (41)


в версии до 5.3:

result := result + AAlphabet[trunc(random()*length(AAlphabet))+1];  

в версии 5.3 и старше:

result := result + AAlphabet[random(length(AAlphabet))+1];

1,131

(20 replies, posted in Russian)

Кстати, раз уж речь зашла о локализации, возможно, вам будет интересен инструмент для локализации приложений, созданных в My Visual Database - https://vk.com/topic-171642664_39527771

https://sun9-7.userapi.com/c847220/v847220153/20e8a0/OT6MEYcBFCQ.jpg

1,132

(20 replies, posted in Russian)

RaeNikGal, топик называется "Предложения в программе" (что само по себе непонятно - какие-такие предложения имеются в программе?), а вот содержание похоже на багрепорты. Может, стоит сменить название топика? smile

newusr wrote:

Здравствуйте.
Не запускается пример из проекта с аккордеоном ни в 5, ни в 6 версиях MVDB

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

В версии 5.х разработчик убрал свойство Visible у строк таблицы. Поэтому нужно заменить строку 361 в модуле mainmenu.pas

      MenuGrid.Row[tmpRow].Visible := false;

на

      MenuGrid.RowVisible(tmpRow) := false;
k245 wrote:

На примере трёх панелей. При клике по панели она "раскрывается", остальные "сворачиваются"

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

andrey.yugay wrote:

Доброго времени суток, можно вас попросить пример? Т.к. я никак не могу добиться что-бы панель опускалась ниже.

На примере трёх панелей. При клике по панели она "раскрывается", остальные "сворачиваются"

procedure Form1_Panel1_OnClick (Sender: TObject);
begin
  Form1.Panel1.height := 30;
  Form1.Panel2.height := 30;
  Form1.Panel3.height := 30;
  TdbPanel(Sender).height := 200;
end;

procedure Form1_OnShow (Sender: TObject; Action: string);
begin
  Form1.Panel1.align := alTop;
  Form1.Panel2.align := alTop;
  Form1.Panel3.align := alTop;
  Form1.Panel1.height := 30;
  Form1.Panel2.height := 30;
  Form1.Panel3.height := 30;
end;
andrey.yugay wrote:

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

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



Это тоже относительно несложно: панели размещаются на родительской панели, затем программно устанавливается Align := alTop  и пару скриптов для разворачивания/сворачивания (изменения высоты панели).


Красивый нестандартный интерфейс - это всегда искусство, на это никаких готовых компонент не напасёшься smile

Храним картинки в базе


https://lh6.googleusercontent.com/kksegbRwX6Vct6uXNGHWcKEYB7nrT7wGl8_cS2e_1yJE49XyCXaaotQhez7sqbAuHY7v_dc0TU_aTNDIOX1qIHGI1Fjh_jmeAolFQk9Hk9Bvuy5Ht7LH6RKY6qc5C4CD4wRC39ah


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


https://lh6.googleusercontent.com/bdS-y51ox5SktZubMxdPg_E4CC5U2W9cmSabmEmh-t8X4Kk2sjWpvFCE7H_uGuCIB5rW6lGs--vk3Zt4EI47Xt6Gehumb8q33SdWTDj364G-TksQHXF4h_sLQZILwbNEhq7OWTzr


Читать далее: https://createmyvisualdatabaseapp.blogs … w=magazine

andrey.yugay wrote:

Планируется ли реализация след:
Свернуть/Развернуть область; что-то наподобие панели, но с возможностью свернуть ее в плашку. соответственно нижний элемент при раскрытии опускается вниз, при сворачивании -вверх.

Если речь о меню-"аккордеоне", то его можно реализовать программно:

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

Полное описание с проектом находится в статье: https://vk.com/@createmyvisualdatabaseapp-akkordeon

Насколько мне известно, ни одна из версий не подписана. Усмирите вашего "защитника", пока он вас не замучил своей параноей ))))

1,140

(12 replies, posted in Russian)

agatlogic101 wrote:

попробовал применить, в итоге Вкладки исчезают, но и информация полностью на этой вкладке пропадает

как только вы программно переключите страницу, всё вернется на место:

Form1.PageControl1.ActivePageIndex := 1;
Form1.PageControl1.ActivePageIndex := 0;

Видимо, при изменении свойства страницы TabVisible меняется и свойство Visible

1,141

(12 replies, posted in Russian)

agatlogic101 wrote:

А что бы в панели поместить другую форму? Я попробовал по аналогии, но ничего не получилось
...

Попробуйте использовать эту процедуру:

// отобразить форму на панели
procedure ShowFormOnPanel(AForm:TAForm; APanel:TdbPanel);
var
  tmpGrid: TdbStringGridEx;
  tmpButton: TdbButton;
begin
  // отстёгиваем предыдущую форму от панели
  if ActiveForm <> nil then
  begin
    // если вызвали отображение текущей активной формы - ничего не делать
    if ActiveForm = AForm then
      exit;
    // спрятать текущую активную форму и отстегнуть её от панели
    ActiveForm.Visible := false;
    ActiveForm.Parent := nil;
    SetParent( ActiveForm.Handle, nil);
  end;
  if AForm.Visible then
  begin
    ShowMessage(S_ERR_SHOW_ON_PANEL);
  end
  else
  begin
    // подготавливаем форму
    AForm.borderStyle := bsNone;
    AForm.Align := alClient;
    // накидываем её на панель
    AForm.Parent := APanel;
    SetParent( AForm.Handle, APanel.Handle);
    AForm.visible := true;
    ActiveForm := AForm;
    // автоматизация
    // 1. нажатие кнопки для обновления табличных данных
    tmpButton := TdbButton(AForm.FindComponent('btnSearch'));
    if tmpButton<>nil then
    begin
      tmpButton.Click;
    end
    else
    begin
      // 2. обновление табличных данных, если кнопки нет
      tmpGrid := TdbStringGridEx(AForm.FindComponent('tgrMain'));
      if tmpGrid<>nil then
      begin
        tmpGrid.dbUpdate;
      end;
    end;
    UpdateMainFormCaption();
  end;
end;

Кроме отображения формы на панели она обновляет табличные данные на форме. Подробней о данном решении можно прочитать здесь: https://vk.com/@createmyvisualdatabasea … lya-dannyh    В конце статьи - ссылка на пример для скачивания.

1,142

(12 replies, posted in Russian)

agatlogic101 wrote:

Оу, с PageControl вариант, а возможно скрыть скриптом выбор вкладок? Что бы малых прямоугольников "Вкладка1" "Вкладка2" не было видно при запуске формы?

Процедура скрывает все ярлыки закладок у многостраничника:

procedure HideTabs( APageControl: TdbPageControl );
// скрыть закладки
var
  i: integer;
begin
  for i := 0 to APageControl.PageCount - 1 do
  begin
    APageControl.Pages[i].TabVisible := false;
  end;
end;

Пример использования:

HideTabs( Form1.PageControl1 );
agatlogic101 wrote:

В больших проектах, когда много форм, естественно всё долго грузится. Есть ли возможность отключать/заморозить некоторые формы, которые в данный момент при работе не нужны, что бы они не влияли на сохранение и загрузку. Что даст ускорение при работе с определённой частью программы. Иначе приходится создавать подпрограмму, в ней тестировать то, что нужно добавить, и после уже вручную копировать таблицы, формы, скрипт...
PS. С точки зрения пользователя, было бы 2 чекбокса на форме, вместо одного. 1 как и раньше скрывает форму в программе что бы она не мешалась, а вторая замораживает


Как показали мои наблюдения, задержку вызывает не создание форм, а выгребание данных для компонентов на форме.
И, если для таблиц данные выгребаются в момент открытия формы, то для комбиков - при подключении к БД. Для MySQL это можно регулировать, выполняя команду UpdateDatabase() в нужное время (например, после отображения формы-заставки).

      // вызываем автозаполение ComboBox-ов, но по отдельности для каждой таблицы
      tmpFileName := ExtractFileDir(ParamStr(0))+'\tables.ini';
      tmpTablesIni := TMemIniFile.Create( tmpFileName ); // для работы с этим файлом использовать TMemIniFile - он нормально работает с Unicode
      tmpList := TStringList.Create;
      try
        tmpTablesIni.ReadSections( tmpList );
        for i := 0 to tmpList.Count - 1 do
        begin
          ConnectionProgress( i/tmpList.Count, tmpList.Strings[i] ); // отобразить название таблицы
          Application.ProcessMessages;
          Sleep(100); // задержка, чтобы видно было ))
          UpdateDatabase(tmpList.Strings[i]);
        end;
      finally
        tmpList.Free;
        tmpTablesIni.Free;
        ConnectionProgress(-1,' ');
        // звуковое подтверждение окончания загрузки
        tmpSoundFileName := copy(ParamStr(0),1,length(ParamStr(0))-4)+'.wav';
        // можно ставить любой файл, а если надоест, то удалить его совсем
        if FileExists(tmpSoundFileName) then
          PlaySound( tmpSoundFileName );
      end;


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


P.S. Долгое время создания именно формы бывает, если на ней находится много графических элементов. Для себя я эту проблему решил созданием и загрузкой графического контента из базы после запуска программы, в момент отображения заставки. Это позволяет реализовать богатый UI: в примере форма содержит больше сотни графических элементов (кнопки с тремя состояниям на базе TdbImage)

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

sibprogsistem wrote:
procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
i:integer;
begin
  for i:=0 to Form1.TableGrid1.RowCount-1 do begin
      Form1.Memo1.Lines.Add(SQLExecute('SELECT id FROM qq WHERE id='+IntToStr(Form1.TableGrid1.dbIndexToID(i))));
      end;
end;

Зачем ID из базы тянуть? можно проще:


procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
  i:integer;
begin
  for i:=0 to Form1.TableGrid1.RowCount-1 do
    Form1.Memo1.Lines.Add( IntToStr(Form1.TableGrid1.dbIndexToID(i) );
end;

1,145

(2 replies, posted in Russian)

А зачем вы проверяете Parent у Sender?  Или вы используете обработчик MouseDown  не только для этих меток, но и для других?
Да и проверка

 if (TLabel) then

какая-то странная.То есть она ничего не проверяет )))  Для чего она нужна?

Если procedure MouseDown() используется только у меток, созданных программно, то никакие проверки не нужны:

procedure MouseDown(Sender: Tobject);
begin
    ShowMessage(TLabel(sender).Caption);
end;

Если вам нужно, чтобы клик срабатывал только для меток на панели (при условии, что обработчик назначен ещё каким-то меткам и другим компонентам), то так:

procedure MouseDown(Sender: Tobject);
var
  LPanel: TPanel;
begin
  LPanel := nil;
  if sender is TLabel then
  begin
    if TLabel(sender).Parent is TPanel then
      LPanel := TPanel(TLabel(sender).Parent);
      if  LPanel <> nil  then
      begin
        ShowMessage(TLabel(sender).Caption);
      end;
  end;
end;

1,146

(15 replies, posted in Russian)

vovka3003 wrote:

Можно и так, но визуально лучше воспринимается цепочка (имхо).

Пожалуй, соглашусь: две отдельные проверки - это надежней, так как не стоит полностью полагаться на неявные соглашения - в какой-то момент их могут поменять, и код перестанет работать.

abc52 wrote:

Ув.  Дмитрий !   


       У таблицы и полей есть названия, а в скриптах приходится

    обращаться к ячейкам через Form1.TableGrid1,Cells[c,r].


  А ведь самое простое Tb.Fd [row] - таблица.поле[строка]
 
  упростило бы написание скриптов значительно избавив от

    зависимости от ячеек,колонок при изменении порядка полей.


  Tb.Fd   встречается при настройке TableGrid1, а в скрипте

   как это использовать ?

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

const
  DATA_COL = 1;
...
frmMain.tgrData.Cells[ DATA_COL, y ]

1,148

(15 replies, posted in Russian)

sibprogsistem wrote:
vovka3003 wrote:

"And" = "then if"

в смысле заменить на then  if,  с начало получаем label а потом проверяем на parent?

Обычно по умолчанию включена оптимизация выполнения условий IF <выражение> AND <выражение>  - если первое выражение в условии равно FALSE, то второе не будет проверяться. Поэтому можно оставить так как есть.

1,149

(3 replies, posted in General)

Set property HeaderStyle = hsFlatBorder and use this code:

procedure frmMain_TableGrid1_OnChange (Sender: TObject);
begin
  frmMain.TableGrid1.Columns[0].Header.Color := clRed;
end;

You can change only header background color, header font color = table font color

1,150

(2 replies, posted in Script)

use SetLength( <DinamicArray>, <NewSize> ), this procedure keep data in array if it possible

var
  DA: array of string;
begin
...
  SetLength( DA, 10);
...
  SetLength( DA, 50);