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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2011, 22:13   #1
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию Динамическое создание IdTCP

Собственно сам код, не удается скомпилировать ругается так. Не вижу ошибок.. Посмотрите
Код:
program Tor;

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Dialogs,
  IdAntiFreezeBase,
  IdAntiFreeze,
  StdCtrls,
  IdBaseComponent,
  IdComponent,
  IdTCPConnection,
  IdTCPClient,
  ExtCtrls,
  Math,
  StrUtils,
  ClTools in 'ClTools.pas';

type
TClientThread = class(TThread)
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
  end;

  var
  IdTCPC: TIdTCPClient;
  IdTAF: TIdAntiFreeze;

{ TClientThread }

constructor TClientThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  Priority := tpIdle;
  FreeOnTerminate:= true;
end;

function VerificaComando(Recebido, Comando: String; Parcial: boolean): Boolean;
begin
  recebido:= AnsiLowerCase(trim(recebido));
  comando:= AnsiLowerCase(trim(comando));
  if not Parcial then
     result:= AnsiSameText(recebido, comando)
  else result:= pos(comando, recebido) <> 0;
end;

procedure TClientThread.Execute;
begin
  inherited;
  begin
    if not IdTCPC.Connected then
       exit;
    repeat
      cmd.text:= IdTCPC.ReadLn;
      if trim(cmd.text) <> '' then
      begin
      cmd.Text:=copy(cmd.Text,1,pos('#',cmd.Text));
        if VerificaComando(cmd.text,'HW',true) then  ShowMessage('Hello WORLD')
        else if VerificaComando(cmd.text,'H4',true) then  ShowMessage('Hello yyy');
      end;
    until not IdTCPC.Connected;
  end;
  if not Terminated then
     Terminate;
end;

function GetComputerName: string;
 var
   buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
   Size: Cardinal;
 begin
   Size := MAX_COMPUTERNAME_LENGTH + 1;
   Windows.GetComputerName(@buffer, Size);
   Result := StrPas(buffer);
 end;

procedure IdTCPCConnected(Sender: TObject);
begin
IdTCPC.WriteLn('nick= '+GetComputerName);
TClientThread.Create(false);
IdTCPC.WriteLn('соединение с '+GetComputerName+' установилось');
end;

begin

  IdTCPC.Create(nil);
  IdTAF.Create(nil);
 if IdTCPC.Connected then
     IdTCPC.Disconnect
  else
  begin
    IdTCPC.Host := '127.0.0.1';
    IdTCPC.Port := 1024;
    IdTCPC.Connect(5000);
  end;
IdTCPC.Disconnect;
end.
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 15.06.2011, 22:44   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если ругается, то как?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.06.2011, 23:08   #3
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

походу так:
http://www.imagepost.ru/?v=uzncoiznl...czfkywefna.JPG
Pein95 вне форума Ответить с цитированием
Старый 15.06.2011, 23:25   #4
fenryr
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 28
По умолчанию

Код:
   IdTCPC.Create(nil);
  IdTAF.Create(nil);
ошибка тут. надо
Код:
  idTTC :=  TIdTCPC.Create(nil);
 idTAF := TIdTAF.Create(nil);
fenryr вне форума Ответить с цитированием
Старый 16.06.2011, 06:55   #5
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

а для чего снова нужно показывать что создаешь? я ведь в
Код:
  var
  IdTCPC: TIdTCPClient;
  IdTAF: TIdAntiFreeze;
уже определил их
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 16.06.2011, 11:15   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> уже определил их

определили указатели, которые равны nil при старте программы.

При вызове IdTCPC.Create(nil); указатель из IdTCPC передаётся в конструктор как ссылка на экземпляр класса, а т.к. он равен nil, виртуальный AfterConstruction() падает.

Код:
 idTTC :=  TIdTCPC.Create(nil);
класса TIdTCPC нет в природе, правильный код для создания:

Код:
  IdTCPC := TIdTCPClient.Create(nil);
  IdTAF := TIdAntiFreeze.Create(nil);
в этом случае в конструктор класса TIdTCPClient передаётся ссылка на описание этого класса с готовой VMT, формируемой компилятором для каждого класса.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 16.06.2011, 11:49   #7
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

да оказалось так, но не выполняется отправка сообщения в procedure IdTCPCConnected(Sender: TObject); , а значит и не создается поток

И как мне сделать так чтобы приложение работало до тех пор пока я его сам не отключу (сейчас у меня запускается и сразу останавливается, попробовал поставить sleep() но это не выход)
Помог, нажми весы слева

Последний раз редактировалось grafgrial; 16.06.2011 в 11:52.
grafgrial вне форума Ответить с цитированием
Старый 16.06.2011, 12:09   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

так у вас IdTCPCConnected() висит в воздухе, о ней никто, кроме вас самих, не знает, а, значит, никто никогда и не вызовет.

Это ж не вижуал бейсик, где (если не ошибаюсь) достаточно написать процедуру с правильным именем, и она сама привяжется на нужное событие. Тут всё руками.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 16.06.2011, 20:41   #9
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

да я это заметил чуть позже, но когда поставил, мне выдает ошибку на клиенте "Terminate Thread Timeout"
Как я понимаю с остановкой потока ??
Помог, нажми весы слева

Последний раз редактировалось grafgrial; 16.06.2011 в 20:53.
grafgrial вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическое создание компонентов DOLBY Компоненты Delphi 10 17.10.2010 14:03
Динамическое создание DirectoryListBox Kuzya59 Общие вопросы Delphi 4 21.09.2009 16:37
Динамическое создание объекта ANGa Помощь студентам 3 10.04.2008 18:14
Динамическое создание объекта Fruit Общие вопросы Delphi 5 24.01.2008 11:00
Динамическое создание фрейма s-force Общие вопросы Delphi 9 05.09.2007 16:56