А разве в проге нет преобразования utf8<>win1251?
Как отдельной функции - нет.
My Visual Database → Posts by k245
А разве в проге нет преобразования utf8<>win1251?
Как отдельной функции - нет.
я помню при чтении ini возникала ошибка из-за строки? Вроде как первую строку не читает
TIniFile - не читает, потому как он работает с кодировкой ANSI
TMemIniFile - читает, потому как он работает с кодировкой UTF-8
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.
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/fr/mvdb-fr/formatage-du-code.html
I really appreciate your contribution to the common cause of popularizing the My Visual Database.
Calculated field in SQL query, InlineCalcFields() - https://myvisualdatabase.com/forum/view … hp?id=8704
Можно ли включить помощь в программу?
В программе есть прямая ссылка на документацию (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
k245 wrote:... написал функцию InlineCalcFields(), которая автоматически подставляет вычисляемое поле в SQL, но... получились костыли... впрочем, судите сами, может, кому понравится:
Константин как вариант пример имеет право на жизнь но не хватает одной вещи, обработки "=" (^equally^)
Прошу уточнить, о какой обработке идет речь?
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.
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
k245 wrote:vovka3003 wrote:Надо линию посередине убрать и все заработает...
не... нужно её на красную линию заменить )))
How ??
PLEASE MERGE THIS 2 CODES
Are you trying to cross FastScript and Delphi? And where will you then attach this chimera?
Надо линию посередине убрать и все заработает...
не... нужно её на красную линию заменить )))
Можно еще визуализировать, так многим будет понятнее (я так думаю ))) )
Да, возможно, такие картинки тоже появятся, но чуть позже, когда систематизирую информацию о написании скриптов. Пока SQL подаётся в контексте non-code программирования. Хотя, это уже не non-code, SQL - это тоже язык, и даже создание вычисляемых полей - написание фрагментов кода на SQL.
есть еще недокументированное с чек боксом. В работе не проверял, но чек отображает.
Имеет ли смысл писать? не знаю.
Да, мне тоже эта мысль пришла, я проверил - работает. Зафиксировал.)))
// в SQL запрос необходимо включить поле id, если необходима возможность редактировать либо удалять записи
// включите в SQL запрос "$autoinc" если необходима колонка со сквозной нумерациейМожно вставить в свой запрос а MVD сам распознает и пронумерует
http://myvisualdatabase.com/help_ru/pro … tring.html
Забавно ))) никогда не использовал. Век живи - век учись.
Добавил главу "Отображение служебных полей"
Возможно стоило включить в этот раздел "$autoinc" - сквозную нумерацию
или вы планируете это в следующих частях ?
Добавил примечание насчет автогенерации значений по возрастанию для поля ID.
id INTEGER PRIMARY KEY ASC AUTOINCREMENT,
Или вы про фишку MVDB с полем/компонентом "Счетчик"? Так там на базе обычный INTEGER,
record_count INTEGER,
автнонумерация делается на клиенте, только если на форме редактирования есть компонент "Счетчик".
Если бы я был администратором форума, то за такие UP-ы влепил бан. Сначала на недельку, потом на месяц, третий-раз - навечно.
Вот ты жесткий парень....
Не, у меня тоже бывает настроение повоспитывать, но тут, как я чувствую, есть причины...
After pressing the Auric button and rebooting
Articles on the topic of style in the MVDB
https://k245.ru/en/tag/style-en
Your project with adapted functions from my examples. No localization. Only styles)))
Использование SQL в MVDB
Обзор механизмов обработки данных с помощью языка SQL, используемых в My Visual Database.
https://k245.ru/mvdb/ispolzovanie-sql-v-mvdb.html
My Visual Database → Posts by k245
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi