No I read this Is there another way ? Someone??
Можно отдельный портативный браузер в форму встроить. Но это трудоемко...
My Visual Database → Posts by vovka3003
No I read this Is there another way ? Someone??
Можно отдельный портативный браузер в форму встроить. Но это трудоемко...
Меня вот это стебануло))
Бесплатный сыр, мля...
Теоретически да.
А как через 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.
Но это уже другая история...
..нужно было рабочее решение, не до элегантности..
Просто есть вероятность поймать "не то" окно. Ну и в процессе выполнения если его тронете - выполнение прекратится.
1. Где нужно было искать код WM_CHAR? (Это для общего развития)
https://gitlab.com/freepascal.org/fpc/s … heads#L973
2. Можно как-то отловить окончание выполнения задачи в консоли?
В данном способе - никак. В MVDb не реализованы нужные функции, а если бы и были - это получился бы еще один условно работающий "костыль".
нужено знать позицию WM_CHAR в массиве параметров
WM_CHAR = 258;
Но мне кажется, есть более изящное решение, чем:
FindWindow('', 'c:\windows\system32\cmd.exe');
через OLE например.
А что именно требуется сделать?
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.
Мы - мясо! Мы - газ!
Это оно?
Угу.
..if Form1.DateTimePicker1.Date >= now then..
OLE-шкой через WMI можно же...
Можно подробней, как пропатчить и как пользоваться патченым dll?
Это была шутка ака "пропатчить KDE2 под FreeBSD"))
Я в общем-то к этому и пришёл, но на всякий случай решил спросить, вдруг всё-таки был вариант.
Только если пропатчить DrvFR.dll
..драйвер ККМ как OLE объект, подключаюсь, запрашиваю данные
Тогда вам не поможет Application.ProcessMessages.
Как вариант "асинхронности" - вызывать отдельный процесс (exe-шник), в котором написать функцию сбора и возврат в текстовый файл или через SendMessage в указанное поле.
периодически по очереди подключаюсь к устройствам и считываю данные
Каким способом?
..душа просит работать без посредников внутри MVD с удалённой базой..
Ну, примерно это я и имел ввиду. В скрипте MVDb вызываете объект v8*.Application или V8*.COMConnector и работаете напрямую из кода проги "внутри" 1С. Возможно это решит проблему "сырых" данных.
Хелпы внутре:
Ну или как вариант можно еще заюзать rest или создать http-сервис внутри 1С-ки.
А принципиально работать напрямую с 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;
Заменить на MessageDlg.
А не судьба задать все эти вопросы на форуме программы?
Это в настройках FastReport делается ?
В фастрепорте можно написать скрипт и делать любую постобработку готовых данных из бд:
Варианты:
1. WIA (OLE-объект)
2. Naps2 (запуск с параметрами).
Оба способа подразумевают написание скрипта. Второй способ немного проще.
My Visual Database → Posts by vovka3003
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi