Здравствуйте, уважаемые эксперты. В общем виде вопрос такой, как не используя визуальные компоненты повесить обработчик события на определенную процедуру. На примере (см. приложение). Нужно у объекта CLI на событие OnRead повесить обработку процедуры ReadData. Буду очень благодарен за любой ответ. Если есть примеры, то можите высылать на мыло.
Здравствуйте, Fess! TClientSocket - это визуальный компонент. Используйте сокет-ЭЙПИАЙ (WinSock). Найдите в каталоге дельфи фаял WinSock.PAS и взгляните на присутствующие в нём прецедуры и функции. Ответ отправлен: 12.06.2003, 20:39 Отправитель: Zensor Отвечает Артём Шегеда
Добрый день, Fess!
Bob Johnson дал исчерпывающий ответ - подтверждаю его правильность! В качестве дополнения привожу пример программы. Только использовать компоненты TClientSocket и TServerSocket в таком виде бессмысленно: размер прогаммы составит всё те же 300К...
Приложение: Ответ отправлен: 13.06.2003, 15:48 Отправитель: Артём Шегеда Отвечает Bob Johnson
Доброе время суток, Fess! Смотрим тип события:
type TSocketNotifyEvent = procedure (Sender: TObject; Socket: TCustomWinSocket) of object;
Значит прежде всего тебе необходимо не просто процедуру, а метод класса, например, класса TForm1. procedure TForm1.ReadData(Sender: TObject; Socket: TCustomWinSocket); а затем выполнить CLI.OnRead = ReadData; Нет класса? Без него не получится. Дело в том, что реально любой метод класса - это функция, которая принимает на 1 параметр больше, чем описано. Этот "невидимый" и первый по очереди параметр является ничем иным, как указателем на текущий экземпляр класса (self в дельфи и this в С++). Поэтому, любое событие, которое описывается как procedure ... of object является не просто 4-х байтным указателем на процедуру, а 2-мя 4-х байтными указателями
(т.е. 8-ми байтным!), из которых один указывает непосредственно на процедуру, а другой - на экземпляр класса, у которого будет вызвана эта процедура (метод). В общем, если у тебя нет класса, придется его создать. И описать в нем один единственный метод (или не один, но это - твое дело). Этот метод должен принимать, естественно, те параметры, что нужно. Ну и потом ты сможешь уже выполнить присвоение.
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 13.06.2003, 03:46 Отправитель: Bob Johnson
Вопрос № 734
Уважаемые эксперты, вот два вопроса: 1. Как сделать в Delphi чтобы окно консоли (или формы) не было видно? 2. Как в реестре не системного винта (например, друг пришел фильмов перекинуть) сделать нужные мне изменения?
Здравствуйте, HaM! Главную форму программы можно скрыть так: Application.MainForm.Visible:=false; Насчёт консоли... Попробуйте получить его handle с помощью findwindow (модуль ShellApi) и пошлите ему сообщение WM_Hide. Ответ отправлен: 15.06.2003, 22:15 Отправитель: =FeanaR= Отвечает Bob Johnson
Здравствуйте, HaM! 1. У формы есть метод Hide. У окна консоли - ShowWindow (GetConsoleWindow, SW_HIDE); 2. Видимо никак.
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 13.06.2003, 03:46 Отправитель: Bob Johnson Отвечает Zensor
Здравствуйте, HaM! 1. В свойствах формы поставь visible:=false; В инете полно инфы по этому поводу, и как из таскбара и из панели задач скрыться. А консоль зачем? чтобы размер уменьшить, можно на чистом эйпиае писать. Попробуй в сети поискать компоненты KOL. Непожалеешь.
Ответ отправлен: 13.06.2003, 08:00 Отправитель: Zensor
Вопрос № 735
хайте, эксперты! Как через Delphi давать команды модему.
Может не откомпилироваться, но общая идея должна быть понятна.
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 14.06.2003, 00:54 Отправитель: Bob Johnson Отвечает =FeanaR=
Здравствуйте, Zensor! Попробуй вот этот модуль. Я его взял из Kulib'ы, и успешно использовал.
Приложение: Ответ отправлен: 15.06.2003, 22:15 Отправитель: =FeanaR=
Вопрос № 737
Привет эксперты! Никто случайно не писал или не видел где-нибудь программу классный журнал(как в школе для оценок). Если есть вышлите плиз(исходник) или помогите советом как это все организовать.
Доброе время суток, Andrey! А в чем проблема написать такой самому - если с использованием БД, так вообще просто...
* EMan1.3: ---===*** The Eternal Power ***===---
Ответ отправлен: 14.06.2003, 23:22 Отправитель: Bob Johnson Отвечает Zensor
Здравствуйте, Andrey! в среду попробуй заползти на мой сайт. Там такая программа с исходниками на Borland Pascal'е будет. Может раньше закачаю, как настроение будет.
Приложение: Ответ отправлен: 15.06.2003, 08:31 Отправитель: Zensor
Вопрос № 738
Здравствуйте, уважаемые эксперты! У меня возникла проблема: я создаю обычное консольное приложение на delphi, мне надо создать функцию, стирающую набранный текст в консольном окне этого приложения. Может быть такая есть в стандартных модулях delphi? Эта функция аналогична функции cls в коммандных файлах. Заранее благодарю, maDByte
Приветствую Вас, maDByte! Попробуй код в приложении. Решение довольно просто, но я у себя проверял и всё работает.
Приложение: Ответ отправлен: 15.06.2003, 22:15 Отправитель: =FeanaR= Отвечает Zensor
Приветствую Вас, maDByte! procedure zcls; var i:byte; begin for i:=1 to 40 do writeln; end; ;) можно и так. но ненужно. а чё вы все в консольный режим на дельфях ударились? турбо паскаля мало? Ответ отправлен: 14.06.2003, 20:11 Отправитель: Zensor Отвечает vitya
Доброе время суток, maDByte! Например ты можешь взять и с помощью функции WriteConsoleOutput (это апишная функция) просто залить все пространство пробелами. Ответ отправлен: 15.06.2003, 10:28 Отправитель: vitya Отвечает Артём Шегеда
Добрый день, maDByte!
Я у себя на сайте выложил исходный код модуля CRT для Delphi. Можешь брать. Ответ отправлен: 16.06.2003, 13:14 Отправитель: Артём Шегеда Отвечает ART_43
Доброе время суток, maDByte! procedure ClrScr; var c:_COORD; i:cardinal; h:cardinal; ii:_CONSOLE_SCREEN_BUFFER_INFO; begin c.X:=0; c.Y:=0; i:=0; h:=GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(h,ii); FillConsoleOutputCharacter(h,' ',ii.dwSize.X*ii.dwSize.Y,c,i); end;
Ответ отправлен: 16.06.2003, 10:35 Отправитель: ART_43
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.