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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.04.2010, 22:02
konsul_81 konsul_81 вне форума
Прохожий
 
Регистрация: 19.04.2010
Сообщения: 21
Репутация: 10
Восклицание загрузка из текстового файла в StringGrid

доброго времени суток!
помогите пожалуйста новичку с решением задачи.
задача такова:
имеются StringGrid и текстовый файл следующего содержания
____________________________

ООО "василек",7712349578
ООО "здоровье",5046287439
ООО" ромашка",7733478323
____________________________

Сохраняю StringGrid в текстовый фаил так:

Код:
procedure TForm1.SpeedButton2Click(Sender: TObject);
Var 
    I : Byte;
    F : TextFile;
    S : String;
begin
  AssignFile(F, 'Test.txt');
  Rewrite(F);
  For I := 1 to StringGrid1.RowCount - 1 do
  Begin
       Writeln(F,StringGrid1.Cells[0,I] +','+StringGrid1.Cells[1,I])
 
  end;
  CloseFile(F)
end;

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

Помогите пожалуйста, очень надо!!!

Последний раз редактировалось Admin, 29.04.2010 в 22:05.
Ответить с цитированием
  #2  
Старый 29.04.2010, 22:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Читаешь из файла стррку, потом находишь разделитель (ф-я Pos), потом "пилишь" ее на части (ф-я Copy), потом эти части пихаешь в StringGrid. Типа:
Код:
...
ReadLn(F,S);
StringGrid1.Cells[0,i] := Copy(S,1,Pos(',',S)-1);
StringGrid1.Cells[2,i] := Copy(S,Pos(',',S)+1,Length(S)); // здесь маленький хак с кол-вом копируемых символов...
Ответить с цитированием
  #3  
Старый 29.04.2010, 22:32
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

Для удобной загрузки созранять лутче так
Код:
procedure TForm1.SpeedButton2Click(Sender: TObject);
Var 
    F : TextFile;
begin
  AssignFile(F, 'Test.txt');
  Rewrite(F);
  For I := 1 to StringGrid1.RowCount - 1 do
  Begin
       Writeln(F,StringGrid1.Cells[0,I]); 
       Writeln(F,StringGrid1.Cells[1,I]);
 
  end;
  CloseFile(F)
end;
загрузка
Код:
procedure TForm1.SpeedButton3Click(Sender: TObject);
Var 
    F : TextFile;
begin
  AssignFile(F, 'Test.txt');
  Reset(F);
  while not EOF(f)  do
  Begin
       readln(F,StringGrid1.Cells[0,I]); 
       readln(F,StringGrid1.Cells[1,I]);
 
  end;
  CloseFile(F)
end;
Не компилил, но должно работать.
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #4  
Старый 29.04.2010, 22:36
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Я бы порекоммендовал создать запись вида
Код:
type
 Tf : record
  Name : string[20];//размер обязателен
  Number : string[20];
 end;
var
 ff : file of Tf;//файл записей
 f : Tf;//переменная записи
Теперь записывать и читать можно так
Код:
begin
  AssignFile(ff, 'Test.dat');
  Rewrite(ff);
  For I := 1 to StringGrid1.RowCount - 1 do
  Begin
   f.Name := StringGrid1.Cells[0,I];
   f.Number := StringGrid1.Cells[1,I];
   Seek(ff, FileSize(ff)-1);
   Write(f);
  end;
  CloseFile(ff);
end;
Код:
begin
  AssignFile(ff, 'Test.dat');
  Reset(ff);
  For I := 0 to FileSize(ff)-1 do
  Begin
   Seek(ff, i);
   read(f);   
   StringGrid1.Cells[0,I] := f.Name;
   StringGrid1.Cells[1,I] := f.Number;
  end;
  CloseFile(ff);
end;
Код писал на коленке, могут быть незначительные ошибки, но принцип ясен
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #5  
Старый 29.04.2010, 23:18
konsul_81 konsul_81 вне форума
Прохожий
 
Регистрация: 19.04.2010
Сообщения: 21
Репутация: 10
По умолчанию

перепробовал все предложеные варианты не выходит
толи лыжи не едут, толи у меня мозг перегорел от перегрузки.
уже неделю загараю с этой загрузкой
Ответить с цитированием
  #6  
Старый 30.04.2010, 01:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ять!!! Вот народ ленивый пошел...
Код:
procedure TForm1.btLoadClick(Sender : TObject);
var
  L : TStringList;
  I : Integer;
begin
  L := TStringList.Create;
  L.LoadFromFile('test.txt');
  StringGrid1.Rows := L.Count;
  StringGrid1.Cols := 2;
  For I := 0 To L.Count-1 Do
    Begin
       StringGrid1.Cells[0,i] := Copy(L[i],1,Pos(',',L[i])-1);
       StringGrid1.Cells[1,i] := Copy(L[i],Pos(',',L[i])+1,Length(L[i]));
    End;
  L.Free;
end;
Ответить с цитированием
  #7  
Старый 30.04.2010, 22:40
konsul_81 konsul_81 вне форума
Прохожий
 
Регистрация: 19.04.2010
Сообщения: 21
Репутация: 10
Восклицание

lmikle спасибо!!!

остался единственный вопрос остался:

как загружать первую по счету строку файла в первую строку StringGrid.
пробовал менять эту строку
Код:
For I := 0 To L.Count-1 Do
с 0 на 1, грузиться со первой строчки StringGrid но со второй по счету строчки файла.
а если не чего не менять грузиться с первой по счету строчки файла но с нулевой фиксированной строки StringGrid, и получается некрасиво.
может кто подкинет идею, а лучше кодинг, а если с описанием буду очень благодарен.
Ответить с цитированием
  #8  
Старый 01.05.2010, 00:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Догадайся сам. Решение очень простое.
Но тебе придется разобраться с нумераций ячеек в TStringGrid и строк в TStringList.
Ответить с цитированием
  #9  
Старый 01.05.2010, 09:18
konsul_81 konsul_81 вне форума
Прохожий
 
Регистрация: 19.04.2010
Сообщения: 21
Репутация: 10
По умолчанию

так что ли:
Код:
 For I := 0 To L.Count-1 Do
    Begin
       StringGrid1.Cells[0,i + 1] := Copy(L[i],1,Pos(',',L[i])-1);
       StringGrid1.Cells[1,i + 1] := Copy(L[i],Pos(',',L[i])+1,Length(L[i]));
    End;

теперь все пучком

Последний раз редактировалось konsul_81, 01.05.2010 в 12:19.
Ответить с цитированием
  #10  
Старый 01.05.2010, 12:26
konsul_81 konsul_81 вне форума
Прохожий
 
Регистрация: 19.04.2010
Сообщения: 21
Репутация: 10
Хорошо

вот так наверно правильней будет
Код:
rocedure TForm1.Button_LoadClick(Sender: TObject);
var
  L : TStringList;
  I : Integer;
begin
  L := TStringList.Create;
  L.LoadFromFile('Test.txt');
 StringGrid1.RowCount := L.Count+1;
 StringGrid1.ColCount := 2;
  For I := 0 To L.Count-1 Do
    Begin
       StringGrid1.Cells[0,i + 1] := Copy(L[i],1,Pos(',',L[i])-1);
       StringGrid1.Cells[1,i + 1] := Copy(L[i],Pos(',',L[i])+1,Length(L[i]));
    End;
  L.Free;
end;

Последний раз редактировалось konsul_81, 01.05.2010 в 12:55.
Ответить с цитированием
  #11  
Старый 12.05.2010, 00:03
president100 president100 вне форума
Прохожий
 
Регистрация: 11.05.2010
Сообщения: 1
Репутация: 10
По умолчанию

у меня такая же проблема, надо считать из файла двумерный массив в stringgrid, но фишка в том что у меня он считывается, прогу мне писал знакомый, сам я плохо разбираюсь, текст вот:

Код:
procedure TFormMain.ButCalcClick(Sender: TObject);
var
  S:Real;
  F:TextFile;
  A:array of array of Real;
  N,M,I,J:Integer;
begin
  AssignFile(F,OpenDialog1.FileName);
  Reset(F);
  ReadLn(F,N,M);
  Massiv.RowCount:=N+1;
  Massiv.ColCount:=M+1;
  SetLength(A,Massiv.RowCount,Massiv.ColCount);

  for I:=0 to Massiv.RowCount-1 do
    Massiv.Cells[I,0]:=IntToStr(I);
  for J:=0 to Massiv.ColCount-1 do

    Massiv.Cells[0,J]:=IntToStr(J);
  for I:=1 to Massiv.RowCount-1 do
    begin
      for J:=1 to Massiv.ColCount-1 do
        Read(F,A[I,J]);
      ReadLn(F)
    end;

  for I:=1 to Massiv.RowCount-1 do
    for J:=1 to Massiv.ColCount-1 do
      Massiv.Cells[I,J]:=FloatToStr(A[I,J]);
    S:=0;
    for I:=1 to Massiv.RowCount-1 do
      for J:=1 to Massiv.ColCount-1 do
        if RdGrCh.ItemIndex=0 then
          if (I+J) mod 2=0 then
            S:=S+A[I,J]
        else
          if RdGrCh.ItemIndex=1 then
            if (I+J) mod 2<>0 then
              S:=S+A[I,J];
    EdRes.Text:=FloatToStr(S);
    ButCalc.Enabled:=false;
    showMessage('Результат: '+FloatToStr(S));
end;

procedure TFormMain.ButCloseClick(Sender: TObject);
begin
  close;
end;

procedure TFormMain.ButLoadClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
      butCalc.Enabled:=true
  else
    begin
      LabTrack.Caption:='Файл не выбран'
    end;

end;



procedure TFormMain.RdGrChClick(Sender: TObject);
begin
  butLoad.Enabled:=true;
end;

end. 

но преподу не нравится говорит типа зачем "надо сначала выбрать элементы, а потом загружать массив, по-моему это 2 независымие операции, исправляй"
+еще с процедуркой ButLoadClick фигня, получается что эта кнопка становится доступной только когда выполняется openDialog а в программе производится 2 разных суммы, и получается что если ты сперва находишь первую сумму и загружаешь массив из файла, а потом хочешь найти вторую сумму то приходится загружать массив повторно, это тоже надо исправить

Последний раз редактировалось president100, 12.05.2010 в 00:10.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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