![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 01.11.2009
Сообщений: 1
|
![]()
Написал рабочий чат. понадобилось приделать передачу файлов.
Т.к основная форма м. б. и клиент и сервер, создал две формы помимо основной (с целью не мешать основному потоку). На одной разместил Тклиентсокет на другой Тсерверсокет. Суть в том, что в идеале чел выделяет ник на основной форме и щелкает по контекстному меню, появляеться подформа отправления файла, где выбираем файл и клацаем "отправить". Подформа отправляет главной форме получателя файла запрос содержащий хост отправителя и команду отображения формы получения. При нажатии отправить на подформе получения, подформа коннектится к подформе отправления и отправляет ей запрос из буквы содержащий требование передачи файла. В ответ на это подформа отправления отправляет файл подформе принятия, подформа принятия его сохраняет. Что происходит: Выбираем файл в подформе жмем отправить. Появляеться форма принятия котроая конектиктся к подформе отправления и отправляет ей запрос. Под форма отправления отправляет файл НО ПОДФОРМА ПОЛУЧЕНИЯ НЕ ПОЛУЧАЕТ НИЧЕГО листинги: код подформы получения (процедура клиентсокетреад) procedure TAcceptForm.OneClientSocketRead(Sen der: TObject; Socket: TCustomWinSocket); begin s:=Socket.ReceiveText; if Reciving then begin fs.Write(s[1], length(s)); if fs.Size=DataSize then begin fs.Free; Reciving:=false; Application.MessageBox('принят файл', 'наконецто'); end; exit; end; if copy(s,1,5)='Size:' then begin s1:=copy(s, 6, Pos(#0, s)-6); DataSize:=strToInt(s1); Delete(s,1,Pos(#0, s)); TitleLabel.Caption:=TitleLabel.Capt ion +'Size: '+IntToStr(DataSize); Reciving:=true; fs:=TFileStream.Create('output.dat' ,fmCreate); fs.Write(s[1], length(s)); end; end; код подформы отправления procedure TSendForm.OneServerSocketClientRead (Sender: TObject; Socket: TCustomWinSocket); begin if Socket.ReceiveText='s' then begin fs:=TFileStream.Create(fileput,fmOp enRead); try fs.Position:=0; Socket.SendText('size:'+IntToStr(fs .Size)+#0); Socket.SendStream(fs); ShowMessage('файло передано'); finally end; end; end; проблема 2. Прописал для чата кнопки с TImage. Необходимо менять их при наведении курсора и возвертать обратно при уползании с них курсора. Т.к. обратного варианта для OnMouseMove не было пришлось четать Интернеты. Там активно подвигаются сm_mouseenter cm_mouseleave. Но при использовани кодоподобия type TImageEx = class (TImage) private { Private declarations } FOnMouseLeave: TNotifyEvent; FOnMouseEnter: TNotifyEvent; procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE; protected { Protected declarations } procedure DoMouseEnter; dynamic; procedure DoMouseLeave; dynamic; public { Public declarations } published { Published declarations } property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; end; Делфи выделяет красной строкой procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER; и пишет foor loop (и бла бла бла) вроде это цикл и ник чему хорошему это не приведет считает компилятор. Что посоветуете? Обидно что не работает вроде как рабочая у других ф-ция. проблема три: для отображения нужных подсветок кнопок при нужных имэйджах основной формы потребовалось: 1. определить checked элемент контекстного меню названия "скина" 2. Для этого осуществить перебор циклом всех названий контекстного меню 3. Выбрать необходимое и выдрать из него caption чтобы сохранить его в строку и юзать соответствующего названия кнопку подсветки в timage Багопротивный код ниже procedure TChatForm.MinimizeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var imya:string; qq:integer; begin for qq:=1 to ChatForm.Popupmenu1.Skins1.Items.Co unt do // планировалось как перебор всех названий скинов begin if Chatform.PopupMenu1.Items.MenuIndex (qq).Checked then // и если чокнутый флажок найден begin imya:=Chatform.PopupMenu1.Items.qq. Caption; // присваиваем его капюшон стрингу имя Showmessage(imya); // showmessage это полезная форма паранои end; end; Беда в том что компилятор считает себя умнее человека и выделяет багом if Chatform.PopupMenu1.Items.MenuIndex (qq).Checked then да и думаю Chatform.PopupMenu1.Items.qq.Captio n; выделит |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Передача параметров в программу и контекстное меню проводника | Ragnarek | Общие вопросы Delphi | 19 | 21.03.2012 13:22 |
Контекстное меню | anGeee | Общие вопросы Delphi | 1 | 30.10.2009 21:28 |
Контекстное меню | mar4elo | Общие вопросы Delphi | 19 | 18.09.2009 14:30 |
Контекстное меню | Михаил Юрьевич | Общие вопросы Delphi | 5 | 02.06.2009 15:10 |
Контекстное меню | Aндрей | Помощь студентам | 1 | 28.04.2009 17:56 |