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

Вниз

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

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

Наверх





Память: 0.47 MB
Время: 0.036 c
3-1119440610
stelius
2005-06-22 15:43
2005.07.31
регулярные выражения в oracle


1-1120682032
ronyn
2005-07-07 00:33
2005.07.31
Сохранение параметров и настроек программы при её закрытии


14-1121080221
NewWonder
2005-07-11 15:10
2005.07.31
Мучался всю ночь: проблема с dll


14-1121248038
Некто
2005-07-13 13:47
2005.07.31
Имитация клавиатуры (заглушка)


3-1119535419
Alex18
2005-06-23 18:03
2005.07.31
Поиск





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский