Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объявление процедуры! [D7, XP, 2003]


bobby ©   (2009-04-29 14:30:00) 

Вобщем задача такая: Необходимо на главной форме написать процедуру так, чтоб её можно было вызывать из других форм. Процедуру взял элементарную:

procedure ьып(x:string);
begin
ShowMessage(X);
end;

Вопрос: как объявить эту функцию чтоб её было видно из другой формы??

пробывал в разделе Type:
procedure msg(x: string);
Выдаёт ошибку что нехватает ещё чего-то:
[Error] Unit1.pas(13): Unsatisfied forward or external declaration: 'TForm1.SetValue'
В справочнике делфи я не нашел норм ответа :( И в литературе описаны только простейшие примеры процедур и функций для вызова из формы где сама процедура и размещена:( Помогите пожалуста!


Anatoly Podgoretsky   (2009-04-29 16:09:00) [1]

Запомните сыновья - так писать не надо.


Запомни Сынок   (2009-04-29 15:16:00) [2]

Procedure GetSector (AQuery : TQuery; H_id:integer);
begin
AQuery.Active:=False;


bobby   (2009-04-29 15:15:00) [3]

Запомни Сынок - по-друому не умею!


Ega23   (2009-04-29 15:14:00) [4]


> Нет, я имею ввиду вот это
>
> Procedure GetSector (H_id:integer);
> begin
> form1.QSector.Active:=False;
>


Да весь код на помойку надо выкинуть


bobby   (2009-04-29 15:14:00) [5]

12 - и тебе спасибище!


Запомни Сынок   (2009-04-29 15:12:00) [6]

Нет, я имею ввиду вот это

Procedure GetSector (H_id:integer);
begin
form1.QSector.Active:=False;


bobby   (2009-04-29 15:07:00) [7]

Ega23 - низкий поклон. Большое спасибо!


12   (2009-04-29 14:58:00) [8]

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
implementation
uses unit2; //!!!!!!!!
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not(msg('Ok')) then showmessage('Error');
end;

end.
------------------------------------
unit Unit2;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;
type
 TForm2 = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form2: TForm2;

 function msg(aStr:string):boolean;

implementation

 function msg(aStr:string):boolean;
 begin
   showmessage(astr);
   result:=GetLastError<>0;
 end;

{$R *.dfm}

end.


bobby   (2009-04-29 14:58:00) [9]

Запомни Сынок Еслои ты имеешь в виду использование функции с фозвратом значения вместо процедуры - то не катит. В программе нужно будит использовать это значение и без запросов в базу. Всё равно в глобальную переменную заносить!


Ega23   (2009-04-29 14:56:00) [10]


> Он итак там. Я написал за форму чтоб меньше описывать тут!


TMyDataModule = class (TDataModule)
.....
public
 ....
 procedure Msg(....);
end;

......

procedure TMyDataModule.Msg(....);
begin
 ......
end;


Вызов - DataModule.Msg(...)


Запомни Сынок   (2009-04-29 14:55:00) [11]

Дело в том что из этой процедуры будит происходить обращение к ADOQuery для редактирования запроса и его активации. Из отдельных модулей насколько я знаю не получиться обращаться к компонентам формы:(
Вобщем будит вот так примерно

Procedure GetSector (H_id:integer);
begin
form1.QSector.Active:=False;
form1.QSector.SQL.Strings[2]:="......................"
form1.QSector.Active:=True;
Sector:=form1.QSector.FieldValues['SectorID'];//Sector - это переменная с раздела паблик. Из неё потом все берут рез


Никогда больше так не делай.


bobby   (2009-04-29 14:53:00) [12]

Он итак там. Я написал за форму чтоб меньше описывать тут!!!


clickmaker   (2009-04-29 14:50:00) [13]

перенеси процедуру вместе с adoquery в DataModule
заодно и места на форме больше будет )
вообще, хорошая практика - выносить работу с данными в отдельные модули или классы. Чтобы не смешивать юзер интерфасе и бизнес-логику


Anatoly Podgoretsky   (2009-04-29 14:49:00) [14]

> bobby  (29.04.2009 14:33:01)  [1]

Похоже ты создал метод, вместо процедуры.


bobby   (2009-04-29 14:46:00) [15]

Дело в том что из этой процедуры будит происходить обращение к ADOQuery для редактирования запроса и его активации. Из отдельных модулей насколько я знаю не получиться обращаться к компонентам формы:(
Вобщем будит вот так примерно

Procedure GetSector (H_id:integer);
begin
form1.QSector.Active:=False;
form1.QSector.SQL.Strings[2]:="......................"
form1.QSector.Active:=True;
Sector:=form1.QSector.FieldValues['SectorID'];//Sector - это переменная с раздела паблик. Из неё потом все берут результат запроса!
end;


Ну это так чтобы поняли почему именно процедура будит расположена на форме


clickmaker   (2009-04-29 14:37:00) [16]

uses

если это не метод формы, то лучше вынести в отдельный юнит (как и другие совместно используемые процедуры), дабы не засорять код


bobby   (2009-04-29 14:33:00) [17]

Осправлю описание ошибки:
[Error] Unit1.pas(13): Unsatisfied forward or external declaration: 'TForm1.msg'


Наверх

Титульная страница Поиск, карта сайта Написать письмо