Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Глобализазия переменных


Автор: Гость_Виктор 24.3.2005, 22:01
Здраствуйте Вот тренирусь потихоньку- Хочу чтобы Memo1 было доступно и в основном теле программы а как это сделать? В чем ошибка?


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Visible:=true;
end;
begin
If Memo1.Visible:=true then ShowMessage('Âñå îê');

end.

Автор: s-mike 24.3.2005, 22:16
Так не выйдет, потому что к моменту вызова основного блока форма и все компоненты на ней еще не созданы.

Автор: Poseidon 25.3.2005, 00:11
Ошибка № 1
оператор ":=" - означает присваивание. Для сравнения нужно использовать "="

А теперь об основном:
Цитата
Хочу чтобы Memo1 было доступно и в основном теле программы
Это вообще для чего? Может можно по другому, но так сложно?

PS. Что бы не было ошибки (в данном примере) undeclired Memo1 пиши не
Код
If Memo1.Visible
а
Код
If Form1.Memo1.Visible


Автор: Blindman 25.3.2005, 00:17
Так как ты написал точно не заработает. Вот корректный пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Visible:=true;
If Memo1.Visible=true then ShowMessage('Ok');
end;


А можно и так: If Memo1.Visible then ShowMessage('Ok');

Автор: Poseidon 25.3.2005, 00:27
Blindman требуется
Цитата
Глобализазия
т.е. что бы было доступно не только в Button1Click. Только вот сделано не правильно. Я бы сделал так (если я правилоно понял суть задачи):
Код
procedure Myprocedure; // создаем наше событие в отдельной процедуре
begin
If Form1.Memo1.Visible then ShowMessage('что-то там');
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Visible:=true;
Myprocedure; // вызываем нашу процедуру с нужным событием
end;


Причем вызывать процедуру Myprocedure можно из любой процедуры или функции модуля.

Автор: Coder 25.3.2005, 12:40
Цитата(Poseidon @ 25.3.2005, 00:27)
Код
procedure Myprocedure; // создаем наше событие в отдельной процедуре
begin
If Form1.Memo1.Visible then ShowMessage('что-то там');
end;

а не проще эту процедуру прописать в разделе public, дабы каждый раз не упоминать о Form1? да и с такой процедурой меньше будет проблем при вызове ее из других модулей.
Гость_Виктор, зачем тебе Memo1 в основном теле программы? Он же (Мемо) объявлен в классе Form1 и будет доступен из любой процедуры этой форму для любых действий и проверок...

Автор: Poseidon 25.3.2005, 18:24
Цитата
а не проще эту процедуру прописать в разделе public, дабы каждый раз не упоминать о Form1?
Конечно проще. Но у человека ошибка
Цитата
undeclired Memo1
и нужно ему указать способ избовится от нее. И это, по-моему, самый простой способ, даже когда мы используем его не в модуле формы Form1. Причем, если человек только
Цитата
тренирусь потихоньку
то ему легче будет понять именно это. А потом, со временем, он освоит и раздел public.


2Гость_Виктор
Укажи что именно ты хочешь от своей программы, а мы поможем тебе, как это сделать.
Добавлено @ 18:28
Цитата
а не проще эту процедуру прописать в разделе public, дабы каждый раз не упоминать о Form1?
Конечно проще. Но у человека ошибка
Цитата
undeclired Memo1
и нужно ему указать способ избовится от нее. И это, по-моему, самый простой способ, даже когда мы используем его не в модуле формы Form1. Причем, если человек только
Цитата
тренирусь потихоньку
то ему легче будет понять именно это. А потом, со временем, он освоит и раздел public.


2Гость_Виктор
Укажи что именно ты хочешь от своей программы, а мы поможем тебе, как это сделать.

Автор: Гость_Viktor 26.3.2005, 01:09
Срастбо за ответы а теперь подробнее можно как именно ее в раздели паблик описать- чтбы была доступнее всем.

Poisodon понял что я хочу

Автор: Blindman 26.3.2005, 01:33
Просто вставляешь в этот раздел её описание. Например:

unit Unit1;
........................
private
{ Private declarations }
public
{ Public declarations }
Procedure MyProcedure;
end;

.........................

procedure Myprocedure; // создаем наше событие в отдельной процедуре
begin
If Form1.Memo1.Visible then ShowMessage('что-то там');
end;

end.

Всё, процедуру можно вызавать в любом месте программы.

Автор: Poseidon 26.3.2005, 01:35
Код
type
  TForm1 = class(TForm)

  private
    
  public
    procedure MyProcedure; // во тута объявляем;

  end;
...

procedure TForm1.MyProcedure; // вот так вот пишим.
begin
...
end;


Blindman, опередил! Только вот не
Код
procedure Myprocedure; // создаем наше событие в отдельной процедуре
а
Код
procedure TForm1.Myprocedure; // создаем наше событие в отдельной процедуре
а так все правильно!

Автор: Blindman 26.3.2005, 01:45
Цитата(Poseidon @ 26.3.2005, 01:35)
Blindman, опередил! Только вот не
Код
procedure Myprocedure; // создаем наше событие в отдельной процедуре
а
Код
procedure TForm1.Myprocedure; // создаем наше событие в отдельной процедуре
а так все правильно!

Разве в том же самом модуле, где объявлена процедура, так необходимо дописывать предка?

Автор: Poseidon 26.3.2005, 02:09
Цитата
Разве в том же самом модуле, где объявлена процедура, так необходимо дописывать предка?
Да, иначе ошибка
Цитата
Unsatisfied forward or external declaration: '<element>'

Автор: Blindman 26.3.2005, 02:16
Учту на будущее. Спасибо.

Автор: Гость_Viktor 26.3.2005, 21:11
unit Unit1;

interface

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

type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;

procedure N3Click(Sender: TObject);


private
{ Private declarations }
public
procedure Val;
{ Public declarations }
end;




var
Form1: TForm1;

implementation

procedure TForm1.val;

begin
Form1.Richedit1.Clear;
Form1.RichEdit1.Lines.LoadFromFile('c:\65');
Form1.RichEdit1.Font.Size:=13;
Form1.RichEdit1.Font.Name:='Lucida Console'
end;
{$R *.dfm}



procedure TForm1.N3Click(Sender: TObject);
begin
Showmessage('Ïîêà!');
Close;
end;

begin
Val;

end.

Автор: Гость_Viktor 26.3.2005, 21:14
expected ( but found; ошибка!!!

Автор: Blindman 26.3.2005, 23:26
Так ты всунь вызов процедуры Val в другой процедуре и все будет пучком, например

Код

procedure TForm1.N3Click(Sender: TObject);
begin
Showmessage('Ïîêà!');
Val;
end;


Если я не ошибаюсь, то ты перешел на Дельфи с Паскаля? Тут немного все по другому.


Автор: Poseidon 27.3.2005, 01:50
Цитата
Если я не ошибаюсь, то ты перешел на Дельфи с Паскаля? Тут немного все по другому.
Это точно. В Delphi все построено на событиях (OnClick, OnCreate), каторые записываются в процедуры. Поэтому не следует писать что-либо вне процедуры или функции. Вызавай Val; в процедуре, как Blindman

PS. И еще. Если ты указываешь предка в имени процедуры, то можно не указывать его в именах компонентов, т.е. не
Код
procedure TForm1.val;
begin
Form1.Richedit1.Clear;
Form1.RichEdit1.Lines.LoadFromFile('c:\65');
Form1.RichEdit1.Font.Size:=13;
Form1.RichEdit1.Font.Name:='Lucida Console'
end;


а
Код
procedure TForm1.val;
begin
Richedit1.Clear;
RichEdit1.Lines.LoadFromFile('c:\65');
RichEdit1.Font.Size:=13;
RichEdit1.Font.Name:='Lucida Console'
end;


Хотя это не ошибка.

Автор: p0s0l 27.3.2005, 11:20
Люди, вам уже в самом начале s-mike сказал причину...
Так как сделано - делать нельзя!
Блок begin ... end. - называется блоком инициализации модуля (обычно пишут initialization ... end.), во время этой инициализации еще никаких форм и мемов нет! Их нельзя использовать... Еще даже не все модули проинициализировались...

Засунь вызов Val в событие OnCreate...

Добавлено @ 11:22
Цитата
expected ( but found; ошибка!!!
Эта ошибка пишется потому что есть стандартная функция Val... А у тебя не указывается, что нужно вызвать метод Val у Form1... Да и если бы ты указал, то откомпилировалось бы, но ошибка была бы при запуске, т.к. Form1 еще не создана...


Автор: Poseidon 27.3.2005, 17:36
Цитата(p0s0l @ 27.3.2005, 11:20)
Засунь вызов Val в событие OnCreate...
О чем и говорилось:
Цитата(Poseidon @ 27.3.2005, 01:50)
В Delphi все построено на событиях (OnClick, OnCreate), каторые записываются в процедуры. Поэтому не следует писать что-либо вне процедуры или функции. Вызавай Val; в процедуре, как Blindman


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)