226

(15 replies, posted in Russian)

Если есть необходимость хранить эти данные в базе, то дальше нужно немного теории почитать:
Про БД, таблицы и поля - https://k245.ru/mvdb/relyatsionnye-bazy-dannyh.html
Про SQL - https://drive.google.com/file/d/1BK2H9q … drive_link
Чтобы дальнейшие объяснения были вам понятны.


Но могут быть и другие решения, не связанные с SQL, например, сохранять эту дату в файле настройки. Settings.ini


Тут все зависит от бизнес-задачи, для которой эта самая дата нужна. А про задачу вы ещё ничего не рассказали: для кого нужна эта дата, что он с ней будет делать и как эта дата влияет на процесс его работы?


Попробуйте составить ТЗ (https://k245.ru/bez-rubriki/proektirovanie.html), работать станет намного легче smile

227

(15 replies, posted in Russian)

Vickus wrote:

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

Если нужно ТОЛЬКО В МОМЕНТ ОБНОВЛЕНИЯ, тогда достаточно на форме (Form1)  метку разместить (labUpdateDate).
Чтобы на метке появилась надпись, присвойте свойству caption нужное значение:

procedure Form1_buttonabout_OnAfterClick (Sender: TObject);
begin
   Form1.labUpdateDate.Caption := 'Last Updated On:  ' + datetostr(now) + '   At:  ' + timetostr(time);
end;

Про метку и её свойства можно почитать здесь: https://k245.ru/mvdb/metka-tdblabel.html


P.S. Как только вы закроете программу, информация о дате обновления исчезнет. И при последующем запуске в метке ничего отображаться не будет. Это я так, на всякий случай озвучиваю )))

228

(17 replies, posted in Russian)

Слово All является служебным в SQLite, если вы назвали так таблицу (а делать этого не стоило), то теперь в запросах нужно будет это название брать в кавычки всё время. И второй момент: вы использовали условие LIKE, вероятно для того, чтобы номер искать по частичному вхождению. В этом случае нужно добавить символы %. Если моё предположение неверно, уберите их из последней сточки.

SELECT
  id,
  PC_invnum,
  ip,
  ser_num,
  mb_model,
  mb_ser,
  mb_rev,  
  ram_manufacturer_1st,
  ram_manufacturer_2nd,
  ram_memory_1st_planka,
  ram_memory_2nd_planka,
  ram_sn_1st_planka,
  ram_sn_2nd_planka,
  mon_diag,
  mon_inv_num,
  mon_model,
  mon_ser_num,    
  kb_model,
  kb_inv_num,
  kb_ser_num,
  mouse_model,
  mouse_inv_num,
  mouse_ser_num,
  psu_model,
  psu_inv_num,
  psu_ser_num,
  terminal_model,
  terminal_inv_num,
  terminal_ser_num,
  terminal_comment,
  mfu_model,
  mfu_inv_num,
  mfu_ser_num,
  video_manuf,
  video_model,
  video_ram,
  video_other,
  table_num,
  comments
FROM 'all'
WHERE PC_invnum LIKE "%{ed1_inv}%"

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

229

(15 replies, posted in Russian)

Vickus wrote:
k245 wrote:

Не, ну народ обленился.... Одну строчку в коде заменить не могут.
https://myvisualdatabase.com/forum/view … hp?id=6262

Я не программист, а самоучка. Пытаюсь разобраться. Сам пытался поменять, как Вы выразились, строчку, но ничего не вышло, поэтому и прошу помощи. А Вам вместо того, чтобы хейтить лучше бы проявить доброжелательность по примеру Дерека, который постоянно не отказывает и идет на помощь!

Не проблема: если вы продемонстрируете свои попытки в виде вашего проекта, в котором какая-то часть не работает, я вам лично всё подправлю.


И где вы тут увидели хейтерство? А вот культуру общения на форуме - да, насаждаю ))
https://sun9-79.userapi.com/impg/I-vTwMJbe1Ukj5ZEBzN8cWRIPwohncN2cjWRhA/0PhoO9gVGS0.jpg?size=1200x595&quality=96&sign=d5bdfc8180fb10df651c7f37fb4ecbeb&c_uniq_tag=d-1KiMOXHUVwUXE_EMUj4w3KxLpSDdeUpt7V0aj3AVI&type=album


P.S. Что касается вашей задачи, то нужно правильно формулировать запрос. Вам не просто нужно, чтобы где-то на форме отображалась дата обновления после загрузки. Скорей всего вам необходимо, чтобы эта дата запоминалась в базе и отображалась всё время. А вот обновлялась после того, как загрузили данные из Excel, верно?

230

(2 replies, posted in General)

Source for Delphi:
https://delphisources.ru/pages/faq/base … ption.html

231

(15 replies, posted in Russian)

Не, ну народ обленился.... Одну строчку в коде заменить не могут.
https://myvisualdatabase.com/forum/view … hp?id=6262

232

(17 replies, posted in Russian)

pixel7pro wrote:
sparrow wrote:

Если даже сам ... "Даже чат жпт ..." не нашел , чего уж тут спрашивать.

Кстати вы не пробовали ему (САМОМУ ЖПТ) картинку показывать ?

А вы Константин все рассказываете что "тексты читайте ... " . Некогда знаете ли. Жпт наступает. Оказывается надо инструкции по жпт писать ))) Вот на что спрос. Актуальная статья "ЖПТ и ошибки: в  SQL, в программе, в жизни"

чувак - ну зачем ты пишешь ахинею.  я же не спрашиваю как лично твой день прошел?  если не хочешь/не можешь подсказать по делу - ну пройди мимо. Зачем спамишь....   Твой ответ не несет вообще никакой смысловой нагрузки и решению не помогает

чувак - а как твоя картинка поможет решению?

https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=9925&download=0
Как минимум нужно было вторую картинку добавить, с самим SQL-запросом. Ты ведь понимаешь, что у нас тут не шоу экстрасенсов?

vovka3003 wrote:

Если надо ловить глобально (а не только из одной папки), тогда можно попробовать так:

begin
if FindWindow('','already_launched')>0 then
    begin
        ShowMessage('Программа уже запущена');
        Application.Minimize;
        Form1.Close;
    end;

with TForm.Create(Application) do
    begin
        Name := 'already_launched';
        BorderStyle := bsNone;
        Width:=0;
        Height:=0;
        Show;
        Hide;
    end;
end.

Мне этот вариант больше нравится. И как я сам не догадался, что окно с нужной надписью можно самому создать? А то вечные приколы с главной формой и её заголовком. Беру себе в блокнотик )))

234

(1 replies, posted in General)

This is possible if you load text in HTML format into the editor, in which you can customize the colors of hyperlinks using styles. But all this will only work for loaded text.

Главное меню можно "пересадить" с главной формы на другую форму.

procedure Menu_MoveTo(AFromForm: TForm; AToForm: TForm);
// перенести меню с формы на форму
var
  tmpMenu: TMainMenu;
begin
  tmpMenu := AFromForm.Menu;
  AFromForm.Menu := nil;
  AToForm.Menu := tmpMenu;
end;
Andrei wrote:

Добрый день.
Спасибо.
Убрал обработчики.
Теперь 2 кнопки для редактирования записи в разных формах.
При двойном нажатии мышью - открываются для одной записи 2 разные формы???

А почему у вас 2 кнопки редактирования одной записи? Впрочем, такое иногда требуется.
Если вы не хотите, чтобы при двойном клике срабатывали обе кнопки, то у второй (которую вы не хотите) нужно отключить действие "Показать запись" и отображать форму редактирования методом ShowRecord().

Главная форма не меняется скриптом, только в режиме конструктора.
https://k245.ru/wp-content/uploads/2023/08/f8.png
https://k245.ru/mvdb/formy.html
Но вы можете при запуске приложения скрывать главную форму и отображать нужную вам в зависимости от роли.

О том, как показать запись по двойному клику по гриду можно прочитать здесь:
https://k245.ru/mvdb/forma-redaktirovaniya.html
https://k245.ru/mvdb/proekt-biblioteka-v-2-2.html
Для этого достаточно разместить на форме кнопку и настроить её для отображения записи из таблицы, дополнительные обработчики не нужны.

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

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' ,'');
      tmpPlaceHolder := '{'+tmpTableName+'.'+tmpCalcField+'}';
      ASQL := ReplaceStr( ASQL, tmpPlaceHolder ,tmpFieldSQL  );
    until 1=0;
  finally
    tmpIniFile.Free;
    Result := ASQL;
  end;
end;

вместо

 frm_vvod.Edit7.Text := n1+','+n2+','+n3;

вставьте

s := '';
If frm.CheckBox1.sqlValue then
  s := n1;
If frm.CheckBox2.sqlValue then
begin
  if s <>'' then
    s := s+',';
  s := s+ n2;
end;
If frm.CheckBox3.sqlValue then
begin
  if s <>'' then
    s := s+',';
  s := s+ n3;
end;
frm_vvod.Edit7.Text := s;

P.S. Судя по количеству строк, есть проблема в реализации решения изначальной бизнес-задачи. Но о ней вы ничего не сказали, поэтому получили ещё большее количество строк...

241

(17 replies, posted in Russian)

pixel7pro wrote:

Но все равно, вопросы, в любом случае, есть и будут

Разумеется, будут. Но не всегда будут люди, готовые вам на них отвечать. А вот способность находить ответы самостоятельно (в данном случае - через изучение теории и закреплении её на практике) позволит вам быть более независимым в достижении ваших целей. smile

242

(14 replies, posted in General)

vovka3003 wrote:
k245 wrote:

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

Интересно, что скажет выньда, когда увидит позицию меньше -32000..?

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


Well, why organize such digital extremism)))
In fact, this project is unique; in all other projects where I need to do some magic with color design, I use styles, and in this case the rollbars are not gray, but stylish)))

243

(14 replies, posted in General)

vovka3003 wrote:

Скроллбары... скроллбары, йома..)

Да, скроллбары на таблицах непобедимы ))), но решение, как мне кажется, есть: посадить грид на панель, и каждый раз разпупыживать его так, чтобы его родные скролбары не появлялись. И позиционировать грид доморощенными сроллбарами в своё удовольствие.  На менюшке и на новостной ленте уже сделан свой кастомный скроллбар,

244

(14 replies, posted in General)

v_pozidis wrote:

Hi, can we create our own Styles...is there a software to do that?

Delphi - Bitmap Style Designer
https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=9917&amp;download=0

https://docwiki.embarcadero.com/RADStud … e_Designer

245

(14 replies, posted in General)

jrga wrote:

Hello dear K245! Thank you very much for responding promptly and for your willingness fam to do so.

I don't think it's worth repeating my experiment. Unless you have a lot of time and desire to create something unusual. The above project is very complex, I would even say unreasonably complex. But it is of interest from the point of view of unusual algorithms and approaches to solving problems (for example, how to create a new class in a system that does not allow creating new classes). Someday I will tell you more about it on the pages of my blog.

246

(3 replies, posted in Reports)

A wonderful example! You have added another dimension to the depth of use of MVDB/FastReport

247

(14 replies, posted in General)

News feed with all your favorite "Discuss" and "Like" buttons
https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=9916&amp;download=0

P.S. Guess whose eye is depicted on the Happy New Year greeting?

248

(14 replies, posted in General)

Другая
https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=9915&amp;download=0

249

(14 replies, posted in General)

Светлая тема
https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=9914&amp;download=0

250

(14 replies, posted in General)

You can create any interface, with your own color schemes and appearance of components, but this can take years.
https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=9913&amp;download=0
Here is an example of an interface where input components have rounded frames, the palette is fully customizable by the user, there is smart scaling and many other useful things. All this was created without using styles.