Главная страница
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.048 c
1-1121165114
Piter
2005-07-12 14:45
2005.07.31
Эмуляция нажатия мышкой


1-1121179551
SergP.
2005-07-12 18:45
2005.07.31
Как подождать пока Word напечатает документ?


14-1120102166
cyborg
2005-06-30 07:29
2005.07.31
Socket 754 vs Socket 939


3-1119601311
salexn
2005-06-24 12:21
2005.07.31
СУБД Cache и его использование вмести с Delphi


14-1120489191
Soft
2005-07-04 18:59
2005.07.31
Давайте раз и навсегда откроем и закроем проблему МАГИИ!