Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.11.2012, 15:24
Аватар для Edinora
Edinora Edinora вне форума
Прохожий
 
Регистрация: 12.11.2012
Сообщения: 22
Репутация: 10
По умолчанию Вопрос: Как сделать масив типа record глобальной переменной?

У меня вопрос к старожилам.
Есть мелкая программка с несколькими формами. В каждой форме фигурируют данные с файла, для удобства записанные в массив TeamsArray. С массива они распределяются по табличках этих формах. (Это в идеале).
Теперь сам вопрос:
Код:
type
  TPerson = record
    FTeam: string[130];
    FCity: string[50];    
    FYearOfFoundation: Integer;
  end;

  TeamFile = file of Team;

var
  Form1: TForm1;
  TeamsArray:array[1..100] of  TPerson;
  ImageTeamsArray:array[1..100] of string;
При попытке вынести TeamsArray в public(что бы он был доступен и другим формам), выкидывает ошибку типа данных, так как тип TPerson все равно объявляется ниже.

Как то меня не радует в каждой из форм считывать данные с файла, записывать в локальный массив, работать с ним, а потом опять записывать в файл.

Есть ли другой, более простой, способ справиться с данной проблемой?
Ответить с цитированием
  #2  
Старый 12.11.2012, 15:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

TeamsArray и так доступен всем модулям.
добавлено позже
а если глобальные переменные вне закона (чушь, конечно):
Код:
type
  TPerson = record
    FTeam: string[130];
    FCity: string[50];
    FYearOfFoundation: Integer;
  end;

  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    TeamsArray:array[1..100] of  TPerson;
  end;
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 12.11.2012 в 15:30.
Ответить с цитированием
  #3  
Старый 12.11.2012, 15:53
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Вообще говоря, пишется юнит
Код:
unit
  UnitTeams;
interface
type
  TPerson = record
    FTeam: string[130];
    FCity: string[50];
    FYearOfFoundation: Integer;
  end;

var
  TeamsArray:array[1..100] of  TPerson;
  TeamsCount:Integer=0;

procedure ReadTeams(FileName:String);
procedure WriteTeams(FileName:String);

implementation
procedure ReadTeams(FileName:String);
var
  T:File of TPerson;
  I:Integer;
begin
  Assignfile(F,FileName);
  TeamsCount:=0;
{$-}
  Reset(F);
  If IoResult <> 0 then Exit;

  I:=FileSize(F);
  
  // if I>100 then ????

  TeamsCount:=I;
  for I:=1 to TeamsCount do begin
    Read(F,TeamsArray[i]);
  end;
  
  CloseFile(F);
{$+}
end;

procedure WriteTeams(FileName:String);
var
  T:File of TPerson;
  I:Integer;
begin
  Assignfile(F,FileName);
  Rewrite(F);
  
  Seek(F,0);

  for I:=1 to TeamsCount do begin
    Write(F,TeamsArray[i]);
  end;

  CloseFile(F);


end;
end.
и подключается к uses в интерфейсной части там, где надо
Ответить с цитированием
  #4  
Старый 12.11.2012, 17:06
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
а если глобальные переменные вне закона (чушь, конечно)
Почему сразу чушь. Мне приходилось писать код, в котором было никак нельзя использовать глобальные переменные. Правда на си, и правда это очень специфичная область применения.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 12.11.2012, 19:56
Аватар для Edinora
Edinora Edinora вне форума
Прохожий
 
Регистрация: 12.11.2012
Сообщения: 22
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
TeamsArray и так доступен всем модулям.
Я пробовала к нему обращаться как к переменной (Form1.TeamsArray[i]), но что-то явно пошло не так (видимо надо было просто TeamsArray[i]).
Цитата:
Сообщение от NumLock
а если глобальные переменные вне закона (чушь, конечно):
Возможно и чушь, я чуть протупила и поставила type TPerson = record в пределах public. На вашем коде я увидела свою ошибку.
Спасибо
Цитата:
Сообщение от icWasya
Вообще говоря, пишется юнит
и подключается к uses в интерфейсной части там, где надо
Хмм... интересное решение, я как то даже не подумала о такой возможности. Спасибо, пойду экспериментировать
Ответить с цитированием
  #6  
Старый 13.11.2012, 09:22
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

1. да, естественно "просто" TeamsArray[i]
2. "чушь" это сказано про категорический запрет использования глобальных переменных, не про ваш код
3. опять же, если принять во внимание категорический запрет использования глобальных переменных, стоит это реализовать отдельным классом, где массив TeamsArray будет свойством класса, а не глобальной переменной. но повторю - чушь это don't use global vars
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:11.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025