Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2011, 00:34   #1
shyrikos
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 11
По умолчанию Indy 10 Chat 2.0 Client не компилируется.

Доброго всем времени суток. Прошу помощи, подскажите как добиться чтобы все заработало. Пример взят из архива indy 10 demo. Там была уже готовая, скомпилированная программа-клиент, которая отлично работает с моим "сервером". Мне этот вариант очень подходит под мою задачу, нужно только сделать кое какие штрихи. Но прога не компилится.
Вот полный код (мной пока не изменялся):

Код:
unit MainForm;

interface

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

type
  TfrmMain = class(TForm)
    Label2: TLabel;
    edHost: TEdit;
    Label3: TLabel;
    edPort: TEdit;
    btnConnect: TButton;
    Bevel1: TBevel;
    memMsgs: TMemo;
    Panel1: TPanel;
    edMsg: TEdit;
    Client: TIdTCPClient;
    Timer1: TTimer;
    procedure btnConnectClick(Sender: TObject);
    procedure ClientConnect(Sender: TObject);
    procedure ClientDisconnect(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure edMsgKeyPress(Sender: TObject; var Key: Char);
    procedure Timer1Timer(Sender: TObject);
    procedure ClientConnected(Sender: TObject);
    procedure ClientDisconnected(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnConnectClick(Sender: TObject);
begin
  if Client.Connected then
    Client.Disconnect
  else
    begin
      Client.Host := edHost.Text;
      Client.Port := StrToIntDef(edPort.Text, 8800);
      edPort.Text := IntToStr(Client.Port);
      memMsgs.Lines.Clear;
      Client.Connect;
    end;
end;

procedure TfrmMain.ClientConnect(Sender: TObject);
begin
  edPort.Enabled := false;
  edHost.Enabled := false;
  btnConnect.Caption := 'Disconnect';
end;

procedure TfrmMain.ClientDisconnect(Sender: TObject);
begin
  edPort.Enabled := true;
  edHost.Enabled := true;
  btnConnect.Caption := 'Connect';
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  memMsgs.Align := alClient;
  memMsgs.Lines.Clear;
  edMsg.Text := '';
end;

procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  Client.Disconnect;
  CanClose := not Client.Connected;
end;

procedure TfrmMain.edMsgKeyPress(Sender: TObject; var Key: Char);
var
  s : String;
begin
  if Key = #13 then
    begin
      s := edMsg.Text + #10#13;
      Key := #0;
      edMsg.Text := '';
      Client.IOHandler.WriteBuffer(s[1], Length(s));
    end;
end;

procedure TfrmMain.Timer1Timer(Sender: TObject);
var
  i : integer;
  s : String;
begin
  if not Client.Connected then
    exit;

  I := Client.IOHandler.Buffer.Size;
  if I > 0 then
    begin
      SetLength(s, i);
      Client.IOHandler.ReadBuffer(s[1], i);
      memMsgs.Lines.add(Copy(s, 1, Length(s) -2));
    end;
end;

procedure TfrmMain.ClientConnected(Sender: TObject);
begin
  btnConnect.Caption := 'Disconnect';
end;

procedure TfrmMain.ClientDisconnected(Sender: TObject);
begin
  btnConnect.Caption := 'Connect';
end;

end.
Сижу уже весь день мучаюсь. Ругается на следующий кусок, который мне крайне важен (вывод того что пишем сами и получаем от сервера, как я понял):

Код:
procedure TfrmMain.edMsgKeyPress(Sender: TObject; var Key: Char);
var
  s : String;
begin
  if Key = #13 then
    begin
      s := edMsg.Text + #10#13;
      Key := #0;
      edMsg.Text := '';
      Client.IOHandler.WriteBuffer(s[1], Length(s));
    end;
end;

procedure TfrmMain.Timer1Timer(Sender: TObject);
var
  i : integer;
  s : String;
begin
  if not Client.Connected then
    exit;

  I := Client.IOHandler.Buffer.Size;
  if I > 0 then
    begin
      SetLength(s, i);
      Client.IOHandler.ReadBuffer(s[1], i);
      memMsgs.Lines.add(Copy(s, 1, Length(s) -2));
    end;
end;
На три эти вещи... Чем их можно заменить, чтобы все заработало? Или чего-то не хватает в коде описывающего их?

Ошибки следующие:
Цитата:
[Error] MainForm.pas(127): Undeclared identifier: 'WriteBuffer'
[Error] MainForm.pas(139): Undeclared identifier: 'Buffer'
[Error] MainForm.pas(139): '(' expected but ';' found
[Error] MainForm.pas(140): Missing operator or semicolon
[Error] MainForm.pas(143): Undeclared identifier: 'ReadBuffer'
[Fatal Error] I10ChatClient.dpr(19): Could not compile used unit 'Forms\MainForm.pas'
shyrikos вне форума Ответить с цитированием
Старый 13.02.2011, 12:04   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А в хелпе эти методы описаны? Какому модулю они пренадлежат?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2011, 12:21   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а у вас десятая версия инди стоит?(раз пример с нее взять)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.02.2011, 12:28   #4
shyrikos
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А в хелпе эти методы описаны? Какому модулю они пренадлежат?
Если смотреть на то что идет с исходниками, то там вообще нет ничего...
В описании, например, здесь http://www.delphisources.ru/pages/fa...-depth-09.html говорится о Readbuffer и writebuffer. Но не пойму тогда почему не работает. У меня Delphi 7, а indy 10.
Chat 2.0.zip
shyrikos вне форума Ответить с цитированием
Старый 13.02.2011, 12:30   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в дэлфи 7 по умолчанию стоит версия инди 9-ая.
а вы скачали примеры для десятой версии инди.

так что или обновляйте инди или смотрите демки к 9-ой версии или переписывайте код(там вродь аналогичные методы есть у самих обьектов инди, без IOHandler)

Цитата:
У меня Delphi 7, а indy 10.
вы обновляли инди?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.02.2011, 12:45   #6
shyrikos
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в дэлфи 7 по умолчанию стоит версия инди 9-ая.
а вы скачали примеры для десятой версии инди.

так что или обновляйте инди или смотрите демки к 9-ой версии или переписывайте код(там вродь аналогичные методы есть у самих обьектов инди, без IOHandler)

вы обновляли инди?
Да конечно. У меня в пакете можно было выбрать или 9 или 10. Так же ставил из svn последнюю сборку, но она глючная, поставил обратно из пакета.

А как вообще можно упростить все это? мне достаточно только чтобы клиент передавал строку. Чтобы красиво принимал мне не надо, лишь бы че-то показывал, что сервер откликнулся.

Последний раз редактировалось Stilet; 13.02.2011 в 15:01.
shyrikos вне форума Ответить с цитированием
Старый 13.02.2011, 15:02   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А как вообще можно упростить все это?
Честно признаюсь: Отказался от Инди в пользу WinInet или Synapse
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2011, 15:36   #8
shyrikos
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 11
По умолчанию

Ну а так, на вскидку, как можно получить и вывести в memo все приходящие данные?
Отправка у меня делается так:
Код:
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  s:string;
begin
  if Key = #13 then
    begin
      s := edit1.Text + #10#13;
      Key := #0;
      edit1.Text := '';
      client.IOHandler.Write(s);
    end;
end;
А для простейшего получения мне опыта не хватает в самом delphi.
Я понимаю, что чтобы получить данные нужно:
client.IOHandler.Read(d);
memo1.lines:= d;
Но что-то туплю как функцию написать... чтобы не по действию реагировало (как с отправкой на нажатие кнопки), а все время?
shyrikos вне форума Ответить с цитированием
Старый 15.02.2011, 00:05   #9
shyrikos
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 11
По умолчанию

а может прога под Indy 10.0b только? в docs написано что на нем сделано. Вот только где найти эту Indy 10.0b, на сайте только последняя версия лежит. Может есть у кого?
shyrikos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как создать Chat в Visual C# Client -Server romanzzz Общие вопросы .NET 2 11.12.2010 09:15
Передача файлов, TCPServer & Client, Indy 10 Killbrum Общие вопросы C/C++ 3 26.09.2010 14:08
как обновить indy 9 на indy 10 Пилигрим Компоненты Delphi 16 30.04.2010 10:11
chat Screamo Общие вопросы по Java, Java SE, Kotlin 2 18.03.2010 20:21