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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.05.2013, 14:47
Archer666 Archer666 вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: выкл
Стрелка Создание массива из внешнего файла.

Здравствуйте, нужна помощь, не могу создать программу, в которой необходимо считать из внешнего файла 9 чисел(записанных через пробел в строку), и сформировать на форме массив (3х3) этих чисел, проблема в том что я не понимаю как из файла со строкой чисел сделать массив...
как открывать файл понятно, но вот как обработать нет.
наведите на мысль пожалуйста...
Ответить с цитированием
  #2  
Старый 05.05.2013, 15:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

TStrings
property Delimiter
property DelimitedText
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 05.05.2013, 15:37
Archer666 Archer666 вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от NumLock
TStrings
property Delimiter
property DelimitedText


а как из этого сделать массив 3х3?
Ответить с цитированием
  #4  
Старый 05.05.2013, 15:43
Аватар для orion_asm
orion_asm orion_asm вне форума
Прохожий
 
Регистрация: 23.06.2012
Адрес: Украина, Днепропетровск
Сообщения: 19
Версия Delphi: XE3
Репутация: 10
По умолчанию

На форму добавить поле Memo и диалог открытия файлов OpenDialog. Ну и кнопку, вот ее обработчик:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
mass : array [0..2] of array [0..2] of integer;
i,j : integer;
begin
if OpenDialog1.Execute then
begin
  AssignFile(F, OpenDialog1.FileName);
  Reset(F);
  while not EOF(F) do
  begin
    for i := 0 to 2 do
      for j := 0 to 2 do
      Read(F, mass[i][j]);
  end;
end;
for i := 0 to 2 do
  for j := 0 to 2 do
  Memo1.Lines.Add('mass [' + IntToStr(i) + ']' + '[' + IntToStr(j) + ']' + ' = ' + IntToStr(mass[i][j]));
end;
Ответить с цитированием
Этот пользователь сказал Спасибо orion_asm за это полезное сообщение:
Archer666 (05.05.2013)
  #5  
Старый 05.05.2013, 16:04
Archer666 Archer666 вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от orion_asm
На форму добавить поле Memo и диалог открытия файлов OpenDialog. Ну и кнопку, вот ее обработчик:
[/code]


спасибо, помогло

а как реализовать вывод в Label в виде таблицы 3х3?
Ответить с цитированием
  #6  
Старый 05.05.2013, 16:19
Аватар для orion_asm
orion_asm orion_asm вне форума
Прохожий
 
Регистрация: 23.06.2012
Адрес: Украина, Днепропетровск
Сообщения: 19
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Archer666
спасибо, помогло

а как реализовать вывод в Label в виде таблицы 3х3?
Это глупая затея. А если задача будет вывод массив 100*100 к примеру, вы будете 10000 лейблов на форму кидать ? Лучше использовать компонент StringGrid. Удалите мемо, добавьте StringGrid. В свойствах (Properties) этого компонента значения FixedCols и FixedRows поставить в 0. RowCount и ColCount задать 3. Хотя это можно и программным способом сделать. Обработчик теперь такой:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
mass : array [0..2] of array [0..2] of integer;
i,j : integer;
begin
if OpenDialog1.Execute then
begin
  AssignFile(F, OpenDialog1.FileName);
  Reset(F);
  while not EOF(F) do
  begin
    for i := 0 to 2 do
      for j := 0 to 2 do
      Read(F, mass[i][j]);
  end;
end;
for i := 0 to 2 do
  for j := 0 to 2 do
  StringGrid1.Cells[i,j] := IntToStr(mass[i][j]);
end;
end.

Последний раз редактировалось orion_asm, 05.05.2013 в 16:25.
Ответить с цитированием
Этот пользователь сказал Спасибо orion_asm за это полезное сообщение:
Archer666 (05.05.2013)
  #7  
Старый 05.05.2013, 16:32
Archer666 Archer666 вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: выкл
Хорошо

Цитата:
Сообщение от orion_asm
Это глупая затея.

точно, так и сортировать потом проще

большое спасибо!
Ответить с цитированием
  #8  
Старый 05.05.2013, 16:39
Archer666 Archer666 вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

orion_asm, а как можно отсортировать? по возрастанию например..
Ответить с цитированием
  #9  
Старый 05.05.2013, 16:43
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Я делал на TFileStream и TMemoryStream подобия n-мерных массивов.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #10  
Старый 05.05.2013, 17:25
Аватар для orion_asm
orion_asm orion_asm вне форума
Прохожий
 
Регистрация: 23.06.2012
Адрес: Украина, Днепропетровск
Сообщения: 19
Версия Delphi: XE3
Репутация: 10
По умолчанию

