![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Access Violation и функция move [D6, WinXP]
ZedeS © (2005-05-24 16:04:00)Доброго времени суток!
Пишу програмулину для роботы по Telnet. Использую компонент Indy Telnet Client (IdTelnet). У него процедура SendChr. Мне надо передать заранее подготовленную строку s. Я ее загоняю в массив st: array of char; при помощи функции move. Вот она, по-моему, и генерит сообщение Access Violation.
Каким другим спосбом можно пропихнуть заданную строку (s:string;) через Telnet.
Ниже листинг программы.
Заранне благодарю за советы.
На форме: Button1, Memo1, UdTelnet1.
Это сообщение:
Project XXXX raised exception class EAccessViolation with message
'Access violation at adress 00000000. Read address 0000000'.
Process stoped...
Вместо нулей при други раскладах - другие адреса.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdTelnet, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
IdTelnet1: TIdTelnet;
procedure IdTelnet1DataAvailable(Buffer: String);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// взято из Кулибы - это такой замечательный зборник советовprocedure Delay(ms : longint);
var
T : LongInt;
begin
T := GetTickCount + ms;
while GetTickCount < T do
Application.ProcessMessages;
end;
//взято из стандартного примера в комлекте с Делфямиprocedure TForm1.IdTelnet1DataAvailable(Buffer: String);
{This routine comes directly from the ICS TNDEMO code. Thanks to Francois Piette
It updates the memo control when we get data}
const
CR = #13;
LF = #10;
var
Start, Stop: Integer;
begin
if Memo1.Lines.Count = 0 then
Memo1.Lines.Add('');
Start := 1;
Stop := Pos(CR, Buffer);
if Stop = 0 then
Stop := Length(Buffer) + 1;
while Start <= Length(Buffer) do
begin
Memo1.Lines.Strings[Memo1.Lines.Count - 1] :=
Memo1.Lines.Strings[Memo1.Lines.Count - 1] +
Copy(Buffer, Start, Stop - Start);
if Buffer[Stop] = CR then
begin
Memo1.Lines.Add('');
{$IFNDEF Linux}
SendMessage(Memo1.Handle, WM_KEYDOWN, VK_UP, 1);
{$ENDIF}
end;
Start := Stop + 1;
if Start > Length(Buffer) then
Break;
if Buffer[Start] = LF then
Start := Start + 1;
Stop := Start;
while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do
Stop := Stop + 1;
end;
end;
// а вот здесь нужно искать багу
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
b,q,i:integer;
st: array of char;
begin
b:=1;
s:='ZEQO:BTS='+IntToStr(b)+';`ZEQO:BTS='+IntToStr(b+1)+';`ZEQO:BTS='+IntToStr(b+2)+';`ZERO:BCF='+IntToStr(b)+';`ZDTI:::P CM=45;`ZESI:ID='+IntToStr(b)+';`';
b:= Length(s);
SetLength(st,b);
move(s,st,b);// если это забанить то все неработает :) нормально
q:=0;
IdTelnet1.Connect;
for i:=1 to 8 do
begin
while st[q]<>'`' do
begin
Form1.IDTelnet1.SendCh(st[q]);
inc(q);
end;
Form1.IDTelnet1.SendCh(#13);
inc(q);
Delay(200);
end;
IdTelnet1.Disconnect;
end;
end.
Slym (2005-05-25 05:31:00) [1]А так не работает?
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTelnet1.Connect;
IdTelnet1.WriteLn('ZEQO:BTS=1;');
IdTelnet1.WriteLn('ZEQO:BTS=2;');
IdTelnet1.WriteLn('ZERO:BCF=1;');
IdTelnet1.WriteLn('ZEQO:BTS=3;');
IdTelnet1.WriteLn('ZDTI:::PCM=45;');
IdTelnet1.WriteLn('ZESI:ID=1;');
IdTelnet1.Disconnect;
end;
Digitman (2005-05-24 16:08:00) [2]
> Мне надо передать заранее подготовленную строку s. Я ее
> загоняю в массив st: array of char
и кто тебя, сироту, заставил это делать, что-то тамс куда-то там "загонять" ?)