Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 6

Автор: CYMar
Дата сообщения: 11.09.2010 14:32
Приветствую, Комрады!
Ищу помощи/констультации в одном деликатном вопросе. Если ошибся топиком - не пинайте.
Есть программа, собирающая данные с удаленных устройств Bluetooth.
ExeInfo PE сказал - Borland Delphi ( 2.0 - 7.0 ) 1992 - www.borland.com.
К машине, на которой установлена данная программа есть промышленный Serial Bluetooth Adapter. Перед началом сбора данных программа спрашивает у данного адаптера версию прошивки AT командой (ATI?), на что получая ответ (F/W version: v4.15), сравнивает его с совместимыми, и начинает процедуру сбора данных.
Купили еще один такой адаптер, а у него версия прошивки немного отлична от того, который у нас был (4.35), соотвественно процедуру проверки прошивки он не проходит.
Открыл исполняемый файл блокнотом, нашел данный кусок

Код: ATI? яяяя F/W VERSION: SPP_03 яяяя F/W VERSION: v4.15 яяяя F/W VERSION: v4.19 яяяя*
Автор: Frodo_Torbins
Дата сообщения: 11.09.2010 22:46
CYMar
Мне кажется, что с новой версией прошивки просто нужно работать по другому алгоритму. И очень может быть, что легче будет написать замену вашей проги, чем ее исправить.
Ну или возможно вам удастся перепрошить адаптер?

svs123456789
Либо в править ресурсах соответствующую форму (ее еще нужно там найти), либо изменить сразу для всей системы значение DPI, тогда и в инспекторе шрифт станет больше.

DmitryKz
А при вызове SystemParametersInfo эффекта нету?
Автор: CYMar
Дата сообщения: 11.09.2010 23:42

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

В новой прошивке было добавлено несколько функций, которые мы не используем.
Написать новую версию не вариант, к сожалению, связи с разработчиком нет, исходников нет, а комплекс довольно сложный и завязан на разные службы.
А перешить адаптер - практически невозможно. Но вот сделать некий патч для данной программы, который бы устранил данную проблему, как мне кажется, вполне реально.
Если интересно могу скинуть исполняемый файл.
Автор: Frodo_Torbins
Дата сообщения: 12.09.2010 13:50
CYMar
Я к сожалению не очень разбираюсь в реверс инжиниринге. К тому же не имея девайса, с которым эта прога должна взаимодействовать, затея становится практически гиблой. Но файлик все же можете куда-нибудь выложить - вдруг найдется умелец. Плюс на форуме есть раздел с объявлениями о работе: http://forum.ru-board.com/topic.cgi?forum=33&topic=2395
Автор: CYMar
Дата сообщения: 12.09.2010 14:31

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

Ссылка на исполняемый файл. Кажется мне для специалиста это дело 5ти минут, а я, к сожалению, делитант.

Проблема решена. Спасибо.
Автор: Man_Without_Face
Дата сообщения: 15.09.2010 16:47
Доброго времени суток. Перевожу программу для открытия\редактирования xml файлов (использую xmlMapper + компоненты XMLTransform и XMLTransformProvider) с Delphi 2006 (DevExpress, старые) на Delphi 2009 (DevExpress v48). Поменял функции с DecompressBuf на zDecompress. Ругалось в uses на ToolEdit и CurrEdit, убрал, вроде бы это для Rx компонентов, их не использую. Все компилируется, но при выполнении программы возникает три ошибки:
1. Русский текст отображается как иероглифы в cxGrid. Я так понимаю это из-за юникодной 2009. В 2006 ставил XML.Encoding := 'Windows-1251';
2. При сохранении одного из видов xml файла, при выполнении программы, возникает ошибка (если запускать exe все вроде бы нормально): Project pReportEdit.exe raised exception class EDatabaseError with message 'Record not found or changed by another user'.
3. При запуске у пользователя требует библиотеку midas.dll. Когда писал программу на 2006 было тоже самое, тогда в корневой каталог программы закинул со своего компа эту dll. Сейчас не могу найти для 2009.
Помогите пожалуйста решить вопросы. Заранее благодарен.

Вот код:
[more]
Открытие:

procedure TfrmMain.acOpenExecute(Sender: TObject);
begin
SysUtils.DecimalSeparator := '.';
if param = 0 then //0- OX отчеты, 1-Kx отчеты
begin
if OpenDialog1.Execute then
begin
SaveCursor := Screen.Cursor;
Screen.Cursor := crHourglass;
try
sXTR := OpenDialog1.Filename;
sXML := ExtractFile(sXTR); //Функция распаковки файла
except
Application.MessageBox('Ошибка при разархивировании файла!', 'Ошибка!', MB_OK+MB_ICONSTOP);
end;
XML := TXMLDocument.Create(nil);
XML.LoadFromXML(sXML);
XML.Active := true;
XML.Encoding := 'Windows-1251'; //Выставляю кодировку
XML.SaveToFile('C:\zx.xml');
//Настраиваю соединение с xml файлом
cdsHeader.Close;
XMLTransform1.SourceXmlFile := 'C:\zx.xml';
XMLTransform1.TransformationFile := 'OXtrans.xtr'; //Файл трансформации в датасет
cdsHeader.XMLData := XMLTransform1.data;
try
cdsHeader.Open;
//cdsHeader - Древовидная структура (датасет в датасете, поле fields)
cdsOX.Close;
cdsOX.Open;
except
Application.MessageBox('Ошибка при открытии файла!', 'Ошибка!', MB_OK+MB_ICONSTOP);
Screen.Cursor := SaveCursor;
end;
.......................................

Сохранение:
procedure TfrmMain.acSaveAsExecute(Sender: TObject);
begin
SaveDialog1.FileName := sXTR;
if SaveDialog1.Execute then
begin
SaveCursor := Screen.Cursor;
Screen.Cursor := crHourglass;
try
//Настраиваю соединение для записи в xml файл
XMLTransformProvider1.XMLDataFile := 'C:\zx.xml';
if param = 0 then
begin
XMLTransformProvider1.TransformRead.TransformationFile := 'OXtrans.xtr'; //Файл трансформации в датасет
XMLTransformProvider1.TransformWrite.TransformationFile := 'toxmlOX.xtr'; //Файл трансформации в xml
end
else
begin
XMLTransformProvider1.TransformRead.TransformationFile := 'KXtrans.xtr'; //Файл трансформации в датасет
XMLTransformProvider1.TransformWrite.TransformationFile := 'toxmlKX.xtr'; //Файл трансформации в xml
end;
cdsHeader.ApplyUpdates(-1); Ошибку при сохранении выдает вроде здесь
CompressFile('C:\zx.xml', SaveDialog1.FileName); //Сжимаю файл
Application.MessageBox('Сохранение прошло успешно', 'Сохранение', MB_OK);
except
Application.MessageBox('Ошибка при сохранении файла!', 'Ошибка!', MB_OK+MB_ICONSTOP);
Screen.Cursor := SaveCursor;
end;
Screen.Cursor := SaveCursor;
end
else;
end;
[/more]
Автор: salexn1
Дата сообщения: 15.09.2010 18:09
Man_Without_Face
п.1 ---
п.2 если есть в таблице уникальное поле, выстави в TClientDataSet св-во UpdateMode = KeyOnly и задай нужные опции у полей: InKey, InUpdate, InWhere
п.3. Проще всего в uses проекта добавить midaslib, тогда вообще не нужны будут midas.dll
Автор: Man_Without_Face
Дата сообщения: 16.09.2010 12:52
Вопрос по той же теме: Загружаю xml файл в cxGrid (сортировки нигде нет), редактирую, сохраняю (cdsHeader.ApplyUpdates(-1);). Записи которые были отредактированы, почему то попадают в конец xml файла. Вопрос: можно ли как нибудь оставить их на своих местах. Описание и код выше. Delphi 2007 (DevExpress v48).
Автор: Man_Without_Face
Дата сообщения: 23.09.2010 11:27
Делаю экспорт в dbf файл при помощи halcyon (v 6.98). Halcyon поле типа datetime вроде бы не поддерживает, но поле почему то создается:
CHDS.CreateFields.Add('RECEIPDATE;t;8;0');
Но значение никак записать туда не могу. Можно ли как нибудь еще без каких либо компонентов записать значение в это поле (файл уже создан и известна структура)? Может какой нибудь инсерт? Delphi2006.
Автор: greenpc
Дата сообщения: 23.09.2010 11:59
Man_Without_Face
ну вобще-то дата это тот же float
если таблица и структура созданы то может прокатить.
на клиенте asDateTime
лично я остановился для работы с dbf - TDBF (Copyright 2002-2004 Брусникин И.В.)
и зачем же повторяться http://forum.ru-board.com/topic.cgi?forum=33&topic=11215&start=60#13
Автор: Man_Without_Face
Дата сообщения: 23.09.2010 12:57
greenpc вариант открыть asDateTime не подходит. В dbf уже должно быть поле со структурой datetime.


Цитата:
лично я остановился для работы с dbf - TDBF (Copyright 2002-2004 Брусникин И.В.)

Скачал, посмотрел, прикольно. Но там как я понял тоже нельзя создать поле со структурой datetime.



Автор: greenpc
Дата сообщения: 23.09.2010 13:07
Man_Without_Face
Field1 := FormatDateTime('"dd/mm/yyyy hh:mm:ss"', Now);
или
ShortDataFormat := 'mm/dd/yyyy';
Добавлено:
Man_Without_Face

Код: procedure TForm1.btn4Click(Sender: TObject);
var
DBFTable : TTable;
begin
DBFTable := TTable.Create(nil);
with DBFTable do
begin
DatabaseName:='C:\temp\';
TableName:='person.dbf';
TableType:=ttDBase;
TableLevel:=4;
FieldDefs.Clear;
FieldDefs.Add('NAME',ftString,30,false);
FieldDefs.Add('S_DATE',ftDate);
FieldDefs.Add(S_DateTime, ftDateTime); // почему - то Character(30)
CreateTable;
Active:=true;
Insert;
Edit;
FieldByName('NAME').AsString :='Test';
FieldByName('S_DATE').Value := FormatDateTime('mm/dd/yyyy hh:mm:ss', Now-1); // только дата
FieldByName('S_DateTime').Value := Now; // дата и время
Post;
Free;
end;
end;
Автор: Man_Without_Face
Дата сообщения: 23.09.2010 14:40
greenpc
Спасибо, но выше описанный код у меня (после того как создан dbf файл) при открытии файла dbf (dbfNavigator) выдает ошибку: "Не верный размер записи или смещение." Если убираю datetime, все нормально.
Автор: greenpc
Дата сообщения: 23.09.2010 15:00
Man_Without_Face
у меня все нормально _http://img713.imageshack.us/img713/1024/test1u.jpg
единственная опечатка в пред. коде
FieldDefs.Add('S_DateTime', ftDateTime); // почему - то Character(30)

- забыл апострофы

Автор: Man_Without_Face
Дата сообщения: 23.09.2010 15:37
greenpc
Мда...все равно нужно поле datetime. В dbf файле присланном заказчиком в dbfNavigator'e тип поля datetime(8). Кодовая страница: 866 Russian MS-DOS. В файлах сформированных мной: None. Может еще какие-нибудь нормальные компоненты есть?

Автор: greenpc
Дата сообщения: 24.09.2010 07:24
Man_Without_Face

Цитата:
datetime(8)
размер 8 - только дата
для codepage вот

Код: var
fStream : TStream;
buf : Byte;
begin
fStream := TFileStream.Create('C:\temp\person.dbf', fmOpenWrite);
fStream.Seek(29, soFromBeginning); // место где указывается код
buf :=$65; // кодовая страница
fStream.Write(buf, 1);
fStream.Free;
Автор: greenpc
Дата сообщения: 24.09.2010 10:14
Man_Without_Face
ну и
1. ставим
Microsoft OLE DB Provider for Visual FoxPro 9.0.0.3504
или Microsoft OLE DB Provider for Visual FoxPro 8.0

