![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объявление процедуры! [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'