Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Сохранить Edit1 и Edit2...


Автор: Des666 5.12.2006, 15:18
Вот код сохранения 
Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  m: integer;
  p: TextFile;
begin
  AssignFile(p,'uin.lst');
  Rewrite(p);
  Writeln(p,UIN.text,Pass.text);
  CloseFile(p);
end;

А как теперь загрузить при открытии программы эти  UIN.text, Pass.text?

Автор: Albinos_x 5.12.2006, 15:30
можно аналогично...
Код

AssignFile(..);
Reset(..);
ReadLn(..);

Автор: x77 5.12.2006, 15:34
Цитата
Writeln(p,UIN.text,Pass.text);


это всё хорошо..... но допустим, что UIN.Text = '1234567', Pass.Text = '7654321', соответственно в файле на диске мы получим замечательную строчку: 12345677654321. как потом предполагается разбираться, где UIN, а где пароль?

надо, как минимум, писать двумя операторами WriteLn, по отдельности, а по большому счёту лучше использовать TIniFile.

Автор: Albinos_x 5.12.2006, 15:54
Цитата(x77 @  5.12.2006,  15:34 Найти цитируемый пост)
 12345677654321. как потом предполагается разбираться, где UIN, а где пароль?

если строка фиксированной длины, т.е. объявлена как string[7] то это проблем не составит... можно так же по-извращяться и сделать допустим так:
Код
...
Writeln(p,UIN.text,'/',Pass.text);
...


прочитать так:
Код
...
readln(p,s);
UIN.text=copy(s,1,pos(s,'/'));
delete(s,1,pos(s,'/'));
Pass.text:=s;
...

 smile  smile  smile 

Автор: Des666 5.12.2006, 16:01
Вот так пишу в чём ошибка? 
Код

var
  m: integer;
  p: TextFile;
begin
   AssignFile(p,'uin.lst');
   readln(p,UIN.Text);
   readln(p,pass.text);


Albinos_x, 
И что это за строка? Reset(..);

Автор: Romikgy 5.12.2006, 16:04
имхо только лучше раздилять переводом строки

Автор: Des666 5.12.2006, 16:18
Albinos_x, 
Нет UIN никак фиксированным быть не может  smile  теперь сохраняет в файл в 1 строчке UIN во 2 пароль, теперь надо загрузить их при открытии программы в эти поля, пишу так
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  p: TextFile;
begin
   AssignFile(p,'uin.lst');
   readln(p,UIN.Text);
   readln(p,pass.text);

никак немогу понять с этими файлами как работать  smile 

Автор: x77 5.12.2006, 16:32
Код

procedure Save (Uin, Pass: string);
var
  sl: TStrings;
begin
  sl := TStringList.Create;
  try 
    sl.Add (Uin);
    sl.Add (Pass);
    sl.SaveToFile (ExtractFilePath (ParamStr (0)) + 'uin.lst');
  finally
    sl.Free;
  end;
end;

procedure Load (var Uin, Pass: string);
var
  sl: TStrings;
begin
  sl := TStringList.Create;
  try 
    sl.LoadFromFile (ExtractFilePath (ParamStr (0)) + 'uin.lst');
    Uin := sl [0];
    Pass := sl [1];
  finally
    sl.Free;
  end;
end;


более корректный вариант использовать Names, т.е. хранить в виде "UIN=PASSWORD", благо TStrings позволит обработать строку автоматически, но тут могут быть грабли в том, что Password'у никто не запрещает содержать знак "=".

код не тестил - занят по работе smile

Автор: Des666 5.12.2006, 16:40
Пишет несовпадение типов tedit и tstring  smile 
вот тут Uin := sl [0];
//----------------------
Извините тупанул  smile 
А как сделать чтобы он ошибку не выдавал при открытии если файла uin.lst нету?

Автор: x77 5.12.2006, 16:53
Des666, можно проверить: 

Код

if FileExists (ExtractFilePath (ParamStr (0)) + 'uin.lst') then begin
  ..
end;

Автор: Des666 5.12.2006, 17:05
Вот так пишу опять ошибка  smile 
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  sl: TStrings;
begin
  sl := TStringList.Create;
  try
  if FileExists (ExtractFilePath (ParamStr (0)) + 'uin.lst') then
  begin
  sl.Create:=uin.lst;
  end;
  begin
    sl.LoadFromFile (ExtractFilePath (ParamStr (0)) + 'uin.lst');
    Uin.Text := sl [0];
    Pass.Text := sl [1];end;
  finally
    sl.Free;

Автор: x77 5.12.2006, 17:08
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  sl: TStrings;
begin
  if FileExists (ExtractFilePath (ParamStr (0)) + 'uin.lst') then begin
    sl := TStringList.Create;
    try
      sl.LoadFromFile (ExtractFilePath (ParamStr (0)) + 'uin.lst');
      Uin.Text := sl [0];
      Pass.Text := sl [1];
    finally
      sl.Free;
    end;
  end;
end;

Автор: Des666 5.12.2006, 17:13
Так же пишет при открытии "неудаётся найти такой то файл" =( 

Автор: x77 5.12.2006, 17:15
Des666, не может быть smile это уже в каком-то другом месте ошибка, в этой функции такой ошибки не будет.

Автор: Des666 5.12.2006, 17:21
x77, 
Да брат ты прав, я накосячил снова с кодом....  smile 

Автор: Albinos_x 5.12.2006, 18:08
Цитата(Des666 @  5.12.2006,  16:01 Найти цитируемый пост)
Reset(..);

открытие для чтения...

Цитата(Des666 @  5.12.2006,  16:18 Найти цитируемый пост)
никак немогу понять с этими файлами как работать

открыть для чтения забыл...
и записывать нужно тогда как говорил x77, или разделитель брать указанный Romikgy - #13 
Цитата(Des666 @  5.12.2006,  17:05 Найти цитируемый пост)
  sl: TStrings;

неверный тип:
нужно так:
Код

sl: TStringList;

тогда проблем возникать не будет...
Цитата(Des666 @  5.12.2006,  17:13 Найти цитируемый пост)
Так же пишет при открытии "неудаётся найти такой то файл" =( 

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

Автор: x77 5.12.2006, 18:34
Albinos_x, не совсем так.

Цитата

неверный тип:
нужно так:

sl: TStringList;

тогда проблем возникать не будет...


а их и сейчас не возникает, поскольку создаётся sl через TStringList. дело не в этом ;)


Цитата(Albinos_x @  5.12.2006,  18:08 Найти цитируемый пост)
Цитата(Des666 @  5.12.2006,  17:13 Найти цитируемый пост)
Так же пишет при открытии "неудаётся найти такой то файл" =( 

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


а полный путь и указывается  smile 

Автор: Albinos_x 5.12.2006, 19:10
Цитата(x77 @  5.12.2006,  18:34 Найти цитируемый пост)
а полный путь и указывается

это про чтение... а я про запись...
Цитата(x77 @  5.12.2006,  18:34 Найти цитируемый пост)
а их и сейчас не возникает, поскольку создаётся sl через TStringList. дело не в этом ;)

дело не в этом, но... TStrings - это ссылки на строки(объекты), а TStringList - массив строк... поэтому возможна утечка памяти, т.к. когда сделаешь free ссылки очистятся... а объекты/строки останутся... тогда и смысл использования в TStrings в TStringList нет, тогда уж проще сделать TString.Create...

Автор: x77 5.12.2006, 19:17
Albinos_x, не совсем согласен про утечку...  поскольку TStrings создаётся как TStringList, то и деструктор будет вызываться "родной", т.е.

Код

destructor TStringList.Destroy;
begin
  FOnChange := nil;
  FOnChanging := nil;
  inherited Destroy;
  if FCount <> 0 then Finalize(FList^[0], FCount);
  FCount := 0;
  SetCapacity(0);
end;


который благополучно всё вычистит. а объявлять список именно как TStrings - это просто хороший тон, так этот класс будет приводим к любому потомку TStrings, которых в VCL великое множество. но в принципе - это всё уже детали...

про запись - не могу сказать, потому что авторского кода, отвечающего за запись файла, я не видел.

Добавлено @ 19:18 
З.Ы. TStrings.Create, кстати, делать нельзя - этот класс содержит абстрактные методы.

Автор: Albinos_x 5.12.2006, 21:14
во блин... допрограммировался... глюки так из меня и лезут... smile 
да... точно...я этот момент упустил... free вызовет:
Код
...
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
...


который вызовет нужный деструктор...
Цитата(x77 @  5.12.2006,  19:17 Найти цитируемый пост)
про запись - не могу сказать, потому что авторского кода, отвечающего за запись файла, я не видел.

он пример в начале приводил...

Автор: gambit 8.12.2006, 20:04
Я понимаю что тема старая но всеже.
А не легче  объявить новый тип
занести в него значения полей а потом записать???

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)