2.
Код: cmd1.ConnectionString := 'Provider=VFPOLEDB.1;Data Source=C:\TEMP;Password="";Collating Sequence=RUSSIAN';
cmd1.CommandText := 'SET NULL OFF';
cmd1.Execute;
cmd1.CommandText := 'CREATE DBF Test.dbf (FILIAL N(5,0), DATE D, VAL Ca(3), WDT T)';
cmd1.Execute;
cmd1.CommandText := 'COPY TO Work.dbf AS 866';
cmd1.Execute;
Автор: Man_Without_Face
Дата сообщения: 24.09.2010 13:05
greenpc Спасибо. Это все для чего? Выставить кодовую страницу? А что это даст?

Есть еще один вопрос: можно ли с помощью компонента halcyon записать в dbf null значения если тип поля integer. Например dBase 4 (читал вроде там null не поддерживался), clipper, foxpro2).
Автор: greenpc
Дата сообщения: 24.09.2010 13:12
Man_Without_Face
1 пример, который с потоком - меняет кодовую страницу
2 пример, который с ADO - созает таблицу с полем DateTime(8)
в котое пишется дата и время


Цитата:
dbf null значения если тип поля integer

нет. если зачения которяе заносятся в поле >=0
то можно вместо null записать -1
Автор: Man_Without_Face
Дата сообщения: 24.09.2010 14:53
greenpc

Цитата:
2 пример, который с ADO - созает таблицу с полем DateTime(8)
в котое пишется дата и время

Если клиент в 1С загружает dbf файлы (версию не знаю) этот пример подойдет?


Цитата:
Microsoft OLE DB Provider for Visual FoxPro 9.0.0.3504

Скачал, поставил, там в примерах есть файл, в котором в конце поле _NullFlags с типом unknown. Я так так понимаю это поле отвечает за null значения. Если его в мой dbf записывать тоже, только вот какие значения ставить и в какой системе (там вроде 16: 0x0000, 0x0400, 0x0010, 0x0410, 0x0800)?


Автор: greenpc
Дата сообщения: 24.09.2010 15:53
Man_Without_Face

В этой колонке ставятся флажки, если другие колонки имеют значение NULL. Каждый бит соответствует своей колонке.
есть шанс что при откывании файла будет ошибка тогда
Нужно послать команду "SET NULL OFF"

Цитата:
Если клиент в 1С загружает dbf файлы (версию не знаю) этот пример подойдет?

а самому попробовать?
я понятие не имею - с 1с не работаю.
ЕЩЕ раз спрашиваю что бы узнать чей файл(формат) dbf у вас : чему равен первый байт в dbf файле?
Автор: Man_Without_Face
Дата сообщения: 24.09.2010 16:23
greenpc

Цитата:
чей файл(формат) dbf у вас

их 48 (30 в шестнадцатеричной), то что я формирую хальконом 03.

ДБФ грузят в 1С (версия 8.1), дальше 1С данные переписывает на сервер. И так как вместо null значений стоит 0, данные где стоит 0 не переписываются.

Автор: greenpc
Дата сообщения: 27.09.2010 07:29

Цитата:
то что я формирую хальконом 03.

это 0x03 FoxBASE+/Dbase III plus, no memo
в этом формате нету поля DateTime только Date.
В моем примере (где Tadocommand) как раз формируется нужная Вам таблица 0x30 Visual FoxPro

Цитата:
И так как вместо null значений стоит 0, данные где стоит 0 не переписываются
вот это я не понял - кем не переписываются?
Автор: Man_Without_Face
Дата сообщения: 27.09.2010 09:27
greenpc


Цитата:
вот это я не понял - кем не переписываются?

1C'сом не переписываются. Я толком не знаю, мне как передали так и написал. Хотят null значения и все тут.

И если не сложно пример записи значений в Tadocommand. Спасибо.


Добавлено:
greenpc
При выполнении выдает ошибку:
"Произошла одна или несколько ошибок во время обработки команды"

Если эту строчку закоментить, то все нормально:
cmd1.CommandText := 'COPY TO test.dbf AS 866';

И как добавить поддержку null значений?


Автор: greenpc
Дата сообщения: 27.09.2010 11:48
Man_Without_Face

Цитата:
пример записи значений в Tadocommand

см. комнду insert в sql

Цитата:
При выполнении выдает ошибку:

достаточно этого
cmd1.CommandText := 'execscript ([CREATE DBF Test.dbf codepage=866 (FILIAL I null, DATE D, VAL Ca(3) Null, WDT T)])';

Цитата:
Хотят null значения и все тут

готовый файл покажите?
Автор: Man_Without_Face
Дата сообщения: 27.09.2010 12:57

Цитата:
готовый файл покажите?

В присланном мне файле стоят 0, но нужно null.


Цитата:
cmd1.CommandText := 'execscript ([CREATE DBF Test.dbf codepage=866 (FILIAL I null, DATE D, VAL Ca(3) Null, WDT T)])';

Если заменяю на это, то при открытии файла пишет: Не удается открыть файл.

Вот так работает:

cmd1.ConnectionString := 'Provider=VFPOLEDB.1;Data Source=D:\;Password="";Collating Sequence=RUSSIAN';
cmd1.CommandText := 'CREATE DBF Test.dbf (FILIAL N(7,0) null, DATE D, VAL Ca(3), WDT T)';
cmd1.Execute;
cmd1.CommandText := 'INSERT INTO Test.dbf (FILIAL, VAL) VALUES (null, ''fff'')';
cmd1.Execute;

но вместо null записывается 0.
Автор: greenpc
Дата сообщения: 27.09.2010 14:37
Man_Without_Face

Код: cmd1.ConnectionString := 'Provider=VFPOLEDB.1;Data Source=D:\;Password="";Collating Sequence=RUSSIAN';
cmd1.CommandText := 'CREATE DBF Test.dbf codepage=866 (FILIAL N(7,0) null, DATE D, VAL Ca(3), WDT T)';
cmd1.Execute;
cmd1.CommandText := 'INSERT INTO Test.dbf (FILIAL, VAL) VALUES (null, ''fff'')';
cmd1.Execute;

with qry1 do
begin
Close;
ConnectionString := 'Provider=VFPOLEDB.1;Data Source=D:\;Password="";Collating Sequence=RUSSIAN';
SQL.Text := 'select * from Test.dbf where FILIAL is null';
Open;
ShowMessage('Null record='+IntToStr(RecordCount));
end;
with qry1 do
begin
Close;
ConnectionString := 'Provider=VFPOLEDB.1;Data Source=D:\;Password="";Collating Sequence=RUSSIAN';
SQL.Text := 'select * from Test.dbf where FILIAL=0';
Open;
ShowMessage('FILIAL=0 record='+IntToStr(RecordCount));
end;
Автор: Man_Without_Face
Дата сообщения: 27.09.2010 14:38
greenpc Спасибо.
Выше написанный код вызвает ошибку: 'Cannot open file d:\test.dbf'

Но я так понимаю это DBFNavigator так показывает (0 вместо '').

Еще не понимаю почему дату не записывает (Data type mismatch):
VALUES (NULL, ''fff'', ''05.10.2010'')';
Автор: greenpc
Дата сообщения: 27.09.2010 14:59
Man_Without_Face

Цитата:
Еще не понимаю почему дату не записывает (Data type mismatch):


Код: cmd1.CommandText := 'INSERT INTO Test.dbf (FILIAL, VAL, DATE) VALUES (null, ''fff'', {^1994-02-16})';
Автор: Man_Without_Face
Дата сообщения: 27.09.2010 15:08
greenpc Спасибо


Цитата:
{^1994-02-16}

Мне тут подсказывают это какое то старое представление, но никто не знает как дату+время в таком виде записать?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.