Форум: "Сети";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
ВнизAccess Violation и функция move Найти похожие ветки
← →
ZedeS © (2005-05-24 16:04) [0]Доброго времени суток!
Пишу програмулину для роботы по 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.
← →
Digitman © (2005-05-24 16:08) [1]
> Мне надо передать заранее подготовленную строку s. Я ее
> загоняю в массив st: array of char
и кто тебя, сироту, заставил это делать, что-то тамс куда-то там "загонять" ?)
← →
Slym © (2005-05-25 05:31) [2]А так не работает?
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;
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c