Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1256063303
TUser
2009-10-20 22:28
2009.12.20
Вклад метагеномики в микробиологию, экологию и медицину


1-1229839894
VoyagerEternal
2008-12-21 09:11
2009.12.20
Проблема организации кода из нескольких модулей


2-1256945135
_
2009-10-31 02:25
2009.12.20
Очистка буфера клавиатуры.


1-1228671974
vaBRAMYAK
2008-12-07 20:46
2009.12.20
Вызов функции из DLL и конвертация типов


15-1255973073
Cerberus
2009-10-19 21:24
2009.12.20
Какие банки работают с PayPal(через дебетовые карты)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский