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

Вниз

Массив компонентов без компонентов   Найти похожие ветки 

 
Uzver32.dll   (2005-07-12 13:17) [0]

Uzver32.dll

     Здравствуйте.
     Помогите, пожалуйста, решить мою проблему:

Мне необходимо работать с множеством подобных компонентов
и дабы не заваливать форму этими компонентами, я объединил их
в массивы следующим образом и для удобства создал класс:
При попытке привести Sender и обратиться к его свойствам вылетает:

 MyReget.exe raised exception clsee EAccess Violation with message: "Access violation
 at address 00404580 in module "MyReget.exe". Read of address FFFFFFFF"


В общем См. исходник:

unit main;
 .................
Type
 TDloadSystem = class(TObject)
   FileStream: array [1..3] of TMemoryStream;
   PacketSize: array [1..3] of integer;
   IsBusySock: array [1..3] of boolean;
   BufferStream: array [1..3] of TMemoryStream;
   Timers: array [1..3] of TTimer;
   Sockets: array [1..3] of TServerSocket;
 end;
 .................
var
  DloadManager: TDloadSystem; //глобалка DloadManager
 .................

procedure TForm1.GatheredDATA(Sender: TObject; Socket: TCustomWinSocket); // это обработчик (см. ниже)
var
 iLen,tLen: Dword;
 SockInd: byte;
begin
 iLen := Socket.ReceiveLength;//Как ни странно это работает
 SockInd:=IntToStr(TServerSocket(Sender).Name[5]); //А вот тут и вылетает "Access violation at addres и т. д."
 //ShowMessage(TServerSocket(Sender).Name); //Так тоже не пашет
 //Думаю, что проблема в Sender
 .................

//В разделе OnCreate формы пишу:
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
DloadManager:=TDloadSystem.Create;
for i:=1 to 3 do begin
 DloadManager.Sockets[i]:=TServerSocket.Create(Self);
 DloadManager.Sockets[i].Name:="Sock"+IntToStr(i);
 DloadManager.Sockets[i].Port:=323100+i;
 DloadManager.Sockets[i].OnClientRead:=GatheredDATA; //это ссылка на обработчик
 DloadManager.Sockets[i].Active:=true;
 DloadManager.Timers[i]:=TTimer.Create(Self);
 DloadManager.Timers[i].Name:="Timer"+IntToStr(i);
 DloadManager.Timers[i].Enabled:=False;
 DloadManager.Timers[i].Interval:=10000;
 DloadManager.Timers[i].OnTimer:=Timeout;//А вот с таймерами всё ок
 DloadManager.IsBusySock[i]:=false;
 DloadManager.FileStream[i]:=TMemoryStream.Create;
 DloadManager.BufferStream[i]:=TMemoryStream.Create;
end;
end;
 .................
end.


 
Ega23 ©   (2005-07-12 13:29) [1]

А как и где ты вызываешь GatheredDATA?


 
Uzver32.dll   (2005-07-12 13:32) [2]

В свойстве объекта
DloadManager.Sockets[i].OnClientRead указываю
на обработчик GatheredDATA
событие произойдет когда в сокет
придут данные


 
Ega23 ©   (2005-07-12 13:40) [3]

Ну а кто Sender-то у тебя? С какого фига ты так явно тип приводишь?
Сделай простую проверку:

procedure TForm1.GatheredDATA(Sender: TObject; Socket: TCustomWinSocket); // это обработчик (см. ниже)
var
iLen,tLen: Dword;
SockInd: byte;
begin
if not (Sender is TServerSocket) then Exit;
iLen := Socket.ReceiveLength;//Как ни странно это работает
SockInd:=IntToStr(TServerSocket(Sender).Name[5]); //А вот тут и вылетает "Access violation at addres и т. д."
//ShowMessage(TServerSocket(Sender).Name); //Так тоже не пашет
//Думаю, что проблема в Sender


А ещё - у тебя Name может меньше пяти символов быть.


 
Digitman ©   (2005-07-12 13:41) [4]

что говорит Sender.ClassName ?


 
Uzver32.dll   (2005-07-12 13:50) [5]

Name я вручную заполняю в при инициализации   DloadManager.Sockets[i].Name:="Sock"+IntToStr(i);
пятый символ индекс сокета приславшего сообщение

Sender.ClassName говорит TServerWinSocket -
странно я же при объявлении класса ему ясно сказал  Sockets: array [1..3] of TServerSocket;

вся эта замарочка нужна для того, чтоб
узнать какой сокет получил данные и
вызвал обработчик


 
Ega23 ©   (2005-07-12 13:58) [6]

Мало ли, что ты ему сказал. В Sender"е вообще nil может придти.


 
Uzver32.dll   (2005-07-12 14:01) [7]

А почему не работает так?
я пытаюсь ясно указать что передавать в Sender
 DloadManager.Sockets[i].OnClientRead:=GatheredDATA(DloadManager.Sockets[i],DloadManager.Sockets[i].Socket);
пишет [Error] main.pas(203): Incompatible types: "TSocketNotifyEvent" and "procedure, untyped pointer or untyped parameter"


 
Digitman ©   (2005-07-12 14:01) [8]


> Name я вручную заполняю в при инициализации  


зачем тебе нужно св-во Name - совершенно неясно ..


> странно я же при объявлении класса ему ясно сказал  


событие возбуждает именно TServerWinSocket, а не TServerSocket


> вся эта замарочка нужна для того, чтоб
> узнать какой сокет получил данные и
> вызвал обработчик


у TServerWinSocket есть св-во Data, с которым ты вправе ассоциировать любые дополнительные индивидуальные данные для этого объекта


> Port:=323100


# порта не может иметь значение > 65535


 
Uzver32.dll   (2005-07-12 14:09) [9]

Спасибо - заработало!
А с портом это я случайно, по-невнимательности, удивительно
что вообще коннектилось



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

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

Наверх




Память: 0.49 MB
Время: 0.025 c
14-1120628954
Aelita
2005-07-06 09:49
2005.07.31
Уборщица-хакер


3-1119472246
серго
2005-06-23 00:30
2005.07.31
не получается работать с компонентом DBMemo


6-1113916300
Alpine
2005-04-19 17:11
2005.07.31
Как изменить соединение с интернотм по умолчанию ?


14-1120901589
Магнум
2005-07-09 13:33
2005.07.31
Мария Кириленко


4-1117696152
rolex
2005-06-02 11:09
2005.07.31
Как получить путь к папке Documents and Settings ???