Главная страница
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.012 c
2-1257157125
Rendal
2009-11-02 13:18
2009.12.20
Удаление ключа из реестра


2-1257362090
bagi
2009-11-04 22:14
2009.12.20
создание профилей настроек


2-1257238572
Кедр
2009-11-03 11:56
2009.12.20
OpenOffice


3-1231842039
Xmen
2009-01-13 13:20
2009.12.20
Ошибка при запросе


11-1163789456
SKA1997
2006-11-17 21:50
2009.12.20
Форма прозрачная для кликов