Так работает вроде:

const
    text =  '<span style="color:red"><b>123459</b></span>';
    script = '<script>alert("Привет мир!");</script>';



var WB:TWebBrowser;
begin
  WB:=TWebBrowser.Create(Application);
 // WB.Silent := 1;
  TWinControl(WB).Parent := Form1;
  WB.Align := alClient;
  WB.Navigate('about:blank');
  WB.Navigate('javascript:document.body.innerHTML='''+text+script+''';');
end.

Вариант - сделать "базовую страницу" и через Navigate в нее передавать содержимое для записи на странице.

newusr wrote:

А как в него записать, есть пример какой-нибудь?

Ну, попробовал - не работает ни один из адекватных способов (data/url, Document.Write).
Бесполезный огрызок браузера, короче...

newusr wrote:

Я правильно понял, что для каждой камеры нужно создать html файл и открыть их через TWebBrowser на форме?

Ну, это уже зависит от возможностей контрола, я с ним не работал, не в курсе. Думаю, как минимум можно сделать сетку div-ов и засунуть в нее отдельно плееры. Делать страницу в виде файла - необязательно, достаточно записать код в TWebBrowser.
Ну и сам установщик контрола с собой таскать для компьютеров, где его нет.

Ну, может производителю задать вопрос?

newusr wrote:

Но хотелось по красоте сделать...

"Красоты" не будет без контейнера ActiveX.

newusr wrote:

для 3-го нужно знать rtsp поток, а я, к сожалению, не смог его вычислить.

Если есть Onvif, то ODM что-то должен показать.

vovka3003 wrote:

1. Плеер загнать в TWebBrowser, а сам TWebBrowser положить на форму.

Примерный html-код:

<body leftmargin=0 topmargin=0 rightmargin=0 bottommargin=0>

<OBJECT  id="NV1" style="width:100%;height:100%; " classid="clsid:62D6556A-808B-4322-A76F-B5DFF38D3DC5"></OBJECT>

<script>
    NV1.MediaURL = '192.168.1.100';
    // ... другие настройки
    NV1.Connect();
    if (!NV1.Play()){
        alert('Ошибка соединения!');
    };
</script>
    
</body>

https://i.imgur.com/tKr56lL.png

OLE-объекты нельзя рассматривать как WinControl.

Возможные варианты:

1. Плеер загнать в TWebBrowser, а сам TWebBrowser положить на форму.

2. Собрать в делфи в Ole-контейнере, запускать как Exe-шник, придумать управление (например через параметры запуска).

3. Заюзать через rtsp в VLС плеере (exe), SetParent-ом подтянуть к форме. Управление возможно http-командами.

В адекватном варианте это надо было реализовать мьютексом, но в MVDb его нет...

vit007 wrote:

Люблю "сделать" красиво...

Ну это тогда винегрет... Или помидоры со шкурками.
По мне так лучше минимизировать операции записи на диск, даже с "какашкой" весом 22  г̶р̶а̶м̶м̶а̶  байта...

vit007 wrote:

DeleteFile('~$applock') не прокатывает

У меня прокатывает.

vit007 wrote:

Как понял про TZipMode, она создает файл, и дальше смотрит его наличие

Не столько "наличие", сколько "занятость" другим, ранее открытым экземпляром.

vit007 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.
vit007 wrote:

Реакция на Zip... smile

Это для случаев, когда из одной и той же папки выполняется повторная попытка запустить exe-шник.
zip - это контрольный файл, по которому проверяется запущенный экземпляр. Если "занят", значит программа уже открыта.

vit007 wrote:

Спасибо. А во втором случаи это если прогу из архива извлекать или для каких случаев...

А причем тут архив?

var ZF:TZipFile;

procedure Form1_OnClose (Sender: TObject; Action: string);
begin
  ZF.Free;
end;

begin
    try
    ZF:=TZipFile.Create;
    ZF.Open('~$applock',zmWrite);
    except
      ShowMessage('Уже запущен экземпляр программы');
      Form1.Close;
    end;
end.

66

(1 replies, posted in General)

В интерактивном режиме можно подключить разные движки.
Но что именно надо выполнить в Python-e?

pavlenko.vladimir.v wrote:

хрен с ним, я уже придумал как решить эту проблему

Ок.

А проблемный пример никто не полюбляет приложить... Ни новички, ни старички...
Если правильно понял вопрос - задача на "зацикливание"...

69

(14 replies, posted in General)

k245 wrote:

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

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

70

(14 replies, posted in General)

k245 wrote:

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.

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

71

(6 replies, posted in General)

Примера нет, не сохранял.
Но могу подсказать методику:
"Рамка" окна - это form1, с растянутой картинкой (или сплошным цветом), и установленным свойством bsNone.
"Область формы" - form2, также с установленным свойством bsNone и в качестве Parent-a указана form1.
Крестик, максимизация, минимизация - обычные TLabel, с соответствующими действиями в скрипте.
Ну и дальше "соль и перец по вкусу", насколько хватит фантазии.

72

(14 replies, posted in General)

А обновить до последней версии кто запрещает..?

73

(6 replies, posted in General)

Можно еще с виндой "поспорить", свои бордюры и элементы нарисовать:

https://i.imgur.com/KynxVqc.png

74

(3 replies, posted in Russian)

k245 wrote:

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

Vickus wrote:

На форме записи есть чекбокс. Хотелось бы, чтобы при установке чекбокса "Ранее включен в счет" в итоговой таблице на главной форме это значение имело знак минус и в футере из суммы вычиталось.

Ля, бронированный... neutral

Если рассматривать "плоский" вариант - я б сделал еще колонки "Оплачено" и "Остаток". В итогах - тупо сложение...
Для удобства - по флажку "оплачен полностью" - копировать в "Оплачено" значение из "Суммы".

75

(33 replies, posted in Russian)

http://myvisualdatabase.com/doc_ru/roles.html