Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Переменные


Автор: kdkdkdkd85 27.10.2007, 11:40
Подскажите, пожалуйста, в чём дело - ничего не могу понять  smile . Не присваиваются значения из Edit переменным. Ниже код:

Код

unit UnitMain;

interface

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

type
  TFormMain = class(TForm)
    LabelArea: TLabel;
    ImageArea: TImage;
    ShapeArea: TShape;
    Shape1: TShape;
    GroupBoxParameters: TGroupBox;
    ButtonBuild: TButton;
    Bevel1: TBevel;
    LabelAreaWidth: TLabel;
    LabelAreaHeight: TLabel;
    LabelStepSize: TLabel;
    EditAreaWidth: TEdit;
    EditAreaHeight: TEdit;
    EditStepSize: TEdit;
    procedure ButtonBuildClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

procedure TFormMain.ButtonBuildClick(Sender: TObject);
  var
    AreaWidth, AreaHeight, StepSize: Extended;
begin
    AreaWidth := StrToFloat(EditAreaWidth.Text);
    AreaHeight := StrToFloat(EditAreaHeight.Text);
    StepSize := StrToFloat(EditStepSize.Text);
end;

end.

Автор: VICTAR 27.10.2007, 12:43
kdkdkdkd85, не вижу никаких причин чтобы этот код не работал. Почему ты решил что у тебя что-то не присваивается? Как ты это проверяешь?

Автор: ivan219 27.10.2007, 12:58
kdkdkdkd85, переменные:
Код

 AreaWidth, AreaHeight, StepSize: Extended;

являются локальными и при выходе из процедуры разрушаются.
А так всё должно работать на ура smile 

Автор: mr.Anderson 27.10.2007, 13:00
Напиши
Код

procedure TFormMain.ButtonBuildClick(Sender: TObject);
  var
    AreaWidth, AreaHeight, StepSize: Extended;
begin
    AreaWidth := StrToFloat(EditAreaWidth.Text);
    AreaHeight := StrToFloat(EditAreaHeight.Text);
    StepSize := StrToFloat(EditStepSize.Text);

    showmessage( floattostr( areawidth ) );
    showmessage( floattostr( areaheight ) );
    showmessage( floattostr( stepsize ) );
end;

И посмотри, что будет.

Автор: kdkdkdkd85 27.10.2007, 13:14
Проверяю я, трейся пошагово код (F8). Когда алгоритм проходит строки присвоения то в переменные ничего не заностися. Объясняю в картинках (в архиве)...

Я уже пробовал перезапускать Delphi, переименовывать переменные и компоненты, присваивать втупую (тогда при нажатии F8 происходит перескок через эту строчку и, кстати, на неё нельзя поставить breakpoint (F5)), ну прям чудеса...

Автор: kdkdkdkd85 27.10.2007, 13:22
mr.Anderson,  решил последовать совету и чудеса: как только вставил в код строки про showmessage сразу всё заработало. А почему? Неужели это связано с тем что я ни разу не использовал эти переменные (var AreaWidth never used - пишет компилятор)?

Автор: mr.Anderson 27.10.2007, 13:26
kdkdkdkd85, эт не чудеса. smile

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

Если же сделать showmessage, да или вообще все что угодно, хоть
Код

areawidth := 0;

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

Автор: Still 27.10.2007, 13:53
kdkdkdkd85! ivan219 правильно говорит. Переменные локальные, попробуй сделать их глобальными. Примерно так: 

Код

var
  FormMain: TFormMain;
  AreaWidth, AreaHeight, StepSize: Extended;
implementation

{$R *.dfm}

procedure TFormMain.ButtonBuildClick(Sender: TObject);
begin
    AreaWidth := StrToFloat(EditAreaWidth.Text);
    AreaHeight := StrToFloat(EditAreaHeight.Text);
    StepSize := StrToFloat(EditStepSize.Text);
end;


Автор: mr.Anderson 27.10.2007, 14:04
Still, убил бы за использование глобальных переменных. Их необходимость очень часто довольно призрачна, поэтому лучше обходиться без этого.
Впрочем, я пояснил суть проблемы, почему переменным "не присваиваются" значения. А раз понятна причина - то дальнейшее использование и исправление проблемы полностью на совести автора. smile

Автор: kdkdkdkd85 27.10.2007, 17:41
Всем большое спасибо smile ! Тема, я думаю, закрыта.

Автор: EvilsInterrupt 27.10.2007, 17:57
mr.Anderson, а объекты форм тоже призрачно? ;) Просто глобальные желательно выносить в один модуль u_Global и внем все писать с указанием где каждая переменная используется, тогда все будет ок

Автор: mr.Anderson 27.10.2007, 18:39
EvilsInterrupt, про объекты я молчу, это действительно необходимое использование глобалок. А в данном случае очень вряд ли, что глобалки имеют смысл.

Автор: EvilsInterrupt 27.10.2007, 19:10
mr.Anderson, хорошо вот случай, я щас пишу прогу основанную на плагинах, написал TPluginManager ,  как его объект объявить?
Если использует окно Настроек(есть тута каждый плагин можно настроить, выгрузить\загрузить,обновить лист плагинов), работать с плагинами в модуле u_main , тута основная работа с плагинами, опрос все ли отработали плагины, может кто не верно в базу положил или еще что-нить, как мне замудрить если не глобально?

зы:
жаль что на форумах нельзя жать Ctrl+Enter

Автор: mr.Anderson 28.10.2007, 13:40
EvilsInterrupt, цитирую:
Цитата
в данном случае очень вряд ли, что глобалки имеют смысл

Автор: MetalFan 28.10.2007, 14:57
Цитата(EvilsInterrupt @  27.10.2007,  19:10 Найти цитируемый пост)
зы:
жаль что на форумах нельзя жать Ctrl+Enter

отослано с пом. Ctrl+Enter

Автор: EvilsInterrupt 28.10.2007, 15:18
Цитата

отослано с пом. Ctrl+Enter

и вправду

Автор: limon 30.10.2007, 11:53
А у меня другой вопрос. Можно ли в delphi так же как и в Си при объявлении переменной сразу же ей присваивать какое-нибудь значение?
Например в Си это делается так 
Код

int i = 1;

В delphi можно сделать так же но только с глобальной переменной
Код

var
  Text: String = 'Test';


А как быть с локальной переменной?

Автор: Alexeis 30.10.2007, 12:26
Код

{$J+}
const
  Text: String = 'Test';
{$J-}

Автор: bems 30.10.2007, 17:18
Alexeis, это еще и статическое, пэтому не эувивалент

Автор: Alexeis 30.10.2007, 20:21
Цитата(bems @  30.10.2007,  17:18 Найти цитируемый пост)
Alexeis, это еще и статическое, пэтому не эувивалент

  Да не. Это скорее переменные с начальным значением чем константы. Само слово const сбивает с толку, а так это нормальная переменная. 

Автор: mr.Anderson 30.10.2007, 20:38
Alexeis, угу, только если пишем в дельфине, не забыть в свойствах проекта поставить галочку "Assignable typed constants"... а не то будем получать не то ворнинг, не то ошибку (не помню точно).

Автор: Alexeis 30.10.2007, 21:19
mr.Anderson, {$J+} это тоже самое.

Автор: bems 30.10.2007, 21:27
Цитата(Alexeis @  30.10.2007,  20:21 Найти цитируемый пост)
Да не. Это скорее переменные с начальным значением чем константы
я не про то.
При следующем входе в область видимости у типизированной константы будет значение, как в момент прошлого выхода из этой области. А начальное значение присваивается только однажды - в самомначале (по моему вообще инициализация это не код, а часть образа в секции инициализированных переменных)

Добавлено через 9 минут и 24 секунды
я не силен в Си, но кажись эквивалент твоего кода это не
Код

int i = 1;

а
Код

static int i = 1;

Автор: Alexeis 30.10.2007, 21:51
bems, точно ты прав!

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