1

(2 replies, posted in Russian)

История изменений.

2

(2 replies, posted in Russian)

Спасибо за пример.
Я почти так и сделал. smile

function Max(const A, B: Integer): Integer;
begin
  case A > B of
    true: Result := A;
    false: Result := B;
  end;
end;

function Min(const A, B: Integer): Integer;
begin
  case A < B of
    true: Result := A;
    false: Result := B;
  end;
end;

3

(29 replies, posted in Russian)

agatlogic101 wrote:

А какие еще браузеры поддерживает?

Любые. Надо только в коде указать что запускать и что искать.

Например, для Firefox в скрипте надо изменить три строчки:

...
Openfile('ya.ru', 'firefox');
...
h := FindWindow('MozillaWindowClass', '');
...
SetParent( FindWindow('MozillaWindowClass', ''), Form1.Panel1.Handle);

4

(29 replies, posted in Russian)

agatlogic101 wrote:

Скрипт иногда срабатывает частично. То есть может открыть браузер с адрессом как обычную программу, и только на 3 или 4 раз заключить его в форму. Редко бывало что-бы срабатывал с первого раза. Но такое было. Как то это можно подправить?

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

5

(2 replies, posted in Russian)

Наткнулся на эти функции при переделке делфи-кода. Компилятор их проглатывает и не возмущается.

ShowMessage(Max(1,2));
ShowMessage(Min(1,2));

Но они не работают и всегда возвращают 0.
neutral

vit007 wrote:

... Как, я понял, отцентровать содержимое формы сложно, ...

Если требуется отцентрировать форму, которая запихивается в форму, то можно так:

procedure Form1_OnResize (Sender: TObject);
begin
    if Form2 <> nil then
    begin
        Form2.Left:= Form1.ClientWidth div 2 - Form2.Width div 2;
        Form2.Top:= Form1.ClientHeight div 2 - Form2.Height div 2;
    end;
end;

procedure Form1_OnShow (Sender: TObject; Action: string);
begin
    Form2.Show;
    Form2.Parent:= Form1;
    Form2.Align:= alCustom;
end;

procedure Form2_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
    Form1.WindowState := wsMinimized;
end;

procedure Form1_OnClose (Sender: TObject; Action: string);
begin
    Form2:= nil;
end;

procedure Form2_OnClose (Sender: TObject; Action: string);
begin
    Form1.Close;
end;

begin
end.
vit007 wrote:

... Как, я понял, отцентровать содержимое формы сложно, ...

Первой форме цепляем на событие OnResize код:

procedure Form1_OnResize (Sender: TObject);
begin
    Form2.Position:= poMainFormCenter;
end;

Вуаля! Вторая форма центрируется по первой .

8

(3 replies, posted in General)

DriveSoft wrote:

Hello.


Please download latest beta version again
...


Что-то с этой сборкой (07.11.19) не так.

На форме с компонентами RichEdit и Button не срабатывает код:

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
  i: integer;
begin
  for i := 0 to Form1.ComponentCount - 1 do
  begin
    if (Form1.Components[i] is TdbRichEdit) then
    begin
      ShowMessage(Form1.Components[i].Name);
    end;
  end;
end;

В предыдушей сборке (06.11.19) всё работало.

9

(7 replies, posted in Russian)

Если нельзя, но очень хочется - значит можно. smile

procedure Form1_OnCloseQuery (Sender: TObject; Action: string);
begin
    if Action = 'true' then Action:= 'false';
end;

begin
    Form1.BorderIcons:= Form1.BorderIcons - biSystemMenu;
    Form1.Caption:= 'Форму можно закрыть в Диспетчере задач';
    Form1.OnCloseQuery:= @Form1_OnCloseQuery;
end.

ПРЕДУПРЕЖДЕНИЕ! Не запускайте скрипт, если не знакомы с "Диспетчером задач"!

procedure Form1_TableGrid1_OnCellDoubleClick (Sender: TObject; ACol, ARow: Integer);
begin
   if Form1.Edit1.Text <> '' then Form1.Edit1.Text := Form1.Edit1.Text + ', ';      
   Form1.Edit1.Text := Form1.Edit1.Text + Form1.TableGrid1.Cells[ACol,ARow];
end;

Google Переводчик smile

Процедура срабатывает при двойном клике по ячейке таблицы.
Начало
    Если текстовое поле не пустое, то в него добавляется запятая.
    В текстовое поле добавляется содержимое ячейки по которой кликнули.
Завершение
k245 wrote:

Панель инструментов

Читать статью полностью: https://vk.com/@createmyvisualdatabasea … strumentov

// загрузка картинок в TImageList
procedure LoadImages( AImageList:TImageList; AImageNames: TStringList; ASize:integer; AImageDir:string );
// загрузка картинок сделана процедурой с параметрами, так как в приложении может быть несколько размеров изображений
// которые должны храниться в разных списках; картинки в формате png

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

// назначить индекс изображения по названию файла
procedure SetImage( AImageList:TImageList; AImageNames: TStringList; AButton:TdbButton; AImageName:string );

12

(29 replies, posted in Russian)

agatlogic101 wrote:

А как то можно прописать логин  и пароль для каждого конкретного веба? допустим их на форме сразу 2. Panel1 и Panel2. Они настроены оба уже на нужный сайт, но 1 логинется в свой аккаунт, а второй в свой.

DriveSoft wrote:

3. Добавил методы, которые позволяют заполнять элементы на форме, находя их по id или name, примеры

    Web.FillElementByName('fd1', 'test');   // заполнение текстового поля
    Web.FillElementByID('qjump-select', '4'); // выбираем 4 элемент из списка
    Web.FillElementByID('fld3', '1'); // установка галочки в CheckBox

    Web.FillElementByName('req_username', 'test');
    Web.FillElementByName('qjump-select', '4');
    Web.FillElementByName('checkboxname', '1');

Волшебное заклинание подействовало! smile

Волшебство пропадёт, если форму минимизировать и развернуть.

Можно вынести код в отдельную процедуру и вызывать её в GLForm_OnShow и GLForm_OnResize.

procedure CanvasShow ();
var
  Canvas:TCanvas;
  ww, hh: Integer;
begin
  GLForm.Canvas.Font.Size:=18;
  GLForm.Canvas.Font.Color:=clRed;
  GLForm.Canvas.Brush.Style:=bsClear;

  ww:=GLForm.Canvas.TextWidth('Hello World');
  hh:=GLForm.Canvas.TextHeight('Hello World');

  GLForm.Canvas.Rectangle(80, 60, 80+ww, 60+hh);
  GLForm.Canvas.TextOut(80,60,'Hello World');
end;

procedure GLForm_OnResize (Sender: TObject);
begin
  Application.ProcessMessages;
  CanvasShow;
end;

procedure GLForm_OnShow (Sender: TObject; Action: string);
begin
  SendMessage(GLForm.Handle,274,61728,0);
  GLForm_OnResize(GLForm);
end;

Но если перетащить форму за пределы экрана, волшебство опять исчезнет.

А совет от админа быстрее и красивше.

Я только показал, что при использовании Canvas надо перерисовывать форму.

adiziktdy wrote:

Исправила ошибки синтаксиса

procedure GLForm_OnShow (Sender: TObject; Action: string);
var
Canvas:TCanvas;
ww, hh: Integer;
begin
  GLForm.Canvas.Font.Size:=18;
  GLForm.Canvas.Font.Color:=clRed;
  GLForm.Canvas.Brush.Style:=bsClear;

  ww:=GLForm.Canvas.TextWidth('Hello World');
  hh:=GLForm.Canvas.TextHeight('Hello World');

  GLForm.Canvas.Rectangle(80, 60, 80+ww, 60+hh);
  GLForm.Canvas.TextOut(80,60,'Hello World');
end;

но ничего на прорисовалось

Если мне память не изменяет, вот так должно прорисоваться:

procedure GLForm_OnShow (Sender: TObject; Action: string);
var
Canvas:TCanvas;
ww, hh: Integer;
begin
  SendMessage(GLForm.Handle,274,61728,0);
  Application.ProcessMessages;

  GLForm.Canvas.Font.Size:=18;
  GLForm.Canvas.Font.Color:=clRed;
  GLForm.Canvas.Brush.Style:=bsClear;

  ww:=GLForm.Canvas.TextWidth('Hello World');
  hh:=GLForm.Canvas.TextHeight('Hello World');

  GLForm.Canvas.Rectangle(80, 60, 80+ww, 60+hh);
  GLForm.Canvas.TextOut(80,60,'Hello World');
end;

15

(5 replies, posted in Russian)

Не надо изобретать велосипеды. Пользуйтесь общественным транспортом.

MVDB поддерживает класс TSpeedButton.
Кнопки SpeedButton имеют возможность быть зафиксированными в утопленном состоянии.

mikhail_a wrote:

Может разработчик что-то поменял?

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

А в случае, когда программа отказывается работать с файлом script.dcu, может помочь повторная компиляция. Возможно файл повреждён.
Не знаю как сейчас, но в более ранних версиях MVDB бывали ситуации, когда при запуске проекта программа закрывалась с ошибкой, но продолжала висеть в исполняемых процессах.
Приходилось убивать этот процесс вручную, иначе при повторном запуске проекта начинали появляться ошибки чтения и записи.

mikhail_a wrote:

Вот и получается, что результат моего эксперимента противоречит информации на форуме....

Результат эксперимента противоречит логике работы MVDB.
Файл script.pas нужен MVDB для компиляции всех скриптов в один файл script.dcu, который использует в своей работе созданная программа.
Если в папке Script после запуска проекта в MVDB не появляется файл script.dcu, можно сделать вывод, что в созданной программе не используются скрипты.

18

(4 replies, posted in Russian)

Присутствует проблема с буквой "я" в редакторе скриптов программы.

Если в строковом выражении последняя буква 'я', то ломается дальнейшая подсветка синтаксиса.
https://c.radikal.ru/c43/1712/98/98b98ad084e6.png

Чтобы не портилась подсветка можно после буквы поставить пробел 'я ' или использовать костыль

ShowMessage('Информаци'#1103);

Не фонтан, но действует.

19

(4 replies, posted in Script)

https://b.radikal.ru/b27/1805/61/e224f32d851f.png

script.pas

var
    RichEdit: TRichEdit;

procedure Form1_TableGrid1_OnCellClick (Sender: TObject; ACol, ARow: Integer);
var
    td: Tdataset;
begin
    SQLQuery('select * from help_topic where id = ' + Form1.TableGrid1.Cells[0,Form1.TableGrid1.SelectedRow],td);
    Form1.Memo1.Clear;
    Form1.Memo1.Lines.Add(td.Fields[3].AsString);  //By column number
    RichEdit.Lines.Clear;
    RichEdit.Lines.Add(td.Fields[3].AsString);
end;
procedure Init ();
begin
    RichEdit:= TRichEdit.Create(Form1);
    RichEdit.Parent:= Form1;
    RichEdit.Top:= 281;
    RichEdit.Left:= 608;
    RichEdit.Width:= 489;
    RichEdit.Height:= 272;
    RichEdit.Color:= clYellow;
    RichEdit.Font.Name:= 'Courier New';
    RichEdit.Font.Size:= 8;
    RichEdit.ScrollBars:= ssBoth;
end;

begin
    Init;
end.

You can pass parameters through the system registry.
Class TRegistry.

21

(25 replies, posted in Russian)

kovalenko wrote:

А где финал 4,3?

DriveSoft wrote:

Версия 4.3
качать: http://myvisualdatabase.com/download/myvisualdb.exe

22

(25 replies, posted in Russian)

mcsimm wrote:

Подскажите, пожалуйста, можно ли скрыть в компоненте TreeView строчки слева?

Свойства компонента
  Options
    goIndicator = False

Можно разместить на форме TWebBrowser.
Загрузить в него страничку с часами и парсить.

Подправил код

procedure Form2_bt1_OnClick (Sender: string; Action: string);
begin
    if CurrentCtrl is TdbEdit then
        TdbEdit(CurrentCtrl).Text := TdbEdit(CurrentCtrl).Text + TdbButton(Form2.FindComponent(Sender)).Caption;

    if CurrentCtrl is TdbMemo then
        TdbMemo(CurrentCtrl).Text := TdbMemo(CurrentCtrl).Text + TdbButton(Form2.FindComponent(Sender)).Caption;
end;

на

procedure Form2_bt1_OnClick (Sender: string; Action: string);
begin
    if CurrentCtrl is TdbEdit then
        TdbEdit(CurrentCtrl).Text := TdbEdit(CurrentCtrl).Text + TdbButton(Sender).Caption;

    if CurrentCtrl is TdbMemo then
        TdbMemo(CurrentCtrl).Text := TdbMemo(CurrentCtrl).Text + TdbButton(Sender).Caption;
end;

Не знаю правильно это или нет, но работает.

---
Ещё случайно наткнулся на баг при работе в редакторе скриптов.

Если в строковом выражении последняя буква 'я', то ломается дальнейшая подсветка синтаксиса.
https://c.radikal.ru/c43/1712/98/98b98ad084e6.png

Чтобы не портилась подсветка можно после буквы поставить пробел 'я ' или использовать костыль

ShowMessage('Информаци'#1103);

Не фонтан, но действует.

Обнаружилась ошибка в работе скрипта VK_fixed2.zip после компиляции в версии программы 4.XX
(в версии 2.8 компилируется и работает нормально).
Скрипт был взят из темы: My Visual Database → Russian → Виртуальная клавиатура
При нажатии на цифровую кнопку на форме появляется ошибка

https://b.radikal.ru/b02/1712/74/22a37dd6bb53.png