Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2009, 17:22   #1
a1b1
Новичок
Джуниор
 
Регистрация: 01.11.2009
Сообщений: 1
По умолчанию передача файлов, контекстное меню, cm_Mouseleave

Написал рабочий чат. понадобилось приделать передачу файлов.
Т.к основная форма м. б. и клиент и сервер, создал две формы помимо основной (с целью не мешать основному потоку). На одной разместил
Тклиентсокет на другой Тсерверсокет. Суть в том, что в идеале чел выделяет ник на основной форме и щелкает по контекстному меню, появляеться подформа отправления файла, где выбираем файл и клацаем "отправить". Подформа отправляет главной форме получателя файла запрос содержащий хост отправителя и команду отображения формы получения. При нажатии отправить на подформе получения, подформа коннектится к подформе отправления и отправляет ей запрос из буквы содержащий требование передачи файла. В ответ на это подформа отправления отправляет файл подформе принятия, подформа принятия его сохраняет.

Что происходит: Выбираем файл в подформе жмем отправить. Появляеться форма принятия котроая конектиктся к подформе отправления и отправляет ей запрос. Под форма отправления отправляет файл НО ПОДФОРМА ПОЛУЧЕНИЯ НЕ ПОЛУЧАЕТ НИЧЕГО

листинги: код подформы получения (процедура клиентсокетреад)

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; выделит
a1b1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в программу и контекстное меню проводника 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