Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2008, 11:07   #1
Михаил Юрьевич
Форумчанин
 
Аватар для Михаил Юрьевич
 
Регистрация: 25.12.2007
Сообщений: 655
Восклицание курсор ввода текста

Подскажите как сделать чтобы при открытии текстового редактора
в RichEdit курсор ввода текста находился в поле,вставил в
RichEdit1Change-RichEdit1.SetFocus; программа выдает ошибку
За частые поиски был забанен во всех известных
поисковых системах!
Михаил Юрьевич вне форума Ответить с цитированием
Старый 01.03.2008, 12:28   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Самое простое при проектировании сделать свойство TabOrder у RichEdit1 равным 0, тогда при открытии программы курсор всегда будет в RichEdit1.
puporev вне форума Ответить с цитированием
Старый 01.03.2008, 12:54   #3
Табурет
Пользователь
 
Аватар для Табурет
 
Регистрация: 29.02.2008
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Михаил Юрьевич Посмотреть сообщение
Подскажите как сделать чтобы при открытии текстового редактора
в RichEdit курсор ввода текста находился в поле,вставил в
RichEdit1Change-RichEdit1.SetFocus; программа выдает ошибку
SetWindowFocus(RichEdit1.Handle, false); <- примерно так. Событие лучше вешать на Form.Activate, чтобы RichEdit1 уже был создан.
Табурет вне форума Ответить с цитированием
Старый 01.03.2008, 13:30   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Табурет Посмотреть сообщение
SetWindowFocus(RichEdit1.Handle, false); <- примерно так. Событие лучше вешать на Form.Activate, чтобы RichEdit1 уже был создан.
Что это за функция такая - SetWindowFocus ???
----------------

Цитата:
Сообщение от Михаил Юрьевич Посмотреть сообщение
Подскажите как сделать чтобы при открытии текстового редактора
в RichEdit курсор ввода текста находился в поле,вставил в
RichEdit1Change-RichEdit1.SetFocus; программа выдает ошибку
Михаил Юрьевич, а кто Вас научил вызывать SetFocus в обработчике WM_CHANGE? Ставьте его в OnFocused у формы, или сделайте, как puporev предлагает... И что за ошибка?
B_N вне форума Ответить с цитированием
Старый 03.03.2008, 09:14   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ставьте его в OnFocused у формы
э-э-э думаю ты хотел сказать OnActivate ибо нет OnFocused события у формы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.03.2008, 11:04   #6
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

проще по onShow
andrey4623 вне форума Ответить с цитированием
Старый 03.03.2008, 12:09   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
проще по onShow
Нет. Не сработает если форма уже видна.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.03.2008, 14:23   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
э-э-э думаю ты хотел сказать OnActivate ибо нет OnFocused события у формы.
Stilet, не совсем. Это плохо, что у формы нет изначального обработчика WM_SETFOCUS, запамятовал, видимо, но я бы его для таких случаев определял вручную. Я считаю, что определенные события должны обрабатываться в соответствующих им местах. Например, другое приложение гипотетически может вызвать SetFocus на главное окно нашего и цепочка будет нарушена. В качестве примера - обработка (интересующих нас) сообщений в главном окне обычного блокнота:

1. Активация главного окна
Код:
<00001> 0013026C S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
<00002> 0013026C R WM_ACTIVATEAPP
<00003> 0013026C S WM_NCACTIVATE fActive:True
<00004> 0013026C R WM_NCACTIVATE
<00005> 0013026C S WM_ACTIVATE fActive:WA_CLICKACTIVE fMinimized:False hwndPrevious:(null)
<00006> 0013026C S WM_SETFOCUS hwndLoseFocus:(null)
<00007> 0013026C S WM_KILLFOCUS hwndGetFocus:000803B2
<00008> 0013026C R WM_KILLFOCUS
<00009> 0013026C R WM_SETFOCUS
<00010> 0013026C R WM_ACTIVATE

2. Деактивация главного окна
Код:
<00011> 0013026C S WM_NCACTIVATE fActive:False
<00012> 0013026C R WM_NCACTIVATE fDeactivateOK:True
<00013> 0013026C S WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null)
<00014> 0013026C R WM_ACTIVATE
<00015> 0013026C S WM_ACTIVATEAPP fActive:False dwThreadID:00000B64
<00016> 0013026C R WM_ACTIVATEAPP
Прекрасно видно, что после того, как главное окно получило WM_ACTIVATE, оно ставит фокус именно на себя, и уже в своем обработчике WM_SETFOCUS вызывает SetFocus на дочернее (что следует, хотя бы, из немедленного появления WM_KILLFOCUS). Т.е. сообщения обрабатываются каждое в своем месте. Кроме того, не стоит забывать, к каким грустным последствиям в VCL или MFC приводит попытка передать фокус несуществующему/невидимому/отключенному окну при отсутствии должной обработки исключений, почему неплохо всякий вызов SetFocus и подобных предварять группой из IsWindow, IsWindowVisible IsWindowEnabled и проверкой существования самого объекта (RichEdit1 в данном топике).
B_N вне форума Ответить с цитированием
Старый 03.03.2008, 14:56   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может оно и так да только попробуй в Делфи определи для формы обработчик WM_SETFOCUS и убедись что он не сработает. Поэтому если работа идет с VCL то тут WM_ACTIVATE (OnActivate) или WM_ACTIVEAPP что еще эффективнее т.е.:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, AppEvnts;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    procedure ApplicationEvents1Activate(Sender: TObject);
    procedure FormCreate(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }


procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin
Memo1.SetFocus
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnActivate:=ApplicationEvents1Activate;
end;

end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.03.2008, 15:32   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Может оно и так да только попробуй в Делфи определи для формы обработчик WM_SETFOCUS и убедись что он не сработает. Поэтому если работа идет с VCL то тут WM_ACTIVATE (OnActivate) или WM_ACTIVEAPP что еще эффективнее т.е.:
Почему не сработает? А куда же пойдет WM_SETFOCUS? Просто 0 вернется? А если прямо в оконной процедуре? Ну может быть это уже приколы Дельфи, в любом случае, куда-то же должен приходить WM_SETFOCUS, просто посланный главному окну "со-стороны".... И как не крути, делать это в RichEdit1Change как-то "неосторожно"...
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выравнивание текста, моргающий курсор alikon1 Общие вопросы Delphi 6 17.04.2009 00:41
Анимированый курсор Gromsky Мультимедиа в Delphi 9 04.11.2008 09:04
Курсор RealSHELS Общие вопросы Delphi 2 12.05.2008 12:51
курсор в мемо Чуча Помощь студентам 7 05.03.2008 15:44
курсор steck Общие вопросы Delphi 2 02.04.2007 22:45