Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.003 c
2-1317566758
Reist
2011-10-02 18:45
2012.01.08
This form of method call only allowed for class methods


15-1316107383
Kerk
2011-09-15 21:23
2012.01.08
Вот так Google продвигает свой поиск в России


15-1314779981
oldman
2011-08-31 12:39
2012.01.08
"Научные" анекдоты


2-1317185032
я
2011-09-28 08:43
2012.01.08
Форматирование кода программы в среде разработки


2-1317392685
Сергей
2011-09-30 18:24
2012.01.08
Как выполнить репликацию Access c помощью Delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский