Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Aleshka01
0 / 0 / 0
Регистрация: 18.11.2015
Сообщений: 6
1

Вызов процедуры OnClick из модуля без формы

18.11.2015, 21:00. Просмотров 861. Ответов 12
Метки нет (Все метки)

Сабж. На форме много компонентов, а форма одна, хочу разделить работу с компонентами по полочкам.
Можно же, чтобы из Form1 как-то вызвать событие из Unit2 (голый юнит без формы)?

Предложенные Варианты по типу:
Создать процедуру на Form1 и вызвать процедуру из unit2 - не подходит.

грубо говоря, хочу чтобы некоторым компонентам можно было использовать обработчик событий сразу из Unit2.


Надеюсь, что понятно объяснил.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2015, 21:00
Ответы с готовыми решениями:

Вызов процедуры из другого модуля
Доброго времени суток! Имеется форма с компонентами Stringgrid, Memo, Checkbox...

Вызов процедуры из другого модуля
Подскажите, что я сделал не так, хочу вынести подпрограммы в отдельный модуль,...

вызов процедуры из другого модуля
Помогите пожалуйста, нужно вызвать свою процедуру из другого модуля, что надо...

Вызов процедуры-члена объекта из другого модуля
Следующий код вызывает ошибку "Access (ошибка доступа к памяти)": Модуль...

Вызов процедуры из другой формы
Всех приветствую! На одной форме у меня описана процедура Color_click; в ней...

12
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
18.11.2015, 21:51 2
Лучший ответ Сообщение было отмечено Aleshka01 как решение

Решение

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
unit2:
 
TMyClass = class
public
  procedure ClickHandler(Sender: TObject);
end;
 
..
procedure TMyClass.ClickHandler(Sender: TObject);
begin
..blabla..
end;
 
FormUnit:
uses Unit2;
..
MyObject := TMyClass.Create;
ComponentOnMyForm.OnClick := MyObject.ClickHandler;
1
Aleshka01
0 / 0 / 0
Регистрация: 18.11.2015
Сообщений: 6
18.11.2015, 22:09  [ТС] 3
Благодарю, всё работает.
Кстати, класс же можно не создавать при открытии формы? Тогда сразу при её открытии назначать параметры?
Delphi
1
sCheckBox3.OnClick := MyObject.ClickHandler; // - сразу так пишем, всё работает
Правда я хотел немного другого, но думаю, так тоже нормально, видимо других выходов нет, спасибо)

Добавлено через 7 минут
И ещё вопрос небольшой: а можно этот процесс автоматизировать, чтобы не писать самостоятельно процедуры, а просто заходить во вкладку Events и переходить к событию, которое описано в Unit2?
0
northener
пофигист широкого профиля
3423 / 2323 / 630
Регистрация: 15.07.2013
Сообщений: 13,748
19.11.2015, 00:40 4
Цитата Сообщение от Aleshka01 Посмотреть сообщение
И ещё вопрос небольшой: а можно этот процесс автоматизировать, чтобы не писать самостоятельно процедуры, а просто заходить во вкладку Events и переходить к событию, которое описано в Unit2?
Можно. Но это гораздо сложнее.
1
Aleshka01
0 / 0 / 0
Регистрация: 18.11.2015
Сообщений: 6
19.11.2015, 00:41  [ТС] 5
Цитата Сообщение от northener Посмотреть сообщение
Можно. Но это гораздо сложнее.
Уже интереснее, а можно поинтересоваться - как?
0
northener
пофигист широкого профиля
3423 / 2323 / 630
Регистрация: 15.07.2013
Сообщений: 13,748
19.11.2015, 00:55 6
Регистрировать свой класс. Дабы он был доступен в дизайн-тайме. Регистрировать для него нестандартные редакторы свойств, если таковые нужны. Т.е. это тема "Создание компонент в Дельфи". Суперсложного в ней ничего нет, но её основы нужно знать. Если нужно.
1
Aleshka01
0 / 0 / 0
Регистрация: 18.11.2015
Сообщений: 6
19.11.2015, 00:56  [ТС] 7
Такс, хорошо, а есть примеры какие-нибудь, либо сей материал, который могу прочесть?
0
northener
пофигист широкого профиля
3423 / 2323 / 630
Регистрация: 15.07.2013
Сообщений: 13,748
19.11.2015, 01:09 8
Цитата Сообщение от Aleshka01 Посмотреть сообщение
Такс, хорошо, а есть примеры какие-нибудь, либо сей материал, который могу прочесть?
Примеры чего? "Создания компонент"? Вся VCL есть ни что иное, как создание компонент, а она у вас под руками. Ну а книжки. Либо читай книжку Рея Конопки "Создание оригинальных компонент в среде Delphi", либо книжку наших Мастеров http://www.delphimaster.ru/books/1656145/.
В данном случае примеры на форуме не годятся. Ты не поймешь, а мы обломимся объяснять.
0
n1056
0 / 0 / 1
Регистрация: 17.04.2016
Сообщений: 56
28.03.2017, 22:57 9
Коллеги, добрый день.
Есть форма с таблицей TStringGrid. Нужно, что бы по нажатию Ins вызывалась процедура добавления новых строк, а по нажатию Del вызывалась процедуру удаления строк.
Не понимаю, но почему-то по нажатию данных клавиш процедуры не вызываются. Полагаю, что проблема именно в синтаксисе вызова процедур TForm1.Button1Click и Form1.ButClearRowClick. Попробовал разные варианты, но положительного результата не добился. В чем ошибка?
Ниже синтаксис ключевых процедур. В конце обработка нажатия клавиш Ins (45) и Del (46):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
procedure TForm1.ButClearRowClick(Sender: TObject);
var
  I : Integer;
  Z : byte;
begin
    Z:=0;
    for I := 1 to FGrid.RowCount-1 do
    begin
      If ChIn[I]=1 then
      begin
          ChIn[I]:=0;
          DeleteARow(FGrid, I);
          Z :=1;
      end;
    end;
    ChIn[0]:= 0;
    SetLength(ChIn,FGrid.RowCount);
    if Z=1 then
    begin
      If (High(ChIn)>0) then FGrid.Row := 1
      else FGrid.Row := 0;
      FGrid.Repaint;
    end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  openDialog : TOpenDialog;    // Open dialog variable
  i, z: Integer;
  c : byte;
  sz64 : Int64;
  Fname : String;
begin
   //form2 := TForm2.Create(Application);
   //form2.showmodal;
    openDialog := TOpenDialog.Create(self);
    openDialog.InitialDir := GetCurrentDir;
    openDialog.Options := [ofAllowMultiSelect];
    if not openDialog.Execute
    then ShowMessage('Open file was cancelled')
    else
    begin
      For I := 0 to openDialog.Files.Count-1 do
      Begin
         c := 0;
         if FGrid.RowCount=1 then
         Begin
            FGrid.RowCount := FGrid.RowCount+1;
            FGrid.FixedRows := 1;
            SetLength(ChIn,FGrid.RowCount);
            ChIn[FGrid.RowCount-1]:=0;
            FGrid.Cells[1,FGrid.RowCount-1] := openDialog.Files[i];
            FName := openDialog.Files[i];
            GetBFileSize(FName, sz64);
            FGrid.Cells[2,FGrid.RowCount-1] := IntToStr(sz64 div 1024);
            FGrid.Cells[3,FGrid.RowCount-1] := DateToStr(FileDateToDateTime(FileAge(FName)));
         End
         else
         Begin
            For Z := 1 to FGrid.RowCount-1 do
            Begin
              if openDialog.Files[i]=FGrid.Cells[1,Z] then c := 1;
            End;
            if c = 0 then
            Begin
                FGrid.RowCount := FGrid.RowCount+1;
                FGrid.FixedRows := 1;
                SetLength(ChIn,FGrid.RowCount);
                ChIn[FGrid.RowCount-1]:=0;
                FGrid.Cells[1,FGrid.RowCount-1] := openDialog.Files[i];
                FName := openDialog.Files[i];
                GetBFileSize(FName, sz64);
                FGrid.Cells[2,FGrid.RowCount-1] := IntToStr(sz64 div 1024);
                FGrid.Cells[3,FGrid.RowCount-1] := DateToStr(FileDateToDateTime(FileAge(FName)));
            End;
         End;
      End;
    end;
    openDialog.Free;
end;
 
procedure TForm1.FGridKeyPress(Sender: TObject; var Key: Char);
var
  Z, I : Integer;
begin
   if (key=#32) then
   Begin
      Z := FGrid.Selection.Bottom - FGrid.Selection.Top + 1;
      for I := 1 to Z do
      begin
          if ChIn[FGrid.Selection.Top+I-1] = 1 then
          begin
            ChIn[FGrid.Selection.Top+I-1] := 0;
            ChIn[0] :=0;
          end
          else ChIn[FGrid.Selection.Top+I-1] := 1;
      end;
      if (FGrid.Selection.Bottom +1) > (FGrid.RowCount -1) then  FGrid.Row := 1
      else FGrid.Row := FGrid.Selection.Bottom +1;
      FGrid.Repaint;
   End;
   if (key=#45) then Button1.Click;
   if (key=#46) then Form1.ButClearRowClick(FGrid);
end;
0
northener
пофигист широкого профиля
3423 / 2323 / 630
Регистрация: 15.07.2013
Сообщений: 13,748
29.03.2017, 02:07 10
Если я правильно понимаю приведенный код, то процедура FGridKeyPress привязана к обработчику события FGrid.OnKeyPress.
А вы нажимаете эти клавишы когда у вас фокус на гриде?
И какая у вас версия Дельфи?
0
n1056
0 / 0 / 1
Регистрация: 17.04.2016
Сообщений: 56
29.03.2017, 19:01 11
Цитата Сообщение от northener Посмотреть сообщение
А вы нажимаете эти клавишы когда у вас фокус на гриде?
Да, фокус на гриде. Само событие FGrid.OnKeyPress срабатывает. Так в полном объеме обрабатывается нажатие пробела. Я думаю, что и нажатие Ins и Del принимается, просто нет перехода в соответствующую процедуру.

Версия Делфи Embarcadero® Delphi 10 Seattle Version 23.0.21418.4207

Добавлено через 8 часов 52 минуты
Для эксперимента попробовал разделить элементы интерфейса формы и код вычислений. А именно, вынес все содержимое процедуры TForm1.Button1Click (весь openDialog и всю логику заполнения грида) в отдельную процедуру TForm1.AddFiles и при необходимости добавить файлы в список, обращаюсь к ней на прямую вызовом AddFiles.
При нажатии на Button1, все продолжает работать как и было до разделения.
При вызове через нажатие Ins (if (key=#45) then AddFiles ), без изменений не работает.
0
Пытливый
1380 / 691 / 249
Регистрация: 29.05.2013
Сообщений: 3,116
29.03.2017, 19:53 12
Дело в том, что Del и Ins относятся к так называемой расширенной клавиатуре и имеют по сути 2 кода и в рамках события OnKeyPress их обработать не выйдет - используйте событие OnKeyDown.
1
n1056
0 / 0 / 1
Регистрация: 17.04.2016
Сообщений: 56
29.03.2017, 23:09 13
Пытливый,
Решено. Спасибо.
0
29.03.2017, 23:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2017, 23:09

Вызов процедуры с другой формы
Было 3 лабы, нужно их объединить с помощью MainMenu в один проект. Сделала все,...

Вызов собственной процедуры с другой формы
Есть несколько форм, на 1-й процедура виду: procedure adddd; Begin ...

Вызов процедуры из другой процедуры с параметрами
Не подскажете как вызвать процедуру StringGrid1KeyUp procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru