vovka3003 wrote:

А разве в проге нет преобразования utf8<>win1251?

Как отдельной функции - нет.

pavlenko.vladimir.v wrote:

я помню при чтении ini возникала ошибка из-за строки? Вроде как первую строку не читает

TIniFile - не читает, потому как он работает с кодировкой ANSI
TMemIniFile - читает, потому как он работает с кодировкой UTF-8

pavlenko.vladimir.v wrote:
k245 wrote:

1. Метод TIniFile.ReadSectionValues не работает

должен работать, тут я применял его
https://myvisualdatabase.com/forum/view … hp?id=7125

Проверил ещё раз, действительно работает!  Значит, это у меня в коде какой-то баг был, и остаётся только одна новость -  хорошая, про TMemIniFile )))

Избавляемся от костылей!

У меня есть две новости: одна - плохая, другая - хорошая.


1. Метод TIniFile.ReadSectionValues не работает
2. В MVDB есть класс TMemIniFile, который работает с ini-фалом в кодировке UTF-8.


Продолжая идею sparrow о необходимости разовой загрузки формул вычисляемых полей, доделал InlineCalcFields(), костыли отнес в больничку )))


var
  DB_CalcFields: TStringList;  // список хранимых полей из файла tables.ini


procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
  tmpSQL: string;
begin
  tmpSQL :=
    'Select '+
    ' "$checkbox",'+
    ' "$autoinc",'+
    '  data, '+
    '  {test.data_calc} '+ // надо указывать таблицу и вычисляемоте поле
    'from '+
    '  test ';
  tmpSQL := InlineCalcFields(tmpSQL);
  TdbButton(Sender).dbSQL := tmpSQL;
end;

function InlineCalcFields( ASQL:string ):string;
var
  tmpStartPos: integer;
  tmpEndPos: integer;
  tmpCalcField: string;
  tmpFieldSQL: string;
  tmpPlaceHolder: string;
begin
  try
    repeat
      tmpStartPos := Pos( '{',ASQL);
      if tmpStartPos = 0 then
        exit;
      tmpEndPos := Pos('}',ASQL);
      if tmpEndPos = 0 then
        exit;
      //
      tmpCalcField := copy(ASQL,tmpStartPos+1,tmpEndPos-tmpStartPos-1);
      if DB_CalcFields.IndexOfName(tmpCalcField) < 0 then
      begin
        ShowMessage('Вычисляемое поле '+tmpCalcField+' не найдено!');
        exit;
      end;
      tmpFieldSQL := DB_CalcFields.Values(tmpCalcField);
      tmpFieldSQL := ReplaceStr( tmpFieldSQL, '\r' ,'');
      tmpFieldSQL := ReplaceStr( tmpFieldSQL, '\n' ,'');
      tmpFieldSQL := ReplaceStr( tmpFieldSQL, '^equally^' ,'=');
      tmpPlaceHolder := '{'+tmpCalcField+'}';
      ASQL := ReplaceStr( ASQL, tmpPlaceHolder ,tmpFieldSQL  );
    until 1=0;
  finally
    Result := ASQL;
  end;
end;

procedure ReadCalcFields;
// заполняем список вычисляемых полей DB_CalcFields
var
  tmpIniFile: TMemIniFile;
  tmpList:TStringList;
  tmpList2:TStringList;
  s: string;
  i: integer;
  j: integer;
  tmpTableName: string;
  tmpFieldName: string;
begin
  DB_CalcFields := TStringList.Create;
  tmpList := TStringList.Create;
  tmpList2 := TStringList.Create;
  tmpIniFile := TMemIniFile.Create(ExtractFilePath(Application.ExeName)+'tables.ini');
  try
    tmpIniFile.ReadSections(tmpList);
    for i:=0 to tmpList.Count - 1 do
    begin
      tmpTableName := tmpList.Strings[i];
      tmpIniFile.ReadSectionValues( tmpTableName, tmpList2 );
      for j := 0 to tmpList2.Count - 1 do
      begin
        tmpFieldName := tmpList2.Names[j];
        if copy(tmpFieldName,1,1) = '%' then
        begin
          DB_CalcFields.Add( tmpTableName+'.'+copy( tmpList2.Strings[j],2,Length(tmpList2.Strings[j])-1 ) );
        end
      end;
    end;
  finally
    tmpIniFile.Free;
    tmpList.Free;
    tmpList2.Free;
  end;
end;

begin
  ReadCalcFields;
end.

205

(7 replies, posted in General)

jean.brezhonek wrote:

K245 : Thanks for your help.I'm about to send you a new set of French translations.

Mon ami, merci de m'avoir rappelé ma promesse. J’ai eu le plaisir de publier votre dernière traduction et j’attends avec impatience de nouvelles.
Formatage du code
https://k245.ru/wp-content/uploads/2022/08/Vyravnivanie.jpg
https://k245.ru/fr/mvdb-fr/formatage-du-code.html

I really appreciate your contribution to the common cause of popularizing the My Visual Database.

206

(7 replies, posted in General)

Calculated field in SQL query, InlineCalcFields() - https://myvisualdatabase.com/forum/view … hp?id=8704

ghdjndy wrote:

Можно ли включить помощь в программу?

https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=9946&amp;download=0
В программе есть прямая ссылка на документацию (http://myvisualdatabase.com/help_ru/)  и видеоуроки.http://drive-software.com/myvisualdatab … html#video

Или вы спрашиваете, как подключить ваш собственный файл помощи к вашей программе? Тогда вам сюда: https://k245.ru/mvdb/help.html

Действительно.... тогда добавляем одну строчку в InlineCalcFields()


procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
  tmpSQL: string;
begin
  tmpSQL :=
    'Select '+
    '  data, '+
    '  {test.data_calc} '+ // надо указывать таблицу и вычисляемое поле
    'from '+
    '  test ';
  tmpSQL := InlineCalcFields(tmpSQL);
  TdbButton(Sender).dbSQL := tmpSQL;
end;

function InlineCalcFields( ASQL:string ):string;
var
  tmpStartPos: integer;
  tmpEndPos: integer;
  tmpDotPos: integer;
  tmpCalcField: string;
  tmpFieldSQL: string;
  tmpTableName: string;
  tmpPlaceHolder: string;
  tmpIniFile: TIniFile;
  tmpFileName: string;
  tmpFileName2: string;
  tmpList:TStringList;
  tmpList2:TStringList;
  s: string;
begin
  // сюрприз! файл tables.ini записан в кодировке UTF-8, с которой TIniFile работает некорректно - пропускает первый раздел.
  // есть два варианта: преобразовать tables.ini в ANSI или не использовать стандартный TIniFile, а писать свой
  // --- преобразовать файл (вынести этот костыль за пределы функции, чтобы вызывать только один раз...)
  tmpFileName := ExtractFilePath(Application.ExeName)+'tables.ini';
  tmpFileName2 := ExtractFilePath(Application.ExeName)+'tables.dat';
  tmpList := TStringList.Create;
  tmpList2 := TStringList.Create;
  tmpList.LoadFromFile(tmpFileName);
  s := tmpList.Text;
  tmpList2.Text := Trim(s);
  tmpList2.SaveToFileANSI(tmpFileName2);
  tmpList.Free;
  tmpList2.Free;
  ////////////////////////////////////////////////////////////////////////////////////
  tmpIniFile := TIniFile.Create( tmpFileName2 );
  try
    repeat
      tmpStartPos := Pos( '{',ASQL);
      if tmpStartPos = 0 then
        exit;
      tmpEndPos := Pos('}',ASQL);
      if tmpEndPos = 0 then
        exit;
      // таблица.поля
      tmpCalcField := copy(ASQL,tmpStartPos+1,tmpEndPos-tmpStartPos-1);
      tmpDotPos := Pos( '.',tmpCalcField);
      if tmpDotPos = 0 then
        exit;
      tmpTableName := copy(tmpCalcField,1,tmpDotPos-1);
      delete(tmpCalcField,1,tmpDotPos);
      tmpFieldSQL := tmpIniFile.ReadString(tmpTableName,'%'+tmpCalcField,'');
      tmpFieldSQL := ReplaceStr( tmpFieldSQL, '\r' ,'');
      tmpFieldSQL := ReplaceStr( tmpFieldSQL, '\n' ,'');
      tmpFieldSQL := ReplaceStr( tmpFieldSQL, '^equally^' ,'=');
      tmpPlaceHolder := '{'+tmpTableName+'.'+tmpCalcField+'}';
      ASQL := ReplaceStr( ASQL, tmpPlaceHolder ,tmpFieldSQL  );
    until 1=0;
  finally
    tmpIniFile.Free;
    Result := ASQL;
  end;
end;

sparrow, благодарю, вы как всегда очень внимательны и зорко следите за правильностью кода, словно eagle  smile

sparrow wrote:
k245 wrote:

... написал функцию InlineCalcFields(), которая автоматически подставляет вычисляемое поле в SQL, но... получились костыли... впрочем, судите сами, может, кому понравится:

Константин как вариант пример имеет право на жизнь но не хватает одной вещи, обработки "=" (^equally^)

Прошу уточнить, о какой обработке идет речь?

210

(10 replies, posted in FAQ)

https://myvisualdatabase.com/forum/view … hp?id=8156

211

(10 replies, posted in FAQ)

Step-in wrote:

I have the same problem with UI translation. But I have problems with message windows.
I used the below method but it didn't help.

begin
    Translate('Admin_user_not_found_A_user_with_administrator_privileges_will_be_created', 'Admin_user_not_found_A_user_with_administrator_privileges_will_be_created');
    Translate('Wrong_username_password', 'Wrong_username_password');
    Translate('Wrong_password', 'Wrong_password');
    Translate('Password_cannot_be_empty', 'Password_cannot_be_empty');
    Translate('The_password_and_confirmation_password_do_not_match', 'The_password_and_confirmation_password_do_not_match');
    Translate('Your_password_has_been_changed_successfully', 'Your_password_has_been_changed_successfully');
end.

PS I did not want to create a new topic, because it is related to the translation.

The messages on the left are issued by an authentication form. Look for a solution on the forum: you need to replace the login button click handler. Are the messages on the right displayed on the password change form? I suppose the solution would be the same - replace the click handler.

oleg wrote:
k245 wrote:

Обычно приведенную вами информацию размещают непосредственно в заголовке формы.

Хорошо. В таком случае, как в заголовке формы вывести?

В обработчике события OnShow нужной формы добавляете скрипт:

procedure Form1_OnShow (Sender: TObject; Action: string);
begin
  Form1.Caption := 'Demo version. Time left: ' + IntToStr(iDays) +' days.';
end;

"Вместо меню"

1. Скрыть стандартное меню
2. В верхней части формы разместить метку, у которой caption := 'Что нужно, то и написать'


"Рядом с меню"

1. Скрыть стандартное меню,
2. В верхней части разместить панель
3 На панели создать своё главное меню на панели (как именно - вариантов несколько)
4 На панели разместить метку, у которой caption := 'Что нужно, то и написать'


Главный вопрос - зачем? ))))
Обычно приведенную вами информацию размещают непосредственно в заголовке формы.

Reports in Excel on several pages can be made using a script if you work with Excel directly, through OLE

215

(6 replies, posted in General)

foevil wrote:
k245 wrote:
vovka3003 wrote:

Надо линию посередине убрать и все заработает...

не... нужно её на красную линию заменить )))


How ??

https://www.youtube.com/watch?v=BKorP55Aqvg

216

(6 replies, posted in General)

foevil wrote:

PLEASE MERGE THIS 2 CODES

Are you trying to cross FastScript and Delphi? And where will you then attach this chimera?

217

(6 replies, posted in General)

vovka3003 wrote:

Надо линию посередине убрать и все заработает...

не... нужно её на красную линию заменить )))

pavlenko.vladimir.v wrote:

Можно еще визуализировать, так многим будет понятнее (я так думаю ))) )
https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=9935&amp;download=0

Да, возможно, такие картинки тоже появятся, но чуть позже, когда систематизирую информацию о написании скриптов. Пока SQL подаётся в контексте non-code программирования. Хотя, это уже не non-code, SQL - это тоже язык, и даже создание вычисляемых полей - написание фрагментов кода на SQL.

sparrow wrote:

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

Да, мне тоже эта мысль пришла, я проверил - работает. Зафиксировал.)))

sparrow wrote:

// в SQL запрос необходимо включить поле id, если необходима возможность редактировать либо удалять записи
    // включите в SQL запрос "$autoinc" если необходима колонка со сквозной нумерацией

Можно вставить в свой запрос а MVD сам распознает и пронумерует
http://myvisualdatabase.com/help_ru/pro … tring.html

Забавно ))) никогда не использовал. Век живи - век учись.


Добавил главу "Отображение служебных полей"

sparrow wrote:

Возможно стоило включить в этот раздел "$autoinc" - сквозную нумерацию
или вы планируете это в следующих частях ?

Добавил примечание насчет автогенерации значений по возрастанию для поля ID.

id           INTEGER PRIMARY KEY ASC AUTOINCREMENT,

Или вы про фишку MVDB с полем/компонентом "Счетчик"?  Так там на базе обычный INTEGER,

record_count INTEGER,

автнонумерация делается на клиенте, только если на форме редактирования есть компонент "Счетчик".

vovka3003 wrote:

Если бы я был администратором форума, то за такие UP-ы влепил бан. Сначала на недельку, потом на месяц, третий-раз - навечно.

Вот ты жесткий парень....
Не, у меня тоже бывает настроение повоспитывать, но тут, как я чувствую, есть причины...

After pressing the Auric button and rebooting
https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=9934&amp;download=0

Articles on the topic of style in the MVDB

https://k245.ru/en/tag/style-en

https://k245.ru/wp-content/uploads/2022/08/stilnyj-muzhik.jpg

Your project with adapted functions from my examples. No localization. Only styles)))

Использование SQL в MVDB
https://k245.ru/wp-content/uploads/2023/09/select.jpg
Обзор механизмов обработки данных с помощью языка SQL, используемых в My Visual Database.
https://k245.ru/mvdb/ispolzovanie-sql-v-mvdb.html