Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 130
от 23.05.2005, 11:50

Администратор:Калашников О.А.
В номере:Вопросов: 3, Ответов: 14


Вопрос № 20994: Здравствуйте уважаемые эксперты! Как "таскать" форму по экрану одним кликом мыши, т.е. я нажал на мыши кнопку и перетаскиваю форму. Такая "фишка" реализована во многих инет-качалках (Своеобразная корзинка, которую можно тягать...
Вопрос № 20998: Уважаемые господа эксперты! Прошу Вашей помощи. 1. На экране появляется кнопка, координаты ее положения случайны. При работе программы кнопка может занять любое положение в пределах окна программы. Поймав кнопку мышью мы сможем активировать к...
Вопрос № 21001: Ребят помогите пожалуйста разрешить такую проблему. При наборе текста в RichEdit необходимо чтобы некоторые ключевые слова выделялись жирным или меняли цвет автоматически во время набора. Заранее спасибо...

Вопрос № 20994
Здравствуйте уважаемые эксперты!
Как "таскать" форму по экрану одним кликом мыши, т.е. я нажал на мыши кнопку и перетаскиваю форму. Такая "фишка" реализована во многих инет-качалках (Своеобразная корзинка, которую можно тягать по всему экрану). Как реализовать такое перетаскивание формы??
Отправлен: 17.05.2005, 18:13
Вопрос задал: And1 (статус: 2-ой класс)
Всего ответов отправлено: 7

Отвечает: Асоков Александр Иванович
Здравствуйте, And1!
Уточни вопрос а то не ясно. Форму и так можно таскасть по экрану мышкой.
Ответ отправил: Асоков Александр Иванович (статус: 1-ый класс)
Отправлен: 17.05.2005, 19:32
Оценка за ответ: 3
Комментарий оценки:
Можно, но только за заголовок...
а заклиентскую область экрана - нет

Отвечает: Jadd
Здравствуйте, And1!
Окно можно таскать, но за заголовок окна. Если нужно таскать за клиентскую область, то тут придется немного посчитать. Т.е. на событие OnMouseMove нухно проверить состояние кнопки мыши и, в случае ее удержания, нужно получить координаты окна, например, через WinAPI (функция GetWindowPlacement) и передвинуть на позицию равной разности позиции курсора в окне и верхней левой точки окна. Это можно так же делать через WinAPI (функция SetWindowPos). Описание функций в хелпе и MSDN. Удачи.
Ответ отправил: Jadd (статус: 4-ый класс)
Отправлен: 17.05.2005, 22:36
Оценка за ответ: 3
Комментарий оценки:
Оказалось всё гораздо проще, чем "хуки"...

Отвечает: Ballon
Здравствуйте, And1!
Смотри листинг.
unit Unit1;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
private
{ Private declarations }
protected
// Перехват сообщения WM_NCHITTEST для перемещения окна без заголовка.
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
public
{ Public declarations }
procedure CreateParams(var Params: TCreateParams); override;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
// Результат HTCAPTION означает, что курсор находится над заголовком:
Message.Result := HTCAPTION;
end;
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
// Окно с рамкой (WS_THICKFRAME), но без заголовка (WS_POPUP):
Params.Style := WS_THICKFRAME or WS_POPUP;
end;
end.
Ответ отправил: Ballon (статус: 2-ой класс)
Отправлен: 18.05.2005, 08:12
Оценка за ответ: 5
Комментарий оценки:
Спасибо! даже с комментариями! :)

Отвечает: sir henry
Здравствуйте, And1!
Может быть я чего-то не понял, но любую форму можно таскать мышкой, если только прямо в ее свойствах не указать, что ее таскать нельзя.
Если нужно таскать форму за любой ее дочерний компонент, то см в приложении пример 1 (для лэйбла).
Еще у меня факах пример валяется, но сам я его не пробовал, может подойдет. См в приложении пример 2

Приложение:

Ответ отправил: sir henry (статус: Профессор)
Отправлен: 18.05.2005, 08:50
Оценка за ответ: 5
Комментарий оценки:
Спасибо!!
Пример 1 - то что нужно!

Отвечает: Stamm
Здравствуйте, And1!
Попробуй следующий код
Посмотри в приложении

Приложение:

Ответ отправил: Stamm (статус: 2-ой класс)
Отправлен: 18.05.2005, 13:01
Оценка за ответ: 5
Комментарий оценки:
Спасибо, достаточно оригинальное решение!

Отвечает: Master89
Здравствуйте, And1!
{Выдержка из одной статьи...}
Помимо всего прочего, пример демонстрирует, как таскать форму левой кнопкой мыши (в смысле, не только за заголовок окна). Для этого нам потребуется создать свою собственную процедуру обработки события WM_LBUTTONDOWN, которое форма получает всякий раз, когда на ней нажимают левую кнопку мыши. Вот как эта процедура выглядит в описании формы:
type
TFormMain = class(TForm)
private
{ Private declarations }
procedure WMLButtonDown(var Msg: TMessage); message WM_LBUTTONDOWN;
public
{ Public declarations }
end;
Строчка, которую нужно будет добавить, выделена красным цветом. В разделе реализации эта функция выглядит так:
procedure TFormMain.WMLButtonDown(var Msg: TMessage);
begin
Perform(WM_NCLBUTTONDOWN, HTCAPTION, Msg.LParam);
end;
Форма посылает самой себе сообщение WM_NCLBUTTONDOWN с wParam равным HTCAPTION, то есть эмулирует ситуацию, когда пользователь нажимает левую кнопку мыши на заголовке формы.
Ответ отправил: Master89 (статус: 3-ий класс)
Отправлен: 18.05.2005, 13:03
Оценка за ответ: 5

Отвечает: nimoid
Здравствуйте, And1!
Вот так:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const SC_DragMove = $F012;
begin
ReleaseCapture;
Form1.Perform(WM_SysCommand, SC_DragMove, 0);
end;
Ответ отправил: nimoid (статус: 1-ый класс)
Отправлен: 18.05.2005, 16:10
Оценка за ответ: 5
Комментарий оценки:
Спасибо, то что нужно!


Вопрос № 20998
Уважаемые господа эксперты! Прошу Вашей помощи.
1. На экране появляется кнопка, координаты ее положения случайны.
При работе программы кнопка может занять любое положение в пределах окна программы. Поймав кнопку мышью мы сможем активировать кнопку выхода из программы. Размер окна формы 360*300, кнопка-30*100.
а) Инициализация генератора случайных чисел.
б) Прыгающая кнопка невидима.
2. Последовательность действий для проверки пустой строки, чтобы не обрабатывать пустую строку, т.е. проверка длины строки.
3. Атрибуты стандартного сообщения об ошибке Messagedlg и их значение,
(по моему их 4)
И последний вопрос: условный оператор, который позволит подсказать пользователю, что строка не введена.
Спасибо заранее. Я ведь даже не то чтобы учусь ходить, а только ползать.
Отправлен: 17.05.2005, 21:07
Вопрос задал: Петров Василий Владимирович (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Ballon
Здравствуйте, Петров Василий Владимирович!
Чтобы сгенерировать случайное число
1.Используй процедуру Randomize;
Например:
Begin
Randomize;
x:=Random(100);//Возвращает случайное число от 0 до 100;
end;
2.Чтобы кнопка была невидима поставь свойство Visible этой кнопки в False:
Button1.Visible := false;
3.function MessageDlg(const Msg: string; Atype: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: Longint): Word;
Сообщение в окне задается параметром Msg.
Вид окна задается параметром Atype, может иметь значения: mtConfirmation, mtInformation, mtError, mtWarning, mtCustom.
Параметр AButtons определяет какие кнопки будут присутствовать в окне, и может иметь значения: mbYes, mbNo, mbOK, mbCancel, mbHelp, mbAbort, mbRetry, mbIgnore, mbAll. Еще есть три константы: mbYesNoCancel, mbOkCancel, mbAbortRetryIgnore.
Параметр HelpCtx определяет экран контекстной справки, если справку не планируешь задай 0.
4. if Edit1.Text ='' then
MessageDlg('Строка не введена', mtWarning, [mbOk],0);
P.S. ЧИТАЙ СПРАВКУ ТАМ ВСЕ НАПИСАНО.
Ответ отправил: Ballon (статус: 2-ой класс)
Отправлен: 18.05.2005, 07:59

Отвечает: sir henry
Здравствуйте, Петров Василий Владимирович!
1. а) Генератор случайных чисел инициализируется волшебным словом Randomize.
б) Если прыгающая кнопка будет невидима, то как ее можно будет поймать? Или она на самом деле не прыгает, а просто случайным образом располагается на экране?
Пожалуйста, уточните этот момент.
2. Длину строки строки возвращает функция Length(строка).
3. Забудте Вы про MessageDlg, вместо нее используйте стандартное системное окно сообщений MessageBox(). Оно выводит кнопки на русском языке, а MessageDlg на английском. Вам это надо?
По MessageBox и ее параметрам, есть подробная справка в самом Дельфи. Вы туда не заглядывали?
Если коротенько то вот:
MessageBox(hWnd, lpText, lpCaption, uType);
hWnd - идентификатор родительского окна, обычно можно ставить 0;
lpText - текст сообщения;
lpCaption - текст заголовка;
uType - это какая будет иконка и какие кнопки, там констант довольно много, посмотрите в хелпе.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 18.05.2005, 09:05


