Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2007, 18:04   #1
zzss
 
Регистрация: 11.10.2007
Сообщений: 8
По умолчанию Работа со StringGreid

Здрасти!
Вот у меня такое задание...
в форме1 я заполняю все поля и нажимаю кнопку ОК....
данные (например editFIO и editTel)с этих полей должны заноситься в StringGrid в одну строку и все поля очищаются.....
Затем я снова заполняю все поля и данные опять заносятся в StringGrid во вторую строку и так до тех пор пока не нажму кнопку ВЫХОД....
После нажатия по этой кнопке ВЫХОД все данные из StringGrid должны сохраниться в файл для дальнейшей работы с ними.....
А при следующем открытии файла, при заполнении формы1 данные должны дописоваться в файл.....
Заранее благодарю.....
zzss вне форума Ответить с цитированием
Старый 11.10.2007, 18:51   #2
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Т.е. надо создать мини БД + отображение?
В чём возникла проблема?
zetrix вне форума Ответить с цитированием
Старый 11.10.2007, 19:46   #3
zzss
 
Регистрация: 11.10.2007
Сообщений: 8
По умолчанию

Цитата:
Сообщение от zetrix Посмотреть сообщение
Т.е. надо создать мини БД + отображение?
В чём возникла проблема?
почти.... надо создать мини БД через StringGrid, но она сама не должна быть видимой... дальше мне надо по номеру телефона чтобы искала нужную фамилию и выводила ее......

а проблема в том, что я не понимаю как записать код программы на кнопку ОК, посредством которой данные из Edit'ов заносятся СтрингГрид каждая на новую строчку (как описал выше).... т.е. я занес сколько мне нужно данных, нажал ВЫХОД и база сохранилась.... и еще, если вдруг данных больше надо вводить чем база по умолчанию (кол-во строк и столбцов)... можно ли сделать, чтобы на каждую новую запись добавлялась строка.........
zzss вне форума Ответить с цитированием
Старый 11.10.2007, 20:11   #4
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
Радость

Примерный набросок того что тебе надо:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    function GetAmountOfLines(Table:TStringGrid):integer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
type
TFake = class(TStringGrid);
Base=record
        FIO:string[255];
        TelNumber:string[20];
End;
{$R *.DFM}
var BaseFile:array[1..100] of Base;
    Select:integer;
function TForm1.GetAmountOfLines(Table:TStringGrid):integer;
var i:integer;
Begin
i:=1;
while Table.Cells[1,i]<>'' do
i:=i+1;
GetAmountOfLines:=i;
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
Select:=1;
StringGrid1.ColWidths[0]:=150;
StringGrid1.Cells[0,0]:='Номер';
StringGrid1.ColWidths[1]:=280;
StringGrid1.Cells[1,0]:='ФИО';
end;

procedure TForm1.Button1Click(Sender: TObject);
var AmountOfLines:byte;
begin
if (edit1.text<>'') and (edit2.text<>'') then
Begin
AmountOfLines:=GetAmountOfLines(StringGrid1);

StringGrid1.Cells[0,AmountOfLines]:=Edit1.text;
StringGrid1.Cells[1,AmountOfLines]:=Edit2.text;
End
else
ShowMessage('Заполните все поля.');

end;

procedure TForm1.Button4Click(Sender: TObject);
var F:file of Base;
i:integer;
begin
if SaveDialog1.execute then
Begin

AssignFile(F,SaveDialog1.FileName);
Rewrite(F);
for i:=1 to 100 do
Begin
if StringGrid1.Cells[0,i]<>'' then
Begin
BaseFile[i].FIO:=StringGrid1.Cells[0,i];
BaseFile[i].TelNumber:=StringGrid1.Cells[1,i];
End
else
Begin
BaseFile[i].FIO:='';
BaseFile[i].TelNumber:=0;
End;
write(F,BaseFile[i]);
End;
CloseFile(F);

End;
end;

procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
F:file of Base;
begin
if OpenDialog1.execute then
Begin
AssignFile(F,OpenDialog1.FileName);
Reset(F);
for i:=1 to 100 do
Begin
read(F,BaseFile[i]);

if BaseFile[i].FIO<>'' then
Begin
StringGrid1.Cells[0,i]:=BaseFile[i].FIO;
StringGrid1.Cells[1,i]:=BaseFile[i].TelNumber;
End
else
Begin
break;
End;

End;
CloseFile(F);
End;
exit;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
Select:=ARow;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if StringGrid1.Cells[0,Select]<>'' then
Begin
StringGrid1.Cells[0,Select]:='';
StringGrid1.Cells[1,Select]:='';
TFake(StringGrid1).RowMoved(Select, 100);
End;
end;

end.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"

