76

(3 replies, posted in General)

v_pozidis wrote:

No I read this  Is there another way ? Someone??

Можно отдельный портативный браузер в форму встроить. Но это трудоемко...

77

(13 replies, posted in Russian)

Меня вот это стебануло))

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

Бесплатный сыр, мля...

Теоретически да.

newusr wrote:

А как через OLE, например?

procedure Test; // с выводом
var objShell,objExec,objADODB:variant;
    strBuf:string;
begin
    try
     objShell := CreateOleObject('WScript.Shell');
     objExec := objShell.Exec('cmd');
     objExec.StdIn.WriteLine('ping ya.ru && ping google.ru && exit' {без exit не закроется консоль из-за .ReadAll});
    strBuf := objExec.StdOut.ReadAll;
    objADODB := CreateOleObject('ADODB.Stream');
    objADODB.Open;
    objADODB.Charset := 'Windows-1251';
    objADODB.WriteText(strBuf);
    objADODB.Position := 0;
    objADODB.Charset := 'IBM866';
    strBuf := objADODB.ReadText;
    objADODB.Close;
    objExec.Terminate();
    ShowMessage(strBuf);
   finally
    objShell := 0;
    objExec  := 0;
    strBuf := '';
    objADODB := 0;
   end;
end;

procedure Test2; // без вывода
var objShell,objExec,objADODB:variant;
begin
    try
     objShell := CreateOleObject('WScript.Shell');
     objExec := objShell.Exec('cmd');
     objExec.StdIn.WriteLine('calc');
     objExec.StdIn.WriteLine('notepad');
     objExec.Terminate();
   finally
    objShell := 0;
    objExec  := 0;
   end;
end;

Еще возможно более гибко можно было бы через WMI с помощью класса Win32_Process.
Но это уже другая история...

indigen wrote:

..нужно было рабочее решение, не до элегантности..

Просто есть вероятность поймать "не то" окно. Ну и в процессе выполнения если его тронете - выполнение прекратится.

indigen wrote:

1. Где нужно было искать код WM_CHAR? (Это для общего развития)

https://gitlab.com/freepascal.org/fpc/s … heads#L973

indigen wrote:

2. Можно как-то отловить окончание выполнения задачи в консоли?

В данном способе - никак. В MVDb не реализованы нужные функции, а если бы и были - это получился бы еще один условно работающий "костыль".

indigen wrote:

нужено знать позицию WM_CHAR в массиве параметров

WM_CHAR = 258; 

Но мне кажется, есть более изящное решение, чем:

FindWindow('', 'c:\windows\system32\cmd.exe');

через OLE например.

А что именно требуется сделать?

m128mx wrote:

vovka3003, а с юсб носителями сработает? Наверное только если он как том с буквой определится?

Не совсем понял что значит "работает" и "если он как том с буквой определится"...
WMI может перечислить все устройства в системе (диски, порты, видео- аудио- устройства, сетевые адаптеры и т.п.)

Порыл старые черновики...

// Win32_LogicalDisk class:
// https://learn.microsoft.com/en-US/windows/win32/cimwin32prov/win32-logicaldisk#properties

procedure GetDisks;
var
  FSWbemLocator, disks, disk: Variant;
  i:integer;
  res:string;
begin
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    disks   := FSWbemLocator.ConnectServer('.', 'root\CIMV2', '', '')
    .ExecQuery('SELECT * FROM Win32_LogicalDisk');
    for i:=0 to disks.Count-1 do
    begin
    disk := disks.ItemIndex[i];
           res := res +