В секции implementation добавляешь такое: (SgSort взят и частично изменен с cyberforum.ru)
Код:
implementation
// Процедура сортировки StringGrid
procedure SgSort(aSg : TStringGrid; const aCol : Integer; aCompare : TStringListSortCompare = nil);
var
  SlSort, SlRow : TStringList;
  i, j : Integer;
begin
  SlSort := TStringList.Create;
  for i := aSg.FixedRows to aSg.RowCount - 1 do begin
    SlRow := TStringList.Create;
    SlRow.Assign(aSg.Rows[i]);
    SlSort.AddObject(aSg.Cells[aCol, i], SlRow);
  end;
  if Assigned(aCompare) then SlSort.CustomSort(aCompare)
  else SlSort.Sort;
  j := 0;
  for i := aSg.FixedRows to aSg.RowCount - 1 do begin
    SlRow := Pointer(SlSort.Objects[j]);
    aSg.Rows[i].Assign(SlRow);
    SlRow.Free;
    Inc(j);
  end;
  FreeAndNil(SlSort);
end;

// Сортировка по возрастанию
function CompNumAsc(aSl: TStringList; aIndex1, aIndex2: Integer) : Integer;
var
  N1, N2 : Extended;
begin
  N1 := StrToFloatDef(aSl[aIndex1], 0);
  N2 := StrToFloatDef(aSl[aIndex2], 0);
  if N1 < N2 then Result := -1
  else if N1 > N2 then Result := 1
  else Result := 0;
end;

// По убыванию
function CompNumDesc(aSl: TStringList; aIndex1, aIndex2: Integer) : Integer;
var
  N1, N2 : Extended;
begin
  N1 := StrToFloatDef(aSl[aIndex1], 0);
  N2 := StrToFloatDef(aSl[aIndex2], 0);
  if N1 > N2 then Result := -1
  else if N1 < N2 then Result := 1
  else Result := 0;
end;
В обработчике:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
mass : array [0..2] of array [0..2] of integer;
i,j : integer;
begin
if OpenDialog1.Execute then
begin
  AssignFile(F, OpenDialog1.FileName);
  Reset(F);
  while not EOF(F) do
  begin
    for i := 0 to 2 do
      for j := 0 to 2 do
      Read(F, mass[i][j]);
  end;
end;
for i := 0 to 2 do
  for j := 0 to 2 do
  begin
  StringGrid1.Cells[i,j] := IntToStr(mass[i][j]);
end;
// Сортируем все столбцы по возрастанию
SgSort(StringGrid1, 0, CompNumAsc);
SgSort(StringGrid1, 1, CompNumAsc);
SgSort(StringGrid1, 2, CompNumAsc);
end;
end.
Функция принимает 3 параметра - имя StringGrid которое нуждается в сортировке, потом индекс столбца в котором должна выполнятся сортировка, и функция сортировки либо по убыванию, либо по возрастанию

Последний раз редактировалось orion_asm, 30.07.2013 в 04:58.
Ответить с цитированием
  #11  
Старый 05.05.2013, 17:40
Archer666 Archer666 вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от orion_asm
Функция принимает 3 параметра - имя StringGrid которое нуждается в сортировке, потом индекс столбца в котором должна выполнятся сортировка, и функция сортировки либо по убыванию, либо по возрастанию


проблема в том что, отсортированные должны быть в соседней таблице..
Ответить с цитированием
  #12  
Старый 05.05.2013, 17:54
Аватар для orion_asm
orion_asm orion_asm вне форума
Прохожий
 
Регистрация: 23.06.2012
Адрес: Украина, Днепропетровск
Сообщения: 19
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Archer666
проблема в том что, отсортированные должны быть в соседней таблице..
А что мешает добавить еще один стринг грид, заполнить его аналогично в одном цикле вместе с первым, а потом вызвать сортировку указав нужный стринггрид? Допустим добавили еще один, пусть называется StringGrid2:
Здесь его заполняем вместе с первым:
Код:
...
for i := 0 to 2 do
  for j := 0 to 2 do
  begin
  StringGrid1.Cells[i,j] := IntToStr(mass[i][j]);
  StringGrid2.Cells[i,j] := IntToStr(mass[i][j]);
end;

А здесь сортируем:
Код:
SgSort(StringGrid2, 0, CompNumAsc);
SgSort(StringGrid2, 1, CompNumAsc);
SgSort(StringGrid2, 2, CompNumAsc);

Обыкновенная копипаста и замена единственного числа.
Ответить с цитированием
  #13  
Старый 05.05.2013, 18:05
Archer666 Archer666 вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от orion_asm
Обыкновенная копипаста и замена единственного числа.

извиняюсь, затупил..
спасибо за помощь.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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