Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 19
1

Обращение к компонентам формы

27.04.2013, 19:16. Показов 3280. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер, господа форумчане .

Суть проблемы кратко : Задача состоит в том , что бы написать дллку , которая вызывает немодальное окно в котором будет отображаться результат какой-либо операции ( в моем случае это норма вектора ).
Возник вопрос , как из процедур не относящихся к форме обратится к компонентам формы ?

Мой код :
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
unit DLLForm;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    lbl1: TLabel;
    lbl2: TLabel;
    procedure FormDestroy(Sender: TObject);
  private
  public
  end;
 
function ShowWindow(AHandle:THandle;ACaption:String):LongInt;stdcall;
procedure Vector(a:array of Integer; n:Integer);stdcall;
 
 
implementation
 
{$R *.dfm}
 
function ShowWindow(AHandle:THandle;ACaption:String):LongInt;
var Form1:TForm;
  begin
   Application.Handle:=AHandle;
   Form1:=TForm.Create(Application);
   Result:=LongInt(TForm1);
   Form1.Caption:=ACaption;
   Form1.Show;
  end;
 
procedure Vector(a:array of Integer;n:integer);
var s,i:Integer;
    lbl2: TLabel;
  begin
     s:=0;
     for i:=1 to n do
      s:=s+a[i];
  end;
 
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
 Free;
 Close;
end;
 
end.
При попытке прямого обращения ( допустим к компоненте label ) :
Delphi
1
2
3
4
5
6
7
8
9
procedure Vector(a:array of Integer;n:integer);
var s,i:Integer;
    lbl2: TLabel;
  begin
     s:=0;
     for i:=1 to n do
      s:=s+a[i];
      lbl2.Caption:=IntToStr(s);
  end;
Выбивает :
[Warning] DLLForm.pas(43): Variable 'lbl2' might not have been initialized

Господа , как же обратиться к label'у ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2013, 19:16
Ответы с готовыми решениями:

Обращение ко всем компонентам DBGrid
Доброго времени суток ! Столкнулся со следующей проблемой. На форме "FormKarta" расположено 9...

Обращение к однотипным компонентам в цикле
Пытаюсь всё красиво автоматизировать и сделать так что бы ComboBox*.ItemIndex (*= от 6 до 11)...

Обращение к динамически созданным компонентам
Доброго времени суток! Я новичок и только постигаю азы, прошу не ругаться. В данной процедуре я...

Доступ к компонентам главной формы из дочерней
Всем здравствуйте, есть на делфи 2 формы: главная и дочерняя. Скажите пожалуйста, как находясь в...

7
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
27.04.2013, 19:21 2
Delphi
1
var Form1:TForm;
делай глобальной для всей dll, обращайся так:
Delphi
1
Form1.lbl1.Caption:=IntToStr(s);
еще лучше перед обращением проверить, существует ли Form1, т.е.
Delphi
1
 if Assigned(Form1) then....
1
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 19
27.04.2013, 19:23  [ТС] 3
Цитата Сообщение от cotseec Посмотреть сообщение
Delphi
1
var Form1:TForm;
делай глобальной для всей dll, обращайся так:
Delphi
1
Form1.lbl1.Caption:=IntToStr(s);
еще лучше перед обращением проверить, существует ли Form1, т.е.
Delphi
1
 if Assigned(Form1) then....
При
Delphi
1
  Form1.lbl2.caption:=IntToStr(s);
Выбивает [Error] DLLForm.pas(43): Undeclared identifier: 'Form1'
Такая попытка уже была.
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
27.04.2013, 19:31 4
судя по этому
Цитата Сообщение от hppnd Посмотреть сообщение
Undeclared identifier: 'Form1'
это даже не читал
Цитата Сообщение от cotseec Посмотреть сообщение
делай глобальной для всей dll
Добавлено через 1 минуту
соответственно локальное объявление формы и лейбла необходимо убрать
1
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 19
27.04.2013, 19:35  [ТС] 5
cotseec, похоже я Вас не правильно понимаю
попробую разобраться
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
27.04.2013, 19:52 6
то ли лыжи не едут, то ли я... попробовал в Delphi - не получается......

Как вызвать форму из DLL

Добавлено через 5 минут
все нормально, была в коде ошибка синтаксиса, вот код
Кликните здесь для просмотра всего текста
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
unit DLLForm;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    lbl1: TLabel;
    lbl2: TLabel;
    procedure FormDestroy(Sender: TObject);
  private
  public
  end;
 
var Form1:TForm1;
 
function ShowWindow(AHandle:THandle;ACaption:String):LongInt;stdcall;
procedure Vector(a:array of Integer; n:Integer);stdcall;
 
 
implementation
 
{$R *.dfm}
 
function ShowWindow(AHandle:THandle;ACaption:String):LongInt;
 
  begin
   Application.Handle:=AHandle;
   Form1:=TForm1.Create(Application);
   Result:=LongInt(TForm1);
   Form1.Caption:=ACaption;
   Form1.Show;
  end;
 
procedure Vector(a:array of Integer;n:integer);
var s,i:Integer;
  begin
     s:=0;
     for i:=1 to n do
      s:=s+a[i];
     Form1.lbl1.Caption:=IntToStr(s);
  end;
 
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
 Free;
 Close;
end;
 
end.
вот тут
Delphi
1
2
Application.Handle:=AHandle;
   Form1:=TForm.Create(Application);
необходимо создавать потомка TForm1, а не TForm
1
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 19
27.04.2013, 20:35  [ТС] 7
cotseec, Спасибо , исправил.
Он вроде-бы не ругается на
Цитата Сообщение от hppnd Посмотреть сообщение
Form1.lbl2.caption:=IntToStr(s);
Но при запуске программы выдает

В чем может быть проблема , учитывая что если закомментить
Цитата Сообщение от hppnd Посмотреть сообщение
Form1.lbl2.caption:=IntToStr(s);
то все работает нормально (результат конечно-же не выдает)
Миниатюры
Обращение к компонентам формы  
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
27.04.2013, 21:02 8
Цитата Сообщение от hppnd Посмотреть сообщение
В чем может быть проблема , учитывая что если закомментить
форма уже создана перед обращением к процедуре Vector?
если точку останова на строку
Delphi
1
Form1.lbl2.caption:=IntToStr(s);
, какое значение дает Form1?
думаю будет проще, если посмотреть весь проект
0
27.04.2013, 21:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2013, 21:02
Помогаю со студенческими работами здесь

Доступ к компонентам формы из глобальной процедуры
Еще про процедуры?! Я создал свою процедуру procedure MNK (i,k:integer); прописываю в ней...

Загвоздка с созданной вручную процедурой ShowTime для доступа к компонентам формы напрямую
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,...

Обращение к полям дополнительной формы
Попробую сформулировать запрос понятно. Есть 3 юнита 1 - юнит главной формы приложения 2 - юнит...

Обращение к переменной другой формы
Как мне обратиться к переменной другой формы, не записвая ее ни в какой из компонентов. Типа...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru