Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибки в работе с TShelfOpStruct в Delphi 7: как сформировать строку с именами файлов и добавить завершающий двойной нулевой символ

Delphi , Синтаксис , Справочник по API-функциям

Ошибки в работе с TSHFileOpStruct в Delphi 7: как сформировать строку с именами файлов и добавить завершающий двойной нулевой символ

Переход с Delphi 7 на более новые версии может быть непростой задачей, особенно когда дело касается работы с низкоуровневыми структурами, такими как TSHFileOpStruct. Ошибки, связанные с неправильной обработкой строк и символов, могут возникнуть при попытке загрузить имена файлов с разделителем в виде нулевого символа и добавлением двойного нулевого символа в конце для завершения требований.

Описание проблемы

Рассмотрим код, который пытается загрузить строку имен файлов в структуру TSHFileOpStruct. В коде используется тип PWideChar для хранения имен файлов, разделенных нулевым символом. Однако, при попытке конкатенации строк возникает ошибка, связанная с несоответствием типов.

procedure TForm13.Button1Click(Sender: TObject);
var
  s: String;
  sfo: TSHFileOpStruct;
begin
  s := '123' + #0 + '456' + #0;
  sfo.pfrom := PChar(s);
end;

Попытки использовать pWideString или pChar также не увенчались успехом, и конкатенация с нулевым символом привела к ошибке.

Подтвержденный ответ

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

procedure TForm13.Button1Click(Sender: TObject);
var
  s: String;
  sfo: TSHFileOpStruct;
begin
  s := '123'#0'456'#0;
  sfo.pfrom := PChar(s);
end;

Это описано в документации Delphi: Fundamental Syntactic Elements (Delphi): Character Strings.

Такой подход работает и в Delphi 7, как для AnsiString, так и для WideString.

Альтернативный ответ

Если имена файлов динамически генерируются и хранятся в переменных, можно использовать следующий подход:

procedure TForm13.Button1Click(Sender: TObject);
var
  fileNames: array of string;
  fileName, s: String;
  len: Integer;
  P: PChar;
  sfo: TSHFileOpStruct;
begin
  SetLength(fileNames, 2);
  fileNames[0] := '123';
  fileNames[1] := '456';

  len := 0;
  for fileName in fileNames do
    Inc(len, Length(fileName) + 1);

  SetLength(s, len);
  P := PChar(s);

  for fileName in fileNames do
  begin
    len := Length(fileName);
    Move(PChar(fileName)^, P^, len * SizeOf(Char));
    Inc(P, len);
    P^ := #0;
    Inc(P);
  end;

  sfo.pfrom := PChar(s);
end;

Или, используя TStringList для более удобной работы со строками:

procedure TForm13.Button1Click(Sender: TObject);
var
  fileNames: TStringList;
  s: String;
  sfo: TSHFileOpStruct;
begin
  fileNames := TStringList.Create;
  try
    fileNames.Add('123');
    fileNames.Add('456');

    fileNames.Delimiter := #0;
    fileNames.QuoteChar := #0;
    fileNames.StrictDelimiter := True;

    s := fileNames.DelimitedText + #0;
  finally
    fileNames.Free;
  end;

  sfo.pfrom := PChar(s);
end;

Использование этих методов позволит корректно сформировать строку с именами файлов, разделенных нулевым символом, и добавить завершающий двойной нулевой символ, что является требованием для работы с TSHFileOpStruct.

Создано по материалам из источника по ссылке.

### Описание Проблема связана с необходимостью правильно сформировать строку с именами файлов в формате, требуемом для структуры TSHFileOpStruct в Delphi 7, включая добавление двойного нулевого символа в конце строки.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 13:59:16/0.0032889842987061/0