//'Access: ' + VarToStr(disk.Access) + #13#10 +
//'Availability: ' + VarToStr(disk.Availability) + #13#10 +
//'BlockSize: ' + VarToStr(disk.BlockSize) + #13#10 +
'Caption: ' + VarToStr(disk.Caption) + #13#10 +
'Compressed: ' + VarToStr(disk.Compressed) + #13#10 +
//'ConfigManagerErrorCode: ' + VarToStr(disk.ConfigManagerErrorCode) + #13#10 +
//'ConfigManagerUserConfig: ' + VarToStr(disk.ConfigManagerUserConfig) + #13#10 +
//'CreationClassName: ' + VarToStr(disk.CreationClassName) + #13#10 +
'Description: ' + VarToStr(disk.Description) + #13#10 +
'DeviceID: ' + VarToStr(disk.DeviceID) + #13#10 +
'DriveType: ' + VarToStr(disk.DriveType) + #13#10 +
//'ErrorCleared: ' + VarToStr(disk.ErrorCleared) + #13#10 +
//'ErrorDescription: ' + VarToStr(disk.ErrorDescription) + #13#10 +
//'ErrorMethodology: ' + VarToStr(disk.ErrorMethodology) + #13#10 +
'FileSystem: ' + VarToStr(disk.FileSystem) + #13#10 +
'FreeSpace: ' + VarToStr(disk.FreeSpace) + #13#10 +
//'InstallDate: ' + VarToStr(disk.InstallDate) + #13#10 +
//'LastErrorCode: ' + VarToStr(disk.LastErrorCode) + #13#10 +
//'MaximumComponentLength: ' + VarToStr(disk.MaximumComponentLength) + #13#10 +
'MediaType: ' + VarToStr(disk.MediaType) + #13#10 +
'Name: ' + VarToStr(disk.Name) + #13#10 +
//'NumberOfBlocks: ' + VarToStr(disk.NumberOfBlocks) + #13#10 +
//'PNPDeviceID: ' + VarToStr(disk.PNPDeviceID) + #13#10 +
//'PowerManagementCapabilities[]: ' + VarToStr(disk.PowerManagementCapabilities[]) + #13#10 +
//'PowerManagementSupported: ' + VarToStr(disk.PowerManagementSupported) + #13#10 +
//'ProviderName: ' + VarToStr(disk.ProviderName) + #13#10 +
//'Purpose: ' + VarToStr(disk.Purpose) + #13#10 +
'QuotasDisabled: ' + VarToStr(disk.QuotasDisabled) + #13#10 +
//'QuotasIncomplete: ' + VarToStr(disk.QuotasIncomplete) + #13#10 +
//'QuotasRebuilding: ' + VarToStr(disk.QuotasRebuilding) + #13#10 +
'Size: ' + VarToStr(disk.Size) + #13#10 +
//'Status: ' + VarToStr(disk.Status) + #13#10 +
//'StatusInfo: ' + VarToStr(disk.StatusInfo) + #13#10 +
'SupportsDiskQuotas: ' + VarToStr(disk.SupportsDiskQuotas) + #13#10 +
'SupportsFileBasedCompression: ' + VarToStr(disk.SupportsFileBasedCompression) + #13#10 +
//'SystemCreationClassName: ' + VarToStr(disk.SystemCreationClassName) + #13#10 +
'SystemName: ' + VarToStr(disk.SystemName) + #13#10 +
//'VolumeDirty: ' + VarToStr(disk.VolumeDirty) + #13#10 +
//'VolumeName: ' + VarToStr(disk.VolumeName) + #13#10 +
'VolumeSerialNumber: ' + VarToStr(disk.VolumeSerialNumber) + #13#10 + #13#10 ;


    end;
    ShowMessage(trim(res));
  finally
    FSWbemLocator := 0;
  end;
end;

begin
  GetDisks;
end. 

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

Мы - мясо! Мы - газ!

k245 wrote:

Это оно?

Угу.

87

(2 replies, posted in Russian)

..if Form1.DateTimePicker1.Date >= now then..

OLE-шкой через WMI можно же...

newusr wrote:

Можно подробней, как пропатчить и как пользоваться патченым dll?

Это была шутка ака "пропатчить KDE2 под FreeBSD"))

newusr wrote:

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

Только если пропатчить DrvFR.dll smile

newusr wrote:

..драйвер ККМ как OLE объект, подключаюсь, запрашиваю данные

Тогда вам не поможет Application.ProcessMessages.
Как вариант "асинхронности" - вызывать отдельный процесс (exe-шник), в котором написать функцию сбора и возврат в текстовый файл или через SendMessage в указанное поле.

newusr wrote:

периодически по очереди подключаюсь к устройствам и считываю данные

Каким способом?

93

(5 replies, posted in Russian)

dir_er wrote:

..душа просит работать без посредников внутри MVD с удалённой базой..

Ну, примерно это я и имел ввиду. В скрипте MVDb вызываете объект v8*.Application или V8*.COMConnector и работаете напрямую из кода проги "внутри" 1С. Возможно это решит проблему "сырых" данных.
Хелпы внутре:

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

Ну или как вариант можно еще заюзать rest или создать http-сервис внутри 1С-ки.

94

(5 replies, posted in Russian)

А принципиально работать напрямую с ADODB (MS SQL)? Можно же дергать данные через OLE объект 1С.

function GUID:string;
var s:variant;
begin
   s := CreateOleObject('Scriptlet.TypeLib');
   result := Copy(s.Guid, 2, 36);
   s := 0;
end;

96

(5 replies, posted in General)

Заменить на MessageDlg.

97

(35 replies, posted in General)

А не судьба задать все эти вопросы на форуме программы?

98

(4 replies, posted in General)

Может под wine.

99

(89 replies, posted in Russian)

malitos wrote:

Это в настройках FastReport делается ?

В фастрепорте можно написать скрипт и делать любую постобработку готовых данных из бд:

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

100

(1 replies, posted in Script)

Варианты:
1. WIA (OLE-объект)
2. Naps2 (запуск с параметрами).
Оба способа подразумевают написание скрипта. Второй способ немного проще.