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

Вниз

передача файлов, контекстное меню, cm_Mouseleave   Найти похожие ветки 

 
a1b1 ©   (2009-11-01 17:34) [0]

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

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

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

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; выделит


 
Сергей М. ©   (2009-11-01 17:56) [1]


> две формы помимо основной (с целью не мешать основному потоку)


Абсолютно все VCL-формы работают в одном и том же потоке - оссновном.
Так что плодить формы чтобы не мешать осн.потоку - полнейшая ерунда.



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
2-1257213337
sideX
2009-11-03 04:55
2009.12.20
2 вопроса по TWebBrowser


15-1256237040
POOP
2009-10-22 22:44
2009.12.20
Есть ли от этого польза?


2-1256914960
Ivan
2009-10-30 18:02
2009.12.20
Список названий сетевых соединений


2-1257005562
minomorf
2009-10-31 19:12
2009.12.20
Как оргаизовать связку число-строка?


15-1256327662
SkyN
2009-10-23 23:54
2009.12.20
компонент простейшего dns сервера