На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Чтение и запись TextFile
имеется текстовый файл. Я хочу прочитать и записать построчно с 1 строки и дальше(3 строки прочитать, 2 записать). Но запись для текстового файла предполагает при append в конец файла или rewrite, а как сделать с начала?
ExpandedWrap disabled
    Var
      F:TextFile;
    begin
          AssignFile(F,FolderSQL+ListBox1.Items[ListBox1.ItemIndex]);
          Reset(F);
          readln(F,S);
          readln(F,S);
          readln(F,S);
          S:='1';
          Writeln(F,S);
          S:='set @d2='''+DateToStr( MonthCalendar2.Date)+'''';
          Writeln(F,S);
          CloseFile(f);


на write ошибка IO error 105.

Добавлено
Нашел такое решение:
ExpandedWrap disabled
      SF:TStringList;
    begin
     
          SF:=TStringList.Create;
     
          SF.LoadFromFile(FolderSQL+ListBox1.Items[ListBox1.ItemIndex]);
     
          SF.Strings[3]:='set @d1='''+DateToStr( MonthCalendar1.Date)+'''';
          SF.Strings[4]:='set @d2='''+DateToStr( MonthCalendar2.Date)+'''';
     
          SF.SaveToFile(FolderSQL+ListBox1.Items[ListBox1.ItemIndex]);
     
          SF.Free;
    end;

минусы думаю очевидны.
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
никак
читай из одного, пиши в другой
Что бы ни происходило, убедись, что ты чист. Обращай внимание на следы, результаты дают только чистые операции. Ощутив необходимость, проконтролируй себя и раз, и два. Будь чист, пусть это станет законом.
Кстати такой ещё вопрос.

Если я хочу через ShellExecute передать русские символы, какие строки я должен применять?

ExpandedWrap disabled
    const
      FolderSQL='\\server\Сотрудники\Отдел Права\Отчеты ПМ\Запросы программа\';
     
    Var
    S:String;//какая строка?
    begin
          S:='/C '''+FolderSQL+ListBox1.Items[ListBox1.ItemIndex]+'.cmd''';
          ShowMessage(s);
          ShellExecute(0, 'open', 'cmd.exe', PWideChar(S), nil, SW_SHOW);//Что вместо PWideChar должно быть?
    end;
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
В двойные кавычки строку заключи. Delphi какая версия?
delphi Berlin,
"`Привет`", так чтоли?
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Пример:
ExpandedWrap disabled
    ShellExecute(Application.Handle,
      'open',
      PChar('"C:\DelphiInstallation\bin\bds.exe"'),
      PChar('-pDelphi "C:\Source\YourProjectFile.dproj"'),
      nil,
      SW_SHOWNORMAL)


Параметр, включающий файловый путь (длинный, с пробелами, с русскими символами), заключен в двойные кавычки (это требование Windows)
Цитата ^D^ima @
Но запись для текстового файла предполагает при append в конец файла или rewrite, а как сделать с начала?

Никак. TextFile м.б. открыт либо только на чтение (reset), либо только на запись (rewrite и append).
Поэтому если нужно что-то изменить в начале\середине файла, то возможны несколько вариантов:
1) Вариант Shaggy: "читай из одного, пиши в другой", используя TextFile. После окончания записи можно удалить исходный файл и затем переименовать новый в исходный.
2) Открыть файл как двоичный на чтение и запись. Прочитать начало файла (или весь файл) в строку S нужного размера, ручками найти строки с нужными номерами (с помощью PosEx или ExtractStrings) и заменить их на новые. Если при этом длина текста не изменяется (суммарная длина измененных строк остается прежней), то просто перезаписываем начало файла и всё. Если же изменяется, то в общем случае придется помучиться с перезаписью всего хвоста файла со смещением в плюс или минус. Поскольку эта задачка в общем случае нетривиальная, то "минусы думаю очевидны". Поэтому если файл не слишком большой, то проще его читать целиком и соотв-но перезаписывать целиком (или от начала изменений, если они находятся не в начале файла, а где-то в середине).
3) Но если файл не слишком большой, то самое простое - это прочитать его в TStringList, заменить нужные строки и сохранить в файл с тем же именем (= "Нашел такое решение"). Минусы по сравнению с другими вариантами "очевидны" только для сравнительно больших\огромных файлов. (Основной "минус" по сравнению с вариантом 2 с загрузкой всего файла - это то, что при Load и Save требуется удвоенный размер памяти под исходный или сохраняемый текст и строки TStringList, а скорость разборки\сборки строк существенной роли не играет, т.к. по любому выполняется намного быстрее чтения самого файла).
leo
Спасибо за полный ответ, а такие вещи как ReadFile и WriteFile это какие-то чисто апишные функции? Их использование когда бывает оправдано?

MBo
сейчас попробую
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Цитата ^D^ima @
S:String;//какая строка?
...//Что вместо PWideChar должно быть?

Просто String и просто PChar.
Каждая версия дельфи сама разруливает, какой вариант строк используется по умолчанию и соотв-но какой вариант функции ShellExecute использовать (А или W).

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

Добавлено
Цитата ^D^ima @
а такие вещи как ReadFile и WriteFile это какие-то чисто апишные функции? Их использование когда бывает оправдано?

Да, чисто апишные. Их обертками в дельфи являются FileRead и FileWrite.
По сути BlockRead и BlockWrite тоже используют эти функции. Поэтому принципиальной разницы между ними нет.
Разница лишь в том, что Read\WriteFile и FileRead\Write используют хэндл файла, получаемый апишной ф-ей CreateFile или дельфийской FileOpen. А в переменной типа File этот хэндл скрыт в структуре TFileRec(f).Handle. Поэтому "оправданность" может заключаться не в самих функциях чтения\записи, а использовании более продвинутой функции CreateFilе с возможностью задания дополнительных опций\флагов открытия файла.

Добавлено
PS: Или даже не продвинутых, а более понятных, например разрешений чтения записи файла другими процессами FILE_SHARE_READ\WRITE, вместо малопонятной дельфийской FileMod, не разрешающей, а запрещающей чтение\запись (например fmShareDenyWrite = FILE_SHARE_READ, а fmShareDenyRead = FILE_SHARE_WRIE).
да,в "" заработало. Я почему-то использовал одинарные '' видимо автоматом как в дельфи... :D
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1192 ]   [ 20 queries used ]   [ Generated: 20.11.17, 22:47 GMT ]