![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ciacomport [D7, Win2k, WinXP]
Максим © (2008-04-09 12:06:00)Здравствуйте.
При работе с компонентом ciacomport под Дельфи 7 столкнулся вот с какими проблемами:
- При компиляции на различных платформах Windows (2000/2003/XP различных сборок и сервиспаков) компонент ведет себя по разному.
- вторая проблема, наверняка тоже связана с первой. При работе с термопринтером (com-порт) одна и та же функция печати в одной программе ведет себя не совсем так как хочется.
Сначало о первом.
Работал на XP Professional писал проект с использованием этого компонента. После переустановки Windows на XP Home, оборудование на отрез отказалось работать в той же самой сборке компонентов. прищлось вносить небольшие изменения, чтобы привести все в чувство. Зато она хорошо закомпилировалась на Win2003 и прекрасно все заработало.
Теперь о второй проблеме.
Фукция печати чека работает не по закону всемирного программирования ))). У меня есть главная форма и форма, на которой лежит сам компонент CiaComPort. На этой же форме расположена функция печати. При вызове функции из главной формы этой функции вроде все работает верно (по крайней мере как и хочется). А вот при вызове этой же самой функции из второй формы печать идет, но не заканчивается. Она прерывается напечатав только часть данных и останавлиается. Правда есть одна особенность - после печати, я закрываю форму. Но я проверил - порт даже после закрытия формы остается открытым (ранее выяснил, что при закрытии порта он останавливает процесс печати).
Вот так выглядит моя функция печати до модификации
procedure TDataM.PrintChek(s:string);
var s1: String;
sc:PChar;
begin
try
CiaComPort1.Open:=False;
CiaComPort1.Parity:=ptNone;
CiaComPort1.Baudrate:=19200;
CiaComPort1.Open:=True;
sc:=PChar(s+#$0A);
s1:=sc;
CharToOem(sc,PChar(s1));
CiaComPort1.SendStr(#$1B#$4D#$00); //размер шрифта.
CiaComPort1.SendStr(s1+#$A#$D#$A#$D#$A#$D#$A#$D#$A#$D);
CiaComPort1.SendStr(#$1D#$49#$01);
CiaComPort1.SendStr(#$1B#$69);
except
CiaComPort1.Open:=False;
end;
end;
А вот так после:
procedure TDataM.PrintChek(s:string);
var s1: String;
sc:PChar;
begin
try
CiaComPort1.Baudrate:=19200;
CiaComPort1.Open:=False;
CiaComPort1.Open:=True;
CiaComPort1.Accessible;
sc:=PChar(s+#$0A);
s1:=sc;
AnsiToOem(sc,PChar(s1));
//CiaComPort1.SendStr(#$1B+'t'+#$09); //Windows Character.
CiaComPort1.PurgeTx;
CiaComPort1.SendStr(#$1B+'t'+#$07); //DOS Character.
CiaComPort1.ProcessMessages;
sleep(10);
CiaComPort1.PurgeTx;
CiaComPort1.SendStr(#$1B#$4D#$00); //размер шрифта.
CiaComPort1.ProcessMessages;
sleep(10);
CiaComPort1.PurgeTx;
CiaComPort1.SendStr(s1+#$A#$D#$A#$D#$A#$D#$A#$D#$A#$D);
CiaComPort1.ProcessMessages;
sleep(100);
CiaComPort1.PurgeTx;
CiaComPort1.SendStr(#$1D#$49#$01);
CiaComPort1.ProcessMessages;
sleep(100);
CiaComPort1.PurgeTx;
CiaComPort1.SendStr(#$1B#$69); // Отрезка чека
CiaComPort1.ProcessMessages;
sleep(100);
log('print chek','Ok');
except
on e:Exception do
begin
log('print chek','ERROR:'+e.Message);
CiaComPort1.Open:=False;
end;
end;
end;
p.s.: компонент версии 1.15. Принтер CITIZEN CBM1000 Serial.
Хотя тип устройства значения не имеет, т.к. они все перестали работать.
Заранее благодарю.
Сергей М. (2008-04-09 12:32:00) [21]
> Фукция печати чека работает не по закону всемирного программирования
Эт точно)
По закону всемирного программирования конструкция try..except используется, мягко говоря, иначе)