На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0317 ]   [ 16 queries used ]   [ Generated: 23.04.24, 12:17 GMT ]