Последний раз редактировалось AlDelta; 11.10.2007 в 20:34. Причина: Немного исправил исходник
AlDelta вне форума Ответить с цитированием
Старый 11.10.2007, 20:31   #5
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
Сообщение

Цитата:
... надо создать мини БД через StringGrid, но она сама не должна быть видимой...
Код:
StringGrid1.Visible:=false;
Цитата:
... дальше мне надо по номеру телефона чтобы искала нужную фамилию и выводила ее......
Поиск:
Код:
procedure TForm1.Button6Click(Sender: TObject);
var i,len:integer;
begin
len:=getAmountOfLines(StringGrid1);
for i:=1 to len do
Begin
if Edit3.text=StringGrid1.Cells[0,i] then
Begin
label1.Caption:=StringGrid1.Cells[1,i];
break;
End
else
ShowMessage('Нет такого абонента.');
break;
End;
end;
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"

Последний раз редактировалось AlDelta; 11.10.2007 в 20:35.
AlDelta вне форума Ответить с цитированием
Старый 12.10.2007, 14:19   #6
zzss
 
Регистрация: 11.10.2007
Сообщений: 8
По умолчанию

Спс за код, я его весь не взял, но делаю свою программку опираясь на него и еще другие источники.... у меня проблема, при данном коде, у меня сохраняется только последняя запись, а предыдущие все стираюся, не подскажите как проблему исправить, чтобы данные дополнялись а не затирались??

procedure TfEnter.btnExitClick(Sender: TObject);
var
F:TextFile;
Base: Data;
i:integer;
begin
AssignFile(F, 'C:\Base.sav');
Rewrite(F);
for i:=1 to fBase.GetAmountOfLines(fBase.Grid)-1 do
begin
Base.Fam:= fBase.Grid.Cells[1,i];
Base.Im:= fBase.Grid.Cells[2,i];
Base.Ot:= fBase.Grid.Cells[3,i];
Base.DR:= fBase.Grid.Cells[4,i];
Base.Ad:= fBase.Grid.Cells[5,i];
Base.Tel:= fBase.Grid.Cells[6,i];
WriteLn(F, Base.Fam);
WriteLn(F, Base.Im);
WriteLn(F, Base.Ot);
WriteLn(F, Base.DR);
WriteLn(F, Base.Ad);
WriteLn(F, Base.Tel);
end;
CloseFile(F);
fEnter.Close;
fSelect.Show;
end;

Последний раз редактировалось zzss; 12.10.2007 в 21:07. Причина: исправил на правильный код на сохранение....
zzss вне форума Ответить с цитированием
Старый 12.10.2007, 14:33   #7
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
Подмигивание

Будь-ласка.

Будь внимательным и люди к тебе потянутся: говорить о твоей невнимательности! (Владимир Борисов)

Тебе нужно создать массив записей с типом Data и записывать в файл каждый элемент массива, вот так:

Цитата:
Код:
AssignFile(F,SaveDialog1.FileName);
Rewrite(F);
for i:=1 to 100 do
Begin
if StringGrid1.Cells[0,i]<>'' then
Begin
BaseFile[i].FIO:=StringGrid1.Cells[0,i];
BaseFile[i].TelNumber:=StringGrid1.Cells[1,i]; 
End
else
Begin
BaseFile[i].FIO:='';
BaseFile[i].TelNumber:=0;
End;
write(F,BaseFile[i]);{<<----Запись в файл каждого элемента массива}
End;
CloseFile(F);
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"

Последний раз редактировалось AlDelta; 12.10.2007 в 14:44.
AlDelta вне форума Ответить с цитированием
Старый 12.10.2007, 19:40   #8
zzss
 
Регистрация: 11.10.2007
Сообщений: 8
По умолчанию

Цитата:
Сообщение от AlDelta Посмотреть сообщение
Примерный набросок того что тебе надо:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    function GetAmountOfLines(Table:TStringGrid):integer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
type
TFake = class(TStringGrid);
Base=record
        FIO:string[255];
        TelNumber:string[20];
End;
{$R *.DFM}
var BaseFile:array[1..100] of Base;
    Select:integer;
function TForm1.GetAmountOfLines(Table:TStringGrid):integer;
var i:integer;
Begin
i:=1;
while Table.Cells[1,i]<>'' do
i:=i+1;
GetAmountOfLines:=i;
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
Select:=1;
StringGrid1.ColWidths[0]:=150;
StringGrid1.Cells[0,0]:='Номер';
StringGrid1.ColWidths[1]:=280;
StringGrid1.Cells[1,0]:='ФИО';
end;

procedure TForm1.Button1Click(Sender: TObject);
var AmountOfLines:byte;
begin
if (edit1.text<>'') and (edit2.text<>'') then
Begin
AmountOfLines:=GetAmountOfLines(StringGrid1);

