Форум: "Начинающим";
Текущий архив: 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