Форум: "Начинающим";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];
Внизпередача файлов, контекстное меню, 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.019 c