Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.09.2012, 13:10
Pavel_Aleksandrovich Pavel_Aleksandrovich вне форума
Прохожий
 
Регистрация: 02.09.2012
Сообщения: 31
Репутация: 9
По умолчанию Фокусировка на пустых Edit'ах

Написал инструкцию типа
Код:
begin
     if key=#13
       then
           begin
                if length(edit1.text)=0
                    then edit1.setfocus
                    else
                        begin
                             if length(edit2.text)=0
                               then edit2.setfocus
                               else
                                   begin
                                        if length(edit3.text)=0
                                          then edit3.setfocus
                                          else button2.setfocus;
                                   end;
                        end;
она не рациональна
что хочу сделать:
1) засунуть данную инструкцию в модуль
2) расписать ее более красиво


что получилось

модуль:
Код:
 procedure setfocus_edits_button(edits_on_form:array of tedit; button_on_form:tbutton);
                       var
                          i:integer;
                          status:bolean;

                       begin
                            status:=true;

                            for i:=1 to hight(edits_on_form) do
                               begin
                                    if length(edits_on_form[i].text)=0
                                      then
                                          begin
                                               edits_on_form[i].setfocus;
                                               status:=false;
                                               continue
                                          end
                                      else status:=true;
                               end;

                            if status=true
                              then button_on_form.setfocus;

                       end;
использование модуля в форме:
Код:
begin
     if key=#13
       then setfocus_edits_button([edit1,edit2,edit3],button1);
end;
Bargest: правила форума предписывают оформлять код тегами!

в итоге ошибки:
в модуле компилятор не понимает Tedit и tbutton

подскажите где ошибки, может можно как то более рационально прописать инструкции:
что должно получиться
1) инструкция должна быть прописана в модуле
2) она должна проверять пустые edit'ы и на них фокусироваться пока е заполнит оператор, в случае если они заполнены фокусируется на след объекте - кнопка например

спасибо))

Последний раз редактировалось Bargest, 02.09.2012 в 13:39.
Ответить с цитированием
  #2  
Старый 02.09.2012, 13:49
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Код:
unit emptyFoc;

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


procedure focusEdit(component:TComponent);

implementation

  procedure focusEdit(component:TComponent);
  var i:Integer;
  begin
    for i:=0 to component.ComponentCount-1 do begin
      if component.Components[i].ClassType=TEdit then begin
         if Length((component.Components[i] as TEdit).Text)=0 then begin
             (component.Components[i] as TEdit).SetFocus;
             exit;
         end;
      end;
    end;

  end;
end.
Но если хочешь, чтобы процедура ждала, пока пустой Edit не заполнится, желательно это делать в отдельном потоке. Можно, конечно, использовать
Код:
Application.ProcessMessages
, но все-равно будет занимать много процессорного времени.
Ответить с цитированием
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение:
Pavel_Aleksandrovich (03.09.2012)
  #3  
Старый 02.09.2012, 16:23
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,503
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от YVitaliy
Но если хочешь, чтобы процедура ждала, пока пустой Edit не заполнится, желательно это делать в отдельном потоке. Можно, конечно, использовать
Код:
Application.ProcessMessages
, но все-равно будет занимать много процессорного времени.

Application.HandleMessages.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Pavel_Aleksandrovich (03.09.2012)
  #4  
Старый 02.09.2012, 19:40
Pavel_Aleksandrovich Pavel_Aleksandrovich вне форума
Прохожий
 
Регистрация: 02.09.2012
Сообщения: 31
Репутация: 9
По умолчанию

Цитата:
Сообщение от YVitaliy
Код:
unit emptyFoc;

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


procedure focusEdit(component:TComponent);

implementation

  procedure focusEdit(component:TComponent);
  var i:Integer;
  begin
    for i:=0 to component.ComponentCount-1 do begin
      if component.Components[i].ClassType=TEdit then begin
         if Length((component.Components[i] as TEdit).Text)=0 then begin
             (component.Components[i] as TEdit).SetFocus;
             exit;
         end;
      end;
    end;

  end;
end.
Но если хочешь, чтобы процедура ждала, пока пустой Edit не заполнится, желательно это делать в отдельном потоке. Можно, конечно, использовать
Код:
Application.ProcessMessages
, но все-равно будет занимать много процессорного времени.

а тип tcomponent зарезервирован в delphi? или его надо объявлять?
Ответить с цитированием
  #5  
Старый 02.09.2012, 19:50
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Pavel_Aleksandrovich
а тип tcomponent зарезервирован в delphi? или его надо объявлять?
а ты встань на него и нажми F1
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Pavel_Aleksandrovich (03.09.2012)
  #6  
Старый 02.09.2012, 19:55
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Лучше сделать так:
Код:
function focusEdit(component:TComponent):boolean;
  var i:Integer;
  begin
    for i:=0 to component.ComponentCount-1 do begin
      if component.Components[i].ClassType=TEdit then begin
         if Length((component.Components[i] as TEdit).Text)=0 then begin
             (component.Components[i] as TEdit).SetFocus;
             result:=true;
             exit;
         end;
      end;
    end;

    for i:=0 to component.ComponentCount-1 do
      if focusEdit(component.Components[i]) then begin
       result:=true;
       exit;
      end;
   result:=false;
  end;

так будет искать по всех контролах на форме (панелях и тп).
Лучше сделать так: Выбрать все TEdit (с помощью клавиши SHIFT), и задать им один обработчик OnKeyDown на всех:
Код:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=vk_Return then  focusEdit(Form1);
end;
Ответить с цитированием
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение:
Pavel_Aleksandrovich (03.09.2012)
  #7  
Старый 03.09.2012, 22:27
Pavel_Aleksandrovich Pavel_Aleksandrovich вне форума
Прохожий
 
Регистрация: 02.09.2012
Сообщения: 31
Репутация: 9
По умолчанию Подскажите где ошибка?

Код:
procedure Form4.FormCreate(Sender: TObject);
begin
     label1.Caption:='Исходные данные:'+#13+'Университет:'+#32+
     Unit1.Form1.RadioButton1.Caption+#13+'Фамилия:'+#32+
     Unit2.Form2.Edit1.Text+#13+'имя:'+#32+Unit2.Form2.Edit2.Text+
     #13+'отчество:'+#32+Unit2.Form2.Edit3.Text;
end;


Почему то Label не отобажает ни один Edit.Text
может быть причина в том что я ни в одной форме не определяю переменные, и не присваиваю им значения edit.text


Подскажите в чем нюанс?

Последний раз редактировалось Pavel_Aleksandrovich, 03.09.2012 в 22:32.
Ответить с цитированием
  #8  
Старый 03.09.2012, 22:35
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Попробуй перенести из OnCreate в OnShow. При создании данной формы, остальные могли не успеть проинициализироваться.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Pavel_Aleksandrovich (04.09.2012)
  #9  
Старый 04.09.2012, 00:08
Pavel_Aleksandrovich Pavel_Aleksandrovich вне форума
Прохожий
 
Регистрация: 02.09.2012
Сообщения: 31
Репутация: 9
По умолчанию

Цитата:
Сообщение от angvelem
Попробуй перенести из OnCreate в OnShow. При создании данной формы, остальные могли не успеть проинициализироваться.

точно сработало
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram