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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2011, 22:19   #1
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию загрузка из тхт файла структуры,содержащую tstringlist

Код:
type
  xy=record
    Left,Top:integer;
  end;
  allwhatuse=record
    statyses,logins,passwords:TStringList;//описание структуры
{вырезано}
  end;
Код:
procedure TForm1.FormShow(Sender: TObject);
var
  reg:TRegistry;
  data1:tfilestream;
begin
{вырезано}
if FileExists('data1.dat')=false then
  begin
    data1:=tfilestream.Create('data1.dat',fmcreate);
    statusbar1.Panels[2].Text:='Создали файл data1.dat';
 
  end
else
  begin
    all.statyses.Create;//вот нужно ли здесь ее инициализировать
    all.passwords.Create;
    data1:=tfilestream.Create('data1.dat',fmopenread);
    data1.Read(all,sizeof(all));
    data1.Free;
       //загружаем размеры окна и тд
  end;
end;
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var logi,passi,o,t:string;
    i:byte;
    online:TStringList;
    u,y:integer;
 
begin
{cut}
        if pos(infa.login,all.logins.Text)=0 then//если не найдено такого в списке,то записываем
          begin
            if all.logins.Count<11 then
              begin
                all.logins.Add(infa.login);
                all.passwords.Add(infa.password);
              end
              else
                begin
                  all.logins.Strings[0]:=infa.login;//если найдено то заменяем первую строку на новые данные
                  all.passwords.Strings[0]:=infa.password;
                end;
          end;
        end;
{cut}
end;
Код:
procedure TForm1.FormDestroy(Sender: TObject);
var data1:TFileStream;                                            //сохраняем структуру
begin
data1:=tfilestream.Create('data1.dat',fmCreate);
data1.Write(all,sizeof(all));
data1.free;
end;
при показе формы говорит что обращаюсь к несуществующей памяти,2 раза
и еще такую ошибку дает при удалении формы
http://www.cyberforum.ru/attachment....6&d=1320683568

это в formshow,теперь говорит что я обращаюсь к несуществующей памяти,когда происходит клик по кнопке(и показывает на pos)мне кажется что tstringlist в структуре надо проинициализировать,а потом загружать в него данные из тхт
я так и делал
Код:
procedure TForm1.FormShow(Sender: TObject);
var
  reg:TRegistry;
  data1:tfilestream;
begin
{вырезано}
if FileExists('data1.dat')=false then
  begin
    data1:=tfilestream.Create('data1.dat',fmcreate);
    statusbar1.Panels[2].Text:='Создали файл data1.dat';
 
  end
else
  begin
    all.statyses.Create;//вот нужно ли здесь ее инициализировать
    all.passwords.Create;
    data1:=tfilestream.Create('data1.dat',fmopenread);
    data1.Read(all,sizeof(all));
    data1.Free;
       //загружаем размеры окна и тд
  end;
но тогда дает ошибки о несуществующей памяти на них
spydark91 вне форума Ответить с цитированием
Старый 08.11.2011, 00:50   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
data1.Write(all,sizeof(all));
ну Вы хоть бы посмотрели на размер создаваемого файла..
Вам не кажется, что 8 байт это как-то маловато?!

Объяснение, экземпляры класса - это УКАЗАТЕЛИ!
Поэтому Вы записываете в файл указатель на область памяти.
А когда его грузите, по этому адресу нет нужных Вам данных (неожиданно, да?..)

Так, как Вы написали, сохранить структуру в файл НЕ ПОЛУЧИТСЯ!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.11.2011, 09:03   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Интересно, а что за формат dat файла?
Просто я бы лично делал так:
Вот формат файла:
Цитата:
001:Печать:34:37,4
002:Проявка:34:28,05
003:Обработкка:34:28,05
А вот читалка:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var f:TextFile;
  s:string;
begin
   AssignFile(f,'file1.txt'); reset(f);
   StringGrid1.RowCount:=2;
    StringGrid1.Row:=1;
   while not eof(f) do begin
    readln(f,s);
    StringGrid1.Rows[StringGrid1.RowCount-1].Delimiter:=':';
    StringGrid1.Rows[StringGrid1.RowCount-1].DelimitedText:=s;
    StringGrid1.RowCount:=StringGrid1.RowCount+1;
   end;
end;
P.S. Это кстати пример с форума...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.11.2011, 10:37   #4
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

10:37
еслИ в структуре нет tstringlist то все работает отлично,а если есть,то возникают проблемы(я про свой вариант)

10:51
В_общем-то вопрос когда (и надо ли) инициализировать переменныЕ типа tstringlist из структуры?

Красные жирные циферки видны ?
Это время, когда вы отправляли свои сообщения друг за другом, подряд.
У нас есть кнопка "Правка".
Читаем правила раздела.
По правилам это приравнивается к флуду.

Последний раз редактировалось mihali4; 08.11.2011 в 12:42.
spydark91 вне форума Ответить с цитированием
Старый 08.11.2011, 10:52   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

такие структуры(содержащие ссылочный тип) надо сохранять ручками.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.11.2011, 13:28   #6
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

т.е. делать так?
all.statyses.SaveToFile();
или что вы имеете ввиду?
spydark91 вне форума Ответить с цитированием
Старый 08.11.2011, 15:15   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

spydark91
угу.
Только не обязательно именно так.
Тут всё зависит от того, где Вам надо сохранить информацию.
Например, я бы сохранил в том же файле, в файловом потоке. в формате, сначала ДЛИНА строки, потом сама СТРОКА.

на Delphi это выглядит примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var BopStream : TFileStream;
    W : longint;
    str : AnsiString;
begin
   if FileExists('namefile.ddd') then begin
     if Application.MessageBox('Файл уже существует.'+#13+#10+'Перезаписать?',
           'Подтверждение', MB_ICONQUESTION or MB_YESNO) <>ID_YES then
     Exit;
   end;


    BopStream := TFileStream.Create('namefile.ddd',fmCreate);

    str := Edit1.Text;
    W := length(str);
    {записываем сначала длину строки}
    BopStream.WriteBuffer(W, sizeof(W));
    {потом, собственно строку}
    if W>0 then
       BopStream.WriteBuffer(str[1], W);

    str := all.statyses.Text;
    W := length(str);
    {записываем сначала длину строки}
    BopStream.WriteBuffer(W, sizeof(W));
    {потом, собственно строку}
    if W>0 then
       BopStream.WriteBuffer(str[1], W);

    FreeAndNil(BopStream);
end;

procedure TForm1.Button2Click(Sender: TObject);
var BopStream : TFileStream;
    W : longint;
    str : AnsiString;
begin
   if not FileExists('namefile.ddd') then begin
     Application.MessageBox('Файл не найден!', 'Ошибка', MB_ICONERROR or MB_OK);
     Exit;
   end;
   BopStream := TFileStream.Create('namefile.ddd', fmOpenRead );
   BopStream.ReadBuffer(W, sizeof(W));
   if W = 0 then str := ''
   else begin
     SetLength(str, W);
     BopStream.ReadBuffer(str[1], W);
   end;
   Edit2.Text := str;

   BopStream.ReadBuffer(W, sizeof(W));
   if W = 0 then str := ''
   else begin
     SetLength(str, W);
     BopStream.ReadBuffer(str[1], W);
   end;
   if Not Assigned(all.statyses) then all.statyses := TStringList.Create;
   all.statyses.Text := str;

   {ВНИМАНИЕ! Все созданные в программном коде объекты
     ОБЯЗАТЕЛЬНО должны быть уничтожены так же программно! 
     Нужно вызвать all.statyses.Free; или, лучше, FreeAndNil(all.statyses);

    И ещё. лучше создавать all.statyses := TStringList.Create где нибудь
     на событии Form OnCreate, а уничтожать - на событие Form OnClose (onDestroy)}

   FreeAndNil(BopStream);

end;

Последний раз редактировалось Serge_Bliznykov; 08.11.2011 в 15:17.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка дерева в TTreeList из TStringList DemonXT Общие вопросы Delphi 2 03.07.2011 01:00
Загрузка структуры из файла mrCloud Общие вопросы Delphi 1 14.05.2011 15:31
Создание тхт файла на винчестере... misher Общие вопросы Delphi 29 03.09.2010 03:13
Загрузка - Выгрузка структуры из dat файла delphinewerklin Общие вопросы Delphi 4 07.02.2010 20:00
Как часть тхт-файла закинуть в мемо? Vito89 Общие вопросы Delphi 4 31.05.2009 09:04