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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.12.2011, 19:42
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию Создание переменных

По сути глупый вопрос, но ни один урок, ни какой Google мне не дали ответ.
Как создать переменную в процессе работы?
В данный момент я хочу считывать текст с файла и каждый символ помещать в отдельную переменную. Но длина строки и количество строк неизвестно, создать нужное количество переменные заранее не получится. Как быть?
Ответить с цитированием
  #2  
Старый 04.12.2011, 20:02
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

динамический массив или TStringlist
а вобще:
Цитата:
memo.lines.loadfromfile
memo.lines[i]

Последний раз редактировалось Pyro, 04.12.2011 в 20:06.
Ответить с цитированием
  #3  
Старый 04.12.2011, 20:21
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

"Каждый символ помещать в свою переменную"

А не слишком ли жирно?
1 символ- это 1 байт.
Указатель на переменную- это 4 байта. И ты собираешься потратить 4 байта на то чтобы хранить 1 байт?
Делать динамич массив нет смысла. Проще свего считать весь файл в длинную строку. Это и есть динамич массив.
Ну а если надо поделить на строки (те организовать 2- мерный массив)- то см. совет Pyro. Лучше этого не скажешь.

Последний раз редактировалось chainik, 04.12.2011 в 20:28.
Ответить с цитированием
  #4  
Старый 04.12.2011, 21:14
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Да нет. Так надо. В файле указанны определенные данные, в целом процедура должна выглядеть подобным образом.
- Определяем количество строк в файле
- Определяем длину первой строки
- Создаем цикл который поместит каждый символы в отдельную переменную.
После они (значения в переменных) будут служить координатами.
P.S. тяжело переходить с конструкторов на программный код, в конструкторах все решается одной строкой
Ответить с цитированием
  #5  
Старый 04.12.2011, 21:38
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
В файле указанны определенные данные
Цитата:
- Создаем цикл который поместит каждый символы в отдельную переменную.
После они (значения в переменных) будут служить координатами.
Ну так о чем и говорят. Если каждый символ (байт) - координата, то просто берем это как строку или N строк. Работать с ней можно как угодно. Потому что строка - такой же массив байт.
Можно считать целым куском в оперативку (если там не слишком много данных) или по частям, и работать как с обычным массивом, брать элементы по индексу. Создание именно отдельных переменных является нерациональным расходованием памяти и бредом. Если все же ну очень хочется проверить, насколько это бред - придется делать массив указателей на байты. В х32 это увеличит потребляемую память в 5 раз (1 байт - значение и 4 указатель), а в х64 скорее всего сразу в 9 раз (там указатели 8 байт).
Только я никак не пойму: зачем тебе хранить в отдельных переменных? Код сам не модифицируется, но он должен работать с любым числом "переменных" => он должен быть написан с использованием динамического массива указателей на эти "переменные". Но если делаешь массив указателей, почему бы не сделать просто массив значений, и хранить только адрес первого значения, остальные получать как "адрес массива + номер байта"?

P.S. Не знаю, про какие "конструкторы" говоришь, но могу сказать одно: если оно имеет отношение к выполнению программы на машине и если это не какая-то детская игрушка, а хоть сколько-нибудь полезная вещь, то там на деле это реализуется через динамический массив (он же строка).
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 04.12.2011 в 21:50.
Ответить с цитированием
  #6  
Старый 04.12.2011, 21:39
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

если в файле указаны определенные данные- то это типированный файл. и читать его надо не байтами, а в соответствующую структуру. См справку по типированным файлам. Без этого дальнейшая дискуссия теряет смысл. Это испорченный телефон.
Ответить с цитированием
  #7  
Старый 04.12.2011, 21:44
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Примерно ясно. Спасибо.

Цитата:
P.S. Не знаю, про какие "конструкторы" говоришь, но могу сказать одно: если оно имеет отношение к выполнению программы на машине и если это не какая-то детская игрушка, а хоть сколько-нибудь полезная вещь, то там на деле это реализуется через динамический массив (он же строка).
Не знаю как это выглядит системно, но переменные создавались в процессе работы, даже если они ранее не существовали.
Цитата:
динамический массив или TStringlist
Совсем туго что-то... TStringlist сразу отпадает, не подходит по принципу построения. динамический массив - что-то как-то вяло... Может может кто объяснить?
Код:
var
  Form1: TForm1;
  New  : TStringList;
  News : Array of Array of string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  New := TStringList.Create;
  New.Add('Cat');
  New.Add('Mouse');
  New.Add('Giraffe');

  SetLength(News[0], 1);
  SetLength(News[1], 2);
  SetLength(News[2], 3);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(New[StrToInt(Edit1.Text)]);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
News[0,0] := 'News';
ShowMessage(News[0,0]);
end;

Последний раз редактировалось Kaktuz, 05.12.2011 в 01:05.
Ответить с цитированием
  #8  
Старый 08.12.2011, 00:11
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от chainik
А не слишком ли жирно?
1 символ- это 1 байт.
Указатель на переменную- это 4 байта. И ты собираешься потратить 4 байта на то чтобы хранить 1 байт?
Узнал об одной такой неплохой возможности как
Код:
var Temp: TStringList;
begin
Temp:=TStringList.Create;
Temp.LoadFromFile('Text.txt');
Потом использую координаты для загрузки нужного символа
Код:
L:=Temp.Strings[StrToInt(Y)];
L:=L[StrToInt(X)-1];
Таким же способом будет использоваться меньше ресурсов системы, да?
Вот только если понадобится заменить какой-то из символов... мм... не знаю как его... можно ли...
Ответить с цитированием
  #9  
Старый 08.12.2011, 00:21
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код:
Temp.Strings[i][j]:='a';
По идеи так.
TStringList это есть динамический массив строк с кучей методов, а каждая строка - динамический массив.


P.S.
Код:
Temp.Strings[StrToInt(Y)]
L[StrToInt(X)-1];
Не пойму, в чем великий смысл строку использовать как индекс, и почему бы не обратиться сразу к символу, если он нужен.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 08.12.2011 в 00:26.
Ответить с цитированием
  #10  
Старый 08.12.2011, 00:43
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Тогда так
Код:
L:=Temp.Strings[StrToInt(Y)][StrToInt(X)-1];

Подскажите пожалуйста один такой вопрос. Немного не по теме конечно, но... Вот как сделать программно что бы объект был на переднем плане относительно других объектов. Нашел решение при создании
Цитата:
Щелкаешь на объекте правой кнопкой, в появившемся меню пункт Control. В нем - Bring to Front - вытащить на передний план, или Send to Back - отправить на задний план.
Но вот один нюанс. Изначально у меня уже есть созданные объекты. Я так же хочу создать им фоновое изображение из множества изображений
Код:
for i := 0 to 4 do
  begin
  for j := 0 to 4 do
    begin
    img[i, j] := TImage.Create(nil);
    img[i, j].Picture.LoadFromFile('1.bmp');
    img[i, j].Left := i*32;
    img[i, j].Top := j*32;
    img[i, j].Parent := Form1;
    end;
  end;
Но они тогда получается перекрывают все мои ранее созданные объекты. Можно как-то уже в самой программе во время работы поместить нужные мне объекты на передний план?

Последний раз редактировалось Kaktuz, 08.12.2011 в 01:05.
Ответить с цитированием
  #11  
Старый 08.12.2011, 01:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Великая и могучая СПРАВКА сообщает:
Цитата:
BringToFront method (TControl)

Delphi syntax:

procedure BringToFront;

Description

Call BringToFront to ensure that a form is visible or to reorder overlapping controls within a form.

Note that controls that wrap Windows screen objects (control classes descended from TWinControl) always "stack" above lightweight controls (control classes descended from TGraphicControl). BringToFront can force a lightweight control, such as a Shape, to stack above other lightweight controls, but wrapped controls, such as an Edit, will still stack above the Shape.

Without BringToFront, controls are stacked in their order they were placed on the form.
Читать лень? Проще на форуме спросить? В следующий раз за такие вопросы можно и наказать.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #12  
Старый 08.12.2011, 01:24
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Читать лень? Проще на форуме спросить? В следующий раз за такие вопросы можно и наказать.
Я же говорил что английский плохо знаю... и стандартной справкой не пользуюсь.
Наказать... Нет что бы подсказать... mail.ru...
Ответить с цитированием
  #13  
Старый 08.12.2011, 01:34
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Kaktuz
Я же говорил что английский плохо знаю... и стандартной справкой не пользуюсь.
Наказать... Нет что бы подсказать... mail.ru...
Учи, пригодится.
Вот за это и нужно наказывать, справка для того и пишется.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #14  
Старый 15.12.2011, 22:29
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Код:
Temp.Strings[i][j]:='a';
По идеи так.
Не работает.
Ответить с цитированием
  #15  
Старый 15.12.2011, 22:36
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

И не может, Strings - одномерный массив:
Цитата:
property Strings[Index: Integer]: string; default;

Description

Use Strings to read or modify the string at a particular position. Index gives the position of the string, where 0 is the position of the first string, 1 is the position of the second string, and so on. To locate a particular string in the list, call the IndexOf method.

In Delphi, Strings is the default property of string list objects. The Strings identifier can be omitted when accessing the Strings property of a string list object. For example, the following two lines of code are both acceptable and do the same thing:
MyStringList.Strings[0] := 'This is the first string';
MyStringList[0] := 'This is the first string';
Можно написать:
Код:
Temp.Strings[i]:='a';
Temp[i]:='a';
Temp.Strings[j]:='a';
Temp.[j]:='a';
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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