Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2012, 12:19   #1
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию Доступ к переменным

Программа состоит из нескольких форм и отдельных модулей. Кампиляция никаких ошибок не выдаёт, но при выполнении, не всегда и не на всех компьютерах, возникает ошибка при обращении к глобальным переменным в соседних модулях. Ошибка неявная, программа продолжает выполнение, ОС не выдаёт никаких сообщений, но чтение значения переменной возвращает 0. Не всегда и явной закономерности я не заметил. Скажем, возвращается пустая строка, где должен быть прописан путь к файлу, строка с каким-либо текстовым значением и есть подозрение, что не только строковые переменные. Даже под отладчиком.
Причём зависит от конкретной реализации ОС. По крайней мере, такое ощущение.
Может какие-то опции капиляции изменить, кто подскажет?
Aleksandr_59 вне форума Ответить с цитированием
Старый 12.04.2012, 12:53   #2
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

А как именно вы описываете глоб. переменные - var в interfaces?
RuVarez вне форума Ответить с цитированием
Старый 12.04.2012, 13:01   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Проще кинуть проект, и указать какие переменные обычно шалят. Вряд ли есть сразу рецепт.
Пока предполагаю, что ошибки в коде из-за глобальности доступа к переменным.
Почитать http://www.gunsmoker.ru/2011/04/blog-post.html
phomm вне форума Ответить с цитированием
Старый 12.04.2012, 13:02   #4
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

А вот тут я что-то не подумал.
Вот так:

Код:
unit Widget;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, JPEG, SHDocVw, mshtml, StdCtrls, DBLogDlg, ExtCtrls,
  ComCtrls, StrUtils, OleServer, ExcelXP, ClipBrd, ActiveX;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    EditNom: TEdit;
    ButtonExit: TButton;
    ...
    procedure FormFon(FileFon: string);
    procedure WebBrowser1BeforeNavigate2(ASender: TObject;
      const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
      Headers: OleVariant; var Cancel: WordBool);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

procedure Zagr;
procedure ParsProd;

var
  Form1: TForm1;
  bSuite, bPaint: boolean;
  bScanBut, bNomBut, bKodBut, bKlavBut: boolean;
  ...
  strFon: String='Fon6.jpg';
  strFonPars: String='FonPars6.jpg';

const confFileN: String='MonoConf.txt';
const conSec: integer=9;
...
const strImage: String='Image';

implementation

uses Dop_03, UnitExcel, UnitNadp, UnitSc, UnitCam, UnitKlav,
  Cam, UnitRez, UnitScroll;

{$R *.dfm}

...

end.
А что нам даёт Var?



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 12.04.2012 в 15:31.
Aleksandr_59 вне форума Ответить с цитированием
Старый 12.04.2012, 13:11   #5
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Хорошо и где именно затык? Какая переменная обнуляется?
RuVarez вне форума Ответить с цитированием
Старый 12.04.2012, 13:24   #6
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Я сумел отследить на отладчике только один момент. Глобальная строковая переменная, определяющая путь к программной папке, инициализируется при создании формы и должна быть доступна всем другим модулям. Но одна из процедур в другом модуле при обращении к этой строковой переменной получает пустую строку. Хотя другие процедуры в этом же модуле получают нормальный путь. Причём только на отдельных компьютерах. Грешить на ОС я бы стал в последнюю очередь.
И это не единичная переменная. Теряется переменная, содержащая строковое представление кода выхода, булевая переменная, определяющая необходимость заверщения процедуры. Все они глобальные в модуле главной формы.
Aleksandr_59 вне форума Ответить с цитированием
Старый 12.04.2012, 14:21   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Мб конфликт имён где-то ? Т.е. у Вас где-то лежит ещё какая-то переменная с этим же именем , и в той процедуре видимость переменных другая и читает из другой переменной (неинициализированной)
Попробуйте везде, где критично, проставить имя_модуля.имя_переменной
phomm вне форума Ответить с цитированием
Старый 12.04.2012, 14:43   #8
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

ТС, поменяй порядок модулей в uses... твои модули должны идти в самом конце списка
смотри не только в модуле формы, а и в файле где строки "application.run" (Project - View Source)
проблема в порядке initialization-секций
GreenWizard вне форума Ответить с цитированием
Старый 12.04.2012, 16:54   #9
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

[QUOTE=phomm;1020231]Мб конфликт имён где-то ? Т.е. у Вас где-то лежит ещё какая-то переменная с этим же именем , и в той процедуре видимость переменных другая и читает из другой переменной (неинициализированной)
Попробуйте везде, где критично, проставить имя_модуля.имя_переменной[/QUOT]

Тоже может быть, попробую. Только почему проблемма не на всех компах?
Aleksandr_59 вне форума Ответить с цитированием
Старый 12.04.2012, 16:58   #10
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
ТС, поменяй порядок модулей в uses... твои модули должны идти в самом конце списка
смотри не только в модуле формы, а и в файле где строки "application.run" (Project - View Source)
проблема в порядке initialization-секций
А как их "правильно" расставить?

Код:
uses
  Forms,
  Dop_03 in 'Dop_03.pas',
  UnitNadp in 'UnitNadp.pas' {FormNadp},
  UnitCam in 'UnitCam.pas' {FormCam},
  Cam in 'Cam.pas',
  Camera in 'Camera.pas' {FormCamera},
  UnitSc in 'UnitSc.pas',
  UnitExcel in 'UnitExcel.pas',
  UnitKlav in 'UnitKlav.pas' {FormKlav},
  Widget in 'Widget.pas' {Form1},
  UnitScroll in 'UnitScroll.pas' {FormScroll},
  UnitRez in 'UnitRez.pas' {FormPars};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TFormNadp, FormNadp);
  Application.CreateForm(TFormCam, FormCam);
  Application.CreateForm(TFormCamera, FormCamera);
  Application.CreateForm(TFormKlav, FormKlav);
  Application.CreateForm(TFormPars, FormPars);
  Application.CreateForm(TFormScroll, FormScroll);
  //Application.Form1.;
  Application.Run;
end.
Aleksandr_59 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
доступ к переменным из scanf zl@dey Общие вопросы C/C++ 3 21.12.2011 13:49
Вопрос по переменным ronston Общие вопросы C/C++ 6 06.10.2010 10:27
Доступ функций к глобальным переменным Utkin Общие вопросы по программированию, компьютерный форум 74 19.04.2010 07:59
присвоить из бд переменным akimov_aleks БД в Delphi 6 07.04.2010 08:24
Доступ к переменным RealSHELS Общие вопросы Delphi 4 15.06.2008 13:14