Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

This form of method call only allowed for class methods [D7, XP]


Reist ©   (2011-10-02 18:45:00) 

Здравствуйте, делаю в Delphi 7 чат (пока сервер) на ServerSocket1 в блокирующем режиме. Делаю не с нуля, а собирая по частям из различных программ(так как сам не разбираюсь).
Необходимо по нажатию кнопки, сделать рассылку сообщения из мемо всем клиентам. Основа сервера из этой( http://www.superadm.net/index.php?name=pages&op=view&id=167) статьи.

Программа состоит из юнита формы (который работает с компонентами) и юнита потоков (который работает с клиентами).
В юните потоков есть класс TServerThread = class(TServerClientThread), у которого есть процедура рассылки всем клиентам сообщения:
procedure TServerThread.SendAllClient(var aData: tData);
var i: Word;
begin
try
 for i := 0 to ServerSocket.ActiveThreads - 1 do begin
   ServerSocket.Connections[i].SendBuf(aData, SizeOf(aData));    
 end;
except
end;
end;


В основной форме пытаюсь вызвать это процедуру и передать ей значения на нажатие кнопки.
type
 TData = record
   fCommand: Word;
   fNick: String[MAX_STRING];
   fColor: Integer;
   fMessages: array [0..MAX_CHAR - 1] of Char;
 end;
 PData = ^TData;
............................
implementation

uses
 uServerThread;

{$R *.dfm}

type
    n=class (uServerThread.TServerThread);
....................................
procedure TfMain.Button3Click(Sender: TObject);
var adata:tData; i:Integer;
begin
 with adata do begin
   fCommand:=10010;
   fNick:='Администратор';
   fColor:=4;
   for i := 0 to Length(memo2.text) - 1 do
     fMessages[i]:=Char(memo2.text[i + 1]);
     n.SendAllClient(adata);
 end;
  end;


В строчке n.SendAllClient(adata); появляется ошибка, так как скорее всего этот метод не правилен. Подскажите решение этой проблемы или альтернативный метод.


_Юрий   (2011-10-03 19:27:00) [1]


> В строчке n.SendAllClient(adata); появляется ошибка, так
> как скорее всего этот метод не правилен.


n - это тип.
Это, как если бы вы написали не
Form1.Close а TForm1.Close.

чтобы не было путаницы, никогдане называйте так типы


Dimka Maslov   (2011-10-03 13:24:00) [2]

Незнание, как видно из всего вышесказанного, выходит далеко даже за рамки того, о чём пишутв книгах по Delphi...


Reist   (2011-10-03 12:07:00) [3]


> Ту щас тебе выложат по полной - срочно и бегом в книжки
> :)

Знать бы еще эти книжки, по сокетам нашел только: Григорьев А.Б. О чем не пишут в книгах по Delphi и то там только на Winsock, без использования компонентов. Можете подсказать "правильную" книгу?


sniknik   (2011-10-03 08:10:00) [4]

> может он не альтернативу знает, а глюк видит?
+ кстати, вчера как-то не обратил внимания.
объект "живой" так? т.е. коннектиться кто-то, кто-то отключается. список может меняться прямо в процессе, а коней просмотра в for вычисляется один раз в начале... в общем понятно зачем понадобилось скрывать ошибки. это огрехи логики в работе. что в коде тоже мало радует.

> Уже вторые сутки бьюсь с подобными разработчиками. :(
сутки это по "божески", у меня была эпопея на 2 месяца, в течении которых все цто на ушах стояло, + программистам житья не было. из-за одной "маленькой" ошибки (заняли порт не описанный в доке, и не используемый... просто как понимаю в режиме разработки в дизайне оставили включенным компонент, и в нем тестовый прописан) ну так как ошибка была "русифицирована" то в ней ни о каких портах и т.д. ничего не было.
нашли в чем дело случайно, запустили именно ту прогу с кем пересекалось второй (вообще обе сервисы с определенным порядком/зависимостями. случайно получилось в общем. ошиблись...) и вот та сказала реальную ошибку. после чего в контору программы было заявлено гневное "И??!?!?!? б." и в ответ "ой, действительно...". но логику с "русифкацией ошибок"  так и не поменяли, т.к. было еще такое же, но там уже не тратили время, "ошибка самопальная - проблема ваша!".


Германн   (2011-10-03 03:22:00) [5]


> вот такое в коде
> > except
> > end;
> = признак ламеризма "в последней степени"

Во-во.
Ничуть не лучше самопальные сообщения об ошибках. Уже вторые сутки бьюсь с подобными разработчиками. :(


sniknik   (2011-10-03 01:54:00) [6]

> Значит он знает альтернативу
может он не альтернативу знает, а глюк видит?

вот примеру, хоть и не работал с сокетами но вижу странность  - по количеству потоков берутся коннекты... они равны? и потом если тут "активные"(Active) значит должны быть и "пассивные"? т.е. даже если количество потоков всегда равно количеству соединений то точно не все активные... допустим половина, что значит отсылать будем только половине коннектов. и еще странно, не лучше ли посылать в те которые сейчас не работают, вместо в те кто и так занят...

p.s. лучше бы доку почитал чем сомнительную статью. (причем для меня безотносительно к сокетам вот такое в коде
> except
> end;
= признак ламеризма "в последней степени"... как бы ни пыжился но верить написавшему такое нельзя... не, понимаю бывают ситуации когда нужно скрыть. но в этом случае там обязательно должен быть комментарий почему, или хотя бы отписка. что человек в своем уме, и делает это не без причины.)


Jeer   (2011-10-03 01:28:00) [7]


> значит может ее выложить.


Ту щас тебе выложат по полной - срочно и бегом в книжки :)


Reist   (2011-10-02 23:24:00) [8]

Просто если человеку не нравится:

> >  for i := 0 to ServerSocket.ActiveThreads - 1 do begin
> >    ServerSocket.Connections[i].SendBuf(aData, SizeOf(aData));
>
>
>
> В топку.

Значит он знает альтернативу, а если отписался тут, значит может ее выложить.


sniknik   (2011-10-02 23:02:00) [9]

нанять программиста?


Reist   (2011-10-02 22:44:00) [10]

Альтернатива?


Сергей М.   (2011-10-02 21:23:00) [11]


>  for i := 0 to ServerSocket.ActiveThreads - 1 do begin
>    ServerSocket.Connections[i].SendBuf(aData, SizeOf(aData));


В топку.


Dimka Maslov   (2011-10-02 19:43:00) [12]

Нет. Ибо:

1. Сначала надо создать объект, получить на него указатель, а потом уже вызывать его метод. Почём я знаю, где это должно происходить?

2. С какой это вдруг радости, тип объявленный в форме вдруг станет совместим с одноимённым типом, объявленным в модуле?

Отсюда мораль: сначала нужно выяснить, кто такие типы, классы, объекты, экземпляры, поля, методы, свойства, указател и много разных других вещей. А потом собирать сервера в блокирующем режиме.


sniknik   (2011-10-02 19:33:00) [13]

может. я гарантирую это. ;)

> Подскажите решение этой проблемы или альтернативный метод.
альтернативный метод это садишься за книжки и учишься... как только дочитаешь чем тип от переменной отличается так и поймешь "тайный" смысл послания в [1].


Reist   (2011-10-02 19:17:00) [14]

Можете показать как правильно вызывать?


Dimka Maslov   (2011-10-02 18:52:00) [15]

Метод правилен. Я гарантирую это. А вот вызывается он неправильно. Ибо перед именем вызываемого метода должно стоять имя экземпляра класса, а не самого класса.


Наверх

Титульная страница Поиск, карта сайта Написать письмо