Вопрос № 21001
Ребят помогите пожалуйста разрешить такую проблему.
При наборе текста в RichEdit необходимо чтобы некоторые ключевые слова выделялись жирным или меняли цвет автоматически во время набора.
Заранее спасибо
Отправлен: 17.05.2005, 21:37
Вопрос задал: Pithon (статус: Посетитель)
Всего ответов отправлено: 5

Отвечает: Rusland
Здравствуйте, Pithon!
Смотри свойства RichEdit - SelStart, SelLength, SelAttributes.Style
Но RichEdit часто делает выделения криво, например, после выделения отдельного слова жирным цветом все последующие слова тоже выделяются жирным. Я, к сожалению, от этого избавится не смог.

Приложение:

Ответ отправил: Rusland (статус: 3-ий класс)
Отправлен: 18.05.2005, 09:16
Оценка за ответ: 2
Комментарий оценки:
Я задавал вопрос по Delphi, мне прислали на CBildere. Я конечно понимаю что систаксис там схожий, но я так и не смого переделать его на Делфи.

Отвечает: VBA
Здравствуйте, Pithon!
Скачай готовые компоненты для подсветки синтаксиса.
http://synedit.sourceforge.net
Тут также есть прога, которая позволяет создавать свои собственные компоненты, указав список ключевых слов.
Ответ отправил: VBA (статус: 3-ий класс)
Отправлен: 18.05.2005, 10:59

Отвечает: Master89
Здравствуйте, Pithon!
Скачайте редактор SynEdit: http://prdownloads.sourceforge.net/synedit/synedit-201b.zip?download
Там всё это есть и можно сделать Delphi-подобный редактор за пару секунд.
Ответ отправил: Master89 (статус: 3-ий класс)
Отправлен: 18.05.2005, 13:02

Отвечает: X
Здравствуйте, Pithon!
Вот вроде вполне работоспособный пример без дополнительных компонентов.

Приложение:

Ответ отправил: X (статус: 4-ый класс)
Отправлен: 18.05.2005, 14:10
Оценка за ответ: 5
Комментарий оценки:
Это то что мне было нужно. Большое спасибо.

Отвечает: And1
Здравствуйте, Pithon!
Это называется подсветка синтаксиса. Есть отличный компонент, предназначенный специально для этого - SynEdit. Его можно найти на сайте www.torry.net (здесь вообще море компонентов). Сайт компонента - http://synedit.sourceforge.net. А мучаться самому создавая подсветку, я думаю, смысла нет.
Ответ отправил: And1 (статус: 2-ой класс)
Отправлен: 20.05.2005, 12:07


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus

Другие рассылки этой тематики
Отписаться
Вспомнить пароль

В избранное