Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: Образование, Работа и Бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Октябрь 2005 → | ||||||
1
|
2
|
|||||
---|---|---|---|---|---|---|
3
|
4
|
5
|
7
|
8
|
9
|
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
Статистика
-1 за неделю
Программирование на Delphi (выпуск 34)
Информационный Канал Subscribe.Ru |
Программирование на DELPHI |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Выпуск #34 (23 октября 2005 г.) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Статусы экспертов и их возможности:
Примечание: Под форматированием текста понимается возможность оформлять ответы с использованием html-тегов. Если Вы хотите, чтобы Вашего имени (ника) не было в данной таблице, отправьте письмо по этой ссылке с зарегистрированного у нас адреса. В теле письма, пожалуйста, укажите причину удаления имени из таблицы. Нам важно ваше мнение. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Вопрос #169 (автор вопроса: Сафронов А.Н.; вопрос отправлен: 06.10.2005 13:27): Скажите пожалуйста, каким образом заполнение ProgressBar можно связать с выполнением процедуры CopyFile? Спасибо. [Ответить на вопрос] Вопрос #170 (автор вопроса: SHKoder@deagnostic.ru; вопрос отправлен: 06.10.2005 15:44): Имея WebBrowser пытаюсь его распечатать. Делаю так: begin end; Вопрос #171 (автор вопроса: Nikan; вопрос отправлен: 06.10.2005 21:25): Добрый день!
Вопрос #172 (автор вопроса: jeni; вопрос отправлен: 07.10.2005 10:53): Здравствуйте! У меня такой вопрос: как определить, какой процесс использует данную папку и как он ее использует (для чтения(самое важное) для записи и т.д.) ? Т.е. если пользователь открыл папку или смотрит ее в Total Comander'e (осуществляет доступ к папке), то показывается сообщение. Ну что-то наподобие FileMon'a, только мне нужен код на Delphi 7. Т.е мне нужно узнать какой процесс читает данную папку. Заранее спасибо. [Ответить на вопрос] Вопрос #173 (автор вопроса: GENEMI; вопрос отправлен: 08.10.2005 15:47): Привет всем! Как сохранить (а потом и загрузить) данные переменной типа WideString? Делаю я так: //---[save]--- //---[load]--- После загрузки вместо долгожданного тест слова "West-Test" появляется какой то мусор :-(( Что тут можно сделать? [Ответить на вопрос] Вопрос #174 (автор вопроса: Sadowsky Vladimir T; вопрос отправлен: 10.10.2005 22:29): Здравствуйте! Подскажите, пожайлуста, как создать "Cаption" в TButton или TBitBtn, короче в любом TWinControl вертикально? [Ответить на вопрос] Вопрос #175 (автор вопроса: Сергей Урбанович; вопрос отправлен: 10.10.2005 22:50): Имеется текстовый файл, кодировка - ANSI. Как его перекодировать в Юникод? Заранее спасибо. [Ответить на вопрос] Вопрос #176 (автор вопроса: Тимур; вопрос отправлен: 12.10.2005 13:58): Нужно программно узнать температуру процессора. Мать Abit NF7-S (или любая другая) с микросхемой мониторинга Winbond W83627HF. [Ответить на вопрос] Вопрос #177 (автор вопроса: PWL; вопрос отправлен: 15.10.2005 17:53): Привет народ... К вам такой вопросик, может кто знает или встречался с таким, короче нужна помощь... Суть моей проблемы такова. Я разрабатываю программу-каталог с наименованием товара, с подключаемыми файлами, в которых находится только один товар и все с ним связано: в смысле, я беру DLL в котором фотки этого товара и какое-то описание, лучше всего в txt, но вот тут меня берут смятения, как лучше, или базу данных или то, что я задумал? Вообще-то я задумал якобы в одном файле под названием определенного товара лежат jpg`шки и txt`шки о товаре, мысль состоит в том, чтобы на форме имелся список всех этих dll`ок и при нажатии на данным товаром на форме выводились фотки и описание из dll (jpg и txt находятся в dll файлах). Короче, нужно, чтобы delphi их отображал на форме... Если у кого есть другие варианты решения этого трабла, плиииз помогите и поделитесь мыслёй... [Ответить на вопрос] Вопрос #178 (автор вопроса: Eltorn; вопрос отправлен: 17.10.2005 01:40): Я хотел бы узнать, как из буфера обмена, в котором находится рисунок в jpeg формате, вставлять его в компонент TImage? [Ответить на вопрос] Вопрос #179 (автор вопроса: Eltorn; вопрос отправлен: 17.10.2005 01:49): Есть массив, описывающий введенный алгоритм в виде записей вершина(имя),связи(TStringList имена связанных с ней вершин). Так вот, очень бы хотелось увидеть процедуру разбора такого алгоритма, а точнее выявление всех путей между операторными вершинами. Заранее благодарен. [Ответить на вопрос]
Вопрос #88 (автор вопроса: Sergey; вопрос отправлен: 15.03.2005 19:57): Вопрос по TChart. Как осуществить привязку указателя мыши к линии LineSeries? И еще. По оси X - время (DateTime). Как "вытащить" значение Y в любой точке LineSeries? [Ответить на вопрос] Вопрос #90 (автор вопроса: Nanny_Jagg; вопрос отправлен: 17.03.2005 07:56): Как в DBGrid из библиотеки Ehlib 3.6 добавить Lookup-поле, чтобы оно действительно работало? Поле вроде сделано, но ключевое поле, оставленное рядом для контрола не меняется, по какому событию обработчик писать? [Ответить на вопрос]
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Вопрос #105: 1. [Отвечает: Валерий Рум, 06.10.2005 16:09]: Боюсь что без дров не обойтись. Оценка за ответ: 2.
Вопрос #144: 1. [Отвечает: Костюков В., 12.10.2005 19:12]: В общем, ответ таков: чтобы добавить юзера необходимо выполнить следующее: net user username password /add - добовляет пользователя, net localgroup Администраторы username /add - права админа... а для того чтобы удалить тоже самое - только вместо add - delete/// а чтобы выполнить программно это так - ShellExecute(Application.Handle, 'open', 'net user username password /add', nil, nil, SW_SHOWNORMAL); что-то такое по-моему..... рытся надо, пробуйте..... спасибо за внимание.. Оценка за ответ: 4. Вопрос #149: 1. [Отвечает: Валерий Рум, 06.10.2005 16:12]: SendMessage(Application.Handle,WM_SYSCOMMAND,SC_MONITORPOWER,X); X=0 Потушить. Оценка за ответ: 4. 2. [Отвечает: mfred, 15.10.2005 17:55]: Привет. Вот код выключения и включения монитора через каждые 5 секунд, работает под XP. procedure TForm1.FormCreate(Sender: TObject); procedure TForm1.Timer1Timer(Sender: TObject); Оценка за ответ: 4. Вопрос #157: 1. [Отвечает: Spider, 06.10.2005 16:04]: При щелчке даже вне окна программы? Если да, то не знаю, но если просто щелчок на форме, тогда это очень легко: Image1.Picture.LoadFromFile('car.bmp'); Оценка за ответ: 4. 2. [Отвечает: jeni, 06.10.2005 16:38]: implementation {$R *.dfm} function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall; procedure TForm1.FormCreate(Sender: TObject); procedure TForm1.FormDestroy(Sender: TObject); Вместо ShowMessage подставляешь изменение картинки. Оценка за ответ: 5. Вопрос #158: 1. [Отвечает: Alexey Lukyanenko, 06.10.2005 13:36]: Дело в том, что один обработчик можно повесить на несколько контролов. И параметр Sender будет содержать ссылку именно на тот объект (контрол), который вызвал событие - для того, чтобы, например, обратиться к свойству Text того Edit, в который сейчас пользователь вводит текст - а Edit'ов у тебя, к примеру, десяток. Оценка за ответ: 5. 2. [Отвечает: Иван, 06.10.2005 13:39]: В этом параметре передается объект вызвавший событие. Если ты предположим задал кнопке Button1 событие OnCLick, то параметр Sender будет указывать на эту кнопку (т.е. Sender будет равен Button1). Зачем вообще нужен этот параметр? Чтобы написать предположим один обработчик для всех кнопок, а не 10 обработчиков с одинаковым кодом, отличающимся только тем, что работает с разными контролами... Конкретный класс объекта можно проверить с помощью оператора is. Например: кинь на форму TButton и TLabel, событие OnClick для обоих задай Button1Click. procedure TForm1.Button1Click(Sender: TObject); Оценка за ответ: 5. 3. [Отвечает: Матвеев И.В., 06.10.2005 14:54]: Sender в событиях это тот объект, который собственно вызвал данное событие (Event). Например, у вас имеется несколько кнопок на форме, вы выделяете несколько кнопок и в инспекторе объектов дважды щелкаете на событии OnClick. Теперь несколько кнопок при щелчке на них вызывают одно и то же событие, и при этом в Sender храниться указатель именно на ту кнопку, по которой щелкнули в данный момент. Как это можно использовать: в обработчике OnClick напишите TButton(Sender).Caption := 'Щелкнули по мне'; И вам сразу все станет ясно... Оценка за ответ: 5. 4. [Отвечает: timka05, 06.10.2005 16:58]: Sender - это объект, вызвавший событие. Тип объекта TObject - родительский объект для объектов всех остальных типов (визуальных и невизуальных). Класс объекта можно изнать из свойства ClassName (для кнопки это например, TButton). Для приведения Sender к нужному классу можно использовать след. код: (Sender as TButton).<имя_свойства_или_метода> TButton(Sender).<имя_свойства_или_метода>. Оценка за ответ: 5. 5. [Отвечает: Садовников Владимир, 06.10.2005 19:22]: Представь себе, у тебя имеется менюшка с (примерно) 100 пунктами (одни - вложенные, другие - нет, третьи - подобие радиокнопок и т.д.). Естественно, создавать для каждого пункта свой обработчик OnClick будет муторно и нечитабельно. Зато это легко решается созданием одного общего обработчика для конкретного набора пунктов меню, в котором проверяется, что являлось причиной вызова обработчика. В данном случае в качестве Sender будет играть роль указатель на соответствующий объект твоего TMenuItem. Почему именно TObject - да потому, что это полиморфный базовый класс для любого объекта Delphi. Даже при объявлении пользовательского родительского класса последний становится наследником TObject без нашей на то воли. Зато мы выигрываем мощный механизм полиморфных классов и RTTI, которая хранит информацию о всех родительских классах и наследниках, что упрощает доступ к искомому объекту благодаря динамическому преобразованию типов, которое порой бывает очень-очень нужным. Оценка за ответ: 5. 6. [Отвечает: mvp, 06.10.2005 19:29]: Он ссылается на объект, который вызал событие. Введён, скорее всего, для универсальности, ведь все классы наследуются от TObject. Ещё возможна ситуация, когда несколько объектов используют один обработчик события, и чтобы различить, кто именно его вызвал, используют TObject. Например, имеется 5 checkBox'ов, и у всех у них один обработчик события: checkboxClicked. И 5 label'ов, которые вкл/выкл. при клике на соответствующем checkbox'е: procedure TForm.checkboxClicked(Sender: TObject); И не надо в 5-и обработчиках писать одну и туже строку. Пример этот исскуственный, но такие ситуации встречаются достаточно часто, особенно когда компоненты создаются динамически. Оценка за ответ: 5. 7. [Отвечает: alexlazer, 06.10.2005 20:10]: Все компоненты Delphi являются лишь частью иерархической структуры, которая называется VCL. Базовый класс этой структуры - класс TObject, который используется Delphi по умолчанию при создании всех остальных классов. Следовательно, класс TObject является базовым классом, от которого "произошли" все остальные классы Delphi. Класс TObject инкапсулирует (включает в себя) общие черты поведения всех объектов VCL - библиотеки. Это включает: 1. Создание, управление и разрушение экземпляра объекта путем выделения ему памяти, инициализации и последующего освобождения выделенной памяти; 2. Доступ во время выполнения к информации о типе экземпляра объекта и его published-свойствам; 3. Поддержку управления событиями; 4. Поддержку реализуемых объектами интерфейсов. Если при создании нового объекта не указан базовый класс, то Delphi автоматически использует как предка класс TObject. Объявление type TMyClass = class равнозначно объявлению type TMyClass = class(TObject). Оценка за ответ: 5. 8. [Отвечает: Ершов Денис, 07.10.2005 07:59]: Любое Delphi-событие по сути своей представляет собой указатель одного объекта (инициатор события) на метод (обработчик события) какого-либо другого объекта. Наиболее распространенным типом события является TNotifyEvent. Они имеет формат: TNotifyEvent = procedure(Sender: TObject) of object; , где Sender - указатель на объект-инициатор события. Однако ничто не мешает определить любой другой формат событий. Событие типа TNotifyEvent чаще всего реализовано следующим способом: type Метод DoEvent - это метод диспетчеризации события. Он обычно бывает реализован динамическим и в секции protected, чтобы в будущих потомках этого класса его можно было перекрыть, с целью построить другой порядок инициации события. В простейшем случае данный метод реализуется следующим способом: procedure T_Объект.DoEvent; Если событие определено в published-секции то оно будет отображаться в закладке Events Инспектора Объектов, что сильно облегчает их использование. Кроме того можно определять обработчики самостоятельно. TForm1 = class(TForm) ... procedure Form1.FormCreate(Sender: TObject); Данный механизм позволяет менять обработчики событий по ходу работы программы, меняя ее поведение. Как было пояснено выше, в качестве параметра параметра Sender в обработчик обычно передается указатель на объект-инициатор события. В Инспекторе Объектов для события можно выбрать уже готовый обработчик из выпадающего списка. Данный механизм позволяет назначить один и тот же обработчик на несколько объектов, а при помощи параметра Sender обработчик может определить каким именно объектом было инициировано событие. Например, необходимо в меню программы встроить выбор COM-порта. |... |------- Количество портов на ПК может быть разное, кроме того можно произвольно задать их номера. TForm1 = class(TForm) ... procedure FormCreate(Sender: TObject); ... //Функция включения порта Procedure TFormTerm.SelectPortClick (Sender: TObject); Вкратце дело обстоит так. :) Оценка за ответ: 5. 9. [Отвечает: Вадим Фурив, 07.10.2005 08:54]: В сендере обычно указываю Self. Тогда событие указывает на свой объект. Т.е.: N1Click(Self); Оценка за ответ: 3. 10. [Отвечает: PVS, 07.10.2005 10:40]: Sender обычно указывает на компонент, который вызвал событие. Только находится он не в событии, а в процедуре - ОБРАБОТЧИКЕ события, потому что один и тот же обработчик может реагировать на разные события от разных объектов. Кроме того обработчик события - обычная процедура и его можна вызвать самому со своими параметрами (в.т.ч. и с Sender'ом). Если обработчик реагирует только на события одного объекта - да Sender известен заранее и обычно не используется, если же он реагирует на события нескольких объектов иногда нужно знать от кого оно пришло. Простейший пример - цифровые кнопки "калькулятора". Каждой кнопке в OnClick указываем Digit1Click, а сам код такой: procedure TCalculatorForm.Digit1Click(Sender:TObject); И не надо писать 10 разных процедур. Оценка за ответ: 5. 11. [Отвечает: Trojan, 07.10.2005 13:07]: Параметр Sender указывает на контрол, исполняющий данный event… Оценка за ответ: 3. 12. [Отвечает: Dron, 07.10.2005 14:46]: Параметр Sender в процедурах указывает на объект, который вызвал данное событие. Это удобно в случаях, когда несколько контролов должны выполнять аналогичные действия. Например, если есть 5 TLabel и каждый из них должен изменять цвет текста при наведении курсора, то можно выделить их все, переключиться на вкладку Events в Object Inspector и двойным щелчком создать событие OnMouseEnter и вписать: (Sender as TLabel).Font.Color:=clRed; Аналогично создаём событие OnMouseLeave: (Sender as TLabel).Font.Color:=clBlack; Теперь каждый из TLabel будет выделяться при наведении. Очень часто Sender помогает принимать обработчики пунктов меню (когда их много). Также этот Sender можно "заглушить": Button1.OnClick(nil); Оценка за ответ: 5. 13. [Отвечает: PiRAT, 07.10.2005 16:08]: Это переменная хранит объект который вызвал данный обработчик. Фишка в том, что несколько объектов могут иметь один и тот же обработчик. Например у тебя есть 20 полей ввода и ты хочешь по нажатию на определенную клавишу чистить в них текст. Согласись, что создавать 20 обработчиков просто неудобно (хотя можно). Вот красивый пример по изменению картинки у BitBtn (у всех у них один обработчик события): procedure TMFrm.sBitRenderMouseDown(Sender: TObject; Button: TMouseButton; Оценка за ответ: 5. 14. [Отвечает: VeroLom, 07.10.2005 17:00]: Это ссылка на объёкт, который вызвал событие т.е. можно использовать одно событие дня нескольких объектов. Использовать можно так: Form1.OnClickHandler(Sender: TObject); Оценка за ответ: 5. 15. [Отвечает: halk2, 07.10.2005 21:07]: В параметре Sender передаётся ссылка на компонент, вызвавший Это событие (т.е событие где находится Sender). Например имеются пять кнопок c Caption'ами - 1 , 2 , 3 , 4 , 5 соответственно и Edit1: TEdit; И чтоб не писать в каждой кнопке практически один и тот же код, с помощью Sender делаем сделующее: Оценка за ответ: 5. 16. [Отвечает: Лучников А.И., 13.10.2005 13:53]: Sender, как явствует из названия, - это объект, который послал сообщение о событии. Например, при нажатии кнопки Button1 возникает событие onClick и Sender у него будет Button1. Можно использовать Sender для обработки одинаковых событий от разных объектов, например обработка введенных данных в TEdit. Предположим есть несколько экземпляров TEdit: Edit1, Edit2,Edit3 и у каждого одинаковая проверка на значение. Тогда пишем один обработчик (Edit1Exit) и задаем его всем трем Edit'ам. Только в обработчике будем использовать: TEdit(Sender), а не явное указание объекта. При вызове процедуры из программы вместо Sender'а можно указать nil, но только если в самом обработчике нет ссылок на Sender. Оценка за ответ: 5. 17. [Отвечает: dasha ermakova, 13.10.2005 16:39]: Это класс компонента, который вызывает событие (например TButton при нажатии на кнопку). Присвоить его нельзя, можно только посмотреть. Оценка за ответ: 3. 18. [Отвечает: Yurchik, 14.10.2005 00:40]: Параметр Sender определяет объект, который порождает данное событие. Sender удобно использовать для выполнения одинаковых операций над определенным множеством однотипных объектов, когда конкретный обрабатываемый экземпляр точно неизвестен. Поясню на примере. Размести на формочке несколько меток. Создай обработчик события OnClick для первой метки и пропиши такой код: procedure TForm1.Label1Click(Sender: TObject); Остальным меткам выставь обработчик события OnClick в Label1Click. Теперь при клике на любую метку будет меняться ее цвет. Согласись, такой код более наглядный и короткий, чем прописывание соответствующего кода в каждом обработчике OnClick для каждой метки. Оценка за ответ: 5. 19. [Отвечает: Alexey, 14.10.2005 08:15]: Положите на форму две кнопки и назначте им обоим следующий обработчик procedure TForm1.Button1Click(Sender: TObject); Думаю после этого все станет на свои места :) Оценка за ответ: 4. 20. [Отвечает: dicking@rambler.ru, 14.10.2005 19:56]: Переводи Sender - отправитель, т.е. это объект, вызвавший событие. Например, ты в design-time 2 раза щелкаешь мышью на кнопке и у тебя автоматом создается обработчик события TForm.Button1Click(Sender: TObject). В этом обработчике можешь явно указать имя контрола - Button1. Но бывают случаи, когда на форме много компонентов и при нажатии на каждый выполняются похожие действия. В этом случае ты в Button1Click не пишешь явно имя Button1, а пишешь (Sender as TButton), остальное все то же самое. Остальным же компонентам назначаешь это же событие, выбирая его в списке в Object Inspector'e, тем самым значительно сокращая код. Оценка за ответ: 5. Вопрос #159: 1. [Отвечает: Константин Ситников, 06.10.2005 14:21]: Просто обратиться к API-функции. Пример: SetMenuItemBitmaps(File1.Handle, 1, MF_BYPOSITION, BMP1.Handle, BMP2.Handle); Оценка за ответ: 5. 2. [Отвечает: Матвеев И.В., 06.10.2005 14:54]: Существует несколько методов вызова API функций от простых Статического и Динамического вызова, до вычисления адресов API функций по их CRC и т.д. Самый простой способ вызвать API функцию - Статический: function ZwUnmapViewOfSection(SectionHandle: THandle; эта недокументированная функция будет вызвана из библиотеки ntdll.dll, обратите внимание на тип передачи параметров stdcall - библиотеки Windows всегда используют такой тип передачи. Оценка за ответ: 5. 3. [Отвечает: Валерий Рум, 06.10.2005 16:01]: Часть функций прописана в Delphi и их не надо объявлять. Если же нет той функции в pas-файлах что вам нужно, то зная dll где она расположена можно воспользоваться функциями LoadLibrary и GetProcAddress. Есть ещё один вариант: Оценка за ответ: 5. 4. [Отвечает: mvp, 06.10.2005 19:34]: Следует подключить модуль windows, shellApi для явного использования API-функций. Просто uses windows, shellApi - и используйте. А зачем объявлять чужие функции? Ничего не нужно объявлять. Скорее всего вы некоректно сформулировали вопрос. Оценка за ответ: 5. 5. [Отвечает: Садовников Владимир, 06.10.2005 19:50]: Объявить функцию WinAPI можно также, как и обычную функцию. Надо только знать, каким способом она вызывается (stdcall, fastcall, cdecl, pascal), какие аргументы принимает и в каком модуле находится. Используется директива external, после корой указывается либо имя библиотеки непосредственно, либо имя строковой константы. Вот пример объявления функций-расширений библиотеки OpenGL в отдельном модуле. unit GLExtensions; interface uses Windows, OpenGL; const procedure glArrayElement(ind:GLInt);stdcall; implementation procedure glColorPointer(size:GLInt;atype:GLEnum;stride:GLSizei;data:Pointer);stdcall;external OpenGL32; end. Оценка за ответ: 5. 6. [Отвечает: Ершов Денис, 07.10.2005 08:15]: Насколько я знаю все API представляет собой просто функции из различных DLL Windows. Программы сами должны находить эти DLL и обращаться к их функциям. Можешь ради интереса открыть исходник модуля "Windows", заметишь все API там описываются как external функции. Если тебе необходимо создать новую функцию просто создаешь новую DLL и записываешь ее в {%WindowsDir%}/System32. Если же тебе необходимо заменить стандартную API на собственную, то я даже не знаю как помочь твоему горю. У самого возникает живой интерес: Как можно перехватить вызов определенной функции из определенной DLL и выполнить вместо нее свою? Оценка за ответ: 5. 7. [Отвечает: PVS, 07.10.2005 10:56]: Функции API можно объявлять в любом месте, где допустимо объявление функций. Сама же функция API есть ничто иное как внешняя функция из динамической библиотеки: function CASESensitiveName(Param1:PChar):Integer;stdcall;external 'library.dll'; Функции API oбычно требуют stdcall (или cdecl) чтобы указать способ передачи параметров и очистки места за собой принятый в С вместо Pascal'евского. А вместо library.dll надо писать kerhel32.dll, user32.dll или чего-то еще, где спрятано API. Обычно в help'e указана нужная dll. Оценка за ответ: 5. 8. [Отвечает: Dron, 07.10.2005 14:49]: Чтобы объявить API-функцию, нужно создать dll, содержащую эту функцию и поместить её в системый каталог (system32 или system). После этого функцию можно будет вызывать примерно так: function MyFunc(Param1,Param2,Param3: Integer):Integer; stdcall; external 'myfunc.dll'; А чтобы использовать в своей программе все API-функции, объявлять их, конечно, не нужно. Большинство из них прописаны в модуле Windows.pas, который по умолчанию подключён к программе. Оценка за ответ: 5. 9. [Отвечает: PiRAT, 07.10.2005 16:12]: Ее не нужно объявлять все они описаны в стандартном модуле Windows. Например GetCursorPos(var Pos: TPoint); выдает в пременную текущие координаты курсора. Просто найди себе справочник по API функциям и используй его. Оценка за ответ: 5. 10. [Отвечает: Иван, 06.10.2005 17:48]: Есть два способа - статистическое связывание и динамическое. Статическое связывание: function MapDialogRect; external user32 name 'MapDialogRect'; Динамическое: type Где объявлять? Там же где и все остальные функции... Советую создать отдельный юнит... Оценка за ответ: 5. 11. [Отвечает: halk2, 07.10.2005 21:14]: Обьявлять ёе не надо, если подключён модуль Windows. Оценка за ответ: 3. 12. [Отвечает: Yurchik, 14.10.2005 00:41]: Все основные функции WinAPI уже объявлены в модулях Windows и ShellAPI. Объявление какой-либо функции из внешней библиотеки не отличается от обычного объявления функции, а ее тело заменяется директивой external. Например: function MyFunc(A: Integer): Integer; stdcall; external <LibNm> ЗЫ. Все экспортируемые функции библиотеки должны компилироваться в режиме stdcall. Соответственно, и при объявлении функции нужно указывать эту директиву. Оценка за ответ: 5. Вопрос #160: 1. [Отвечает: SHKoder@deagnostic.ru, 06.10.2005 13:23]: А ты в квери делай так: QueryInsert.ExecSQL, а не QueryInsert.Open. Оценка за ответ: 4. 2. [Отвечает: dasha ermakova, 13.10.2005 16:47]: Подавить сообщение можно с помощью: try Тогда сообщение будет выдаваться только при компиляции, а во время работы программы - нет. Оценка за ответ: 5. 3. [Отвечает: Alexey, 14.10.2005 08:10]: Здравствуйте, Сергей! Здесь телепатов нет, описывайте через что подключаетесь, каким образом выполняете запрос, желательно полностью код - это на будущее! А так скорее всего пытаетесь выполнить query.open вместо execSQL; Оценка за ответ: 4. Вопрос #161: 1. [Отвечает: SHKoder@deagnostic.ru, 06.10.2005 13:35]: Там же в OptionsData есть свойства Appending, Deleting, Editing, Inserting. Будь внимательнее. Оценка за ответ: 5. 2. [Отвечает: Ершов Денис, 07.10.2005 14:30]: Подобный вопрос уже был. Мой ответ - AdvStringGrid. Уже давно включен в список файлового архива. Оценка за ответ: 5. Вопрос #162: 1. [Отвечает: SHKoder@deagnostic.ru, 06.10.2005 13:36]: CD-Burning: {-----------------------------------------------------------------------------} Оценка за ответ: 3. 2. [Отвечает: Матвеев И.В., 07.10.2005 14:54]: Если вам нужен компонент для записи CD/DVD дисков советую посмотреть Magic CD DVD Burner v1.1.7 (http://www.binarymagics.com). Оценка за ответ: 5. Вопрос #163: 1. [Отвечает: SHKoder@deagnostic.ru, 06.10.2005 13:38]: Используй TImageComboBox. Оценка за ответ: 3. 2. [Отвечает: Трапезников Антон, 06.10.2005 13:42]: Делается это при помощи стиля ownerdraw, который присутствует в TComboBox. Тебя должно интересовать два свойства этого стиля: После того как стиль будет установлен на один из вышеперечисленных, то можно воспользоваться событием onDrawItem. Это событие возникает каждый раз, когда приложению необходимо нарисовать пункт в выпадающем списке (combo box). Событие определяется следующим образом: procedure TForm1.ComboBox1DrawItem(Control: TWinControl; index: Integer; Rect: TRect; State: TOwnerDrawState) Control - Элемент управления, содержащий пункт списка Если выпадающему списку был присвоен стиль csOwnerDrawFixed, то всё, что надо сделать, это написать процедуру, которая будет рисовать битмап и текст в событии onDrawItem. procedure TForm1.ComboBox1DrawItem(Control: TWinControl; index:Integer; Для выпадающего списка со стилем csOwnerDrawVariable необходимо пройти ещё одну дополнительную стадию. Заключается эта стадия в создании обработчика для события onMeasureItem. Это событие вызывается перед DrawItem, для того, чтобы Вы могли установить фактическую высоту для каждого элемента списка. Вот его определение: procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; index: Integer; var Height: Integer); Control - Элемент управления, содержащий пункт списка Оценка за ответ: 5. 3. [Отвечает: mvp, 06.10.2005 19:44]: В ComboBox просто так не поместишь рисунок. Используйте TComboBoxEx (вкладка Win32). Бросаете ImageList на форму, заполняете его рисунками. В ComboBoxEx Свойству Images присваиваете тот ImageList. При добавлении вручную или програмно нужно знать порядковые номера рисунков в ImageList. Рисунки могут менятся в зависимости от состаяния строки (выбрана, не выбрана). Узнать индекс выбранного элемента можно с помощью itemIndex. Если он =-1, то отображение не соответствует ни одному элементу в списке. Оценка за ответ: 5. 4. [Отвечает: Ершов Денис, 07.10.2005 08:27]: Приветствую, TERRARIUM. По событию OnDrawItem можно перерисовать пункт ниспадающего списка как душе угодно. А номер выбранного элемента содержится в свойстве ItemIndex. Оценка за ответ: 4. 5. [Отвечает: Вадим Фурив, 07.10.2005 09:11]: Компонент TComboBox не поддерживает по-моему вставку картинок. Для этого нужно использовать компонент TComboBoxEx в закладке Win32 (в Delphi 7 по крайней мере). В ComboBoxEx.Images добавляются методом Add картинки. Затем в ComboBoxEx.ItemsEx добавляются пункты меню с указанием требуемой картинки. Я сом этого не делал, так что добавить текст программы не могу. Все это Прочитал только что в Help по Дельфи. Чего и Вам желаю. Там все подробно и доходчиво описано. А считать номер выбранного компонента: ComboBox.InemIndex. Если равен -1, то в текст в ComboBox.Text не из списка. Иначе возвращает номер выбранного компонента. Нумерация начинается с нуля. Такая же система и в TComboBoxEx. Оценка за ответ: 5. 6. [Отвечает: jeni, 07.10.2005 11:41]: Кидаешь на форму ImageList, заполняешь его картинками. У ComboBox'a на событии OnDrawItem пишешь procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; А чтобы узнать по какой строке кликнули вот это: procedure TForm1.ComboBox1Change(Sender: TObject); Оценка за ответ: 5. 7. [Отвечает: Dron, 07.10.2005 14:52]: Для этого нужно использовать компонент TComboBoxEx со страницы Win32. Следует создать TImageList (тоже с Win32) и поместить в него необходимые изображения. Затем в ComboBoxEx установить свойство Images равным созданному ImageList. После этого каждой из строк (ItemsEx) можно ассоциировать изображения (порядок счёта начинается с нуля). Чтобы узнать индекс выбранного элемента списка, следует обратиться к ComboBoxEx.ItemIndex. Оценка за ответ: 5. 8. [Отвечает: dasha ermakova, 13.10.2005 16:49]: Возьми компонент ComboBoxEx1 в Win32, там предусмотрены картинки. Номер выбранного элемента: ComboBoxEx1.ItemIndex; Оценка за ответ: 5. 9. [Отвечает: Yurchik, 14.10.2005 00:42]: Количество строк Items должно быть равно количеству элементов в выпадающем списке. Style выставлен в csOwnerDrawFixed или csOwnerDrawVariable. Обработчик события OnDrawItem должен рисовать элемент с заданным индексом. Событие OnMeasureItem возникает только если style="csOwnerDrawVariable" и используется для определения высоты каждого элемента. Пример: procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer; Номер выбранного элемента ниспадающего списка доступен, как обычно, через ItemIndex. Оценка за ответ: 5. 10. [Отвечает: vet, 15.10.2005 00:18]: 1. Создаешь компонент TImageList, в который помещаешь картинки, которые тебе надо рисовать. Заполняешь ComboBox строками, свойство Style устанавливаешь в csOwnerDrawFixed (или csOwnerDrawVariable - для разной высоты строк) и описываешь обработчик события ComboBox'a OnDrawItem, например: procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; 2. Номер выделенного элемента - ComboBox.ItemIndex. Оценка за ответ: 5. Вопрос #164: 1. [Отвечает: Садовников Владимир, 06.10.2005 19:31]: Так дебаггером. Если обычный дельфовский отладчик не справляется, поможет Turbo Debugger, который вызывается View->Debug Windows->CPU, но после этого придётся разбираться уже с ассемблером. Оценка за ответ: 5. 2. [Отвечает: Alexey Lukyanenko, 07.10.2005 12:39]: Для этого нужно запустить программу функцией CreateProcess, дождаться окончания ее работы, и получить результат из функции GetExitCodeProcess: var CreateProcess('program.exe', '', nil, nil, False, 0, nil, nil, SA, PI); if WaitForSingleObject(PI.hProcess, INFINITE) = WAIT_OBJECT_0 then Оценка за ответ: 5. Вопрос #165: 1. [Отвечает: Alexey Lukyanenko, 06.10.2005 13:43]: Зарегистрировать системное событие 'TaskbarCreated', и обрабатывать его: WM_TBCreated := RegisterWindowMessage('TaskbarCreated'); Оценка за ответ: 5. 2. [Отвечает: Константин Ситников, 06.10.2005 14:23]: Советую просто обновлять иконку в трее через определенный интервал времени (1 минута к примеру). Оценка за ответ: 4. 3. [Отвечает: Сергей, 06.10.2005 19:22]: Я в своих программах делаю так: Кидаешь на форму Timer и пишешь: //----trey------ При перезагрузке проводника через некоторое время в трее появится иконка. Оценка за ответ: 5. 4. [Отвечает: Dron, 07.10.2005 14:53]: Рекомендую воспользоваться компонентом CoolTrayIcon. Он автоматически восстанавливает иконку при перезагрузке explorer.exe. Это одно из его достоинств. Оценка за ответ: 4. Вопрос #166: 1. [Отвечает: SHKoder@deagnostic.ru, 06.10.2005 13:40]: Bспользуй TActionList, он ловит любые события или TApplicationEvents из закладки Additional. Оценка за ответ: 4. 2. [Отвечает: Nickolay Antipov, 06.10.2005 14:57]: MainMenu1.OwnerDraw = false и все будет ок. Оценка за ответ: 3. 3. [Отвечает: Сергей Азачем, 06.10.2005 22:04]: Нормальным образом никак. Проблема в функции обработки акселераторов в VCL. unit Forms. Можно написать свою функцию и во время выполнения приложения прописать в IsAccel JMP на свою функцию. Как это сделать можно посмотреть в функции MakeObjectInstance; Оценка за ответ: 4. 4. [Отвечает: Вадим Фурив, 07.10.2005 09:26]: У меня в TMainMenu не имеет значения регистр нажимаемой буквы. Срабатывает как заглавная, так и прописная. Могу посоветовать назначить горячие клавиши HotKey. Компонент это позволяет. Оценка за ответ: 4. 5. [Отвечает: Yurchik, 14.10.2005 00:42]: Впервые слышу о таком. Работает как Alt+ф, так и Alt+Shift+ф. Единственное - должна быть включена русская или украинская раскладка клавиатуры. Оценка за ответ: 4. Вопрос #167: 1. [Отвечает: SHKoder@deagnostic.ru, 06.10.2005 13:42]: Но тогда нужен консольный rar.exe. Еще есть вариант Unrar.dll как использовать его можно посматреть на офиц. сайте rarlabs.com там вроде с примерами на C#, VB, Delphi. Оценка за ответ: 4. 2. [Отвечает: Матвеев И.В., 06.10.2005 14:54]: Насколько я понимаю создавать Rar архивы может только WinRar/RAR, т.е. алгоритмы сжатия не публиковались, а вот распаковывать RAR архивы из своей программы довольно легко - существует специальная библиотека UnRar.dll (см. www.rarlab.com) именно для этой цели. Однажды я использовал ее для создания инсталляционного дистрибутива своей программы, т.е. из ресурсов извлекал в temp библиотеку, динамически подгружал ее и использовал для распаковки архива с файлами программы. Не очень красивое решение, но всеже работало. Если же вы хотите именно сжимать, вы можете использовать RAR - консольную версию архиватора (rar.exe - поставляется вместе с WinRar), как им пользоваться довольно подробно описано в документации WinRar. Оценка за ответ: 5. 3. [Отвечает: mvp, 06.10.2005 19:53]: В uses добавьте shellApi. А так вот вызывается winrar: ShellExecute(Application.Handle, 'open', 'winrar', 0, 0, 0); Изучите руководство по командной строке WinRar - очень много функций. Если же вы хотите ему передать параметры командной строки, то так: ShellExecute(Application.Handle, 'open', 'winrar', pchar(par1 + ' ' + .. Учтите, что если вы будете указывать пути к файлам, то там могут встретиться пробелы и такой параметр должен начинаться с двойных кавычек и ими же заканчиваться. Оценка за ответ: 5. 4. [Отвечает: Сергей Азачем, 06.10.2005 22:10]: В поставку WinRar входит консольная версия Rar.exe. Для ее запуска можно воспользоваться ShellExecute(GetDesktopWindow, nil, 'C:\Program Files\WinRAR\Rar.exe', 'параметры командной строки' nil, SW_ShowNormal); Параметры командной строки отображает сам Rar при его запуске без параметров. Оценка за ответ: 5. 5. [Отвечает: Ершов Денис, 07.10.2005 09:00]: Не совсем компонент. DLL и интерфейс к ней. Загрузить прикреплённый файл >> ...Дополнение к ответу. По запуску WinRAR'а. Открой его справку, в содержании есть раздел"Режим командной строки". Там все подробнейше расписано как его запускать. Запустить программу можно функцией WinExec. UINT WinExec( Return Values If the function succeeds, the return value is greater than 31. Value Meaning Оценка за ответ: 5. 6. [Отвечает: Dron, 07.10.2005 14:56]: В состав WinRAR входит командный архиватор - rar.exe и unrar.exe. Запустив его без параметров, можно увидеть список всех достпуных команд (их там много). После этого остаётся только запускать rar.exe с параметрами: WinExec('rar.exe e archive.rar',1); Оценка за ответ: 4. 7. [Отвечает: VeroLom, 07.10.2005 17:03]: Можешь использовать unrar.dll. Описание есть на http://www.RarLab.com. Оценка за ответ: 3. В одном ответе RarLab.com, в другом - RarLabs.com... Где же истина? ;-) (прим. редактора) 8. [Отвечает: Лучников А.И., 13.10.2005 13:58]: WinRar.exe так и вызывается, только нужно ввести параметры (см. rar.txt). А если архиватор не критичен, то рекомендую ТVclZip - очень полезная вещь. Оценка за ответ: 5. 9. [Отвечает: dasha ermakova, 13.10.2005 16:50]: Хороший компонент ZipForge. Хотя называется Zip, но создает любые архивы. Оценка за ответ: 4. 10. [Отвечает: mfred, 15.10.2005 18:48]: Привет. WinRar можно запустить из программы с помощию этого кода: uses ShellAPI; procedure TForm1.Button1Click(Sender: TObject); Оценка за ответ: 4. Вопрос #168: 1. [Отвечает: Валерий Рум, 06.10.2005 16:08]: Попробуй почитать Help по функции SendMessage с параметром LB_FINDSTRING. Оценка за ответ: 3. 2. [Отвечает: mvp, 06.10.2005 20:07]: Ну, по поиску много теории наработано :) Если по простому, то: procedure FindInListBox(lb : TListBox; text : string; caseSencitive : begin Оценка за ответ: 5. 3. [Отвечает: Вадим Фурив, 07.10.2005 09:45]: Для этого нужно использовать цикл. Данные в ListBox расположены в ListBox.Items : TStrings. Свойство ListBox.Items.Count показывает количество строк. Организуем цикл: for I:=1 to ListBox.Items.Count do В этом цикле по очереди сравниваем с нужными нам условиями строки: ListBox.Items[I-1]. I-1 потому что нумерация идет с нуля. Оценка за ответ: 4. 4. [Отвечает: Dron, 07.10.2005 14:59]: Самый простой способ - в цикле проверить все строки ListBox, попутно сравнивая их с заданным образцом. Проверять соответствие строк по маске можно с помощью функций из модуля Masks.pas (нужно подключить в Uses). Вот пример поиска строк (без масок): Var I: Integer; Search: String; Оценка за ответ: 5. 5. [Отвечает: dasha ermakova, 13.10.2005 16:51]: В Edit1 пишем текст, который надо найти. ... implementation procedure TForm1.Button1Click(Sender: TObject); procedure TForm1.FormCreate(Sender: TObject); Оценка за ответ: 5. Все вопросы и ответы на них Вы всегда можете найти на нашем сайте в разделе "Эксперт": http://www.delphi.int.ru/modules/expert/. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Добавляем компонент в стандартный Message Dialog Источник: http://www.ReadCoding.net/ Пример показывает стандартное диалоговое окно, которое обычно используется для подтверждения дальнейших действий в любой программе с галочкой "Don't show this message again". Используем функцию CreateMessageDialog и добавляем любой компонент до того как будет вызвана ShowModal. Например: procedure TForm1.Button1Click(Sender: TObject); Var AMsgDialog: TForm; ACheckBox: TCheckBox; begin AMsgDialog := CreateMessageDialog('This is a test message.', mtWarning, [mbYes, mbNo]); ACheckBox := TCheckBox.Create(AMsgDialog); with AMsgDialog do try Caption := 'Dialog Title' ; Height := 169; With ACheckBox do begin Parent := AMsgDialog; Caption := 'Don''t show me again.'; top := 121; Left := 8; end; Case ShowModal of ID_YES: ; //здесь Ваш код после того как диалог будет закрыт ID_NO: ; end; If ACheckBox.Checked then begin //... end; finally ACheckBox.Free; Free; end; end; Также Вы можете изменить диалог по Вашему усмотрению. Эти изменения основаны на том, что функция CreateMessageDialog создаёт форму, на которой располагаются компоненты стандартного диалога (небольшая иконка, текст сообщения, кнопки). На эту форму можно добавить любой компонент и, соответственно, изменить внешний вид диалога. Присылайте свои статьи по адресу info@delphi.int.ru с темой 'Articles' (без кавычек), и они будут опубликованы в ближайших выпусках рассылки и на сайте. Также вы можете заполнить вот эту форму. Большая просьба: статью оформляйте в -txt или -doc формате и используйте -zip или -rar сжатие (без самораспаковки). |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Из данного раздела Вы можете скачать различные файлы: компоненты, plug-in'ы для Delphi, документацию по программированию, программы, игры, написанные на Delphi и всё остальное... Вы можете добавить свои файлы в данный раздел. Чтобы сделать это, пожалуйста, заполните форму на сайте. Новые файлы на сайте:
Чтобы перейти к разделу "Файловый архив" на сайте, нажмите на эту ссылку. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Здесь представлены ссылки на дружественные сайты нашего портала. Если вы тоже хотите стать нашим другом, разместите наш баннер на своём сайте. Подробнее о том, как это сделать, можно прочитать на странице данного раздела на нашем сайте. Узнать о всех наших друзьях более подробно вы сможете на той же странице... http://infomania2004.webhost.ru/ - Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом. http://www.visualbasic.noka.ru/ - Программирование на Visual Basic & Basic. На сайте Вы найдете множество примеров, статьи, исходники, ActiveX, а также многое другое! http://www.sashook.hut1.ru/ - Игры, коллекция флешек, обои и заставки, компьютерные приколы, картинки, тосты и алкогольные присказки, смешные истории и анекдоты. http://www.ssgroup.fatal.ru/ - Delphi 39. Ресурс для программистов. Статьи, исходники, компоненты, учебники, справочники, FAQ, программы и многое другое. http://www.hkdsoft.narod.ru/ - H.K.D. Soft - Программирование на Delphi, C/C++, Assembler, Pascal, Basic/VB/VBA/VBS. Компоненты, статьи, исходники, множество е-книг, форум. Бесплатный софт. Скачать программу GamesBase - базу данных по играм содержащую описания, скриншоты, коды, прохождения игр. Дружественные рассылки: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Приходят друзья к новому русскому, а тот хвастается новым ремонтом: гостиная вся в золоте, кухня забита дорогущей техникой, в спальня огромная кровать 6 на 6 метров. Спрашивает он у гостей: «ну как?», те: «все просто супер, но что-то у тебя в туалете плитка очень мелкая», он возмущенно: «вы чё в натуре, там одна плитка 100 баксов стоит, Пентиум называется!» :)) Магазин по пpодаже компьютеpов. Пpодавец подбиpает богатой, но не понимающей в комьютеpах даме: :)) Папа-программист сидит за компьютером, работает. В комнату вбегает маленькая дочка: :)) Тонет программист, и орёт во всю глотку: :)) Встречаются два квакера: :)) Визит министpа здравоохранения в одну из психиатрических лечебниц. Осмотpев палаты, пpоцедуpные залы, столовую, министр изъявляет желание пpовеpить, как содеpжатся буйнопомешанные больные, опасные для окpужающих. Спускаются на 0-й этаж, главвpач отпиpает стальную кованую двеpь. За двеpью длинный коpидоp. Министр пеpеходит от камеpы к камеpе, читает таблички, иногда заглядывает внутpь. Около одной из камеp: :)) Анекдоты прислал: Масалов Андрей. Спасибо тем, кто прислал другие анекдоты! Они будут опубликованы в следующих выпусках. Пожалуйста, присылайте свои анекдоты по этой ссылке: info@delphi.int.ru и они обязательно будут опубликованы! Желательно на компьютерную тему.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Товарищи программисты! Проявляйте свою активность. Давайте помогать друг другу! Если вы не нашли ответа на свой вопрос, не отчаивайтесь! Количество подписчиков постоянно растёт и, наверняка, найдётся тот человек, который поможет вам! На сегодня всё. До встречи через неделю! Ведущий рассылки, Ерёмин Андрей. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Вы можете оказать помощь нашему проекту через систему WebMoney: R379291065219, Z165075684614. Будем очень признательны! |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Наш сайт: http://www.delphi.int.ru/ E-mail: admin@delphi.int.ru; info@delphi.int.ru; expert@delphi.int.ru Страница рассылки: http://subscribe.ru/catalog/comp.soft.prog.delphifaq |
Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphifaq Архив рассылки |
Отписаться
Вспомнить пароль |
В избранное | ||