Форум по 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
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 13.11.2012, 20:04
Аватар для Edinora
Edinora Edinora вне форума
Прохожий
 
Регистрация: 12.11.2012
Сообщения: 22
Репутация: 10
По умолчанию Новый вопрос...

Подскажите пожалуйста:
1. Есть отсортированный динамический массив.
2. Есть типизованный файл в который этот массив записывается.
3. В середину массива добавляется значение, это же значение нужно добавить в файл(соответственно в середину).
Как добавить запись в файл раздвинув остальные (уже существующие) записи?

---
P.S.: Для каждого нового вопроса нужно новую тему создавать?
__________________
По переживать и по сокрушаться - я всегда успею.
Так что, дайте мне порадоваться в свое удовольствие!
Ответить с цитированием
  #8  
Старый 13.11.2012, 20:25
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Код:
Seek(F,nRec);
должен вроде вам помочь, где nRec Номер записи.
либо вообще взять и перезаписать файл
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #9  
Старый 13.11.2012, 20:38
Аватар для Edinora
Edinora Edinora вне форума
Прохожий
 
Регистрация: 12.11.2012
Сообщения: 22
Репутация: 10
По умолчанию

Код:
Seek(F,nRec);
не помогает, он просто перезаписывает в файле запись поверх записи с номером nRec.
Можно перезаписывать файл... но как-то это... слишком просто и примитивно, должен же быть способ сделать пусть сложнее но эффективней (Да здравствует теория! ).
__________________
По переживать и по сокрушаться - я всегда успею.
Так что, дайте мне порадоваться в свое удовольствие!
Ответить с цитированием
  #10  
Старый 13.11.2012, 21:09
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Как добавить запись в файл раздвинув остальные (уже существующие) записи?
Все записи после N переписать сдвинутыми на 1, а на место N вставить новую.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #11  
Старый 14.11.2012, 09:21
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Edinora
Как добавить запись в файл раздвинув остальные (уже существующие) записи?
проще перезаписать целиком
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #12  
Старый 14.11.2012, 10:18
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Edinora
Подскажите пожалуйста:
1. Есть отсортированный динамический массив.
2. Есть типизованный файл в который этот массив записывается.
3. В середину массива добавляется значение, это же значение нужно добавить в файл(соответственно в середину).
Как добавить запись в файл раздвинув остальные (уже существующие) записи?
Если размер записи у типизированного файла большой, то лучше в этот типизированный файл писать подряд, а рядом создать небольшой индексный файл в котором записывать какая запись в типизированном файле какому элементу сортированного массива соответствует.
Ответить с цитированием
  #13  
Старый 23.11.2012, 12:27
Аватар для Edinora
Edinora Edinora вне форума
Прохожий
 
Регистрация: 12.11.2012
Сообщения: 22
Репутация: 10
По умолчанию Благодарю=)

Цитата:
Цитата:
Seek(F,nRec);
Все записи после N переписать сдвинутыми на 1, а на место N вставить новую.
Так и сделала, спасибо.
Цитата:
Если размер записи у типизированного файла большой, то лучше в этот типизированный файл писать подряд, а рядом создать небольшой индексный файл в котором записывать какая запись в типизированном файле какому элементу сортированного массива соответствует.
Я уже написала программку. Так что уже переделывать не буду. Но информация полезная, следующую программу буду делать таким образом, у меня там много массивов связанных с первым и через индексный файл будет легче к ним обращаться.
Возможных вопросов стало -1
__________________
По переживать и по сокрушаться - я всегда успею.
Так что, дайте мне порадоваться в свое удовольствие!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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