StringGrid1.Cells[0,AmountOfLines]:=Edit1.text;
StringGrid1.Cells[1,AmountOfLines]:=Edit2.text;
End
else
ShowMessage('Заполните все поля.');

end;

procedure TForm1.Button4Click(Sender: TObject);
var F:file of Base;
i:integer;
begin
if SaveDialog1.execute then
Begin

AssignFile(F,SaveDialog1.FileName);
Rewrite(F);
for i:=1 to 100 do
Begin
if StringGrid1.Cells[0,i]<>'' then
Begin
BaseFile[i].FIO:=StringGrid1.Cells[0,i];
BaseFile[i].TelNumber:=StringGrid1.Cells[1,i];
End
else
Begin
BaseFile[i].FIO:='';
BaseFile[i].TelNumber:=0;
End;
write(F,BaseFile[i]);
End;
CloseFile(F);

End;
end;

procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
F:file of Base;
begin
if OpenDialog1.execute then
Begin
AssignFile(F,OpenDialog1.FileName);
Reset(F);
for i:=1 to 100 do
Begin
read(F,BaseFile[i]);

if BaseFile[i].FIO<>'' then
Begin
StringGrid1.Cells[0,i]:=BaseFile[i].FIO;
StringGrid1.Cells[1,i]:=BaseFile[i].TelNumber;
End
else
Begin
break;
End;

End;
CloseFile(F);
End;
exit;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
Select:=ARow;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if StringGrid1.Cells[0,Select]<>'' then
Begin
StringGrid1.Cells[0,Select]:='';
StringGrid1.Cells[1,Select]:='';
TFake(StringGrid1).RowMoved(Select, 100);
End;
end;

end.
У меня ругается на вот эту строчку, пишет: Type 'Base' needs finalization - not alowed in file type...............

Base описал в Type как запись..... все записи у меня типа стринг....
В принципе из-за этой ошибки и хотел сделать через текстовый файл, думал получится......
zzss вне форума Ответить с цитированием
Старый 12.10.2007, 21:04   #9
zzss
 
Регистрация: 11.10.2007
Сообщений: 8
По умолчанию

Пока не дождался ответа на предыдущий ответ, сделал все-таки по своему через TextFile.... сделал чтобы сохранялось как надо, только вот считать данные не могу и занести их в стринггрид....

procedure TfSelect.FormCreate(Sender: TObject);
var
F: TextFile;
i:integer;
Base: Data;
begin
AssignFile(F, 'C:\Base.sav');
Reset(F);
i:= 1;
while not EOF(F) do
begin
readln(F, Base.Fam);
readln(F, Base.Im);
readln(F, Base.Ot);
readln(F, Base.DR);
readln(F, Base.Ad);
readln(F, Base.Tel);

fBase.Grid.Cells[1, i]:= Base.Fam;
fBase.Grid.Cells[2, i]:= Base.Im;
fBase.Grid.Cells[3, i]:= Base.Ot;
fBase.Grid.Cells[4, i]:= Base.DR;
fBase.Grid.Cells[5, i]:= Base.Ad;
fBase.Grid.Cells[6, i]:= Base.Tel;
i:= i+1;

end;
CloseFile(F);
end;

ошибку выдает на этом месте..... ошибка вылазит сразу после нажатия Ф9.... вылазит тобличка Error и там написано что-то типа 'Project Base09.exe raised exception class EAccessViolation with message.....'
мне кажется надо просто как-то по другому записать данные строчки... только как не могу догадаться пока что, вот и обратился за помощью....
zzss вне форума Ответить с цитированием
Старый 13.10.2007, 01:22   #10
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
Сообщение Немного о работе с типизированными файлами

Цитата:
Типизированные файлы. Это такой вид файлов, в котором содержатся записи одного типа и фиксированной длины. Часто используется или для организации мини баз, конфигураций, иногда для импорта/экспорта в специальных форматах. Если текстовые файлы чисто последовательные, то в типизированных файлах можно перемещаться на любую запись и затем производить последовательное чтение или запись. Это очень похоже на работу с TFileStream за одним исключением, единицей информации является не байт, а тип.

Типизированный файл определяется следующим образом

Код:
var
  FileVar: file of тип;
Где тип это или предопределенный или пользовательский типы. В качестве типов не могут фигурировать динамические структуры, такие как динамические массивы, длинные строки или любые указатели, поскольку все записи должны быть одинаковой длины и не должны указывать на внешние данные. Для обработки таких данных надо использовать не типизированные файлы.

Writeln-запись в файл.
Reaadln-чтение из файла.
Тебе нужно создать массив записей с типом Data и записывать в типизированный файл (не текстовый ) каждый элемент массива, вот так
Код:
write(F,BaseFile[i]); //F-типизированная файловая переменная
Быстрее и лучше всего учишься, когда учишь других. (Роза Люксембург)
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц