Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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


Ответ
 
Опции темы
Старый 16.10.2012, 12:43   #11
avd
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 79
По умолчанию

В общем выходит, что если мы хотим загрузить в StringList данные из открытого файла делать нужно как-то примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TFileStream;
  name: string;
  strl: tStringList;
  s: string;
begin
  strl := TStringList.Create();
  name := ExtractFileDir(Application.ExeName) + '\test.txt';

  Stream := TFileStream.Create(name, fmCreate or fmShareDenyNone);
  Stream.Write(AnsiString('123456789')[1], 9);

  Stream.Seek(0, soFromBeginning);
  Stream.Read(s,0); // Почему ноль сам не понял

  strl.LoadFromStream(Stream);
  ShowMessage(strl[0]);

  strl.Free;
  Stream.Free;
end;

Последний раз редактировалось avd; 16.10.2012 в 12:47.
avd вне форума Ответить с цитированием
Старый 16.10.2012, 13:05   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Цитата:
Код:
Stream.Read(s,0); // Почему ноль сам не понял
кстати, у меня и без этой строчки ваш пример работает.
а Вас нет?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.10.2012, 13:05   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,002
По умолчанию

Цитата:
Stream.Read(s,0); // Почему ноль сам не понял
а выкинуть её нужно в общем то.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.10.2012, 15:07   #14
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Проблема не в TFileStream.Create. Это TStringList просит блокировку.

Должно быть:

Код:
procedure TForm1.Button1Click(Sender: TObject);

  procedure LoadFromFileNonBlocking(SL: TStringList; const AFileName: String);
  var
    FS: TFileStream;
  begin
    FS := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
    try
      SL.LoadFromStream(FS);
    finally
      FreeAndNil(FS);
    end;
  end;

const
  BOM: WORD = $FEFF;
var
  Stream: TFileStream;
  Name: string;
  Strl: TStringList;
  S: WideString;
begin
  Name := ExtractFilePath(Application.ExeName) + 'test.txt';

  Stream := TFileStream.Create(Name, fmCreate or fmShareDenyNone);
  try
    Stream.Write(BOM, SizeOf(BOM));

    S := 'Show me the money';
    Stream.Write(S[1], Length(S) * SizeOf(WideChar));

    Strl := TStringList.Create;
    try
      LoadFromFileNonBlocking(Strl, Name);

      // ... что-то делаем с Strl
      Memo1.Lines := Strl;
    finally
      FreeAndNil(Strl);
    end;
  finally
    FreeAndNil(Stream);
  end;
end;
Владельцы старых IDE заменяют строчку
Код:
Stream := TFileStream.Create(Name, fmCreate or fmShareDenyNone);
на такого монстра:
Код:
...
var
  FileHandle: THandle;
begin
  Name := ExtractFilePath(Application.ExeName) + 'test.txt';

  FileHandle := CreateFile(PChar(Name), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
  Win32Check(FileHandle <> 0);
  Stream := TFileStream.Create(FileHandle);
  try
    ...
и смотрят сюда.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.10.2020, 11:33   #15
q_aza_q
Новичок
Джуниор
 
Регистрация: 27.03.2015
Сообщений: 1
По умолчанию

fmShareDenyNone не работает windows - офиц. ответ embarcadero.
q_aza_q вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление в dataGridView даёт ошибку. KatruKot C# (си шарп) 2 07.05.2012 09:21
Dataset - что даёт определение полей? DeveloPerchik БД в Delphi 11 07.04.2012 18:44
Программа не даёт выключить компьютер Shouldercannon Общие вопросы Delphi 3 22.08.2011 10:12
Канва не дает мне покоя:) NitroSki Компоненты Delphi 0 03.06.2011 09:19
c++ ..при компиляции даёт ошибку.. silveran Помощь студентам 6 17.05.2011 14:32


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя