Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.08;
Скачать: CL | DM;

Вниз

This form of method call only allowed for class methods   Найти похожие ветки 

 
Reist   (2011-10-02 18:45) [0]

Здравствуйте, делаю в 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); появляется ошибка, так как скорее всего этот метод не правилен. Подскажите решение этой проблемы или альтернативный метод.


 
Dimka Maslov ©   (2011-10-02 18:52) [1]

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


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

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


 
sniknik ©   (2011-10-02 19:33) [3]

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

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


 
Dimka Maslov ©   (2011-10-02 19:43) [4]

Нет. Ибо:

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

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

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


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


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


В топку.


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

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


 
sniknik ©   (2011-10-02 23:02) [7]

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


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

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

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

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


 
Jeer ©   (2011-10-03 01:28) [9]


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


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


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

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

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

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


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


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

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


 
sniknik ©   (2011-10-03 08:10) [12]

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

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


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


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

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


 
Dimka Maslov ©   (2011-10-03 13:24) [14]

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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2012.01.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
1-1277762626
Deltas
2010-06-29 02:03
2012.01.08
Анимация окон Windows 7


15-1316525842
БарЛог
2011-09-20 17:37
2012.01.08
Резюме улыбнуло


2-1317671895
demon
2011-10-03 23:58
2012.01.08
Изменить параметры отображения хинта


15-1316348444
alexdn
2011-09-18 16:20
2012.01.08
Php bb форумный движек и спам боты


2-1317192067
Alex_C
2011-09-28 10:41
2012.01.08
ValueListEditor - вид 3D как в Object Inspector