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

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

Автор: Ichigo2
Дата сообщения: 22.02.2012 07:57
salexn1
Да, то что надо! Благодарю!
exteris
Получается так. Но мне важнее фокус всей строчи, а не одной ячейки.
Автор: Ichigo2
Дата сообщения: 22.02.2012 19:27
А можно в одной ячейке хранить несколько данных, например в ячейке записано имя папки, и по двойному клику из этой же ячейки извлекается полный ее путь?
Автор: Frodo_Torbins
Дата сообщения: 22.02.2012 20:40
Ichigo2
Досталась мне в наследство одна прога, в которой дробные числа хранились в стринггриде. Результат был весьма плачевный: потеря точности, не сходящиеся суммы и злые бухгалтерши.
Даже если вы храните в компоненте отображения данных совсем не дробные числа, все равно так делать не стоит. В конце-концов есть же всякие ClientDataSet, JvMemoryData и прочие. Если их правильно использовать, то они могут очень сильно упростить ваш код (в моем случае количество кода уменьшалось в 3-4 раза).
Автор: salexn1
Дата сообщения: 22.02.2012 22:03
Ichigo2
Frodo_Torbins
На самом деле ничего плохого в хранении в одной ячейки нету. Весь вопрос, как реализовать.
У того же StringGrid есть Objects[ACol, ARow], который можно запихнуть ВСЕ, что пожелаешь.
А отображать можно на CustomDraw...
А от кривизны рук и ровности извилин не спасет ни ClientDataSet, ни JvMemoryData... Это про код, который достался в наследство.
Автор: sammozg
Дата сообщения: 24.02.2012 12:14
Frodo_Torbins
Благодарю за советы, но они мне не помогли, я поменял компонент на idTCPClient, вроде стало работать получше, но ни TCPClient, ни idTCPClient не работают когда я запускаю сразу 2 потока(разумеется с разными IP/Port), работает только один, пробывал создавать кучу клиентов, Запускать в разных потоках(всмысле с другим именем, и вообще писал отдельный поток), в общем устал как собака..., а он не работает (первый подвисает на соединении при запуске второго потока, второй благополучно работает, при запуске третьего, виснут первый и второй, работает тока третий и тд...). [more= Вот к чему я пришёл....]unit KRRead;

interface

uses
Classes, SysUtils, Sockets, ExtCtrls, Windows, Messages, Variants, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

type
Work = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;


Type
Buf = array [0..511] of byte;
PBuf = ^Buf;
function crc8 (Start, UsDataLen: integer; Mes: array of byte): byte;
var
Client1: TIDTCPClient;
InputARMData: buf;
KRData: buf;
KRDataQueryByf: Buf;
buffer: buf;
KRReadWrite, Rezerv: Boolean;


implementation
uses SKRSeting, SKR, ARMIO, SKRServer, SKRWork, data;

{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure Work.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ Work }

procedure Work.Execute;
var
KolParNastr14DOst, KolParNastr14AOst, KolParNastr14A, KolParNastrA, k, j: integer;
KR, Param, i, ii, LenSav, LenRec, KolParNastrD, KolParNastr14D: Integer;
A: Byte;
ELOKR, L, M, N, P, KolOKR4, KolOKR4Ost, TimeOut: Integer;
S, Oshibka: boolean;
begin
Oshibka:=False;
KR:=1;//SKR.KRNum;
data.Potok.KRWork[KR]:=true;
KRReadWrite:=True;
Client1:=TIDTcpClient.Create(Nil);
If data.Potok.KRRezerv[KR] then begin
Client1.Host:=SKRSeting.KRSet.KR[KR].RezIP;
Client1.Port:=StrToInt(SKRSeting.KRSet.KR[KR].RezPort);
Client1.ReadTimeout:=StrToInt(SKRSeting.KRSet.KR[KR].RezTimeOut);
end else begin
Client1.Host:=SKRSeting.KRSet.KR[KR].IP;
Client1.Port:=StrToInt(SKRSeting.KRSet.KR[KR].Port);
Client1.ReadTimeout:=StrToInt(SKRSeting.KRSet.KR[KR].TimeOut);
end;
try
Client1.Connect;
except
KRReadWrite:=false;
exit;
end;
While KRReadWrite do
begin
KRDataQueryByf[$00]:=KR;
KRDataQueryByf[$01]:=$00;
KRDataQueryByf[$04]:=$40;
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$00; // Чтение ИНР
for Param:=0 to strtoint(SKRseting.KRSet.KR[KR].INRKol)-1 do begin //поочерёдно читаем все ИНР
KRDataQueryByf[$07]:=Param;
KRDataQueryByf[$02]:=$03; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$08]:=crc8(0,8,KRDataQueryByf); //Считаем CRC
LenSav:=8+4*strtoint(SKRseting.KRSet.KR[KR].INR[Param+1]); //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], 9);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 4*strtoint(SKRSeting.KRSet.KR[KR].INR[Param+1]) do
Begin
A:=Buffer[i+7];
Data.KRData[KR].INR[Param].INRIO[i]:=A;
end;
end;
end;//Закончили читать ИНР
// Чтение Параметров настройки
//********************
KolParNastrA:=strtoint(SKRseting.KRSet.KR[KR].AIKol);
k:=0;
If KolParNastrA>0 then //Читаем AI
begin
KolParNastr14A:=KolParNastrA div 14;
KolParNastr14AOst:=KolParNastrA mod 14;
KRDataQueryByf[$06]:=$01;
for Param:=1 to KolParNastr14A do begin //поочерёдно читаем параметры пакетами по 14 штук
KRDataQueryByf[$07]:=$0E;
KRDataQueryByf[$02]:=$2D; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
for j:=1 to 14 do
begin
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,2]); //номер входа алгоблока
end;
KRDataQueryByf[$32]:=crc8(0,49,KRDataQueryByf); //Считаем CRC
LenSav:=$79; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], $33);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,$78,buffer); //Считаем CRC
If buffer[$78]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 111 do
Begin
A:=Buffer[i+8];
Data.KRData[KR].AI[i+k*112]:=A;
end;
end;
end;
end; //Закончили читать ПАкеты AI
//*****************
If KolParNastr14Aost>0 then
begin //''4''
KRDataQueryByf[$07]:=KolParNastr14Aost;
KRDataQueryByf[$02]:=KolParNastr14Aost*3+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$06]:=$01;
for j:=1 to KolParNastr14Aost do
begin
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,2]); //номер входа алгоблока
end;
KRDataQueryByf[KolParNastr14Aost*3+8]:=crc8(0,KolParNastr14Aost*3+8,KRDataQueryByf); //Считаем CRC
LenSav:=KolParNastr14Aost*8+9; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], 9);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
for i:=0 to KolParNastr14Aost*8 do
Begin
If (buffer[4] and $02)=1 then Rezerv:=true;
A:=Buffer[i+8];
Data.KRData[KR].AI[i+k*112]:=A;
end;
end ;
end; //Закончили читать остатки AI
If StrToInt(SKRSeting.KRSet.KR[KR].OKRKol)>0 then
begin
L:=1;
M:=0;
KolOKR4:=StrToInt(SKRSeting.KRSet.KR[KR].OKRKol) div 4;
KolOKR4Ost:=StrToInt(SKRSeting.KRSet.KR[KR].OKRKol) mod 4;
For ELOKR:=1 to KolOKR4 do
begin
KRDataQueryByf[$02]:=$07; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$02;
KRDataQueryByf[$07]:=$04;
KRDataQueryByf[$08]:=L;
KRDataQueryByf[$09]:=L+1;
KRDataQueryByf[$0A]:=L+2;
KRDataQueryByf[$0B]:=L+3;
L:=L+4;
KRDataQueryByf[$0C]:=crc8(0,$0C,KRDataQueryByf);
LenSav:=$65; //Считаем сколько должно придти
LenRec:=LenSav; //Сохраняем резервную копию(чтоб второй раз не считать)
i:=0;
Client1.WriteBuffer(KRDataQueryByf[$00], $0D);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 23*4-1 do
Begin
A:=Buffer[i+8];
Data.KRData[KR].OKR[i+M*$5c]:=A;
end;
M:=M+1;
end;
End;
If KolOKR4Ost>0 then
begin
KRDataQueryByf[$02]:=KolOKR4Ost+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$02;
KRDataQueryByf[$07]:=KolOKR4Ost;
For i:=0 to KolOKR4Ost do
begin
KRDataQueryByf[i+8]:=L+i;
end;
KRDataQueryByf[KolOKR4Ost+8]:=crc8(0,KolOKR4Ost+8,KRDataQueryByf);
LenSav:=23*KolOKR4Ost+9; //Считаем сколько должно придти
LenRec:=LenSav; //Сохраняем резервную копию(чтоб второй раз не считать)
i:=0;
Client1.WriteBuffer(KRDataQueryByf[$00], KolOKR4Ost+9);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 23*KolOKR4Ost-1 do
Begin
A:=Buffer[i+8];
Data.KRData[KR].OKR[i+M*$5c]:=A;
end;
end;
End;
End;
//******************************


KolParNastrA:=strtoint(SKRseting.KRSet.KR[KR].AOKol);
k:=0;
If KolParNastrA>0 then //Читаем A0
begin
KolParNastr14A:=KolParNastrA div 14;
KolParNastr14AOst:=KolParNastrA mod 14;
KRDataQueryByf[$06]:=$04;
for Param:=1 to KolParNastr14A do begin //поочерёдно читаем параметры пакетами по 14 штук
KRDataQueryByf[$07]:=$0E;
KRDataQueryByf[$02]:=$2D; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
for j:=1 to 14 do
begin
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,2]); //номер входа алгоблока
end;
k:=k+1;
KRDataQueryByf[$32]:=crc8(0,49,KRDataQueryByf); //Считаем CRC
LenSav:=$79; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], $33);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,$78,buffer); //Считаем CRC
If buffer[$78]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 111 do
Begin
A:=Buffer[i+8];
Data.KRData[KR].AO[i+k*112]:=A;
end;
end;
end;
end; //Закончили читать ПАкеты AO
//*****************
If KolParNastr14Aost>0 then
begin //''4''
KRDataQueryByf[$07]:=KolParNastr14Aost;
KRDataQueryByf[$02]:=KolParNastr14Aost*3+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$06]:=$04;
for j:=1 to KolParNastr14Aost do
begin
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,2]); //номер входа алгоблока
end;
k:=k+1;
KRDataQueryByf[KolParNastr14Aost*3+8]:=crc8(0,KolParNastr14Aost*3+8,KRDataQueryByf); //Считаем CRC
LenSav:=KolParNastr14Aost*8+9; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], KolParNastr14Aost*3+9);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
for i:=0 to KolParNastr14Aost*8 do
Begin
If (buffer[4] and $02)=1 then Rezerv:=true;
A:=Buffer[i+8];
Data.KRData[KR].AO[i+k*112]:=A;
end;
end;
end; //Закончили читать остатки AO




//*****************************

If Data.KRData[KR].KolCom>0 Then
Begin
s:=True;
While s do begin
if Data.KRData[KR].Flag then sleep(1) else begin
Data.KRData[KR].Flag:=True;
For P:=0 to Data.KRData[KR].KolCom-1 do begin
For N:=0 to Data.KRData[KR].COM[P,2]+6 do KRDataQueryByf[n]:=Data.KRData[KR].COM[P,n];
LenSav:=$0A; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], $0F);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If (buffer[LenRec-1]<>i) or (Buffer[$07]+Buffer[$08]<>0) then //Проверяем CRC и ответ
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
Form1.Label1.Caption:='Ошибка отправки данных в контроллер';
end; //''6''
Data.KRData[KR].KolCom:=$00;
end;
Data.KRData[KR].Flag:=False;
s:=False;
end;
end;
end;

//*****************************

//SKR.TimeKolIter:=SKR.TimeKolIter+1;
//Form1.Label3.Caption:=IntToStr(SKR.TimeKolIter);
If Rezerv then begin
data.Potok.KRRezerv[KR]:=true;
break;
end;
if Oshibka then break;
end; //Повтор
data.Potok.KRWork[KR]:=false;
Client1.Disconnect;
Client1.Destroy;
//Form1.ListBox1.Items.Add('Вышебло на '+IntToStr(SKR.TimeKolIter));
//Form1.Timer1.Enabled:=True;
end;

function crc8 (Start, UsDataLen: integer; Mes: array of byte): byte;
var
i:word;
CR : cardinal;
begin
CR:=0;
for i:=Start to UsDataLen-1 do
begin
CR:=CR+Mes[i];
CR:= (CR and $FF) + (CR shr 8);
end;
CR:=(CR and $FF) + (CR shr 8);
CR:= not CR + $01;
CRC8:=CR and $FF;
end;

end.
[/more]
Автор: Frodo_Torbins
Дата сообщения: 24.02.2012 12:58
sammozg
Торенты на этом компьютере нормально работают? А то вдруг дело в винде.
И на какой именно строке виснет?
Автор: ant0ni02004
Дата сообщения: 24.02.2012 15:58
sammozg

по идее надо в каждом потоке создавать свой idTCPClient
Автор: LadyOfWood
Дата сообщения: 25.02.2012 14:59
sammozg
Избавляйтесь от глобавльных переменных, TIdTCPClient должен принадлежать потоку, а не быть глобальной переменной, ибо вся синхронизация в данном случае идет лесом. Хотя у вас она вообще отсутствует, потоэтому непредсказуемые ошибки и вылеты гарантированы.
Автор: sammozg
Дата сообщения: 27.02.2012 05:40
Frodo_Torbins
Подвисает на Client1.Connect; Торент-клиентов нет, но есть другие проги опрашивающие контроллеры, в них несколько потоков работают нормально(просматривал снифером)
ant0ni02004
Я пробывал как в нутри потока, так и в нутри класса прописывать, проблема остаётся...
LadyOfWood
избавился от всех глобальных переменных, даже привязки убрал к основному потоку, ничего не помогает....
Теперь ещё одна проблема появилась, когда запускаю только один работает как часики, когда 2 и более виден старт последнего, потом встаёт так-же на конекте...
Может мне в другой версии делфи откампилить проект....
Автор: usatiypolosatiy
Дата сообщения: 27.02.2012 09:54
Вопрос по работе с word

Немогу сделать поиск текста в документе. Причем надо найти все случаи совпадения по документу и отметить их цветом. Подскажите кто встречался.
Автор: Frodo_Torbins
Дата сообщения: 27.02.2012 10:52
usatiypolosatiy
Запись и просмотр исходного кода макроса?

sammozg
Выложите обновленный код без глобальных переменных.
Автор: usatiypolosatiy
Дата сообщения: 27.02.2012 11:07
Не получается из макроса получить работоспособный код. на VBA получается но не могу перенести в delphi.
Автор: LadyOfWood
Дата сообщения: 27.02.2012 14:01

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

Код в студию. Новая версия Delphi вряд ли поможет.
Автор: sammozg
Дата сообщения: 29.02.2012 07:25
Frodo_Torbins
LadyOfWood
Благодарю за помощь, я решил проблему иначе, создал новый проект и дописывал его кодом из предыдущего, все заработало на ура, единственное количество форм и компонентов уменьшилось, Я когда создавал предыдущий проект присоединял к проекту много различных форм, некоторые позже удолялись, может в этом была проблема, сейчас оставил одну форму и один поток, [more=В итоге код потока стал таким] unit Work;

interface

uses
Classes, StdCtrls, SysUtils, Messages, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient;

type
Work1 = class(TThread)
private
procedure SETKR;
{ Private declarations }
protected
procedure Execute; override;
end;
Type
Buf = array [0..511] of byte;
PBuf = ^Buf;
function crc8 (Start, UsDataLen: integer; Mes: array of byte): byte;

var
KRDataQueryByf:array [0..512] of byte;
buffer:array [0..512] of byte;
KRNum:integer;
implementation
uses KR;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure Work.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ Work }

procedure Work1.Execute;
var
KRSETWORK:TKRServ;
KolParNastr14DOst, KolParNastr14AOst, KolParNastr14A, KolParNastrA, k, j: integer;
NUMERKR,{ KR,} Param, i, ii, LenSav, LenRec, KolParNastrD, KolParNastr14D: Integer;
A: Byte;
ELOKR, L, M, N, P, KolOKR4, KolOKR4Ost, TimeOut: Integer;
S, Oshibka: boolean;
Client1: TIDTCPClient;
InputARMData: buf;
KRDataQueryByf: Buf;
buffer: buf;
KRReadWrite: Boolean;
Rezerv: Boolean;
begin
KRSETWORK:=KRSet;
KRNum:=0;
Synchronize(SETKR);
If KRNum<>0 then begin
NUMERKR:=KRNum;
KRReadWrite:=True;
end else KRReadWrite:=False;
IF KRReadWrite then begin// KRSETWORK
Oshibka:=False;
Rezerv:=False;
Client1:=TIDTcpClient.Create(Nil);
If Potok.KRRezerv[NUMERKR] then begin
Client1.Host:=KRSETWORK.KR[NUMERKR].RezIP;
Client1.Port:=StrToInt(KRSETWORK.KR[NUMERKR].RezPort);
Client1.ReadTimeout:=StrToInt(KRSETWORK.KR[NUMERKR].RezTimeOut);
end else begin
Client1.Host:=KRSETWORK.KR[NUMERKR].IP;
Client1.Port:=StrToInt(KRSETWORK.KR[NUMERKR].Port);
Client1.ReadTimeout:=StrToInt(KRSETWORK.KR[NUMERKR].TimeOut);
end;
try
Client1.Connect;
except
KRReadWrite:=false;
Oshibka:=True;
end;
end;
{ Place thread code here }

While KRReadWrite do
begin
KRDataQueryByf[$00]:=NUMERKR;
KRDataQueryByf[$01]:=$00;
KRDataQueryByf[$04]:=$40;
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$00; // Чтение ИНР
for Param:=0 to strtoint(KRSETWORK.KR[NUMERKR].INRKol)-1 do begin //поочерёдно читаем все ИНР
KRDataQueryByf[$07]:=Param;
KRDataQueryByf[$02]:=$03; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$08]:=crc8(0,8,KRDataQueryByf); //Считаем CRC
LenSav:=8+4*strtoint(KRSETWORK.KR[NUMERKR].INR[Param+1]); //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], 9);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 4*strtoint(KRSETWORK.KR[NUMERKR].INR[Param+1]) do
Begin
if NumerKR=2 then
begin
end;
A:=Buffer[i+7];
KRData[NUMERKR].INR[Param].INRIO[i]:=A;
end;
end;
end;//Закончили читать ИНР
// Чтение Параметров настройки
//********************
if not (KRSETWORK.KR[NUMERKR].AIKol='') then KolParNastrA:=strtoint(KRSETWORK.KR[NUMERKR].AIKol) else KolParNastrA:=0;
k:=0;
If KolParNastrA>0 then //Читаем AI
begin
KolParNastr14A:=KolParNastrA div 14;
KolParNastr14AOst:=KolParNastrA mod 14;
KRDataQueryByf[$06]:=$01;
for Param:=1 to KolParNastr14A do begin //поочерёдно читаем параметры пакетами по 14 штук
KRDataQueryByf[$07]:=$0E;
KRDataQueryByf[$02]:=$2D; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
for j:=1 to 14 do
begin
KRDataQueryByf[j*3+5]:=(strtoint(KRSETWORK.KR[NUMERKR].AI[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(KRSETWORK.KR[NUMERKR].AI[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(KRSETWORK.KR[NUMERKR].AI[14*k+j,2]); //номер входа алгоблока
end;
KRDataQueryByf[$32]:=crc8(0,$32{49},KRDataQueryByf); //Считаем CRC
LenSav:=$79; //Считаем сколько должно придти
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], $33);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,$78,buffer); //Считаем CRC
If buffer[$78]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 111 do
Begin
A:=Buffer[i+8];
KRData[NUMERKR].AI[i+k*112]:=A;
end;
end;
end;
end; //Закончили читать ПАкеты AI
//*****************
If KolParNastr14Aost>0 then
begin //''4''
KRDataQueryByf[$07]:=KolParNastr14Aost;
KRDataQueryByf[$02]:=KolParNastr14Aost*3+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$06]:=$01;
for j:=1 to KolParNastr14Aost do
begin
KRDataQueryByf[j*3+5]:=(strtoint(KRSETWORK.KR[NUMERKR].AI[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(KRSETWORK.KR[NUMERKR].AI[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(KRSETWORK.KR[NUMERKR].AI[14*k+j,2]); //номер входа алгоблока
end;
KRDataQueryByf[KolParNastr14Aost*3+8]:=crc8(0,KolParNastr14Aost*3+8,KRDataQueryByf); //Считаем CRC
LenSav:=KolParNastr14Aost*8+9; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], 9+KolParNastr14Aost*3);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
for i:=0 to KolParNastr14Aost*8 do
Begin
If (buffer[4] and $02)=1 then Rezerv:=true;
A:=Buffer[i+8];
KRData[NUMERKR].AI[i+k*112]:=A;
end;
end ;
end; //Закончили читать остатки AI
if (not (KRSETWORK.KR[NUMERKR].OKRKol='')) and (StrToInt(KRSETWORK.KR[NUMERKR].OKRKol)>0) then
begin
L:=1;
M:=0;
KolOKR4:=StrToInt(KRSETWORK.KR[NUMERKR].OKRKol) div 4;
KolOKR4Ost:=StrToInt(KRSETWORK.KR[NUMERKR].OKRKol) mod 4;
For ELOKR:=1 to KolOKR4 do
begin
KRDataQueryByf[$02]:=$07; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$02;
KRDataQueryByf[$07]:=$04;
KRDataQueryByf[$08]:=L;
KRDataQueryByf[$09]:=L+1;
KRDataQueryByf[$0A]:=L+2;
KRDataQueryByf[$0B]:=L+3;
L:=L+4;
KRDataQueryByf[$0C]:=crc8(0,$0C,KRDataQueryByf);
LenSav:=$65; //Считаем сколько должно придти
LenRec:=LenSav; //Сохраняем резервную копию(чтоб второй раз не считать)
i:=0;
Client1.WriteBuffer(KRDataQueryByf[$00], $0D);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 23*4-1 do
Begin
A:=Buffer[i+8];
KRData[NUMERKR].OKR[i+M*$5c]:=A;
end;
M:=M+1;
end;
End;
If KolOKR4Ost>0 then
begin
KRDataQueryByf[$02]:=KolOKR4Ost+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$02;
KRDataQueryByf[$07]:=KolOKR4Ost;
For i:=0 to KolOKR4Ost do
begin
KRDataQueryByf[i+8]:=L+i;
end;
KRDataQueryByf[KolOKR4Ost+8]:=crc8(0,KolOKR4Ost+8,KRDataQueryByf);
LenSav:=23*KolOKR4Ost+9; //Считаем сколько должно придти
LenRec:=LenSav; //Сохраняем резервную копию(чтоб второй раз не считать)
i:=0;
Client1.WriteBuffer(KRDataQueryByf[$00], KolOKR4Ost+9);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 23*KolOKR4Ost-1 do
Begin
A:=Buffer[i+8];
KRData[NUMERKR].OKR[i+M*$5c]:=A;
end;
end;
End;
End;
//******************************

if not (KRSETWORK.KR[NUMERKR].AOKol='') then KolParNastrA:=strtoint(KRSETWORK.KR[NUMERKR].AOKol) else KolParNastrA:=0;
k:=0;
KolParNastr14A:=0;
KolParNastr14AOst:=0;
If KolParNastrA>0 then //Читаем A0
begin
KolParNastr14A:=KolParNastrA div 14;
KolParNastr14AOst:=KolParNastrA mod 14;
KRDataQueryByf[$06]:=$04;
for Param:=1 to KolParNastr14A do begin //поочерёдно читаем параметры пакетами по 14 штук
KRDataQueryByf[$07]:=$0E;
KRDataQueryByf[$02]:=$2D; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
for j:=1 to 14 do
begin
KRDataQueryByf[j*3+5]:=(strtoint(KRSETWORK.KR[NUMERKR].AO[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(KRSETWORK.KR[NUMERKR].AO[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(KRSETWORK.KR[NUMERKR].AO[14*k+j,2]); //номер входа алгоблока
end;
k:=k+1;
KRDataQueryByf[$32]:=crc8(0,49,KRDataQueryByf); //Считаем CRC
LenSav:=$79; //Считаем сколько должно придти
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], $33);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,$78,buffer); //Считаем CRC
If buffer[$78]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 111 do
Begin
A:=Buffer[i+8];
KRData[NUMERKR].AO[i+k*112]:=A;
end;
end;
end;
end; //Закончили читать ПАкеты AO
//*****************
If KolParNastr14Aost>0 then
begin //''4''
KRDataQueryByf[$07]:=KolParNastr14Aost;
KRDataQueryByf[$02]:=KolParNastr14Aost*3+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$06]:=$04;
for j:=1 to KolParNastr14Aost do
begin
KRDataQueryByf[j*3+5]:=(strtoint(KRSETWORK.KR[NUMERKR].AO[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(KRSETWORK.KR[NUMERKR].AO[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(KRSETWORK.KR[NUMERKR].AO[14*k+j,2]); //номер входа алгоблока
end;
k:=k+1;
KRDataQueryByf[KolParNastr14Aost*3+8]:=crc8(0,KolParNastr14Aost*3+8,KRDataQueryByf); //Считаем CRC
LenSav:=KolParNastr14Aost*8+9; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], KolParNastr14Aost*3+9);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
for i:=0 to KolParNastr14Aost*8 do
Begin
If (buffer[4] and $02)=1 then Rezerv:=true;
A:=Buffer[i+8];
KRData[NUMERKR].AO[i+k*112]:=A;
end;
end;
end; //Закончили читать остатки AO
//*****************************
If KRData[NUMERKR].KolCom>0 Then
Begin
s:=True;
While s do begin
if KRData[NUMERKR].Flag then sleep(1) else begin
KRData[NUMERKR].Flag:=True;
For P:=0 to KRData[NUMERKR].KolCom-1 do begin
For N:=0 to KRData[NUMERKR].COM[P,2]+6 do KRDataQueryByf[n]:=KRData[NUMERKR].COM[P,n];
LenSav:=$0A; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.WriteBuffer(KRDataQueryByf[$00], $0F);
try
Client1.ReadBuffer(buffer[i],lenSav);
except
Oshibka:=True;
end;
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If (buffer[LenRec-1]=i) {or (Buffer[$07]+Buffer[$08]<>0)} then //Проверяем CRC и ответ
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
end else Oshibka:=True; //''6''
end;
KRData[NUMERKR].KolCom:=$00;
KRData[NUMERKR].Flag:=False;
s:=False;
end;
end;
end;

//*****************************

If Rezerv then begin
if Potok.KRRezerv[NUMERKR] then Potok.KRRezerv[NUMERKR]:=not Potok.KRRezerv[NUMERKR];
break;
end;
if Oshibka then break;
if not Potok.KRWork[NUMERKR] then break;
end; //Повтор
Potok.KRWork[NUMERKR]:=false;
Client1.Disconnect;
Client1.Destroy;
if Oshibka then ShowMessage('Oшибка приёма-передачи с Контроллером №'+IntToStr(NUMERKR));
end;

function crc8 (Start, UsDataLen: integer; Mes: array of byte): byte;
var
i:word;
CR : cardinal;
begin
CR:=0;
for i:=Start to UsDataLen-1 do
begin
CR:=CR+Mes[i];
CR:= (CR and $FF) + (CR shr 8);
end;
CR:=(CR and $FF) + (CR shr 8);
CR:= not CR + $01;
CRC8:=CR and $FF;
end;

procedure Work1.SETKR;
var
i:integer;
begin
For i:=1 to StrToInt(KRSet.KRkol) do begin
If not potok.KRWork[i] then begin
KRNum:=i;
Potok.KRWork[KRNum]:=True;
Break;
end;
end;

end;

end.
[/more]
Автор: ArtSnegirev
Дата сообщения: 29.02.2012 20:36
delphi 2006
народ, подскажите как сделать post запрос на сервер через HTTPS, используя при этом установленный в windows хранилище клиентский сертификат (рабочий пример очень нужен). Indy не умеет обращаться с виндовым хранилищем сертификатов, а secureblackbox (7 версия) плюется на совершенно корректный сертификат (invalid key material). голову уже сломал в поисках решения. нужно работать именно с виндовым хранилищем, т.к. сертификаты генерятся виндовым сервисом
Автор: LadyOfWood
Дата сообщения: 01.03.2012 20:26

Цитата:
а secureblackbox (7 версия) плюется на совершенно корректный сертификат

Secure Blackbox действительно хорошее решения и достаточно всеядное, может просто флаги указаны неверно или что в этом роде, лучше взглянуть под отладчиком.

Цитата:
Indy не умеет обращаться

Indy тут сама ничего не умеет, к ней обычно прикручивают OpenSSL. Можно и SecureBlackbox прикрутить, там есть необходимые файлы.
Автор: ArtSnegirev
Дата сообщения: 01.03.2012 22:42

Цитата:
Secure Blackbox действительно хорошее решения и достаточно всеядное, может просто флаги указаны неверно или что в этом роде, лучше взглянуть под отладчиком.

Нет, код правильный. Это та версия, на которой я проверял оказалось кривой, об написали на сайте тех. поддержки. С тем же кодом без ошибок отработала 9-я версия, но на нее у меня не ключа.


Цитата:
Indy тут сама ничего не умеет, к ней обычно прикручивают OpenSSL. Можно и SecureBlackbox прикрутить, там есть необходимые файлы.

OpenSSL не понимает виндовые сертификаты, и не умеет обращаться к виндовому хранилищу.

Нашел в сети старую (5) версию SecureBlackbox, с ней вроде все работает.
Автор: StalkerSoftware
Дата сообщения: 02.03.2012 17:36
Привет

Есть небольшой вопрос по Delphi:
Хочу сделать рамку вокруг TEdit.

Делаю наследника от TEdit и прописываю ему WMPaint

[more=Это код обработчика]

procedure TEdit.WMPaint(var Message: TWMPaint);
var
oCanvas :TControlCanvas;
psRect :TRect;

begin

inherited;

oCanvas := TControlCanvas.Create;
try

oCanvas.Control := Self;
oCanvas.Font := Self.Font;

with oCanvas do begin

psRect.Left := Left - 1;
psRect.Right := Left + Width + 1;
psRect.Top := Top - 1;
psRect.Bottom := Top + Height + 1;
oCanvas.Brush.Color := clRed;
oCanvas.FrameRect(psRect);

end;

finally
oCanvas.Free;
end;

end;
[/more]

Рамка не рисуется.

Хотя если заменить
oCanvas.Control := Self;
oCanvas.Font := Self.Font;
на
oCanvas.Control := Self.Parent;
oCanvas.Font := Self.Font;
то все рисуется нормально.

Вопрос: Почему так ?
Я хочу понять, почему рамка рисуется только на родителе (Parent), а на самом компоненте (Self) не хочет ...
Автор: LadyOfWood
Дата сообщения: 02.03.2012 17:43

Цитата:
Вопрос: Почему так ?

Ну так посмотрите как вы рисуете,
Код: psRect.Left := Left - 1;
Автор: StalkerSoftware
Дата сообщения: 02.03.2012 19:48
LadyOfWood

Цитата:
это находится вне прямоугольнока едита и еще в неправильных координатах (в координтах едита должно быть -1, но это все равно не поможет).

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

Попробовал вариант с координатами

psRect.Left := 0;
psRect.Right := Left + Width;
psRect.Top := 0;
psRect.Bottom := Top + Height;

Теперь оно рисуется, но как то криво.
Или может лучше рисовать его на родителе ?
Автор: LadyOfWood
Дата сообщения: 02.03.2012 20:08

Код:
psRect.Left := 0;
psRect.Right := Width;
psRect.Top := 0;
psRect.Bottom := Height;
Автор: Ichigo2
Дата сообщения: 04.03.2012 11:03
А как можно сделать, чтобы при старте Делфи открывался юнит из проекта, а не проект?
Автор: ArtSnegirev
Дата сообщения: 04.03.2012 12:45
Ichigo2
Скорее всего имеется в виду - чтобы открывался юнит при открытии проекта!?
Можно поставить в настройках галку "Autosave project desktop", тогда при повторном открытии проекта все ранее открытые файлы также будут открыты.
Автор: Ichigo2
Дата сообщения: 04.03.2012 15:08
ArtSnegirev
Вы меня поняли. Отлично, все работает!
Автор: Ichigo2
Дата сообщения: 05.03.2012 09:27
Не пойму, как засунуть ListView во вкладку TabControl или TabSet. Почему-то нельзя просто взять и перетащить его. Как правильно?
Автор: ArtSnegirev
Дата сообщения: 05.03.2012 10:14
попробуй Ctrl-X, потом выдели контрол куда вставить и Ctrl-V
Автор: salexn1
Дата сообщения: 05.03.2012 10:45
Ichigo2
Юзай PageControl
Автор: Ichigo2
Дата сообщения: 06.03.2012 08:18
ArtSnegirev
Ха, получилось! Я бы не догадался. Всем спасибо.
Автор: Grande
Дата сообщения: 13.03.2012 07:30
Уважаемые знатоки, не поможете ли с такой проблемой.
Необходимо создать несколько (на начальном этапе количество неизвестно) экземпляров TForm - задача тривиальная. Но в каждом экземпляре одноименные переменные должны иметь своё, уникальное значение. На практике эти переменные принимают значение переменных последней созданной формы.
Что-то голову сломал - не приходит ничего на ум. Помогите, пожалуйста.
С уважением, Сергей ака Grande.
Автор: wasilissk
Дата сообщения: 13.03.2012 07:57
Grande
Наследник класса TForm имеет несколько полей, при создании несколькоих экземпляров этого класса, необходимо инициализировать эти поля случайными неповторяющимися значениями.
Я правильно перевел?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

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


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